mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2026-07-26 14:38:39 +02:00
Compare commits
350
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af8b5b63d5 | ||
|
|
4485d0833e | ||
|
|
a163a6af88 | ||
|
|
38bb5af04b | ||
|
|
11804d1cb8 | ||
|
|
22529fc1d2 | ||
|
|
62b0c5fd62 | ||
|
|
1ed28a4fd4 | ||
|
|
5044aea1d7 | ||
|
|
47fda0ccca | ||
|
|
742490775a | ||
|
|
95bbed2b21 | ||
|
|
2b446e227d | ||
|
|
ea6417dbb1 | ||
|
|
d902417959 | ||
|
|
358197db03 | ||
|
|
102fd1f1a1 | ||
|
|
fe9168c6cf | ||
|
|
f7663fc17f | ||
|
|
e370ec36ab | ||
|
|
8f181c74d4 | ||
|
|
e2fc5bcbb1 | ||
|
|
67af09c4bd | ||
|
|
b81abf4da5 | ||
|
|
2c288bb34d | ||
|
|
df762e8910 | ||
|
|
253aa19701 | ||
|
|
ea608d875b | ||
|
|
d4340a8b95 | ||
|
|
33b3aafb14 | ||
|
|
6cedc2fe35 | ||
|
|
1bb03015d9 | ||
|
|
c5bef72c63 | ||
|
|
8b7c00b337 | ||
|
|
6199d4fab4 | ||
|
|
2063d8647a | ||
|
|
c0a9f85f77 | ||
|
|
b1651c5b01 | ||
|
|
1a8af2caee | ||
|
|
a593070b9f | ||
|
|
1d700b0663 | ||
|
|
2233885142 | ||
|
|
faf87d2942 | ||
|
|
706673aed0 | ||
|
|
eaea688e33 | ||
|
|
256be3521d | ||
|
|
cec1e8593d | ||
|
|
e18f9be810 | ||
|
|
69dca2db43 | ||
|
|
c03321b55e | ||
|
|
f8b4287229 | ||
|
|
ce2fa0c116 | ||
|
|
ebe9a230fd | ||
|
|
a05ceea4bc | ||
|
|
67c2ded1f0 | ||
|
|
66d09c886e | ||
|
|
bbff7513f1 | ||
|
|
4195279c5d | ||
|
|
464d967a0a | ||
|
|
4dd7bf8916 | ||
|
|
4b134eaef9 | ||
|
|
ece62c8b18 | ||
|
|
b430c185b1 | ||
|
|
5c13ccf9e7 | ||
|
|
cb0e2ba305 | ||
|
|
011fbb38cb | ||
|
|
0a69450bc0 | ||
|
|
b4a97f4347 | ||
|
|
96f7aa95ee | ||
|
|
e92f2177e8 | ||
|
|
ab7bda402e | ||
|
|
d78c168e16 | ||
|
|
2b04b4f008 | ||
|
|
a6cc0d742c | ||
|
|
e7e9a2755c | ||
|
|
56ea4ce2f5 | ||
|
|
05528f6dfd | ||
|
|
49cd36c33e | ||
|
|
898d96ce3a | ||
|
|
b257836b76 | ||
|
|
8fab4e56ef | ||
|
|
8e34c230d7 | ||
|
|
b32f2e2973 | ||
|
|
1047d1a598 | ||
|
|
1e5115b743 | ||
|
|
e1e12de91b | ||
|
|
58950afb99 | ||
|
|
89b64b165f | ||
|
|
90ab927bdc | ||
|
|
50ebf4eacb | ||
|
|
064ba080ab | ||
|
|
4ee0345217 | ||
|
|
d45cbbba98 | ||
|
|
612a7a7063 | ||
|
|
62e3ca4068 | ||
|
|
34dcdc89c3 | ||
|
|
bcc202ff3b | ||
|
|
d4a56b3823 | ||
|
|
626239038b | ||
|
|
f7da431e61 | ||
|
|
6ff59c423b | ||
|
|
076d4977e3 | ||
|
|
2a737a9d72 | ||
|
|
8c77a19eb6 | ||
|
|
3918696477 | ||
|
|
8a6a2b8577 | ||
|
|
584023380c | ||
|
|
1f4dd2bdb7 | ||
|
|
f7d5a0732b | ||
|
|
2a6cc882a5 | ||
|
|
f385339da3 | ||
|
|
c37566a999 | ||
|
|
f90a4b1374 | ||
|
|
b649680d3e | ||
|
|
b84c2abe14 | ||
|
|
58aff762c0 | ||
|
|
e5eef69c91 | ||
|
|
54f91b7a88 | ||
|
|
17676173ef | ||
|
|
31f4aa944a | ||
|
|
b30bd495b7 | ||
|
|
06f893436e | ||
|
|
20a2b3ed90 | ||
|
|
b1e3bc46c8 | ||
|
|
8bc5932889 | ||
|
|
3cd597d71e | ||
|
|
48d5ad462e | ||
|
|
40cab87640 | ||
|
|
f405947ad8 | ||
|
|
fd550c15a5 | ||
|
|
d18537cf04 | ||
|
|
f01f0229a8 | ||
|
|
b369eb2d40 | ||
|
|
f08c65c5bf | ||
|
|
1043f4ecd7 | ||
|
|
4f17a32373 | ||
|
|
2203aae6e6 | ||
|
|
7b60c7b6c5 | ||
|
|
be98e06efc | ||
|
|
45239bca34 | ||
|
|
84509ec1a8 | ||
|
|
2493ce7ed7 | ||
|
|
2b1e53b371 | ||
|
|
d643a1769f | ||
|
|
a63b7a188c | ||
|
|
f9c0162b8a | ||
|
|
cda3cb3512 | ||
|
|
766f6938a7 | ||
|
|
8e1ccb517b | ||
|
|
540aab6f83 | ||
|
|
d1969d7897 | ||
|
|
b69e8fd649 | ||
|
|
2e95cf908d | ||
|
|
b589bae2b0 | ||
|
|
e7e4891d82 | ||
|
|
79df676a13 | ||
|
|
03a46decba | ||
|
|
d80482f443 | ||
|
|
735cce7614 | ||
|
|
8ea35a0b36 | ||
|
|
ad90bd3d05 | ||
|
|
fa3856e845 | ||
|
|
752d4ddc8c | ||
|
|
fd2d7a05d1 | ||
|
|
ccf4675867 | ||
|
|
bc043c73ca | ||
|
|
291ab247bc | ||
|
|
d901f470a1 | ||
|
|
0ebb01e39d | ||
|
|
20ac99bf8d | ||
|
|
90e86e1575 | ||
|
|
28652031e7 | ||
|
|
cd8be40cc8 | ||
|
|
52fc937f96 | ||
|
|
68e4722387 | ||
|
|
5f5b38b2f9 | ||
|
|
65f8d3ce81 | ||
|
|
ac571fd63d | ||
|
|
ea2d6e9f31 | ||
|
|
80b999d648 | ||
|
|
54720039e4 | ||
|
|
8c6717c201 | ||
|
|
6610754e25 | ||
|
|
d38622d8a2 | ||
|
|
cd2750a489 | ||
|
|
30140629ae | ||
|
|
0ce29337ef | ||
|
|
6715f29ebb | ||
|
|
b4a8dc9e26 | ||
|
|
c349a0bf00 | ||
|
|
0dc6c142be | ||
|
|
e46c1d9120 | ||
|
|
27ad554ea1 | ||
|
|
5660772b46 | ||
|
|
dab80642ab | ||
|
|
da46191208 | ||
|
|
6484c4de79 | ||
|
|
6716b6042a | ||
|
|
0686859fa7 | ||
|
|
4180862c3a | ||
|
|
7aa20d3211 | ||
|
|
b694b55710 | ||
|
|
024b613063 | ||
|
|
8768d11a20 | ||
|
|
5898303ba4 | ||
|
|
e79d09941c | ||
|
|
c52a60fe77 | ||
|
|
e64f9aa427 | ||
|
|
ee343f78ef | ||
|
|
1f20d5821f | ||
|
|
b0c512e946 | ||
|
|
0d13b7abd1 | ||
|
|
43fd8285c9 | ||
|
|
2f7e8d618a | ||
|
|
a0b910deeb | ||
|
|
e9dc45613c | ||
|
|
b5e90ec3d2 | ||
|
|
3d9f42c1e1 | ||
|
|
e62f430f37 | ||
|
|
9c53564c46 | ||
|
|
f7add6f6cd | ||
|
|
7786e6a827 | ||
|
|
b213e2aabf | ||
|
|
ebca0fafca | ||
|
|
ac8a2ca985 | ||
|
|
6380d7cc02 | ||
|
|
9056ba6b8d | ||
|
|
23801363c4 | ||
|
|
1cdcd7327f | ||
|
|
50ec50003e | ||
|
|
5ff4db1a3f | ||
|
|
394b44c343 | ||
|
|
eb2aa6f773 | ||
|
|
81130e04e5 | ||
|
|
c0ec0758f4 | ||
|
|
e21f7c545e | ||
|
|
c16dd2fcf6 | ||
|
|
90974e6d73 | ||
|
|
8e4f75d85b | ||
|
|
792ee2adb8 | ||
|
|
2c57489c07 | ||
|
|
e3321770fd | ||
|
|
848673f028 | ||
|
|
e6d3003ecf | ||
|
|
90551b7ce7 | ||
|
|
aabac5da13 | ||
|
|
4fad77f9c1 | ||
|
|
0fb6d746eb | ||
|
|
7fc712d19b | ||
|
|
d6018cfe10 | ||
|
|
5b8f231a98 | ||
|
|
cb503f84e1 | ||
|
|
a34f9b80ac | ||
|
|
3e6696b516 | ||
|
|
9cd8bd439a | ||
|
|
ca5b99e23d | ||
|
|
c44fd74f5b | ||
|
|
f82c4834c3 | ||
|
|
dda95bd69c | ||
|
|
a623cb57a7 | ||
|
|
e798d930fb | ||
|
|
f91b0c9e2f | ||
|
|
b6824cf242 | ||
|
|
41477fdac1 | ||
|
|
d4e8afc2f1 | ||
|
|
d42cbfe3e4 | ||
|
|
c7c3ef52e6 | ||
|
|
92344325b6 | ||
|
|
a8172fb3f9 | ||
|
|
a73ec783d5 | ||
|
|
5c9fc4c9e4 | ||
|
|
494ff38ef3 | ||
|
|
b7e6cbf1ab | ||
|
|
b33623b74f | ||
|
|
4f939ce6fc | ||
|
|
4f45f360df | ||
|
|
4ad54f34fe | ||
|
|
574dda5286 | ||
|
|
d788623509 | ||
|
|
f047f6a23b | ||
|
|
48b30f6b03 | ||
|
|
67d32164d9 | ||
|
|
6672a21049 | ||
|
|
b833019a14 | ||
|
|
00eeeb2a5a | ||
|
|
06a0a68143 | ||
|
|
1a7ae468bd | ||
|
|
e8f74d7358 | ||
|
|
984f01da23 | ||
|
|
d6e75410a5 | ||
|
|
7627e1b58c | ||
|
|
5fb31b18ae | ||
|
|
20903e8217 | ||
|
|
8fe348d4eb | ||
|
|
24cda8a179 | ||
|
|
fc954a968b | ||
|
|
aae53a54cd | ||
|
|
cfedcffc98 | ||
|
|
0e74c74a6c | ||
|
|
fb86c45e78 | ||
|
|
124300b215 | ||
|
|
6746c0627b | ||
|
|
0f2cd3b132 | ||
|
|
e94d6fdc1e | ||
|
|
e301b3071c | ||
|
|
3d3dad5e4a | ||
|
|
f8a9033738 | ||
|
|
edb25f5bcd | ||
|
|
bcb239efd1 | ||
|
|
d208211c6f | ||
|
|
0b20b72241 | ||
|
|
5c29459af2 | ||
|
|
e54fd38784 | ||
|
|
94774f13df | ||
|
|
43ec35fe67 | ||
|
|
b2645dc444 | ||
|
|
c79624a82c | ||
|
|
8201f3c9a6 | ||
|
|
e0ac6a1c38 | ||
|
|
400da5566d | ||
|
|
9b67037774 | ||
|
|
48596542c7 | ||
|
|
9715d65d88 | ||
|
|
2e14b31a69 | ||
|
|
1c8ce6c3db | ||
|
|
dc74a6213d | ||
|
|
e9a66bb7a7 | ||
|
|
3c6d4b5f19 | ||
|
|
f04eebe0d8 | ||
|
|
63b5227ccc | ||
|
|
934d9b1df4 | ||
|
|
8994cb3a6e | ||
|
|
4a32de482b | ||
|
|
95f47793d2 | ||
|
|
f27048618d | ||
|
|
c90ad419e8 | ||
|
|
2cdc3ecb9d | ||
|
|
9f89fcd968 | ||
|
|
7c2d51f811 | ||
|
|
41fe7a29cd | ||
|
|
54f3eec303 | ||
|
|
cd91013f69 | ||
|
|
0af16ef05f | ||
|
|
5ba830d56e | ||
|
|
81919e963a | ||
|
|
8a1d4bb958 | ||
|
|
eabac0e709 | ||
|
|
d90783d7c8 | ||
|
|
faf8211e5c | ||
|
|
65d90947c5 |
+1
-6
@@ -1,13 +1,8 @@
|
||||
# editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
labels: bug
|
||||
|
||||
---
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Expected behaviour
|
||||
- Tell us what should happen
|
||||
|
||||
### Actual behaviour
|
||||
- Tell us what happens
|
||||
|
||||
### Environment data
|
||||
|
||||
Audiobookshelf Version:
|
||||
|
||||
- [ ] Android App?
|
||||
- [ ] iOS App?
|
||||
|
||||
#### Android Issue
|
||||
Android version:
|
||||
|
||||
Device model:
|
||||
|
||||
Stock or customized system:
|
||||
|
||||
#### iOS Issue
|
||||
iOS Version:
|
||||
|
||||
iPhone model:
|
||||
@@ -0,0 +1,88 @@
|
||||
name: 🐞 ABS App Bug Report
|
||||
description: File a bug/issue and help us improve the Audiobookshelf mobile apps.
|
||||
title: '[Bug]: '
|
||||
labels: ['bug', 'triage']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: '## App Bug Description'
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: 'Thank you for filing a bug report! 🐛'
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: 'Join the [discord server](https://discord.gg/HQgCbd6E75) for questions or if you are not sure about a bug.'
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What was the Problem?
|
||||
description: Please help us understand the problem.
|
||||
placeholder: Describe the problem you saw or experienced in detail! Include a screenshot or video, if applicable.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: steps-to-reproduce
|
||||
attributes:
|
||||
label: Steps to Reproduce the Issue
|
||||
description: Please help us understand how we can reliably reproduce the issue.
|
||||
placeholder: '1. Go to the library page of a Podcast library and...'
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: what-was-expected
|
||||
attributes:
|
||||
label: What was Expected?
|
||||
description: Please help us understand what should have happened.
|
||||
placeholder: Please help us visualize by including a doodle or screenshot.
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: '## Mobile Environment'
|
||||
- type: input
|
||||
id: phone-model
|
||||
attributes:
|
||||
label: Phone Model
|
||||
description: What kind of phone are you using?
|
||||
placeholder: e.g. Pixel 6, iPhone 14, Samusung Galaxy s23, etc
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: phone-os
|
||||
attributes:
|
||||
label: Phone OS
|
||||
description: What operating system? If Android, is it stock or a custom system?
|
||||
placeholder: e.g. Android 14, iOS 17.4, etc
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: app-version
|
||||
attributes:
|
||||
label: Audiobookshelf App Version
|
||||
description: Please ensure your app is up to date. *If you are using a 3rd-party app, please reach out to them directly.*
|
||||
multiple: true
|
||||
options:
|
||||
- Android App - 0.9.76
|
||||
- iOS App - 0.9.76
|
||||
- Android App - 0.9.75
|
||||
- iOS App - 0.9.75
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: install-source
|
||||
attributes:
|
||||
label: Installation Source
|
||||
multiple: true
|
||||
options:
|
||||
- Google Play Store
|
||||
- Testflight
|
||||
- SideStore
|
||||
- Other (List in "Additional Notes")
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: additional-notes
|
||||
attributes:
|
||||
label: Additional Notes
|
||||
description: Anything else you want to add?
|
||||
placeholder: 'e.g. I have tried X, Y, and Z.'
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
labels: enhancement
|
||||
|
||||
---
|
||||
|
||||
### Is your feature request related to a problem? Please describe.
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
### Describe the solution you'd like
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
### Describe alternatives you've considered
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
### Additional context
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@@ -0,0 +1,57 @@
|
||||
name: 🚀 App Feature Request
|
||||
description: Request a feature/enhancement
|
||||
title: '[Enhancement]: '
|
||||
labels: ['enhancement']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: '## App Feature Request Description'
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: 'Please first search in both issues & discussions for your enhancement and make sure your app is up to date.'
|
||||
- type: textarea
|
||||
id: describe
|
||||
attributes:
|
||||
label: Describe the Feature/Enhancement
|
||||
description: Please help us understand what you want.
|
||||
placeholder: What is your vision?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: the-why
|
||||
attributes:
|
||||
label: Why would this be helpful?
|
||||
description: Please help us understand why this would enhance your experience.
|
||||
placeholder: Explain the "why" or "use case".
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: image
|
||||
attributes:
|
||||
label: Future Implementation (Screenshot)
|
||||
description: Please help us visualize by including a doodle or screenshot.
|
||||
placeholder: How could this look or where could it go?
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: '## App Current Implementation'
|
||||
- type: dropdown
|
||||
id: version
|
||||
attributes:
|
||||
label: Audiobookshelf App Version
|
||||
description: Please ensure your app is up to date. *If you are using a 3rd-party app, please reach out to them directly.*
|
||||
multiple: true
|
||||
options:
|
||||
- Android App - 0.9.76
|
||||
- iOS App - 0.9.76
|
||||
- Android App - 0.9.75
|
||||
- iOS App - 0.9.75
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: current-image
|
||||
attributes:
|
||||
label: Current Implementation (Screenshot)
|
||||
description: What screen were you looking at when you thought of this enhancement?
|
||||
placeholder: If an image is not applicable, please explain why.
|
||||
@@ -0,0 +1,20 @@
|
||||
name: Close fixed issues on release.
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Close issues marked as fixed upon a release.
|
||||
uses: gcampbell-msft/fixed-pending-release@7fa1b75a0c04bcd4b375110522878e5f6100cff5
|
||||
with:
|
||||
label: 'awaiting release'
|
||||
removeLabel: true
|
||||
applyToAll: true
|
||||
message: Fixed in [${releaseTag}](${releaseUrl}).
|
||||
@@ -0,0 +1,28 @@
|
||||
name: Verify all i18n files are alphabetized
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- strings/** # Should only check if any strings changed
|
||||
|
||||
jobs:
|
||||
update_translations:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Check out the repository
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Set up node to run the javascript
|
||||
- name: Set up node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
# The only argument is the `directory`, which is where the i18n files are
|
||||
# stored.
|
||||
- name: Run Update JSON Files action
|
||||
uses: audiobookshelf/audiobookshelf-i18n-updater@v1.3.0
|
||||
with:
|
||||
directory: 'strings/' # Adjust the directory path as needed
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"printWidth": 400,
|
||||
"proseWrap": "never",
|
||||
"trailingComma": "none",
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.html"],
|
||||
"options": {
|
||||
"singleQuote": false,
|
||||
"wrapAttributes": false,
|
||||
"sortAttributes": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"EditorConfig.EditorConfig",
|
||||
"esbenp.prettier-vscode",
|
||||
"octref.vetur"
|
||||
]
|
||||
}
|
||||
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"vetur.format.defaultFormatterOptions": {
|
||||
"prettier": {
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"printWidth": 400,
|
||||
"proseWrap": "never",
|
||||
"trailingComma": "none"
|
||||
},
|
||||
"prettyhtml": {
|
||||
"printWidth": 400,
|
||||
"singleQuote": false,
|
||||
"wrapAttributes": false,
|
||||
"sortAttributes": false
|
||||
}
|
||||
},
|
||||
"editor.formatOnSave": true,
|
||||
"editor.detectIndentation": true,
|
||||
"editor.tabSize": 2,
|
||||
"javascript.format.semicolons": "remove",
|
||||
"[javascript][json][jsonc]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[vue]": {
|
||||
"editor.defaultFormatter": "octref.vetur"
|
||||
}
|
||||
}
|
||||
@@ -28,13 +28,13 @@ android {
|
||||
kotlinOptions {
|
||||
freeCompilerArgs = ['-Xjvm-default=all']
|
||||
}
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
defaultConfig {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
defaultConfig {
|
||||
applicationId "com.audiobookshelf.app"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 104
|
||||
versionName "0.9.73-beta"
|
||||
versionCode 108
|
||||
versionName "0.9.77-beta"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
manifestPlaceholders = [
|
||||
"appAuthRedirectScheme": "com.audiobookshelf.app"
|
||||
@@ -64,8 +64,6 @@ repositories {
|
||||
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
|
||||
}
|
||||
mavenCentral()
|
||||
// TODO: Temporarily using SNAPSHOT version of Simple Storage that resolves https://github.com/anggrayudi/SimpleStorage/issues/133
|
||||
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
|
||||
}
|
||||
|
||||
configurations.configureEach {
|
||||
@@ -120,7 +118,7 @@ dependencies {
|
||||
implementation 'io.github.pilgr:paperdb:2.7.2'
|
||||
|
||||
// Simple Storage
|
||||
implementation "com.anggrayudi:storage:1.5.5-SNAPSHOT"
|
||||
implementation "com.anggrayudi:storage:1.5.6"
|
||||
|
||||
// OK HTTP
|
||||
implementation 'com.squareup.okhttp3:okhttp:4.9.2'
|
||||
|
||||
@@ -10,6 +10,7 @@ android {
|
||||
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
|
||||
dependencies {
|
||||
implementation project(':byteowls-capacitor-filesharer')
|
||||
implementation project(':capacitor-community-volume-buttons')
|
||||
implementation project(':capacitor-app')
|
||||
implementation project(':capacitor-browser')
|
||||
implementation project(':capacitor-clipboard')
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
<!-- Permissions -->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
"pkg": "@byteowls/capacitor-filesharer",
|
||||
"classpath": "com.byteowls.capacitor.filesharer.FileSharerPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor-community/volume-buttons",
|
||||
"classpath": "com.ryltsov.alex.plugins.volume.buttons.VolumeButtonsPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor/app",
|
||||
"classpath": "com.capacitorjs.plugins.app.AppPlugin"
|
||||
|
||||
@@ -96,7 +96,7 @@ class Podcast(
|
||||
@JsonIgnore
|
||||
fun addEpisode(audioTrack:AudioTrack, episode:PodcastEpisode):PodcastEpisode {
|
||||
val localEpisodeId = "local_ep_" + episode.id
|
||||
val newEpisode = PodcastEpisode(localEpisodeId,(episodes?.size ?: 0) + 1,episode.episode,episode.episodeType,episode.title,episode.subtitle,episode.description,null,null,null,audioTrack,episode.chapters,audioTrack.duration,0, episode.id, localEpisodeId)
|
||||
val newEpisode = PodcastEpisode(localEpisodeId,(episodes?.size ?: 0) + 1,episode.episode,episode.episodeType,episode.title,episode.subtitle,episode.description,null,null,null,audioTrack,episode.chapters,audioTrack.duration,episode.size, episode.id, localEpisodeId)
|
||||
episodes?.add(newEpisode)
|
||||
|
||||
var index = 1
|
||||
|
||||
@@ -20,6 +20,14 @@ enum class ShakeSensitivitySetting {
|
||||
VERY_LOW, LOW, MEDIUM, HIGH, VERY_HIGH
|
||||
}
|
||||
|
||||
enum class DownloadUsingCellularSetting {
|
||||
ASK, ALWAYS, NEVER
|
||||
}
|
||||
|
||||
enum class StreamingUsingCellularSetting {
|
||||
ASK, ALWAYS, NEVER
|
||||
}
|
||||
|
||||
data class ServerConnectionConfig(
|
||||
var id:String,
|
||||
var index:Int,
|
||||
@@ -123,7 +131,9 @@ data class DeviceSettings(
|
||||
var sleepTimerLength: Long, // Time in milliseconds
|
||||
var disableSleepTimerFadeOut: Boolean,
|
||||
var disableSleepTimerResetFeedback: Boolean,
|
||||
var languageCode: String
|
||||
var languageCode: String,
|
||||
var downloadUsingCellular: DownloadUsingCellularSetting,
|
||||
var streamingUsingCellular: StreamingUsingCellularSetting
|
||||
) {
|
||||
companion object {
|
||||
// Static method to get default device settings
|
||||
@@ -147,7 +157,9 @@ data class DeviceSettings(
|
||||
autoSleepTimerAutoRewindTime = 300000L, // 5 minutes
|
||||
disableSleepTimerFadeOut = false,
|
||||
disableSleepTimerResetFeedback = false,
|
||||
languageCode = "en-us"
|
||||
languageCode = "en-us",
|
||||
downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS,
|
||||
streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import com.audiobookshelf.app.device.DeviceManager
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
|
||||
import com.audiobookshelf.app.player.PLAYMETHOD_LOCAL
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@@ -78,6 +79,27 @@ class LocalLibraryItem(
|
||||
}
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
fun hasTracks(episode:PodcastEpisode?): Boolean {
|
||||
var audioTracks = media.getAudioTracks() as MutableList<AudioTrack>
|
||||
if (episode != null) { // Get podcast episode audio track
|
||||
episode.audioTrack?.let { at -> mutableListOf(at) }?.let { tracks -> audioTracks = tracks }
|
||||
}
|
||||
if (audioTracks.size == 0) return false
|
||||
audioTracks.forEach {
|
||||
// Check that metadata is not null
|
||||
if (it.metadata === null) {
|
||||
return false
|
||||
}
|
||||
// Check that file exists
|
||||
val file = File(it.metadata!!.path)
|
||||
if (!file.exists()) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
fun getPlaybackSession(episode:PodcastEpisode?, deviceInfo:DeviceInfo):PlaybackSession {
|
||||
val localEpisodeId = episode?.id
|
||||
|
||||
@@ -53,6 +53,14 @@ object DeviceManager {
|
||||
if (deviceData.deviceSettings?.languageCode == null) {
|
||||
deviceData.deviceSettings?.languageCode = "en-us"
|
||||
}
|
||||
|
||||
if (deviceData.deviceSettings?.downloadUsingCellular == null) {
|
||||
deviceData.deviceSettings?.downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS
|
||||
}
|
||||
|
||||
if (deviceData.deviceSettings?.streamingUsingCellular == null) {
|
||||
deviceData.deviceSettings?.streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS
|
||||
}
|
||||
}
|
||||
|
||||
fun getBase64Id(id:String):String {
|
||||
|
||||
@@ -70,6 +70,7 @@ class FolderScanner(var ctx: Context) {
|
||||
)
|
||||
localLibraryItem.localFiles.add(localFile)
|
||||
|
||||
val trackFileMetadata = FileMetadata(file.name, file.extension, file.absolutePath, file.getBasePath(ctx), file.length())
|
||||
// Create new audio track
|
||||
val track = AudioTrack(
|
||||
audioTrackFromServer.index,
|
||||
@@ -78,7 +79,7 @@ class FolderScanner(var ctx: Context) {
|
||||
localFile.filename ?: "",
|
||||
localFile.contentUrl,
|
||||
localFile.mimeType ?: "",
|
||||
null,
|
||||
trackFileMetadata,
|
||||
true,
|
||||
localFileId,
|
||||
null,
|
||||
@@ -274,7 +275,8 @@ class FolderScanner(var ctx: Context) {
|
||||
localLibraryItem.localFiles.add(localFile)
|
||||
|
||||
// Create new audio track
|
||||
val track = AudioTrack(audioTrackFromServer.index, audioTrackFromServer.startOffset, audioTrackFromServer.duration, localFile.filename ?: "", localFile.contentUrl, localFile.mimeType ?: "", null, true, localFileId, null, audioTrackFromServer.index)
|
||||
val trackFileMetadata = FileMetadata(docFile.name ?: "", docFile.extension ?: "", docFile.getAbsolutePath(ctx), docFile.getBasePath(ctx), docFile.length())
|
||||
val track = AudioTrack(audioTrackFromServer.index, audioTrackFromServer.startOffset, audioTrackFromServer.duration, localFile.filename ?: "", localFile.contentUrl, localFile.mimeType ?: "", trackFileMetadata, true, localFileId, null, audioTrackFromServer.index)
|
||||
audioTracks.add(track)
|
||||
|
||||
Log.d(tag, "scanDownloadItem: Created Audio Track with index ${track.index} from local file ${localFile.absolutePath}")
|
||||
|
||||
+2
-4
@@ -15,8 +15,6 @@ import com.google.android.exoplayer2.Player
|
||||
import com.google.android.exoplayer2.ui.PlayerNotificationManager
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
const val NOTIFICATION_LARGE_ICON_SIZE = 144 // px
|
||||
|
||||
class AbMediaDescriptionAdapter constructor(private val controller: MediaControllerCompat, private val playerNotificationService: PlayerNotificationService) : PlayerNotificationManager.MediaDescriptionAdapter {
|
||||
private val tag = "MediaDescriptionAdapter"
|
||||
|
||||
@@ -77,7 +75,7 @@ class AbMediaDescriptionAdapter constructor(private val controller: MediaControl
|
||||
.load(uri)
|
||||
.placeholder(R.drawable.icon)
|
||||
.error(R.drawable.icon)
|
||||
.submit(NOTIFICATION_LARGE_ICON_SIZE, NOTIFICATION_LARGE_ICON_SIZE)
|
||||
.submit()
|
||||
.get()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
@@ -85,7 +83,7 @@ class AbMediaDescriptionAdapter constructor(private val controller: MediaControl
|
||||
Glide.with(playerNotificationService)
|
||||
.asBitmap()
|
||||
.load(Uri.parse("android.resource://${BuildConfig.APPLICATION_ID}/" + R.drawable.icon))
|
||||
.submit(NOTIFICATION_LARGE_ICON_SIZE, NOTIFICATION_LARGE_ICON_SIZE)
|
||||
.submit()
|
||||
.get()
|
||||
}
|
||||
}
|
||||
|
||||
+8
-6
@@ -34,6 +34,7 @@ import com.audiobookshelf.app.managers.SleepTimerManager
|
||||
import com.audiobookshelf.app.media.MediaManager
|
||||
import com.audiobookshelf.app.media.MediaProgressSyncer
|
||||
import com.audiobookshelf.app.server.ApiHandler
|
||||
import com.audiobookshelf.app.BuildConfig
|
||||
import com.google.android.exoplayer2.*
|
||||
import com.google.android.exoplayer2.audio.AudioAttributes
|
||||
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
|
||||
@@ -319,11 +320,10 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
val mediaDescriptionBuilder = MediaDescriptionCompat.Builder()
|
||||
.setExtras(extra)
|
||||
.setTitle(currentPlaybackSession!!.displayTitle)
|
||||
.setIconUri(coverUri)
|
||||
|
||||
bitmap?.let {
|
||||
mediaDescriptionBuilder.setIconBitmap(it)
|
||||
}
|
||||
} ?: mediaDescriptionBuilder.setIconUri(coverUri)
|
||||
|
||||
return mediaDescriptionBuilder.build()
|
||||
}
|
||||
@@ -887,16 +887,18 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
|
||||
fun closePlayback(calledOnError:Boolean? = false) {
|
||||
Log.d(tag, "closePlayback")
|
||||
val config = DeviceManager.serverConnectionConfig
|
||||
|
||||
val isLocal = mediaProgressSyncer.currentIsLocal
|
||||
val currentSessionId = mediaProgressSyncer.currentSessionId
|
||||
if (mediaProgressSyncer.listeningTimerRunning) {
|
||||
Log.i(tag, "About to close playback so stopping media progress syncer first")
|
||||
|
||||
mediaProgressSyncer.stop(calledOnError == false) { // If closing on error then do not sync progress (causes exception)
|
||||
Log.d(tag, "Media Progress syncer stopped")
|
||||
|
||||
// If not local session then close on server
|
||||
if (!isLocal && currentSessionId != "") {
|
||||
apiHandler.closePlaybackSession(currentSessionId) {
|
||||
apiHandler.closePlaybackSession(currentSessionId, config) {
|
||||
Log.d(tag, "Closed playback session $currentSessionId")
|
||||
}
|
||||
}
|
||||
@@ -904,7 +906,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
} else {
|
||||
// If not local session then close on server
|
||||
if (!isLocal && currentSessionId != "") {
|
||||
apiHandler.closePlaybackSession(currentSessionId) {
|
||||
apiHandler.closePlaybackSession(currentSessionId, config) {
|
||||
Log.d(tag, "Closed playback session $currentSessionId")
|
||||
}
|
||||
}
|
||||
@@ -947,7 +949,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
||||
appVersion: 0.9.46-beta
|
||||
*/
|
||||
val deviceId = Settings.Secure.getString(ctx.contentResolver, Settings.Secure.ANDROID_ID)
|
||||
return DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, Build.VERSION.RELEASE)
|
||||
return DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME)
|
||||
}
|
||||
|
||||
private val deviceSettings get() = DeviceManager.deviceData.deviceSettings ?: DeviceSettings.default()
|
||||
|
||||
@@ -198,6 +198,9 @@ class AbsAudioPlayer : Plugin() {
|
||||
return call.resolve(JSObject("{\"error\":\"Podcast episode not found\"}"))
|
||||
}
|
||||
}
|
||||
if (!it.hasTracks(episode)) {
|
||||
return call.resolve(JSObject("{\"error\":\"No audio files found on device. Download book again to fix.\"}"))
|
||||
}
|
||||
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
Log.d(tag, "prepareLibraryItem: Preparing Local Media item ${jacksonMapper.writeValueAsString(it)}")
|
||||
|
||||
@@ -196,7 +196,11 @@ class AbsFileSystem : Plugin() {
|
||||
if (localLibraryItem?.folderId?.startsWith("internal-") == true) {
|
||||
Log.d(tag, "Deleting internal library item at absolutePath $absolutePath")
|
||||
val file = File(absolutePath)
|
||||
success = file.deleteRecursively()
|
||||
success = if (file.exists()) {
|
||||
file.deleteRecursively()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
var subfolderPathToDelete = ""
|
||||
localLibraryItem?.folderId?.let { folderId ->
|
||||
@@ -218,7 +222,12 @@ class AbsFileSystem : Plugin() {
|
||||
}
|
||||
|
||||
val docfile = DocumentFileCompat.fromUri(mainActivity, Uri.parse(contentUrl))
|
||||
success = docfile?.delete() == true
|
||||
if (docfile?.exists() == true) {
|
||||
success = docfile.delete() == true
|
||||
} else {
|
||||
Log.d(tag, "Folder $contentUrl doesn't exist")
|
||||
success = true
|
||||
}
|
||||
|
||||
if (subfolderPathToDelete != "") {
|
||||
Log.d(tag, "Deleting empty subfolder at $subfolderPathToDelete")
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.audiobookshelf.app.media.MediaEventManager
|
||||
import com.audiobookshelf.app.media.MediaProgressSyncData
|
||||
import com.audiobookshelf.app.media.SyncResult
|
||||
import com.audiobookshelf.app.models.User
|
||||
import com.audiobookshelf.app.BuildConfig
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
|
||||
import com.fasterxml.jackson.core.json.JsonReadFeature
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
@@ -43,10 +44,17 @@ class ApiHandler(var ctx:Context) {
|
||||
val address = config?.address ?: DeviceManager.serverAddress
|
||||
val token = config?.token ?: DeviceManager.token
|
||||
|
||||
val request = Request.Builder()
|
||||
.url("${address}$endpoint").addHeader("Authorization", "Bearer $token")
|
||||
.build()
|
||||
makeRequest(request, httpClient, cb)
|
||||
try {
|
||||
val request = Request.Builder()
|
||||
.url("${address}$endpoint").addHeader("Authorization", "Bearer $token")
|
||||
.build()
|
||||
makeRequest(request, httpClient, cb)
|
||||
} catch(e: Exception) {
|
||||
e.printStackTrace()
|
||||
val jsobj = JSObject()
|
||||
jsobj.put("error", "Request failed: ${e.message}")
|
||||
cb(jsobj)
|
||||
}
|
||||
}
|
||||
|
||||
private fun postRequest(endpoint:String, payload: JSObject?, config:ServerConnectionConfig?, cb: (JSObject) -> Unit) {
|
||||
@@ -56,23 +64,38 @@ class ApiHandler(var ctx:Context) {
|
||||
val requestBody = payload?.toString()?.toRequestBody(mediaType) ?: EMPTY_REQUEST
|
||||
val requestUrl = "${address}$endpoint"
|
||||
Log.d(tag, "postRequest to $requestUrl")
|
||||
val request = Request.Builder().post(requestBody)
|
||||
.url(requestUrl).addHeader("Authorization", "Bearer ${token}")
|
||||
.build()
|
||||
makeRequest(request, null, cb)
|
||||
try {
|
||||
val request = Request.Builder().post(requestBody)
|
||||
.url(requestUrl).addHeader("Authorization", "Bearer ${token}")
|
||||
.build()
|
||||
makeRequest(request, null, cb)
|
||||
} catch(e: Exception) {
|
||||
e.printStackTrace()
|
||||
val jsobj = JSObject()
|
||||
jsobj.put("error", "Request failed: ${e.message}")
|
||||
cb(jsobj)
|
||||
}
|
||||
}
|
||||
|
||||
private fun patchRequest(endpoint:String, payload: JSObject, cb: (JSObject) -> Unit) {
|
||||
val mediaType = "application/json; charset=utf-8".toMediaType()
|
||||
val requestBody = payload.toString().toRequestBody(mediaType)
|
||||
val request = Request.Builder().patch(requestBody)
|
||||
.url("${DeviceManager.serverAddress}$endpoint").addHeader("Authorization", "Bearer ${DeviceManager.token}")
|
||||
.build()
|
||||
makeRequest(request, null, cb)
|
||||
try {
|
||||
val request = Request.Builder().patch(requestBody)
|
||||
.url("${DeviceManager.serverAddress}$endpoint").addHeader("Authorization", "Bearer ${DeviceManager.token}")
|
||||
.build()
|
||||
makeRequest(request, null, cb)
|
||||
} catch(e: Exception) {
|
||||
e.printStackTrace()
|
||||
val jsobj = JSObject()
|
||||
jsobj.put("error", "Request failed: ${e.message}")
|
||||
cb(jsobj)
|
||||
}
|
||||
}
|
||||
|
||||
private fun makeRequest(request:Request, httpClient:OkHttpClient?, cb: (JSObject) -> Unit) {
|
||||
val client = httpClient ?: defaultClient
|
||||
|
||||
client.newCall(request).enqueue(object : Callback {
|
||||
override fun onFailure(call: Call, e: IOException) {
|
||||
Log.d(tag, "FAILURE TO CONNECT")
|
||||
@@ -296,9 +319,9 @@ class ApiHandler(var ctx:Context) {
|
||||
}
|
||||
}
|
||||
|
||||
fun closePlaybackSession(playbackSessionId:String, cb: (Boolean) -> Unit) {
|
||||
fun closePlaybackSession(playbackSessionId:String, config:ServerConnectionConfig?, cb: (Boolean) -> Unit) {
|
||||
Log.d(tag, "closePlaybackSession: playbackSessionId=$playbackSessionId")
|
||||
postRequest("/api/session/$playbackSessionId/close", null, null) {
|
||||
postRequest("/api/session/$playbackSessionId/close", null, config) {
|
||||
cb(true)
|
||||
}
|
||||
}
|
||||
@@ -327,7 +350,7 @@ class ApiHandler(var ctx:Context) {
|
||||
fun sendSyncLocalSessions(playbackSessions:List<PlaybackSession>, cb: (Boolean, String?) -> Unit) {
|
||||
@SuppressLint("HardwareIds")
|
||||
val deviceId = Settings.Secure.getString(ctx.contentResolver, Settings.Secure.ANDROID_ID)
|
||||
val deviceInfo = DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, Build.VERSION.RELEASE)
|
||||
val deviceInfo = DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME)
|
||||
|
||||
val payload = JSObject(jacksonMapper.writeValueAsString(LocalSessionsSyncRequestPayload(playbackSessions, deviceInfo)))
|
||||
Log.d(tag, "Sending ${playbackSessions.size} saved local playback sessions to server")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.20'
|
||||
ext.kotlin_version = '2.0.0'
|
||||
|
||||
repositories {
|
||||
google()
|
||||
|
||||
@@ -5,6 +5,9 @@ project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/
|
||||
include ':byteowls-capacitor-filesharer'
|
||||
project(':byteowls-capacitor-filesharer').projectDir = new File('../node_modules/@byteowls/capacitor-filesharer/android')
|
||||
|
||||
include ':capacitor-community-volume-buttons'
|
||||
project(':capacitor-community-volume-buttons').projectDir = new File('../node_modules/@capacitor-community/volume-buttons/android')
|
||||
|
||||
include ':capacitor-app'
|
||||
project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
ext {
|
||||
minSdkVersion = 24
|
||||
compileSdkVersion = 34
|
||||
targetSdkVersion = 33
|
||||
targetSdkVersion = 34
|
||||
androidxActivityVersion = '1.7.0'
|
||||
androidxAppCompatVersion = '1.6.1'
|
||||
androidxAppCompatVersion = '1.7.0'
|
||||
androidxCoordinatorLayoutVersion = '1.2.0'
|
||||
androidxCoreVersion = '1.10.0'
|
||||
androidPlayCore = '1.9.0'
|
||||
@@ -13,8 +13,8 @@ ext {
|
||||
androidxEspressoCoreVersion = '3.5.1'
|
||||
cordovaAndroidVersion = '10.1.1'
|
||||
androidx_car_version = '1.0.0-alpha7'
|
||||
androidx_core_ktx_version = '1.12.0'
|
||||
androidx_media_version = '1.6.0'
|
||||
androidx_core_ktx_version = '1.13.1'
|
||||
androidx_media_version = '1.7.0'
|
||||
androidx_preference_version = '1.1.1'
|
||||
androidx_test_runner_version = '1.3.0'
|
||||
arch_lifecycle_version = '2.2.0'
|
||||
@@ -27,7 +27,7 @@ ext {
|
||||
gradle_version = '3.1.4'
|
||||
gson_version = '2.8.5'
|
||||
junit_version = '4.13'
|
||||
kotlin_version = '1.8.10'
|
||||
kotlin_version = '2.0.0'
|
||||
kotlin_coroutines_version = '1.6.4'
|
||||
multidex_version = '1.0.3'
|
||||
play_services_auth_version = '18.1.0'
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<a v-if="showBack" @click="back" class="rounded-full h-10 w-10 flex items-center justify-center mr-2 cursor-pointer">
|
||||
<span class="material-icons text-3xl text-fg">arrow_back</span>
|
||||
</a>
|
||||
<div v-if="user && currentLibrary && networkConnected">
|
||||
<div v-if="user && currentLibrary && socketConnected">
|
||||
<div class="pl-1.5 pr-2.5 py-2 bg-bg bg-opacity-30 rounded-md flex items-center" @click="clickShowLibraryModal">
|
||||
<ui-library-icon :icon="currentLibraryIcon" :size="4" font-size="base" />
|
||||
<p class="text-sm leading-4 ml-2 mt-0.5 max-w-24 truncate">{{ currentLibraryName }}</p>
|
||||
@@ -54,8 +54,8 @@ export default {
|
||||
this.$store.commit('setCastAvailable', val)
|
||||
}
|
||||
},
|
||||
networkConnected() {
|
||||
return this.$store.state.networkConnected
|
||||
socketConnected() {
|
||||
return this.$store.state.socketConnected
|
||||
},
|
||||
currentLibrary() {
|
||||
return this.$store.getters['libraries/getCurrentLibrary']
|
||||
@@ -160,4 +160,4 @@ export default {
|
||||
transform: translate(10px, 0);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<div id="playerContent" class="playerContainer w-full z-20 absolute bottom-0 left-0 right-0 p-2 pointer-events-auto transition-all" :style="{ backgroundColor: showFullscreen ? '' : coverRgb }" @click="clickContainer">
|
||||
<div v-if="showFullscreen" class="absolute bottom-4 left-0 right-0 w-full pb-4 pt-2 mx-auto px-6" style="max-width: 414px">
|
||||
<div class="flex items-center justify-between pointer-events-auto">
|
||||
<span v-if="!isPodcast && serverLibraryItemId && networkConnected" class="material-icons text-3xl text-fg-muted cursor-pointer" @click="$emit('showBookmarks')">{{ bookmarks.length ? 'bookmark' : 'bookmark_border' }}</span>
|
||||
<span v-if="!isPodcast && serverLibraryItemId && socketConnected" class="material-icons text-3xl text-fg-muted cursor-pointer" @click="$emit('showBookmarks')">{{ bookmarks.length ? 'bookmark' : 'bookmark_border' }}</span>
|
||||
<!-- hidden for podcasts but still using this as a placeholder -->
|
||||
<span v-else class="material-icons text-3xl text-white text-opacity-0">bookmark</span>
|
||||
|
||||
@@ -375,8 +375,8 @@ export default {
|
||||
return secondsRemaining + 's'
|
||||
}
|
||||
},
|
||||
networkConnected() {
|
||||
return this.$store.state.networkConnected
|
||||
socketConnected() {
|
||||
return this.$store.state.socketConnected
|
||||
},
|
||||
mediaId() {
|
||||
if (this.isPodcast || !this.playbackSession) return null
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<script>
|
||||
import { AbsAudioPlayer } from '@/plugins/capacitor'
|
||||
import { Dialog } from '@capacitor/dialog'
|
||||
import CellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
@@ -39,6 +40,7 @@ export default {
|
||||
serverEpisodeId: null
|
||||
}
|
||||
},
|
||||
mixins: [CellularPermissionHelpers],
|
||||
computed: {
|
||||
bookmarks() {
|
||||
if (!this.serverLibraryItemId) return []
|
||||
@@ -193,12 +195,21 @@ export default {
|
||||
const startTime = payload.startTime
|
||||
const startWhenReady = !payload.paused
|
||||
|
||||
const isLocal = libraryItemId.startsWith('local')
|
||||
if (!isLocal) {
|
||||
const hasPermission = await this.checkCellularPermission('streaming')
|
||||
if (!hasPermission) {
|
||||
this.$store.commit('setPlayerDoneStartingPlayback')
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// When playing local library item and can also play this item from the server
|
||||
// then store the server library item id so it can be used if a cast is made
|
||||
const serverLibraryItemId = payload.serverLibraryItemId || null
|
||||
const serverEpisodeId = payload.serverEpisodeId || null
|
||||
|
||||
if (libraryItemId.startsWith('local') && this.$store.state.isCasting) {
|
||||
if (isLocal && this.$store.state.isCasting) {
|
||||
const { value } = await Dialog.confirm({
|
||||
title: 'Warning',
|
||||
message: `Cannot cast downloaded media items. Confirm to close cast and play on your device.`
|
||||
@@ -373,4 +384,4 @@ export default {
|
||||
this.$eventBus.$off('device-focus-update', this.deviceFocused)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -79,7 +79,10 @@ export default {
|
||||
return this.$store.state.serverSettings || {}
|
||||
},
|
||||
username() {
|
||||
return this.user ? this.user.username : ''
|
||||
return this.user?.username || ''
|
||||
},
|
||||
userIsAdminOrUp() {
|
||||
return this.$store.getters['user/getIsAdminOrUp']
|
||||
},
|
||||
navItems() {
|
||||
var items = [
|
||||
@@ -132,6 +135,12 @@ export default {
|
||||
})
|
||||
|
||||
if (this.serverConnectionConfig) {
|
||||
items.push({
|
||||
icon: 'language',
|
||||
text: this.$strings.ButtonGoToWebClient,
|
||||
action: 'openWebClient'
|
||||
})
|
||||
|
||||
items.push({
|
||||
icon: 'login',
|
||||
text: this.$strings.ButtonSwitchServerUser,
|
||||
@@ -151,6 +160,10 @@ export default {
|
||||
if (action === 'logout') {
|
||||
await this.logout()
|
||||
this.$router.push('/connect')
|
||||
} else if (action === 'openWebClient') {
|
||||
this.show = false
|
||||
let path = `/library/${this.$store.state.libraries.currentLibraryId}`
|
||||
await this.$store.dispatch('user/openWebClient', path)
|
||||
}
|
||||
},
|
||||
clickBackground() {
|
||||
@@ -158,6 +171,10 @@ export default {
|
||||
},
|
||||
async logout() {
|
||||
if (this.user) {
|
||||
if (this.$store.getters['getIsPlayerOpen']) {
|
||||
this.$eventBus.$emit('close-stream')
|
||||
}
|
||||
|
||||
await this.$nativeHttp.post('/logout').catch((error) => {
|
||||
console.error('Failed to logout', error)
|
||||
})
|
||||
|
||||
@@ -7,9 +7,12 @@
|
||||
|
||||
<!-- Alternative bookshelf title/author/sort -->
|
||||
<div v-if="isAltViewEnabled" class="absolute left-0 z-50 w-full" :style="{ bottom: `-${titleDisplayBottomOffset}rem` }">
|
||||
<p class="truncate" :style="{ fontSize: 0.9 * sizeMultiplier + 'rem' }">
|
||||
{{ displayTitle }}
|
||||
</p>
|
||||
<div :style="{ fontSize: 0.9 * sizeMultiplier + 'rem' }" class="flex items-center">
|
||||
<p class="truncate" :style="{ fontSize: 0.9 * sizeMultiplier + 'rem' }">
|
||||
{{ displayTitle }}
|
||||
</p>
|
||||
<widgets-explicit-indicator v-if="isExplicit" />
|
||||
</div>
|
||||
<p class="truncate text-fg-muted" :style="{ fontSize: 0.8 * sizeMultiplier + 'rem' }">{{ displayLineTwo || ' ' }}</p>
|
||||
<p v-if="displaySortLine" class="truncate text-fg-muted" :style="{ fontSize: 0.8 * sizeMultiplier + 'rem' }">{{ displaySortLine }}</p>
|
||||
</div>
|
||||
@@ -310,7 +313,7 @@ export default {
|
||||
return !!this.userProgress?.isFinished
|
||||
},
|
||||
showError() {
|
||||
return this.numMissingParts || this.isMissing || this.isInvalid
|
||||
return this.isMissing || this.isInvalid
|
||||
},
|
||||
localLibraryItemId() {
|
||||
if (this.isLocal) return this.libraryItemId
|
||||
@@ -341,9 +344,8 @@ export default {
|
||||
isInvalid() {
|
||||
return this._libraryItem.isInvalid
|
||||
},
|
||||
numMissingParts() {
|
||||
if (this.isPodcast) return 0
|
||||
return this.media.numMissingParts
|
||||
isExplicit() {
|
||||
return !!this.mediaMetadata.explicit
|
||||
},
|
||||
overlayWrapperClasslist() {
|
||||
var classes = []
|
||||
@@ -366,9 +368,6 @@ export default {
|
||||
userCanDownload() {
|
||||
return this.store.getters['user/getUserCanDownload']
|
||||
},
|
||||
userIsRoot() {
|
||||
return this.store.getters['user/getIsRoot']
|
||||
},
|
||||
titleFontSize() {
|
||||
return 0.75 * this.sizeMultiplier
|
||||
},
|
||||
|
||||
@@ -215,7 +215,7 @@ export default {
|
||||
return !!this.userProgress?.isFinished
|
||||
},
|
||||
showError() {
|
||||
return this.numMissingParts || this.isMissing || this.isInvalid
|
||||
return this.isMissing || this.isInvalid
|
||||
},
|
||||
isStreaming() {
|
||||
return this.store.getters['getlibraryItemIdStreaming'] === this.libraryItemId
|
||||
@@ -235,10 +235,6 @@ export default {
|
||||
isInvalid() {
|
||||
return this._libraryItem.isInvalid
|
||||
},
|
||||
numMissingParts() {
|
||||
if (this.isPodcast) return 0
|
||||
return this.media.numMissingParts
|
||||
},
|
||||
store() {
|
||||
return this.$store || this.$nuxt.$store
|
||||
},
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<ui-text-input v-model="password" type="password" :disabled="processing" :placeholder="$strings.LabelPassword" class="w-full mb-2 text-lg" />
|
||||
|
||||
<div class="flex items-center pt-2">
|
||||
<ui-icon-btn v-if="serverConfig.id" small bg-color="error" icon="delete" @click="removeServerConfigClick" />
|
||||
<ui-icon-btn v-if="serverConfig.id" small bg-color="error" icon="delete" type="button" @click="removeServerConfigClick" />
|
||||
<div class="flex-grow" />
|
||||
<ui-btn :disabled="processing || !networkConnected" type="submit" class="mt-1 h-10">{{ networkConnected ? $strings.ButtonSubmit : $strings.MessageNoNetworkConnection }}</ui-btn>
|
||||
</div>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
</div>
|
||||
<span class="material-icons px-2" @click="showSortModal = true">sort</span>
|
||||
</template>
|
||||
<span v-if="seriesBookPage" class="material-icons px-2" @click="downloadSeries">download</span>
|
||||
<span v-if="(page == 'library' && isBookLibrary) || seriesBookPage" class="material-icons px-2" @click="showMoreMenuDialog = true">more_vert</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -64,14 +65,14 @@ export default {
|
||||
return this.$route.query || {}
|
||||
},
|
||||
entityTitle() {
|
||||
if (this.isPodcast) return this.$strings.LabelPodcasts
|
||||
if (this.page === 'library') return this.$strings.LabelBooks
|
||||
else if (this.page === 'series') {
|
||||
if (this.page === 'library') {
|
||||
return this.isPodcast ? this.$strings.LabelPodcasts : this.$strings.LabelBooks
|
||||
} else if (this.page === 'playlists') {
|
||||
return this.$strings.ButtonPlaylists
|
||||
} else if (this.page === 'series') {
|
||||
return this.$strings.LabelSeries
|
||||
} else if (this.page === 'collections') {
|
||||
return this.$strings.ButtonCollections
|
||||
} else if (this.page === 'playlists') {
|
||||
return this.$strings.ButtonPlaylists
|
||||
} else if (this.page === 'authors') {
|
||||
return this.$strings.LabelAuthors
|
||||
}
|
||||
@@ -144,6 +145,10 @@ export default {
|
||||
async changeView() {
|
||||
this.bookshelfListView = !this.bookshelfListView
|
||||
await this.$hapticsImpact()
|
||||
},
|
||||
downloadSeries() {
|
||||
console.log('Download Series click')
|
||||
this.$eventBus.$emit('download-series-click')
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
||||
@@ -210,7 +210,7 @@ export default {
|
||||
]
|
||||
},
|
||||
sublistItems() {
|
||||
return (this[this.sublist] || []).map((item) => {
|
||||
const sublistItems = (this[this.sublist] || []).map((item) => {
|
||||
if (typeof item === 'string') {
|
||||
return {
|
||||
text: item,
|
||||
@@ -223,6 +223,13 @@ export default {
|
||||
}
|
||||
}
|
||||
})
|
||||
if (this.sublist === 'series') {
|
||||
sublistItems.unshift({
|
||||
text: this.$strings.MessageNoSeries,
|
||||
value: this.$encode('no-series')
|
||||
})
|
||||
}
|
||||
return sublistItems
|
||||
},
|
||||
filterData() {
|
||||
return this.$store.state.libraries.filterData || {}
|
||||
|
||||
@@ -135,6 +135,14 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isConnectedToServer) {
|
||||
items.push({
|
||||
text: this.$strings.ButtonGoToWebClient,
|
||||
value: 'openWebClient',
|
||||
icon: 'language'
|
||||
})
|
||||
}
|
||||
|
||||
if (!this.episode) {
|
||||
items.push({
|
||||
text: this.$strings.LabelMoreInfo,
|
||||
@@ -285,6 +293,8 @@ export default {
|
||||
this.clickRSSFeed()
|
||||
} else if (action === 'sendEbook') {
|
||||
this.showSendEbookDevicesModal = true
|
||||
} else if (action === 'openWebClient') {
|
||||
this.$store.dispatch('user/openWebClient', `/item/${this.serverLibraryItemId}`)
|
||||
}
|
||||
},
|
||||
async toggleFinished() {
|
||||
@@ -481,8 +491,8 @@ export default {
|
||||
this.$emit('update:processing', true)
|
||||
let url = `/api/playlists/${this.playlist.id}/item/${this.serverLibraryItemId}`
|
||||
if (this.serverEpisodeId) url += `/${this.serverEpisodeId}`
|
||||
this.$axios
|
||||
.$delete(url)
|
||||
this.$nativeHttp
|
||||
.delete(url)
|
||||
.then(() => {
|
||||
this.$toast.success('Item removed from playlist')
|
||||
})
|
||||
|
||||
@@ -63,6 +63,10 @@ export default {
|
||||
{
|
||||
text: this.$strings.LabelFileModified,
|
||||
value: 'mtimeMs'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelRandomly,
|
||||
value: 'random'
|
||||
}
|
||||
],
|
||||
podcastItems: [
|
||||
@@ -89,6 +93,10 @@ export default {
|
||||
{
|
||||
text: this.$strings.LabelFileModified,
|
||||
value: 'mtimeMs'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelRandomly,
|
||||
value: 'random'
|
||||
}
|
||||
],
|
||||
episodeItems: [
|
||||
|
||||
@@ -71,7 +71,7 @@ export default {
|
||||
}
|
||||
},
|
||||
rates() {
|
||||
return [0.5, 1, 1.2, 1.5, 2, 3]
|
||||
return [0.5, 1, 1.2, 1.5, 1.7, 2, 3]
|
||||
},
|
||||
canIncrement() {
|
||||
return this.playbackRate + 0.1 <= this.MAX_SPEED
|
||||
|
||||
@@ -6,13 +6,7 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div
|
||||
class="w-full h-full overflow-hidden absolute top-0 left-0 flex items-center justify-center"
|
||||
@click="
|
||||
show = false
|
||||
manualTimerModal = false
|
||||
"
|
||||
>
|
||||
<div class="w-full h-full overflow-hidden absolute top-0 left-0 flex items-center justify-center" @click="show = false">
|
||||
<div class="w-full overflow-x-hidden overflow-y-auto bg-primary rounded-lg border border-border" style="max-height: 75%" @click.stop>
|
||||
<div v-if="manualTimerModal" class="p-4">
|
||||
<div class="flex mb-4" @click="manualTimerModal = false">
|
||||
@@ -71,7 +65,7 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
manualTimerModal: null,
|
||||
manualTimerModal: false,
|
||||
manualTimeoutMin: 1
|
||||
}
|
||||
},
|
||||
@@ -81,6 +75,9 @@ export default {
|
||||
return this.value
|
||||
},
|
||||
set(val) {
|
||||
if (!val) {
|
||||
this.manualTimerModal = false
|
||||
}
|
||||
this.$emit('input', val)
|
||||
}
|
||||
},
|
||||
|
||||
@@ -349,7 +349,7 @@ export default {
|
||||
}
|
||||
},
|
||||
parseFilenames(filenames) {
|
||||
const acceptableImages = ['.jpeg', '.jpg', '.png']
|
||||
const acceptableImages = ['.jpeg', '.jpg', '.png', '.webp']
|
||||
var imageFiles = filenames.filter((f) => {
|
||||
return acceptableImages.includes((Path.extname(f) || '').toLowerCase())
|
||||
})
|
||||
|
||||
@@ -34,16 +34,18 @@ export default {
|
||||
currentLocationNum: 0,
|
||||
currentLocationCfi: null,
|
||||
inittingDisplay: true,
|
||||
isRefreshingUI: false,
|
||||
ereaderSettings: {
|
||||
theme: 'dark',
|
||||
fontScale: 100,
|
||||
lineSpacing: 115
|
||||
lineSpacing: 115,
|
||||
textStroke: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
isPlayerOpen() {
|
||||
this.updateHeight()
|
||||
this.refreshUI()
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -112,7 +114,8 @@ export default {
|
||||
'*': {
|
||||
color: `${fontColor}!important`,
|
||||
'background-color': `${backgroundColor}!important`,
|
||||
'line-height': this.ereaderSettings.lineSpacing + '%!important'
|
||||
'line-height': this.ereaderSettings.lineSpacing + '%!important',
|
||||
'-webkit-text-stroke': this.ereaderSettings.textStroke/100 + 'px ' + fontColor + '!important'
|
||||
},
|
||||
a: {
|
||||
color: `${fontColor}!important`
|
||||
@@ -135,11 +138,6 @@ export default {
|
||||
goToChapter(href) {
|
||||
return this.rendition?.display(href)
|
||||
},
|
||||
updateHeight() {
|
||||
if (this.rendition && this.rendition.resize) {
|
||||
this.rendition.resize(window.innerWidth, window.innerHeight - this.readerHeightOffset)
|
||||
}
|
||||
},
|
||||
prev() {
|
||||
if (this.rendition) {
|
||||
this.rendition.prev()
|
||||
@@ -382,14 +380,54 @@ export default {
|
||||
this.rendition.getContents().forEach((c) => {
|
||||
c.addStylesheetRules(this.themeRules)
|
||||
})
|
||||
},
|
||||
async screenOrientationChange() {
|
||||
if (this.isRefreshingUI) return
|
||||
this.isRefreshingUI = true
|
||||
const windowWidth = window.innerWidth
|
||||
this.refreshUI()
|
||||
|
||||
// Window width does not always change right away. Wait up to 250ms for a change.
|
||||
// iPhone 10 on iOS 16 took between 100 - 200ms to update when going from portrait to landscape
|
||||
// but landscape to portrait was immediate
|
||||
for (let i = 0; i < 5; i++) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
||||
if (window.innerWidth !== windowWidth) {
|
||||
this.refreshUI()
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
this.isRefreshingUI = false
|
||||
},
|
||||
refreshUI() {
|
||||
if (this.rendition?.resize) {
|
||||
this.rendition.resize(window.innerWidth, window.innerHeight - this.readerHeightOffset)
|
||||
}
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.book?.destroy()
|
||||
},
|
||||
mounted() {
|
||||
this.initEpub()
|
||||
}
|
||||
|
||||
if (screen.orientation) {
|
||||
// Not available on ios
|
||||
screen.orientation.addEventListener('change', this.screenOrientationChange)
|
||||
} else {
|
||||
document.addEventListener('orientationchange', this.screenOrientationChange)
|
||||
}
|
||||
window.addEventListener('resize', this.screenOrientationChange)
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.book?.destroy()
|
||||
|
||||
if (screen.orientation) {
|
||||
// Not available on ios
|
||||
screen.orientation.removeEventListener('change', this.screenOrientationChange)
|
||||
} else {
|
||||
document.removeEventListener('orientationchange', this.screenOrientationChange)
|
||||
}
|
||||
window.removeEventListener('resize', this.screenOrientationChange)
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -404,4 +442,4 @@ export default {
|
||||
max-height: calc(100% - 132px);
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div class="h-full flex items-center justify-center">
|
||||
<div :style="{ width: pdfWidth + 'px', height: pdfHeight + 'px' }" class="w-full h-full overflow-auto">
|
||||
<div v-if="loadedRatio > 0 && loadedRatio < 1" style="background-color: green; color: white; text-align: center" :style="{ width: loadedRatio * 100 + '%' }">{{ Math.floor(loadedRatio * 100) }}%</div>
|
||||
<pdf ref="pdf" class="m-auto z-10 border border-black border-opacity-20 shadow-md bg-white" :src="pdfDocInitParams" :page="page" :rotate="rotate" @progress="loadedRatio = $event" @error="error" @num-pages="numPagesLoaded" @link-clicked="page = $event" @loaded="loadedEvt"></pdf>
|
||||
<pdf v-if="pdfDocInitParams" ref="pdf" class="m-auto z-10 border border-black border-opacity-20 shadow-md bg-white" :src="pdfDocInitParams" :page="page" :rotate="rotate" @progress="loadedRatio = $event" @error="error" @num-pages="numPagesLoaded" @link-clicked="page = $event" @loaded="loadedEvt"></pdf>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -48,7 +48,8 @@ export default {
|
||||
page: 1,
|
||||
numPages: 0,
|
||||
windowWidth: 0,
|
||||
windowHeight: 0
|
||||
windowHeight: 0,
|
||||
pdfDocInitParams: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -106,14 +107,6 @@ export default {
|
||||
if (!this.userItemProgress?.ebookLocation || isNaN(this.userItemProgress.ebookLocation)) return 0
|
||||
return Number(this.userItemProgress.ebookLocation)
|
||||
},
|
||||
pdfDocInitParams() {
|
||||
return {
|
||||
url: this.url,
|
||||
httpHeaders: {
|
||||
Authorization: `Bearer ${this.userToken}`
|
||||
}
|
||||
}
|
||||
},
|
||||
isPlayerOpen() {
|
||||
return this.$store.getters['getIsPlayerOpen']
|
||||
}
|
||||
@@ -157,6 +150,8 @@ export default {
|
||||
}
|
||||
},
|
||||
numPagesLoaded(e) {
|
||||
if (!e) return
|
||||
|
||||
this.numPages = e
|
||||
},
|
||||
prev() {
|
||||
@@ -175,6 +170,14 @@ export default {
|
||||
screenOrientationChange() {
|
||||
this.windowWidth = window.innerWidth
|
||||
this.windowHeight = window.innerHeight
|
||||
},
|
||||
init() {
|
||||
this.pdfDocInitParams = {
|
||||
url: this.url,
|
||||
httpHeaders: {
|
||||
Authorization: `Bearer ${this.userToken}`
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@@ -188,6 +191,8 @@ export default {
|
||||
document.addEventListener('orientationchange', this.screenOrientationChange)
|
||||
}
|
||||
window.addEventListener('resize', this.screenOrientationChange)
|
||||
|
||||
this.init()
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (screen.orientation) {
|
||||
@@ -199,4 +204,4 @@ export default {
|
||||
window.removeEventListener('resize', this.screenOrientationChange)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
<!-- ereader settings modal -->
|
||||
<modals-fullscreen-modal v-model="showSettingsModal" :theme="ereaderTheme" half-screen>
|
||||
<div style="box-shadow: 0px -8px 8px #11111155">
|
||||
<div class="flex items-end justify-between h-20 px-4 pb-2 mb-6">
|
||||
<div class="flex items-end justify-between h-14 px-4 pb-2 mb-6">
|
||||
<h1 class="text-lg">{{ $strings.HeaderEreaderSettings }}</h1>
|
||||
<button class="flex" @click="showSettingsModal = false">
|
||||
<span class="material-icons">close</span>
|
||||
@@ -82,12 +82,24 @@
|
||||
</div>
|
||||
<ui-range-input v-model="ereaderSettings.lineSpacing" :min="100" :max="300" :step="5" input-width="180px" @input="settingsUpdated" />
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<div class="flex items-center mb-6">
|
||||
<div class="w-32">
|
||||
<p class="text-base">{{ $strings.LabelFontBoldness }}:</p>
|
||||
</div>
|
||||
<ui-range-input v-model="ereaderSettings.textStroke" :min="0" :max="300" :step="5" input-width="180px" @input="settingsUpdated" />
|
||||
</div>
|
||||
<div class="flex items-center mb-6">
|
||||
<div class="w-32">
|
||||
<p class="text-base">{{ $strings.LabelLayout }}:</p>
|
||||
</div>
|
||||
<ui-toggle-btns v-model="ereaderSettings.spread" :items="spreadItems" @input="settingsUpdated" />
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<div class="w-32">
|
||||
<p class="text-base">{{ $strings.LabelNavigateWithVolume }}:</p>
|
||||
</div>
|
||||
<ui-toggle-btns v-model="ereaderSettings.navigateWithVolume" :items="navigateWithVolumeItems" @input="settingsUpdated" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -97,6 +109,7 @@
|
||||
|
||||
<script>
|
||||
import { Capacitor } from '@capacitor/core'
|
||||
import { VolumeButtons } from '@capacitor-community/volume-buttons'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
@@ -112,11 +125,14 @@ export default {
|
||||
showSettingsModal: false,
|
||||
comicHasMetadata: false,
|
||||
chapters: [],
|
||||
isInittingWatchVolume: false,
|
||||
ereaderSettings: {
|
||||
theme: 'dark',
|
||||
fontScale: 100,
|
||||
lineSpacing: 115,
|
||||
spread: 'auto'
|
||||
spread: 'auto',
|
||||
textStroke: 0,
|
||||
navigateWithVolume: 'enabled'
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -127,13 +143,17 @@ export default {
|
||||
this.comicHasMetadata = false
|
||||
this.registerListeners()
|
||||
this.hideToolbar()
|
||||
|
||||
console.log('showReader for ebookFile', JSON.stringify(this.ebookFile))
|
||||
} else {
|
||||
this.unregisterListeners()
|
||||
this.$showHideStatusBar(true)
|
||||
}
|
||||
}
|
||||
},
|
||||
isPlayerOpen(newVal, oldVal) {
|
||||
// Closed player
|
||||
if (!newVal && oldVal) {
|
||||
this.initWatchVolume()
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -173,6 +193,22 @@ export default {
|
||||
}
|
||||
]
|
||||
},
|
||||
navigateWithVolumeItems() {
|
||||
return [
|
||||
{
|
||||
text: this.$strings.LabelNavigateWithVolumeEnabled,
|
||||
value: 'enabled'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelNavigateWithVolumeMirrored,
|
||||
value: 'mirrored'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelNavigateWithVolumeDisabled,
|
||||
value: 'none'
|
||||
}
|
||||
]
|
||||
},
|
||||
themeItems() {
|
||||
return [
|
||||
{
|
||||
@@ -257,6 +293,8 @@ export default {
|
||||
settingsUpdated() {
|
||||
this.$refs.readerComponent?.updateSettings?.(this.ereaderSettings)
|
||||
localStorage.setItem('ereaderSettings', JSON.stringify(this.ereaderSettings))
|
||||
|
||||
this.initWatchVolume()
|
||||
},
|
||||
goToChapter(href) {
|
||||
this.showTOCModal = false
|
||||
@@ -369,31 +407,71 @@ export default {
|
||||
try {
|
||||
const settings = localStorage.getItem('ereaderSettings')
|
||||
if (settings) {
|
||||
const ereaderSettings = JSON.parse(settings)
|
||||
if (!ereaderSettings.spread) {
|
||||
// Added in 0.9.71
|
||||
ereaderSettings.spread = 'auto'
|
||||
const _ereaderSettings = JSON.parse(settings)
|
||||
for (const key in this.ereaderSettings) {
|
||||
if (_ereaderSettings[key] !== undefined) {
|
||||
this.ereaderSettings[key] = _ereaderSettings[key]
|
||||
}
|
||||
}
|
||||
this.ereaderSettings = ereaderSettings
|
||||
this.settingsUpdated()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load ereader settings', error)
|
||||
}
|
||||
},
|
||||
async initWatchVolume() {
|
||||
if (this.isInittingWatchVolume || !this.isEpub) return
|
||||
this.isInittingWatchVolume = true
|
||||
const isWatching = await VolumeButtons.isWatching()
|
||||
|
||||
if (this.ereaderSettings.navigateWithVolume !== 'none' && !this.isPlayerOpen) {
|
||||
if (!isWatching.value) {
|
||||
const options = {
|
||||
disableSystemVolumeHandler: true,
|
||||
suppressVolumeIndicator: true
|
||||
}
|
||||
await VolumeButtons.watchVolume(options, this.volumePressed)
|
||||
}
|
||||
} else if (isWatching.value) {
|
||||
await VolumeButtons.clearWatch().catch((error) => {
|
||||
console.error('Failed to clear volume watch', error)
|
||||
})
|
||||
}
|
||||
|
||||
this.isInittingWatchVolume = false
|
||||
},
|
||||
registerListeners() {
|
||||
this.$eventBus.$on('close-ebook', this.closeEvt)
|
||||
document.body.addEventListener('touchstart', this.touchstart)
|
||||
document.body.addEventListener('touchend', this.touchend)
|
||||
this.initWatchVolume()
|
||||
},
|
||||
unregisterListeners() {
|
||||
this.$eventBus.$on('close-ebook', this.closeEvt)
|
||||
document.body.removeEventListener('touchstart', this.touchstart)
|
||||
document.body.removeEventListener('touchend', this.touchend)
|
||||
VolumeButtons.clearWatch().catch((error) => {
|
||||
console.error('Failed to clear volume watch', error)
|
||||
})
|
||||
},
|
||||
volumePressed(e) {
|
||||
if (this.ereaderSettings.navigateWithVolume == 'enabled') {
|
||||
if (e.direction == 'up') {
|
||||
this.prev()
|
||||
} else {
|
||||
this.next()
|
||||
}
|
||||
} else if (this.ereaderSettings.navigateWithVolume == 'mirrored') {
|
||||
if (e.direction == 'down') {
|
||||
this.prev()
|
||||
} else {
|
||||
this.next()
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.unregisterListeners()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
|
||||
<script>
|
||||
import { AbsFileSystem, AbsDownloader } from '@/plugins/capacitor'
|
||||
import cellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
|
||||
|
||||
export default {
|
||||
props: {
|
||||
@@ -73,6 +74,7 @@ export default {
|
||||
},
|
||||
isLocal: Boolean
|
||||
},
|
||||
mixins: [cellularPermissionHelpers],
|
||||
data() {
|
||||
return {
|
||||
isProcessingReadUpdate: false,
|
||||
@@ -180,6 +182,9 @@ export default {
|
||||
async downloadClick() {
|
||||
if (this.downloadItem || this.startingDownload) return
|
||||
|
||||
const hasPermission = await this.checkCellularPermission('download')
|
||||
if (!hasPermission) return
|
||||
|
||||
this.startingDownload = true
|
||||
setTimeout(() => {
|
||||
this.startingDownload = false
|
||||
|
||||
@@ -101,8 +101,8 @@ export default {
|
||||
isAdminOrUp() {
|
||||
return this.$store.getters['user/getIsAdminOrUp']
|
||||
},
|
||||
networkConnected() {
|
||||
return this.$store.state.networkConnected
|
||||
socketConnected() {
|
||||
return this.$store.state.socketConnected
|
||||
},
|
||||
libraryItemId() {
|
||||
return this.libraryItem?.id || null
|
||||
@@ -233,7 +233,7 @@ export default {
|
||||
}
|
||||
},
|
||||
async searchEpisodes() {
|
||||
if (!this.networkConnected) {
|
||||
if (!this.socketConnected) {
|
||||
return this.$toast.error(this.$strings.MessageNoNetworkConnection)
|
||||
}
|
||||
|
||||
@@ -314,4 +314,4 @@ export default {
|
||||
this.$socket.$off('episode_download_finished', this.episodeDownloadFinished)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -6,8 +6,11 @@
|
||||
<covers-preview-cover :src="$store.getters['globals/getLibraryItemCoverSrcById'](libraryItemId)" :width="40" :book-cover-aspect-ratio="bookCoverAspectRatio" :show-resolution="false" class="md:hidden" />
|
||||
</div>
|
||||
<div class="flex-grow px-2">
|
||||
<div class="-mt-0.5 mb-0.5" @click.stop>
|
||||
<nuxt-link :to="`/item/${libraryItemId}`" class="text-sm text-fg underline">{{ podcast.metadata.title }}</nuxt-link>
|
||||
<div class="flex items-center">
|
||||
<div class="-mt-0.5 mb-0.5" @click.stop>
|
||||
<nuxt-link :to="`/item/${libraryItemId}`" class="text-sm text-fg underline">{{ podcast.metadata.title }}</nuxt-link>
|
||||
</div>
|
||||
<widgets-explicit-indicator v-if="podcast.metadata.explicit" />
|
||||
</div>
|
||||
<p v-if="publishedAt" class="text-xs text-fg-muted">{{ $dateDistanceFromNow(publishedAt) }}</p>
|
||||
</div>
|
||||
@@ -58,6 +61,7 @@
|
||||
|
||||
<script>
|
||||
import { AbsFileSystem, AbsDownloader } from '@/plugins/capacitor'
|
||||
import CellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
|
||||
|
||||
export default {
|
||||
props: {
|
||||
@@ -80,6 +84,7 @@ export default {
|
||||
processing: false
|
||||
}
|
||||
},
|
||||
mixins: [CellularPermissionHelpers],
|
||||
computed: {
|
||||
bookCoverAspectRatio() {
|
||||
return this.$store.getters['libraries/getBookCoverAspectRatio']
|
||||
@@ -184,6 +189,10 @@ export default {
|
||||
},
|
||||
async downloadClick() {
|
||||
if (this.downloadItem || this.pendingDownload) return
|
||||
|
||||
const hasPermission = await this.checkCellularPermission('download')
|
||||
if (!hasPermission) return
|
||||
|
||||
this.pendingDownload = true
|
||||
await this.$hapticsImpact()
|
||||
if (this.isIos) {
|
||||
@@ -259,7 +268,6 @@ export default {
|
||||
|
||||
if (this.localEpisode && this.localLibraryItemId) {
|
||||
console.log('Play local episode', this.localEpisode.id, this.localLibraryItemId)
|
||||
|
||||
this.$eventBus.$emit('play-item', {
|
||||
libraryItemId: this.localLibraryItemId,
|
||||
episodeId: this.localEpisode.id,
|
||||
@@ -282,7 +290,11 @@ export default {
|
||||
const isFinished = !this.userIsFinished
|
||||
const localLibraryItemId = this.isLocal ? this.libraryItemId : this.localLibraryItemId
|
||||
const localEpisodeId = this.isLocal ? this.episode.id : this.localEpisode.id
|
||||
const payload = await this.$db.updateLocalMediaProgressFinished({ localLibraryItemId, localEpisodeId, isFinished })
|
||||
const payload = await this.$db.updateLocalMediaProgressFinished({
|
||||
localLibraryItemId,
|
||||
localEpisodeId,
|
||||
isFinished
|
||||
})
|
||||
console.log('toggleFinished payload', JSON.stringify(payload))
|
||||
if (payload?.error) {
|
||||
this.$toast.error(payload?.error || 'Unknown error')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<button class="icon-btn rounded-md flex items-center justify-center h-9 w-9 relative" @mousedown.prevent :disabled="disabled || loading" :class="className" @click="clickBtn">
|
||||
<button class="icon-btn rounded-md flex items-center justify-center h-9 w-9 relative" :disabled="disabled || loading" :class="className" :type="type" @mousedown.prevent @click="clickBtn">
|
||||
<div v-if="loading" class="text-fg absolute top-0 left-0 w-full h-full flex items-center justify-center text-opacity-100">
|
||||
<svg class="animate-spin" style="width: 24px; height: 24px" viewBox="0 0 24 24">
|
||||
<path fill="currentColor" d="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z" />
|
||||
@@ -13,6 +13,10 @@
|
||||
export default {
|
||||
props: {
|
||||
icon: String,
|
||||
type: {
|
||||
type: String,
|
||||
default: 'button'
|
||||
},
|
||||
disabled: Boolean,
|
||||
bgColor: {
|
||||
type: String,
|
||||
@@ -77,4 +81,4 @@ button.icon-btn:disabled::before {
|
||||
button.icon-btn:disabled span {
|
||||
color: #777;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<div>
|
||||
<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>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
computed: {},
|
||||
methods: {},
|
||||
mounted() {}
|
||||
}
|
||||
</script>
|
||||
@@ -65,6 +65,9 @@
|
||||
E9E8814D28DA6B9000D750C1 /* PlayerTimeUtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E8814C28DA6B9000D750C1 /* PlayerTimeUtilsTests.swift */; };
|
||||
E9E985F828B02D9400957F23 /* PlayerProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E985F728B02D9400957F23 /* PlayerProgress.swift */; };
|
||||
E9FA07E328C82848005520B0 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9FA07E228C82848005520B0 /* Logger.swift */; };
|
||||
EACB38122BCCA1330060DA4A /* AudioPlayerRateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EACB38112BCCA1330060DA4A /* AudioPlayerRateManager.swift */; };
|
||||
EACB38142BCCA1410060DA4A /* LegacyAudioPlayerRateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EACB38132BCCA1410060DA4A /* LegacyAudioPlayerRateManager.swift */; };
|
||||
EACB38162BCCA1500060DA4A /* DefaultedAudioPlayerRateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EACB38152BCCA1500060DA4A /* DefaultedAudioPlayerRateManager.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -142,6 +145,9 @@
|
||||
E9E8814C28DA6B9000D750C1 /* PlayerTimeUtilsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerTimeUtilsTests.swift; sourceTree = "<group>"; };
|
||||
E9E985F728B02D9400957F23 /* PlayerProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerProgress.swift; sourceTree = "<group>"; };
|
||||
E9FA07E228C82848005520B0 /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; };
|
||||
EACB38112BCCA1330060DA4A /* AudioPlayerRateManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioPlayerRateManager.swift; sourceTree = "<group>"; };
|
||||
EACB38132BCCA1410060DA4A /* LegacyAudioPlayerRateManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyAudioPlayerRateManager.swift; sourceTree = "<group>"; };
|
||||
EACB38152BCCA1500060DA4A /* DefaultedAudioPlayerRateManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultedAudioPlayerRateManager.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -183,6 +189,9 @@
|
||||
3ABF6190280432610070250E /* player */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EACB38152BCCA1500060DA4A /* DefaultedAudioPlayerRateManager.swift */,
|
||||
EACB38132BCCA1410060DA4A /* LegacyAudioPlayerRateManager.swift */,
|
||||
EACB38112BCCA1330060DA4A /* AudioPlayerRateManager.swift */,
|
||||
E9E8814828DA641B00D750C1 /* util */,
|
||||
3A200C1427D64D7E00CBF02E /* AudioPlayer.swift */,
|
||||
E9DFCBFA28C28F4A00B36356 /* AudioPlayerSleepTimer.swift */,
|
||||
@@ -521,6 +530,7 @@
|
||||
E9D5506228AC1CC900C746DD /* PlayerState.swift in Sources */,
|
||||
3AD4FCE728043E72006DB301 /* AbsDatabase.m in Sources */,
|
||||
504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
|
||||
EACB38122BCCA1330060DA4A /* AudioPlayerRateManager.swift in Sources */,
|
||||
E9FA07E328C82848005520B0 /* Logger.swift in Sources */,
|
||||
3A90295F280968E700E1D427 /* PlaybackReport.swift in Sources */,
|
||||
E9D5505A28AC1C4500C746DD /* Folder.swift in Sources */,
|
||||
@@ -540,6 +550,7 @@
|
||||
3A200C1527D64D7E00CBF02E /* AudioPlayer.swift in Sources */,
|
||||
E9D5507128AC1EC700C746DD /* DownloadItemPart.swift in Sources */,
|
||||
4D66B956282EE951008272D4 /* AbsFileSystem.m in Sources */,
|
||||
EACB38142BCCA1410060DA4A /* LegacyAudioPlayerRateManager.swift in Sources */,
|
||||
3AFCB5E827EA240D00ECCC05 /* NowPlayingInfo.swift in Sources */,
|
||||
3AB34053280829BF0039308B /* Extensions.swift in Sources */,
|
||||
E9D5505828AC1C1A00C746DD /* Library.swift in Sources */,
|
||||
@@ -548,6 +559,7 @@
|
||||
4DABC04F2B0139CA000F6264 /* User.swift in Sources */,
|
||||
4D66B952282EE822008272D4 /* AbsDownloader.m in Sources */,
|
||||
E9D5506828AC1DC300C746DD /* LocalPodcastEpisode.swift in Sources */,
|
||||
EACB38162BCCA1500060DA4A /* DefaultedAudioPlayerRateManager.swift in Sources */,
|
||||
E9D5505228AC1B5D00C746DD /* Chapter.swift in Sources */,
|
||||
E9D5506028AC1CA900C746DD /* PlaybackMetadata.swift in Sources */,
|
||||
E9D5504828AC1A7A00C746DD /* MediaType.swift in Sources */,
|
||||
@@ -728,12 +740,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 30;
|
||||
CURRENT_PROJECT_VERSION = 34;
|
||||
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 0.9.73;
|
||||
MARKETING_VERSION = 0.9.77;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app.dev;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -752,12 +764,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 30;
|
||||
CURRENT_PROJECT_VERSION = 34;
|
||||
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 0.9.73;
|
||||
MARKETING_VERSION = 0.9.77;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
||||
|
||||
@@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
// Override point for customization after application launch.
|
||||
|
||||
let configuration = Realm.Configuration(
|
||||
schemaVersion: 17,
|
||||
schemaVersion: 18,
|
||||
migrationBlock: { [weak self] migration, oldSchemaVersion in
|
||||
if (oldSchemaVersion < 1) {
|
||||
self?.logger.log("Realm schema version was \(oldSchemaVersion)")
|
||||
@@ -54,6 +54,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
newObject?["chapterTrack"] = false
|
||||
}
|
||||
}
|
||||
if (oldSchemaVersion < 17) {
|
||||
self?.logger.log("Realm schema version was \(oldSchemaVersion)... Adding downloadUsingCellular and streamingUsingCellular settings")
|
||||
migration.enumerateObjects(ofType: PlayerSettings.className()) { oldObject, newObject in
|
||||
newObject?["downloadUsingCellular"] = "ALWAYS"
|
||||
newObject?["streamingUsingCellular"] = "ALWAYS"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
)
|
||||
|
||||
@@ -8,13 +8,16 @@
|
||||
import Foundation
|
||||
import Capacitor
|
||||
import RealmSwift
|
||||
import Network
|
||||
|
||||
@objc(AbsAudioPlayer)
|
||||
public class AbsAudioPlayer: CAPPlugin {
|
||||
private let logger = AppLogger(category: "AbsAudioPlayer")
|
||||
|
||||
|
||||
private var initialPlayWhenReady = false
|
||||
|
||||
private var monitor: NWPathMonitor?
|
||||
private let queue = DispatchQueue.global(qos: .background)
|
||||
|
||||
override public func load() {
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(sendMetadata), name: NSNotification.Name(PlayerEvents.update.rawValue), object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(sendPlaybackClosedEvent), name: NSNotification.Name(PlayerEvents.closed.rawValue), object: nil)
|
||||
@@ -24,20 +27,25 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(sendSleepTimerEnded), name: NSNotification.Name(PlayerEvents.sleepEnded.rawValue), object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(onPlaybackFailed), name: NSNotification.Name(PlayerEvents.failed.rawValue), object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(onLocalMediaProgressUpdate), name: NSNotification.Name(PlayerEvents.localProgress.rawValue), object: nil)
|
||||
|
||||
|
||||
self.bridge?.webView?.allowsBackForwardNavigationGestures = true;
|
||||
self.bridge?.webView?.scrollView.alwaysBounceVertical = false;
|
||||
|
||||
|
||||
setupNetworkMonitor()
|
||||
}
|
||||
|
||||
|
||||
deinit {
|
||||
monitor?.cancel()
|
||||
}
|
||||
|
||||
@objc func onReady(_ call: CAPPluginCall) {
|
||||
// TODO: Was used to notify when Abs UI was ready so that last played media could be opened - this was buggy and removed
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func startPlaybackSession(_ session: PlaybackSession, playWhenReady: Bool, playbackRate: Float) throws {
|
||||
guard let libraryItemId = session.libraryItemId else { throw PlayerError.libraryItemIdNotSpecified }
|
||||
|
||||
|
||||
self.sendPrepareMetadataEvent(itemId: libraryItemId, playWhenReady: playWhenReady)
|
||||
self.sendPlaybackSession(session: try session.asDictionary())
|
||||
PlayerHandler.startPlayback(sessionId: session.id, playWhenReady: playWhenReady, playbackRate: playbackRate)
|
||||
@@ -50,14 +58,14 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
let playWhenReady = call.getBool("playWhenReady", true)
|
||||
let playbackRate = call.getFloat("playbackRate", 1)
|
||||
let startTimeOverride = call.getDouble("startTime")
|
||||
|
||||
|
||||
if libraryItemId == nil {
|
||||
logger.error("provide library item id")
|
||||
return call.resolve()
|
||||
}
|
||||
|
||||
|
||||
PlayerHandler.stopPlayback()
|
||||
|
||||
|
||||
let isLocalItem = libraryItemId?.starts(with: "local_") ?? false
|
||||
if (isLocalItem) {
|
||||
let item = Database.shared.getLocalLibraryItem(localLibraryItemId: libraryItemId!)
|
||||
@@ -66,7 +74,7 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
logger.error("Failed to get local playback session")
|
||||
return call.resolve([:])
|
||||
}
|
||||
|
||||
|
||||
do {
|
||||
if (startTimeOverride != nil) {
|
||||
playbackSession.currentTime = startTimeOverride!
|
||||
@@ -96,14 +104,14 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func closePlayback(_ call: CAPPluginCall) {
|
||||
logger.log("Close playback")
|
||||
|
||||
|
||||
PlayerHandler.stopPlayback()
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func getCurrentTime(_ call: CAPPluginCall) {
|
||||
call.resolve([
|
||||
"value": PlayerHandler.getCurrentTime() ?? 0,
|
||||
@@ -130,7 +138,7 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
PlayerHandler.setChapterTrack()
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func playPlayer(_ call: CAPPluginCall) {
|
||||
PlayerHandler.paused = false
|
||||
call.resolve()
|
||||
@@ -144,7 +152,7 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
PlayerHandler.paused = !PlayerHandler.paused
|
||||
call.resolve([ "playing": !PlayerHandler.paused ])
|
||||
}
|
||||
|
||||
|
||||
@objc func seek(_ call: CAPPluginCall) {
|
||||
PlayerHandler.seek(amount: call.getDouble("value", 0.0))
|
||||
call.resolve()
|
||||
@@ -157,7 +165,7 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
PlayerHandler.seekBackward(amount: call.getDouble("value", 0.0))
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func sendMetadata() {
|
||||
self.notifyListeners("onPlayingUpdate", data: [ "value": !PlayerHandler.paused ])
|
||||
if let metadata = try? PlayerHandler.getMetdata()?.asDictionary() {
|
||||
@@ -167,34 +175,34 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
@objc func sendPlaybackClosedEvent() {
|
||||
self.notifyListeners("onPlaybackClosed", data: [ "value": true ])
|
||||
}
|
||||
|
||||
|
||||
@objc func decreaseSleepTime(_ call: CAPPluginCall) {
|
||||
guard let timeString = call.getString("time") else { return call.resolve([ "success": false ]) }
|
||||
guard let time = Double(timeString) else { return call.resolve([ "success": false ]) }
|
||||
guard let _ = PlayerHandler.getSleepTimeRemaining() else { return call.resolve([ "success": false ]) }
|
||||
|
||||
|
||||
let seconds = time/1000
|
||||
PlayerHandler.decreaseSleepTime(decreaseSeconds: seconds)
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func increaseSleepTime(_ call: CAPPluginCall) {
|
||||
guard let timeString = call.getString("time") else { return call.resolve([ "success": false ]) }
|
||||
guard let time = Double(timeString) else { return call.resolve([ "success": false ]) }
|
||||
guard let _ = PlayerHandler.getSleepTimeRemaining() else { return call.resolve([ "success": false ]) }
|
||||
|
||||
|
||||
let seconds = time/1000
|
||||
PlayerHandler.increaseSleepTime(increaseSeconds: seconds)
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func setSleepTimer(_ call: CAPPluginCall) {
|
||||
guard let timeString = call.getString("time") else { return call.resolve([ "success": false ]) }
|
||||
guard let time = Double(timeString) else { return call.resolve([ "success": false ]) }
|
||||
let isChapterTime = call.getBool("isChapterTime", false)
|
||||
|
||||
|
||||
let seconds = time / 1000
|
||||
|
||||
|
||||
logger.log("chapter time: \(isChapterTime)")
|
||||
if isChapterTime {
|
||||
PlayerHandler.setChapterSleepTime(stopAt: seconds)
|
||||
@@ -204,30 +212,30 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
call.resolve([ "success": true ])
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func cancelSleepTimer(_ call: CAPPluginCall) {
|
||||
PlayerHandler.cancelSleepTime()
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func getSleepTimerTime(_ call: CAPPluginCall) {
|
||||
call.resolve([
|
||||
"value": PlayerHandler.getSleepTimeRemaining() ?? 0
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@objc func sendSleepTimerEnded() {
|
||||
self.notifyListeners("onSleepTimerEnded", data: [
|
||||
"value": PlayerHandler.getCurrentTime() ?? 0
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@objc func sendSleepTimerSet() {
|
||||
self.notifyListeners("onSleepTimerSet", data: [
|
||||
"value": PlayerHandler.getSleepTimeRemaining() ?? 0
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@objc func onLocalMediaProgressUpdate() {
|
||||
guard let localMediaProgressId = PlayerHandler.getPlaybackSession()?.localMediaProgressId else { return }
|
||||
guard let localMediaProgress = Database.shared.getLocalMediaProgress(localMediaProgressId: localMediaProgressId) else { return }
|
||||
@@ -235,7 +243,7 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
logger.log("Sending local progress back to the UI")
|
||||
self.notifyListeners("onLocalMediaProgressUpdate", data: progressUpdate)
|
||||
}
|
||||
|
||||
|
||||
@objc func onPlaybackFailed() {
|
||||
if (PlayerHandler.getPlayMethod() == PlayMethod.directplay.rawValue) {
|
||||
let session = PlayerHandler.getPlaybackSession()
|
||||
@@ -243,7 +251,7 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
let libraryItemId = session?.libraryItemId ?? ""
|
||||
let episodeId = session?.episodeId ?? nil
|
||||
logger.log("Forcing Transcode")
|
||||
|
||||
|
||||
// If direct playing then fallback to transcode
|
||||
ApiClient.startPlaybackSession(libraryItemId: libraryItemId, episodeId: episodeId, forceTranscode: true) { [weak self] session in
|
||||
do {
|
||||
@@ -262,19 +270,38 @@ public class AbsAudioPlayer: CAPPlugin {
|
||||
"value": "Playback Error"
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@objc func sendPrepareMetadataEvent(itemId: String, playWhenReady: Bool) {
|
||||
self.notifyListeners("onPrepareMedia", data: [
|
||||
"audiobookId": itemId,
|
||||
"playWhenReady": playWhenReady,
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@objc func sendPlaybackSession(session: [String: Any]) {
|
||||
self.notifyListeners("onPlaybackSession", data: session)
|
||||
}
|
||||
|
||||
private func setupNetworkMonitor() {
|
||||
monitor = NWPathMonitor()
|
||||
monitor?.pathUpdateHandler = { [weak self] path in
|
||||
guard let self = self else { return }
|
||||
|
||||
let isUnmetered = !path.isExpensive && !path.isConstrained
|
||||
|
||||
DispatchQueue.main.async {
|
||||
self.notifyNetworkMeteredChanged(isUnmetered: isUnmetered)
|
||||
}
|
||||
}
|
||||
monitor?.start(queue: queue)
|
||||
}
|
||||
|
||||
private func notifyNetworkMeteredChanged(isUnmetered: Bool) {
|
||||
let data: [String: Any] = ["value": isUnmetered]
|
||||
self.notifyListeners("onNetworkMeteredChanged", data: data)
|
||||
}
|
||||
}
|
||||
|
||||
enum PlayerError: String, Error {
|
||||
|
||||
@@ -29,20 +29,20 @@ extension String {
|
||||
@objc(AbsDatabase)
|
||||
public class AbsDatabase: CAPPlugin {
|
||||
private let logger = AppLogger(category: "AbsDatabase")
|
||||
|
||||
|
||||
@objc func setCurrentServerConnectionConfig(_ call: CAPPluginCall) {
|
||||
var id = call.getString("id")
|
||||
let address = call.getString("address", "")
|
||||
let userId = call.getString("userId", "")
|
||||
let username = call.getString("username", "")
|
||||
let token = call.getString("token", "")
|
||||
|
||||
|
||||
let name = "\(address) (\(username))"
|
||||
|
||||
|
||||
if id == nil {
|
||||
id = "\(address)@\(username)".toBase64()
|
||||
}
|
||||
|
||||
|
||||
let config = ServerConnectionConfig()
|
||||
config.id = id ?? ""
|
||||
config.index = 0
|
||||
@@ -51,7 +51,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
config.userId = userId
|
||||
config.username = username
|
||||
config.token = token
|
||||
|
||||
|
||||
Store.serverConfig = config
|
||||
let savedConfig = Store.serverConfig // Fetch the latest value
|
||||
call.resolve(convertServerConnectionConfigToJSON(config: savedConfig!))
|
||||
@@ -59,26 +59,26 @@ public class AbsDatabase: CAPPlugin {
|
||||
@objc func removeServerConnectionConfig(_ call: CAPPluginCall) {
|
||||
let id = call.getString("serverConnectionConfigId", "")
|
||||
Database.shared.deleteServerConnectionConfig(id: id)
|
||||
|
||||
|
||||
call.resolve()
|
||||
}
|
||||
@objc func logout(_ call: CAPPluginCall) {
|
||||
Store.serverConfig = nil
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func getDeviceData(_ call: CAPPluginCall) {
|
||||
let configs = Database.shared.getServerConnectionConfigs()
|
||||
let index = Database.shared.getLastActiveConfigIndex()
|
||||
let settings = Database.shared.getDeviceSettings()
|
||||
|
||||
|
||||
call.resolve([
|
||||
"serverConnectionConfigs": configs.map { config in convertServerConnectionConfigToJSON(config: config) },
|
||||
"lastServerConnectionConfigId": configs.first { config in config.index == index }?.id as Any,
|
||||
"deviceSettings": deviceSettingsToJSON(settings: settings)
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@objc func getLocalLibraryItems(_ call: CAPPluginCall) {
|
||||
do {
|
||||
let items = Database.shared.getLocalLibraryItems()
|
||||
@@ -89,7 +89,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
call.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func getLocalLibraryItem(_ call: CAPPluginCall) {
|
||||
do {
|
||||
let item = Database.shared.getLocalLibraryItem(localLibraryItemId: call.getString("id") ?? "")
|
||||
@@ -105,7 +105,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
call.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func getLocalLibraryItemByLId(_ call: CAPPluginCall) {
|
||||
do {
|
||||
let item = Database.shared.getLocalLibraryItem(byServerLibraryItemId: call.getString("libraryItemId") ?? "")
|
||||
@@ -121,11 +121,11 @@ public class AbsDatabase: CAPPlugin {
|
||||
call.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func getLocalLibraryItemsInFolder(_ call: CAPPluginCall) {
|
||||
call.resolve([ "value": [] ])
|
||||
}
|
||||
|
||||
|
||||
@objc func getAllLocalMediaProgress(_ call: CAPPluginCall) {
|
||||
do {
|
||||
call.resolve([ "value": try Database.shared.getAllLocalMediaProgress().asDictionaryArray() ])
|
||||
@@ -135,7 +135,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
call.resolve(["value": []])
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func removeLocalMediaProgress(_ call: CAPPluginCall) {
|
||||
let localMediaProgressId = call.getString("localMediaProgressId")
|
||||
guard let localMediaProgressId = localMediaProgressId else {
|
||||
@@ -145,7 +145,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
try? Database.shared.removeLocalMediaProgress(localMediaProgressId: localMediaProgressId)
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
|
||||
@objc func syncLocalSessionsWithServer(_ call: CAPPluginCall) {
|
||||
let isFirstSync = call.getBool("isFirstSync", false)
|
||||
logger.log("syncLocalSessionsWithServer: Starting (First sync: \(isFirstSync))")
|
||||
@@ -153,19 +153,19 @@ public class AbsDatabase: CAPPlugin {
|
||||
call.reject("syncLocalSessionsWithServer not connected to server")
|
||||
return call.resolve()
|
||||
}
|
||||
|
||||
|
||||
Task {
|
||||
await ApiClient.syncLocalSessionsWithServer(isFirstSync: isFirstSync)
|
||||
call.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func syncServerMediaProgressWithLocalMediaProgress(_ call: CAPPluginCall) {
|
||||
let serverMediaProgress = call.getJson("mediaProgress", type: MediaProgress.self)
|
||||
let localLibraryItemId = call.getString("localLibraryItemId")
|
||||
let localEpisodeId = call.getString("localEpisodeId")
|
||||
let localMediaProgressId = call.getString("localMediaProgressId")
|
||||
|
||||
|
||||
do {
|
||||
guard let serverMediaProgress = serverMediaProgress else {
|
||||
return call.reject("serverMediaProgress not specified")
|
||||
@@ -173,35 +173,35 @@ public class AbsDatabase: CAPPlugin {
|
||||
guard localLibraryItemId != nil || localMediaProgressId != nil else {
|
||||
return call.reject("localLibraryItemId or localMediaProgressId must be specified")
|
||||
}
|
||||
|
||||
|
||||
let localMediaProgress = try LocalMediaProgress.fetchOrCreateLocalMediaProgress(localMediaProgressId: localMediaProgressId, localLibraryItemId: localLibraryItemId, localEpisodeId: localEpisodeId)
|
||||
guard let localMediaProgress = localMediaProgress else {
|
||||
call.reject("Local media progress not found or created")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
logger.log("syncServerMediaProgressWithLocalMediaProgress: Saving local media progress")
|
||||
try localMediaProgress.updateFromServerMediaProgress(serverMediaProgress)
|
||||
|
||||
|
||||
call.resolve(try localMediaProgress.asDictionary())
|
||||
} catch {
|
||||
call.reject("Failed to sync media progress")
|
||||
debugPrint(error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func updateLocalMediaProgressFinished(_ call: CAPPluginCall) {
|
||||
let localLibraryItemId = call.getString("localLibraryItemId")
|
||||
let localEpisodeId = call.getString("localEpisodeId")
|
||||
let isFinished = call.getBool("isFinished", false)
|
||||
|
||||
|
||||
var localMediaProgressId = localLibraryItemId ?? ""
|
||||
if localEpisodeId != nil {
|
||||
localMediaProgressId += "-\(localEpisodeId ?? "")"
|
||||
}
|
||||
|
||||
|
||||
logger.log("updateLocalMediaProgressFinished \(localMediaProgressId) | Is Finished: \(isFinished)")
|
||||
|
||||
|
||||
do {
|
||||
let localMediaProgress = try LocalMediaProgress.fetchOrCreateLocalMediaProgress(localMediaProgressId: localMediaProgressId, localLibraryItemId: localLibraryItemId, localEpisodeId: localEpisodeId)
|
||||
guard let localMediaProgress = localMediaProgress else {
|
||||
@@ -211,11 +211,11 @@ public class AbsDatabase: CAPPlugin {
|
||||
|
||||
// Update finished status
|
||||
try localMediaProgress.updateIsFinished(isFinished)
|
||||
|
||||
|
||||
// Build API response
|
||||
let progressDictionary = try? localMediaProgress.asDictionary()
|
||||
var response: [String: Any] = ["local": true, "server": false, "localMediaProgress": progressDictionary ?? ""]
|
||||
|
||||
|
||||
// Send update to the server if logged in
|
||||
let hasLinkedServer = localMediaProgress.serverConnectionConfigId != nil
|
||||
let loggedIntoServer = Store.serverConfig?.id == localMediaProgress.serverConnectionConfigId
|
||||
@@ -234,7 +234,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc func updateDeviceSettings(_ call: CAPPluginCall) {
|
||||
let disableAutoRewind = call.getBool("disableAutoRewind") ?? false
|
||||
let enableAltView = call.getBool("enableAltView") ?? false
|
||||
@@ -244,6 +244,8 @@ public class AbsDatabase: CAPPlugin {
|
||||
let lockOrientation = call.getString("lockOrientation") ?? "NONE"
|
||||
let hapticFeedback = call.getString("hapticFeedback") ?? "LIGHT"
|
||||
let languageCode = call.getString("languageCode") ?? "en-us"
|
||||
let downloadUsingCellular = call.getString("downloadUsingCellular") ?? "ALWAYS"
|
||||
let streamingUsingCellular = call.getString("streamingUsingCellular") ?? "ALWAYS"
|
||||
let settings = DeviceSettings()
|
||||
settings.disableAutoRewind = disableAutoRewind
|
||||
settings.enableAltView = enableAltView
|
||||
@@ -253,22 +255,24 @@ public class AbsDatabase: CAPPlugin {
|
||||
settings.lockOrientation = lockOrientation
|
||||
settings.hapticFeedback = hapticFeedback
|
||||
settings.languageCode = languageCode
|
||||
|
||||
settings.downloadUsingCellular = downloadUsingCellular
|
||||
settings.streamingUsingCellular = streamingUsingCellular
|
||||
|
||||
Database.shared.setDeviceSettings(deviceSettings: settings)
|
||||
|
||||
|
||||
// Updates the media notification controls (for allowSeekingOnMediaControls setting)
|
||||
PlayerHandler.updateRemoteTransportControls()
|
||||
|
||||
|
||||
getDeviceData(call)
|
||||
}
|
||||
|
||||
|
||||
@objc func updateLocalEbookProgress(_ call: CAPPluginCall) {
|
||||
let localLibraryItemId = call.getString("localLibraryItemId")
|
||||
let ebookLocation = call.getString("ebookLocation", "")
|
||||
let ebookProgress = call.getDouble("ebookProgress", 0.0)
|
||||
|
||||
|
||||
logger.log("updateLocalEbookProgress \(localLibraryItemId ?? "Unknown") | ebookLocation: \(ebookLocation) | ebookProgress: \(ebookProgress)")
|
||||
|
||||
|
||||
do {
|
||||
let localMediaProgress = try LocalMediaProgress.fetchOrCreateLocalMediaProgress(localMediaProgressId: localLibraryItemId, localLibraryItemId: localLibraryItemId, localEpisodeId: nil)
|
||||
guard let localMediaProgress = localMediaProgress else {
|
||||
@@ -278,7 +282,7 @@ public class AbsDatabase: CAPPlugin {
|
||||
|
||||
// Update finished status
|
||||
try localMediaProgress.updateEbookProgress(ebookLocation: ebookLocation, ebookProgress: ebookProgress)
|
||||
|
||||
|
||||
// Build API response
|
||||
let progressDictionary = try? localMediaProgress.asDictionary()
|
||||
let response: [String: Any] = ["localMediaProgress": progressDictionary ?? ""]
|
||||
|
||||
@@ -12,6 +12,7 @@ def capacitor_pods
|
||||
pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
|
||||
pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
|
||||
pod 'ByteowlsCapacitorFilesharer', :path => '../../node_modules/@byteowls/capacitor-filesharer'
|
||||
pod 'CapacitorCommunityVolumeButtons', :path => '../../node_modules/@capacitor-community/volume-buttons'
|
||||
pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app'
|
||||
pod 'CapacitorBrowser', :path => '../../node_modules/@capacitor/browser'
|
||||
pod 'CapacitorClipboard', :path => '../../node_modules/@capacitor/clipboard'
|
||||
|
||||
+13
-7
@@ -2,7 +2,7 @@ PODS:
|
||||
- Alamofire (5.8.1)
|
||||
- ByteowlsCapacitorFilesharer (5.0.0):
|
||||
- Capacitor
|
||||
- Capacitor (5.4.0):
|
||||
- Capacitor (5.6.0):
|
||||
- CapacitorCordova
|
||||
- CapacitorApp (5.0.6):
|
||||
- Capacitor
|
||||
@@ -10,7 +10,9 @@ PODS:
|
||||
- Capacitor
|
||||
- CapacitorClipboard (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorCordova (5.4.0)
|
||||
- CapacitorCommunityVolumeButtons (1.0.2):
|
||||
- Capacitor
|
||||
- CapacitorCordova (5.6.0)
|
||||
- CapacitorDialog (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorHaptics (5.0.6):
|
||||
@@ -21,7 +23,7 @@ PODS:
|
||||
- Capacitor
|
||||
- CapacitorStatusBar (5.0.6):
|
||||
- Capacitor
|
||||
- CordovaPlugins (5.4.0):
|
||||
- CordovaPlugins (5.6.0):
|
||||
- CapacitorCordova
|
||||
- Realm (10.47.0):
|
||||
- Realm/Headers (= 10.47.0)
|
||||
@@ -36,6 +38,7 @@ DEPENDENCIES:
|
||||
- "CapacitorApp (from `../../node_modules/@capacitor/app`)"
|
||||
- "CapacitorBrowser (from `../../node_modules/@capacitor/browser`)"
|
||||
- "CapacitorClipboard (from `../../node_modules/@capacitor/clipboard`)"
|
||||
- "CapacitorCommunityVolumeButtons (from `../../node_modules/@capacitor-community/volume-buttons`)"
|
||||
- "CapacitorCordova (from `../../node_modules/@capacitor/ios`)"
|
||||
- "CapacitorDialog (from `../../node_modules/@capacitor/dialog`)"
|
||||
- "CapacitorHaptics (from `../../node_modules/@capacitor/haptics`)"
|
||||
@@ -62,6 +65,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../../node_modules/@capacitor/browser"
|
||||
CapacitorClipboard:
|
||||
:path: "../../node_modules/@capacitor/clipboard"
|
||||
CapacitorCommunityVolumeButtons:
|
||||
:path: "../../node_modules/@capacitor-community/volume-buttons"
|
||||
CapacitorCordova:
|
||||
:path: "../../node_modules/@capacitor/ios"
|
||||
CapacitorDialog:
|
||||
@@ -80,20 +85,21 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7
|
||||
ByteowlsCapacitorFilesharer: f6a773825632d65d5404a34764c4a3fd857bb176
|
||||
Capacitor: a5cd803e02b471591c81165f400ace01f40b11d3
|
||||
Capacitor: ebfc16cdb8116d04c101686b080342872da42d43
|
||||
CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a
|
||||
CapacitorBrowser: 7a0fb6a1011abfaaf2dfedfd8248f942a8eda3d6
|
||||
CapacitorClipboard: 77edf49827ea21da2a9c05c690a4a6a4d07199c4
|
||||
CapacitorCordova: 66ce22f9976de30fd816f746e9e92e07d6befafd
|
||||
CapacitorCommunityVolumeButtons: 132d27a8e482898e45480b7edc882f3d26a00cb6
|
||||
CapacitorCordova: 931b48fcdbc9bc985fc2f16cec9f77c794a27729
|
||||
CapacitorDialog: 0f3c15dfe9414b83bc64aef4078f1b92bcfead26
|
||||
CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c
|
||||
CapacitorNetwork: d80b3e79bef6ec37640ee2806c19771f07ff2d0c
|
||||
CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10
|
||||
CapacitorStatusBar: 565c0a1ebd79bb40d797606a8992b4a105885309
|
||||
CordovaPlugins: a5db67e5ac1061b9869a0efd754f2c2f776aeccc
|
||||
CordovaPlugins: dae7dac59b3cce58f5a7ce3894709d8f0f824656
|
||||
Realm: e43fb540ae947497e3ea8a662443256920602060
|
||||
RealmSwift: 8b06ed06b5d16749ae0c4d91c0cba414a9e28189
|
||||
|
||||
PODFILE CHECKSUM: 02e6ffe2f51a453ce222ee9af0e55e9448d8514c
|
||||
PODFILE CHECKSUM: d0bbe98fb520752929ffc76e7c901d54b2eed7f0
|
||||
|
||||
COCOAPODS: 1.12.1
|
||||
|
||||
@@ -17,6 +17,8 @@ class DeviceSettings: Object {
|
||||
@Persisted var lockOrientation: String = "NONE"
|
||||
@Persisted var hapticFeedback: String = "LIGHT"
|
||||
@Persisted var languageCode: String = "en-us"
|
||||
@Persisted var downloadUsingCellular: String = "ALWAYS"
|
||||
@Persisted var streamingUsingCellular: String = "ALWAYS"
|
||||
}
|
||||
|
||||
func getDefaultDeviceSettings() -> DeviceSettings {
|
||||
@@ -32,6 +34,8 @@ func deviceSettingsToJSON(settings: DeviceSettings) -> Dictionary<String, Any> {
|
||||
"jumpForwardTime": settings.jumpForwardTime,
|
||||
"lockOrientation": settings.lockOrientation,
|
||||
"hapticFeedback": settings.hapticFeedback,
|
||||
"languageCode": settings.languageCode
|
||||
"languageCode": settings.languageCode,
|
||||
"downloadUsingCellular": settings.downloadUsingCellular,
|
||||
"streamingUsingCellular": settings.streamingUsingCellular
|
||||
]
|
||||
}
|
||||
|
||||
@@ -29,9 +29,7 @@ class AudioPlayer: NSObject {
|
||||
internal let logger = AppLogger(category: "AudioPlayer")
|
||||
|
||||
private var status: PlayerStatus
|
||||
internal var rate: Float
|
||||
|
||||
private var tmpRate: Float = 1.0
|
||||
internal var rateManager: AudioPlayerRateManager
|
||||
|
||||
private var playerContext = 0
|
||||
private var playerItemContext = 0
|
||||
@@ -64,11 +62,18 @@ class AudioPlayer: NSObject {
|
||||
self.audioPlayer.automaticallyWaitsToMinimizeStalling = true
|
||||
self.sessionId = sessionId
|
||||
self.status = .uninitialized
|
||||
self.rate = 0.0
|
||||
self.tmpRate = playbackRate
|
||||
|
||||
if #available(iOS 16.0, *) {
|
||||
self.rateManager = DefaultedAudioPlayerRateManager(audioPlayer: self.audioPlayer, defaultRate: playbackRate)
|
||||
} else {
|
||||
self.rateManager = LegacyAudioPlayerRateManager(audioPlayer: self.audioPlayer, defaultRate: playbackRate)
|
||||
}
|
||||
|
||||
super.init()
|
||||
|
||||
self.rateManager.rateChangedCompletion = self.updateNowPlaying
|
||||
self.rateManager.defaultRateChangedCompletion = self.setupTimeObservers
|
||||
|
||||
initAudioSession()
|
||||
setupRemoteTransportControls()
|
||||
|
||||
@@ -81,7 +86,6 @@ class AudioPlayer: NSObject {
|
||||
|
||||
// Listen to player events
|
||||
self.setupAudioSessionNotifications()
|
||||
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayer.rate), options: .new, context: &playerContext)
|
||||
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayer.currentItem), options: .new, context: &playerContext)
|
||||
|
||||
for track in playbackSession.audioTracks {
|
||||
@@ -150,7 +154,6 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
// Remove observers
|
||||
self.audioPlayer.removeObserver(self, forKeyPath: #keyPath(AVPlayer.rate), context: &playerContext)
|
||||
self.audioPlayer.removeObserver(self, forKeyPath: #keyPath(AVPlayer.currentItem), context: &playerContext)
|
||||
self.removeTimeObservers()
|
||||
|
||||
@@ -332,7 +335,7 @@ class AudioPlayer: NSObject {
|
||||
self.markAudioSessionAs(active: true)
|
||||
DispatchQueue.runOnMainQueue {
|
||||
self.audioPlayer.play()
|
||||
self.audioPlayer.rate = self.tmpRate
|
||||
self.rateManager.handlePlayEvent()
|
||||
}
|
||||
self.status = .playing
|
||||
|
||||
@@ -424,25 +427,8 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
}
|
||||
|
||||
public func setPlaybackRate(_ rate: Float, observed: Bool = false) {
|
||||
let playbackSpeedChanged = rate > 0.0 && rate != self.tmpRate && !(observed && rate == 1)
|
||||
|
||||
if self.audioPlayer.rate != rate {
|
||||
logger.log("setPlaybakRate rate changed from \(self.audioPlayer.rate) to \(rate)")
|
||||
DispatchQueue.runOnMainQueue {
|
||||
self.audioPlayer.rate = rate
|
||||
}
|
||||
}
|
||||
|
||||
self.rate = rate
|
||||
self.updateNowPlaying()
|
||||
|
||||
if playbackSpeedChanged {
|
||||
self.tmpRate = rate
|
||||
|
||||
// Setup the time observer again at the new rate
|
||||
self.setupTimeObservers()
|
||||
}
|
||||
public func setPlaybackRate(_ rate: Float) {
|
||||
self.rateManager.setPlaybackRate(rate)
|
||||
}
|
||||
|
||||
public func setChapterTrack() {
|
||||
@@ -598,6 +584,7 @@ class AudioPlayer: NSObject {
|
||||
let jumpBackwardsTime = deviceSettings.jumpBackwardsTime
|
||||
|
||||
commandCenter.playCommand.isEnabled = true
|
||||
commandCenter.playCommand.removeTarget(nil)
|
||||
commandCenter.playCommand.addTarget { [weak self] event in
|
||||
guard let strongSelf = self else { return .commandFailed }
|
||||
if strongSelf.isPlaying() {
|
||||
@@ -609,6 +596,7 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
commandCenter.pauseCommand.isEnabled = true
|
||||
commandCenter.pauseCommand.removeTarget(nil)
|
||||
commandCenter.pauseCommand.addTarget { [weak self] event in
|
||||
guard let strongSelf = self else { return .commandFailed }
|
||||
if strongSelf.isPlaying() {
|
||||
@@ -620,6 +608,7 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
commandCenter.togglePlayPauseCommand.isEnabled = true
|
||||
commandCenter.togglePlayPauseCommand.removeTarget(nil)
|
||||
commandCenter.togglePlayPauseCommand.addTarget { [weak self] event in
|
||||
guard let strongSelf = self else { return .commandFailed }
|
||||
if strongSelf.isPlaying() {
|
||||
@@ -631,6 +620,7 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
commandCenter.skipForwardCommand.isEnabled = true
|
||||
commandCenter.skipForwardCommand.removeTarget(nil)
|
||||
commandCenter.skipForwardCommand.preferredIntervals = [NSNumber(value: jumpForwardTime)]
|
||||
commandCenter.skipForwardCommand.addTarget { [weak self] event in
|
||||
guard let command = event.command as? MPSkipIntervalCommand else {
|
||||
@@ -643,6 +633,7 @@ class AudioPlayer: NSObject {
|
||||
return .success
|
||||
}
|
||||
commandCenter.skipBackwardCommand.isEnabled = true
|
||||
commandCenter.skipBackwardCommand.removeTarget(nil)
|
||||
commandCenter.skipBackwardCommand.preferredIntervals = [NSNumber(value: jumpBackwardsTime)]
|
||||
commandCenter.skipBackwardCommand.addTarget { [weak self] event in
|
||||
guard let command = event.command as? MPSkipIntervalCommand else {
|
||||
@@ -656,6 +647,7 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
commandCenter.nextTrackCommand.isEnabled = true
|
||||
commandCenter.nextTrackCommand.removeTarget(nil)
|
||||
commandCenter.nextTrackCommand.addTarget { [weak self] _ in
|
||||
guard let currentTime = self?.getCurrentTime() else {
|
||||
return .commandFailed
|
||||
@@ -664,6 +656,7 @@ class AudioPlayer: NSObject {
|
||||
return .success
|
||||
}
|
||||
commandCenter.previousTrackCommand.isEnabled = true
|
||||
commandCenter.previousTrackCommand.removeTarget(nil)
|
||||
commandCenter.previousTrackCommand.addTarget { [weak self] _ in
|
||||
guard let currentTime = self?.getCurrentTime() else {
|
||||
return .commandFailed
|
||||
@@ -673,6 +666,7 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
commandCenter.changePlaybackPositionCommand.isEnabled = deviceSettings.allowSeekingOnMediaControls
|
||||
commandCenter.changePlaybackPositionCommand.removeTarget(nil)
|
||||
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in
|
||||
guard let event = event as? MPChangePlaybackPositionCommandEvent else {
|
||||
return .noSuchContent
|
||||
@@ -690,6 +684,7 @@ class AudioPlayer: NSObject {
|
||||
}
|
||||
|
||||
commandCenter.changePlaybackRateCommand.isEnabled = true
|
||||
commandCenter.changePlaybackRateCommand.removeTarget(nil)
|
||||
commandCenter.changePlaybackRateCommand.supportedPlaybackRates = [0.5, 0.75, 1.0, 1.25, 1.5, 2]
|
||||
commandCenter.changePlaybackRateCommand.addTarget { [weak self] event in
|
||||
guard let event = event as? MPChangePlaybackRateCommandEvent else {
|
||||
@@ -706,23 +701,21 @@ class AudioPlayer: NSObject {
|
||||
NowPlayingInfo.shared.update(
|
||||
duration: currentChapter.getRelativeChapterEndTime(),
|
||||
currentTime: currentChapter.getRelativeChapterCurrentTime(sessionCurrentTime: session.currentTime),
|
||||
rate: rate,
|
||||
rate: self.rateManager.rate,
|
||||
defaultRate: self.rateManager.defaultRate,
|
||||
chapterName: currentChapter.title,
|
||||
chapterNumber: (session.chapters.firstIndex(of: currentChapter) ?? 0) + 1,
|
||||
chapterCount: session.chapters.count
|
||||
)
|
||||
} else if let duration = self.getDuration(), let currentTime = self.getCurrentTime() {
|
||||
NowPlayingInfo.shared.update(duration: duration, currentTime: currentTime, rate: rate)
|
||||
NowPlayingInfo.shared.update(duration: duration, currentTime: currentTime, rate: self.rateManager.rate, defaultRate: self.rateManager.defaultRate)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Observer
|
||||
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
|
||||
if context == &playerContext {
|
||||
if keyPath == #keyPath(AVPlayer.rate) {
|
||||
logger.log("playerContext observer player rate")
|
||||
self.setPlaybackRate(change?[.newKey] as? Float ?? 1.0, observed: true)
|
||||
} else if keyPath == #keyPath(AVPlayer.currentItem) {
|
||||
if keyPath == #keyPath(AVPlayer.currentItem) {
|
||||
NotificationCenter.default.post(name: NSNotification.Name(PlayerEvents.update.rawValue), object: nil)
|
||||
logger.log("WARNING: Item ended")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// AudioPlayerRateManager.swift
|
||||
// Audiobookshelf
|
||||
//
|
||||
// Created by Marke Hallowell on 4/14/24.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import AVFoundation
|
||||
|
||||
protocol AudioPlayerRateManager {
|
||||
var rate: Float { get }
|
||||
var defaultRate: Float { get }
|
||||
var rateChangedCompletion: () -> Void { get set }
|
||||
var defaultRateChangedCompletion: () -> Void { get set }
|
||||
|
||||
init(audioPlayer: AVPlayer, defaultRate: Float)
|
||||
|
||||
func setPlaybackRate(_ rate: Float)
|
||||
|
||||
// Callback for play events (e.g. LegacyAudioPlayerRateManager uses this set rate immediately after playback resumes)
|
||||
func handlePlayEvent() -> Void
|
||||
}
|
||||
@@ -22,7 +22,7 @@ extension AudioPlayer {
|
||||
// Return the player time until sleep
|
||||
var sleepTimeRemaining: Double? = nil
|
||||
if let chapterStopAt = self.sleepTimeChapterStopAt {
|
||||
sleepTimeRemaining = (chapterStopAt - currentTime) / Double(self.rate > 0 ? self.rate : 1.0)
|
||||
sleepTimeRemaining = (chapterStopAt - currentTime) / Double(self.rateManager.rate > 0 ? self.rateManager.rate : 1.0)
|
||||
} else if self.isCountdownSleepTimerSet() {
|
||||
sleepTimeRemaining = self.sleepTimeRemaining
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
//
|
||||
// DefaultedAudioPlayerRateManager.swift
|
||||
// Audiobookshelf
|
||||
//
|
||||
// Created by Marke Hallowell on 4/14/24.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import AVFoundation
|
||||
|
||||
@available(iOS 16.0, *)
|
||||
class DefaultedAudioPlayerRateManager: NSObject, AudioPlayerRateManager {
|
||||
internal let logger = AppLogger(category: "DefaultedAudioPlayerRateManager")
|
||||
|
||||
internal var audioPlayer: AVPlayer
|
||||
|
||||
// MARK: - AudioPlayerRateManager
|
||||
public private(set) var defaultRate: Float
|
||||
public private(set) var rate: Float
|
||||
public var rateChangedCompletion: () -> Void
|
||||
public var defaultRateChangedCompletion: () -> Void
|
||||
|
||||
required init(audioPlayer: AVPlayer, defaultRate: Float) {
|
||||
self.audioPlayer = audioPlayer
|
||||
self.rateChangedCompletion = {}
|
||||
self.defaultRateChangedCompletion = {}
|
||||
self.rate = self.audioPlayer.rate
|
||||
self.defaultRate = defaultRate
|
||||
self.audioPlayer.defaultRate = defaultRate
|
||||
|
||||
super.init()
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(handleObservedRateChange), name: AVPlayer.rateDidChangeNotification, object: self.audioPlayer)
|
||||
}
|
||||
|
||||
public func setPlaybackRate(_ rate: Float) {
|
||||
self.handlePlaybackRateChange(rate, observed: false)
|
||||
}
|
||||
|
||||
// No-op (player automatically resumes at last-known defaultRate)
|
||||
public func handlePlayEvent() { }
|
||||
|
||||
// MARK: - Destructor
|
||||
public func destroy() {
|
||||
NotificationCenter.default.removeObserver(self, name: AVPlayer.rateDidChangeNotification, object: self.audioPlayer)
|
||||
}
|
||||
|
||||
// MARK: - Internal
|
||||
internal func handlePlaybackRateChange(_ rate: Float, observed: Bool = false) {
|
||||
let playbackSpeedChanged = rate > 0.0 && rate != self.defaultRate
|
||||
|
||||
if playbackSpeedChanged {
|
||||
self.defaultRate = rate
|
||||
self.audioPlayer.defaultRate = rate
|
||||
self.defaultRateChangedCompletion()
|
||||
|
||||
// Check to see if we also need to make a temporary rate change to player
|
||||
if self.audioPlayer.rate > 0.0 {
|
||||
if self.audioPlayer.rate != rate {
|
||||
self.rate = rate
|
||||
self.audioPlayer.rate = rate
|
||||
self.rateChangedCompletion()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.rate = rate
|
||||
self.rateChangedCompletion()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - iOS rate change notification handler
|
||||
@objc internal func handleObservedRateChange(notification: Notification) {
|
||||
// TODO: Consider handling cases individually (e.g. overall session impact?)
|
||||
/*
|
||||
guard let reason = notification.userInfo?[AVPlayer.rateDidChangeReasonKey] as? AVPlayer.RateDidChangeReason else {
|
||||
return
|
||||
}
|
||||
|
||||
switch reason {
|
||||
case .appBackgrounded:
|
||||
// App transitioned to the background.
|
||||
case .audioSessionInterrupted:
|
||||
// The system interrupts the app's audio session.
|
||||
case .setRateCalled:
|
||||
// The app set the player's rate.
|
||||
case .setRateFailed:
|
||||
// An attempt to change the player's rate failed.
|
||||
default:
|
||||
break
|
||||
}
|
||||
*/
|
||||
self.handlePlaybackRateChange(self.audioPlayer.rate, observed: true)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
//
|
||||
// LegacyAudioPlayerRateManager.swift
|
||||
// Audiobookshelf
|
||||
//
|
||||
// Created by Marke Hallowell on 4/14/24.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import AVFoundation
|
||||
|
||||
class LegacyAudioPlayerRateManager: NSObject, AudioPlayerRateManager {
|
||||
internal let logger = AppLogger(category: "AudioPlayer")
|
||||
|
||||
internal var audioPlayer: AVPlayer
|
||||
|
||||
internal var managerContext = 0
|
||||
|
||||
// MARK: - AudioPlayerRateManager
|
||||
public private(set) var defaultRate: Float
|
||||
public private(set) var rate: Float
|
||||
public var rateChangedCompletion: () -> Void
|
||||
public var defaultRateChangedCompletion: () -> Void
|
||||
|
||||
required init(audioPlayer: AVPlayer, defaultRate: Float) {
|
||||
self.rate = 0.0
|
||||
self.defaultRate = defaultRate
|
||||
self.audioPlayer = audioPlayer
|
||||
self.rateChangedCompletion = {}
|
||||
self.defaultRateChangedCompletion = {}
|
||||
|
||||
super.init()
|
||||
|
||||
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayer.rate), options: .new, context: &managerContext)
|
||||
}
|
||||
|
||||
public func setPlaybackRate(_ rate: Float) {
|
||||
self.handlePlaybackRateChange(rate, observed: false)
|
||||
}
|
||||
|
||||
public func handlePlayEvent() {
|
||||
DispatchQueue.runOnMainQueue {
|
||||
self.audioPlayer.rate = self.defaultRate
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Destructor
|
||||
public func destroy() {
|
||||
// Remove Observer
|
||||
self.audioPlayer.removeObserver(self, forKeyPath: #keyPath(AVPlayer.rate), context: &managerContext)
|
||||
}
|
||||
|
||||
// MARK: - Internal
|
||||
internal func handlePlaybackRateChange(_ rate: Float, observed: Bool = false) {
|
||||
let playbackSpeedChanged = rate > 0.0 && rate != self.defaultRate && !(observed && rate == 1)
|
||||
|
||||
if self.audioPlayer.rate != rate {
|
||||
logger.log("setPlaybakRate rate changed from \(self.audioPlayer.rate) to \(rate)")
|
||||
DispatchQueue.runOnMainQueue {
|
||||
self.audioPlayer.rate = rate
|
||||
}
|
||||
}
|
||||
|
||||
self.rate = rate
|
||||
self.rateChangedCompletion()
|
||||
|
||||
if playbackSpeedChanged {
|
||||
self.defaultRate = rate
|
||||
self.defaultRateChangedCompletion()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Observer
|
||||
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
|
||||
if context == &managerContext {
|
||||
if keyPath == #keyPath(AVPlayer.rate) {
|
||||
logger.log("playerContext observer player rate")
|
||||
self.handlePlaybackRateChange(change?[.newKey] as? Float ?? 1.0, observed: true)
|
||||
}
|
||||
} else {
|
||||
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,7 @@ class PlayerHandler {
|
||||
public static var paused: Bool {
|
||||
get {
|
||||
guard let player = player else { return true }
|
||||
return player.rate == 0.0
|
||||
return player.rateManager.rate == 0.0
|
||||
}
|
||||
set(paused) {
|
||||
if paused {
|
||||
|
||||
@@ -53,14 +53,14 @@ class NowPlayingInfo {
|
||||
self.setMetadata(artwork: artwork, metadata: metadata)
|
||||
}
|
||||
}
|
||||
public func update(duration: Double, currentTime: Double, rate: Float, chapterName: String? = nil, chapterNumber: Int? = nil, chapterCount: Int? = nil) {
|
||||
public func update(duration: Double, currentTime: Double, rate: Float, defaultRate: Float, chapterName: String? = nil, chapterNumber: Int? = nil, chapterCount: Int? = nil) {
|
||||
// Update on the main to prevent access collisions
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
if let self = self {
|
||||
self.nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = duration
|
||||
self.nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTime
|
||||
self.nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = rate
|
||||
self.nowPlayingInfo[MPNowPlayingInfoPropertyDefaultPlaybackRate] = 1.0
|
||||
self.nowPlayingInfo[MPNowPlayingInfoPropertyDefaultPlaybackRate] = defaultRate
|
||||
|
||||
|
||||
if let chapterName = chapterName, let chapterNumber = chapterNumber, let chapterCount = chapterCount {
|
||||
|
||||
@@ -177,10 +177,6 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
userLoggedOut() {
|
||||
// Only cancels stream if streamining not playing downloaded
|
||||
this.$eventBus.$emit('close-stream')
|
||||
},
|
||||
socketConnectionFailed(err) {
|
||||
this.$toast.error('Socket connection error: ' + err.message)
|
||||
},
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import { Dialog } from '@capacitor/dialog';
|
||||
|
||||
export default {
|
||||
methods: {
|
||||
async checkCellularPermission(actionType) {
|
||||
if (this.$store.state.networkConnectionType !== 'cellular') return true
|
||||
|
||||
let permission;
|
||||
if (actionType === 'download') {
|
||||
permission = this.$store.getters['getCanDownloadUsingCellular']
|
||||
if (permission === 'NEVER') {
|
||||
this.$toast.error(this.$strings.ToastDownloadNotAllowedOnCellular)
|
||||
return false
|
||||
}
|
||||
} else if (actionType === 'streaming') {
|
||||
permission = this.$store.getters['getCanStreamingUsingCellular']
|
||||
if (permission === 'NEVER') {
|
||||
this.$toast.error(this.$strings.ToastStreamingNotAllowedOnCellular)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if (permission === 'ASK') {
|
||||
const confirmed = await this.confirmAction(actionType)
|
||||
return confirmed
|
||||
}
|
||||
|
||||
return true
|
||||
},
|
||||
async confirmAction(actionType) {
|
||||
const message = actionType === 'download' ?
|
||||
this.$strings.MessageConfirmDownloadUsingCellular :
|
||||
this.$strings.MessageConfirmStreamingUsingCellular
|
||||
|
||||
const { value } = await Dialog.confirm({
|
||||
title: 'Confirm',
|
||||
message
|
||||
})
|
||||
return value
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+16
-3
@@ -1,14 +1,15 @@
|
||||
{
|
||||
"name": "audiobookshelf-app",
|
||||
"version": "0.9.73-beta",
|
||||
"version": "0.9.77-beta",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf-app",
|
||||
"version": "0.9.73-beta",
|
||||
"version": "0.9.77-beta",
|
||||
"dependencies": {
|
||||
"@byteowls/capacitor-filesharer": "^5.0.0",
|
||||
"@capacitor-community/volume-buttons": "^1.0.2",
|
||||
"@capacitor/android": "^5.0.0",
|
||||
"@capacitor/app": "^5.0.6",
|
||||
"@capacitor/browser": "^5.1.0",
|
||||
@@ -1979,6 +1980,18 @@
|
||||
"@capacitor/core": ">=5"
|
||||
}
|
||||
},
|
||||
"node_modules/@capacitor-community/volume-buttons": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@capacitor-community/volume-buttons/-/volume-buttons-1.0.2.tgz",
|
||||
"integrity": "sha512-weEwVCgMEdkYF9uWOeZmA3kXltXSbiGlLPTmygF6NMcL1VUg1vBsiCIaikeI5XRne5V4q8UeEda83EfW7eb46g==",
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@capacitor/core": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@capacitor/android": {
|
||||
"version": "5.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.6.0.tgz",
|
||||
@@ -18622,4 +18635,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "audiobookshelf-app",
|
||||
"version": "0.9.73-beta",
|
||||
"version": "0.9.77-beta",
|
||||
"author": "advplyr",
|
||||
"scripts": {
|
||||
"dev": "nuxt --hostname 0.0.0.0 --port 1337",
|
||||
@@ -14,6 +14,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@byteowls/capacitor-filesharer": "^5.0.0",
|
||||
"@capacitor-community/volume-buttons": "^1.0.2",
|
||||
"@capacitor/android": "^5.0.0",
|
||||
"@capacitor/app": "^5.0.6",
|
||||
"@capacitor/browser": "^5.1.0",
|
||||
@@ -48,4 +49,4 @@
|
||||
"postcss": "^8.4.33",
|
||||
"tailwindcss": "^3.4.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
<template v-if="!showSelectedFeed">
|
||||
<div class="w-full mx-auto h-20 flex items-center px-2">
|
||||
<form class="w-full" @submit.prevent="submit">
|
||||
<ui-text-input v-model="searchInput" :disabled="processing || !networkConnected" placeholder="Enter search term or RSS feed URL" text-size="sm" />
|
||||
<ui-text-input v-model="searchInput" :disabled="processing || !socketConnected" placeholder="Enter search term or RSS feed URL" text-size="sm" />
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div v-if="!networkConnected" class="w-full text-center py-6">
|
||||
<div v-if="!socketConnected" class="w-full text-center py-6">
|
||||
<p class="text-lg text-error">{{ $strings.MessageNoNetworkConnection }}</p>
|
||||
</div>
|
||||
<div v-else class="w-full mx-auto pb-2 overflow-y-auto overflow-x-hidden h-[calc(100%-85px)]">
|
||||
@@ -65,8 +65,8 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
networkConnected() {
|
||||
return this.$store.state.networkConnected
|
||||
socketConnected() {
|
||||
return this.$store.state.socketConnected
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<h1 class="text-xl mb-2 font-semibold">{{ $strings.HeaderLatestEpisodes }}</h1>
|
||||
|
||||
<template v-for="episode in recentEpisodes">
|
||||
<tables-podcast-latest-episode-row :episode="episode" :local-episode="localEpisodeMap[episode.id]" :library-item-id="episode.libraryItemId" :local-library-item-id="null" :is-local="isLocal" :key="episode.id" @addToPlaylist="addEpisodeToPlaylist" />
|
||||
<tables-podcast-latest-episode-row :episode="episode" :local-episode="localEpisodeMap[episode.id]" :library-item-id="episode.libraryItemId" :local-library-item-id="localEpisodeMap[episode.id]?.localLibraryItemId" :key="episode.id" @addToPlaylist="addEpisodeToPlaylist" />
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
@@ -17,7 +17,6 @@ export default {
|
||||
totalEpisodes: 0,
|
||||
currentPage: 0,
|
||||
localLibraryItems: [],
|
||||
isLocal: false,
|
||||
loadedLibraryId: null
|
||||
}
|
||||
},
|
||||
@@ -30,7 +29,10 @@ export default {
|
||||
const episodes = []
|
||||
this.localLibraryItems.forEach((li) => {
|
||||
if (li.media.episodes?.length) {
|
||||
episodes.push(...li.media.episodes)
|
||||
li.media.episodes.map((ep) => {
|
||||
ep.localLibraryItemId = li.id
|
||||
episodes.push(ep)
|
||||
})
|
||||
}
|
||||
})
|
||||
return episodes
|
||||
@@ -106,4 +108,4 @@ export default {
|
||||
this.$eventBus.$off('new-local-library-item', this.newLocalLibraryItem)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<template>
|
||||
<bookshelf-lazy-bookshelf page="series-books" :series-id="seriesId" />
|
||||
<bookshelf-lazy-bookshelf page="series-books" :series-id="seriesId" v-on:downloadSeriesClick="downloadSeriesClick" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Dialog } from '@capacitor/dialog'
|
||||
import { AbsDownloader } from '@/plugins/capacitor'
|
||||
import cellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
|
||||
|
||||
export default {
|
||||
async asyncData({ params, app, store, redirect }) {
|
||||
var series = await app.$nativeHttp.get(`/api/series/${params.id}`).catch((error) => {
|
||||
@@ -19,10 +23,162 @@ export default {
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {}
|
||||
return {
|
||||
startingDownload: false,
|
||||
mediaType: 'book',
|
||||
booksPerFetch: 20,
|
||||
books: 0,
|
||||
missingFiles: 0,
|
||||
missingFilesSize: 0,
|
||||
libraryIds: []
|
||||
}
|
||||
},
|
||||
computed: {},
|
||||
methods: {},
|
||||
mounted() {}
|
||||
mixins: [cellularPermissionHelpers],
|
||||
computed: {
|
||||
isIos() {
|
||||
return this.$platform === 'ios'
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async downloadSeriesClick() {
|
||||
console.log('Download Series clicked')
|
||||
if (this.startingDownload) return
|
||||
|
||||
const hasPermission = await this.checkCellularPermission('download')
|
||||
if (!hasPermission) return
|
||||
|
||||
this.startingDownload = true
|
||||
setTimeout(() => {
|
||||
this.startingDownload = false
|
||||
}, 1000)
|
||||
|
||||
await this.$hapticsImpact()
|
||||
this.download()
|
||||
},
|
||||
buildSearchParams() {
|
||||
let searchParams = new URLSearchParams()
|
||||
searchParams.set('filter', `series.${this.$encode(this.seriesId)}`)
|
||||
return searchParams.toString()
|
||||
},
|
||||
async fetchSeriesEntities(page) {
|
||||
const startIndex = page * this.booksPerFetch
|
||||
|
||||
this.currentSFQueryString = this.buildSearchParams()
|
||||
|
||||
const entityPath = `items`
|
||||
const sfQueryString = this.currentSFQueryString ? this.currentSFQueryString + '&' : ''
|
||||
const fullQueryString = `?${sfQueryString}limit=${this.booksPerFetch}&page=${page}&minified=1&include=rssfeed,numEpisodesIncomplete`
|
||||
|
||||
const payload = await this.$nativeHttp.get(`/api/libraries/${this.series.libraryId}/${entityPath}${fullQueryString}`).catch((error) => {
|
||||
console.error('failed to fetch books', error)
|
||||
return null
|
||||
})
|
||||
|
||||
if (payload && payload.results) {
|
||||
console.log('Received payload', payload)
|
||||
this.books = payload.total
|
||||
|
||||
for (let i = 0; i < payload.results.length; i++) {
|
||||
if (!(await this.$db.getLocalLibraryItem(`local_${payload.results[i].id}`))) {
|
||||
this.missingFiles += payload.results[i].numFiles
|
||||
this.missingFilesSize += payload.results[i].size
|
||||
this.libraryIds.push(payload.results[i].id)
|
||||
}
|
||||
}
|
||||
}
|
||||
let totalPages = Math.ceil(this.books / this.booksPerFetch)
|
||||
if (totalPages > page + 1) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
},
|
||||
async download(selectedLocalFolder = null) {
|
||||
// Get the local folder to download to
|
||||
let localFolder = selectedLocalFolder
|
||||
if (!this.isIos && !localFolder) {
|
||||
const localFolders = (await this.$db.getLocalFolders()) || []
|
||||
console.log('Local folders loaded', localFolders.length)
|
||||
const foldersWithMediaType = localFolders.filter((lf) => {
|
||||
console.log('Checking local folder', lf.mediaType)
|
||||
return lf.mediaType == this.mediaType
|
||||
})
|
||||
console.log('Folders with media type', this.mediaType, foldersWithMediaType.length)
|
||||
const internalStorageFolder = foldersWithMediaType.find((f) => f.id === `internal-${this.mediaType}`)
|
||||
if (!foldersWithMediaType.length) {
|
||||
localFolder = {
|
||||
id: `internal-${this.mediaType}`,
|
||||
name: this.$strings.LabelInternalAppStorage,
|
||||
mediaType: this.mediaType
|
||||
}
|
||||
} else if (foldersWithMediaType.length === 1 && internalStorageFolder) {
|
||||
localFolder = internalStorageFolder
|
||||
} else {
|
||||
this.$store.commit('globals/showSelectLocalFolderModal', {
|
||||
mediaType: this.mediaType,
|
||||
callback: (folder) => {
|
||||
this.download(folder)
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch series data from server
|
||||
let page = 0
|
||||
let fetchFinished = false
|
||||
this.missingFiles = 0
|
||||
this.missingFilesSize = 0
|
||||
while (fetchFinished === false) {
|
||||
fetchFinished = await this.fetchSeriesEntities(page)
|
||||
page += 1
|
||||
}
|
||||
if (fetchFinished !== true) {
|
||||
console.error('failed to fetch series books data')
|
||||
return null
|
||||
}
|
||||
if (this.missingFiles == 0) {
|
||||
alert(this.$getString('MessageSeriesAlreadyDownloaded'))
|
||||
}
|
||||
|
||||
// Format message for dialog
|
||||
let startDownloadMessage = this.$getString('MessageSeriesDownloadConfirmIos', [this.libraryIds.length, this.missingFiles, this.$bytesPretty(this.missingFilesSize)])
|
||||
if (!this.isIos) {
|
||||
startDownloadMessage = this.$getString('MessageSeriesDownloadConfirm', [this.libraryIds.length, this.missingFiles, this.$bytesPretty(this.missingFilesSize), localFolder.name])
|
||||
}
|
||||
|
||||
// Show confirmation dialog and start downloading if user chooses so
|
||||
const { value } = await Dialog.confirm({
|
||||
title: 'Confirm',
|
||||
message: startDownloadMessage
|
||||
})
|
||||
if (value) {
|
||||
for (let i = 0; i < this.libraryIds.length; i++) {
|
||||
this.startDownload(localFolder, this.libraryIds[i])
|
||||
}
|
||||
}
|
||||
this.libraryIds = []
|
||||
},
|
||||
async startDownload(localFolder = null, libraryItemId) {
|
||||
const payload = {
|
||||
libraryItemId: libraryItemId
|
||||
}
|
||||
if (localFolder) {
|
||||
console.log('Starting download to local folder', localFolder.name)
|
||||
payload.localFolderId = localFolder.id
|
||||
}
|
||||
var downloadRes = await AbsDownloader.downloadLibraryItem(payload)
|
||||
if (downloadRes && downloadRes.error) {
|
||||
var errorMsg = downloadRes.error || 'Unknown error'
|
||||
console.error('Download error', errorMsg)
|
||||
this.$toast.error(errorMsg)
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$eventBus.$on('download-series-click', this.downloadSeriesClick)
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.$eventBus.$off('download-series-click', this.downloadSeriesClick)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
+2
-6
@@ -34,11 +34,7 @@ export default {
|
||||
deviceData: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
networkConnected() {
|
||||
return this.$store.state.networkConnected
|
||||
}
|
||||
},
|
||||
computed: {},
|
||||
methods: {
|
||||
async init() {
|
||||
this.deviceData = await this.$db.getDeviceData()
|
||||
@@ -53,4 +49,4 @@ export default {
|
||||
this.init()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div v-if="localLibraryItems.length" class="mt-4 text-sm text-fg-muted">
|
||||
{{ $strings.LabelTotalSize }}: {{ $bytesPretty(localLibraryItems.reduce((acc, item) => acc + item.size, 0)) }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
</ui-btn>
|
||||
</div>
|
||||
|
||||
<p class="text-sm text-fg mt-1.5 mb-0.5 default-style" v-html="description" />
|
||||
<p class="text-sm text-fg mt-1.5 mb-0.5 default-style description-container" v-html="transformedDescription"></p>
|
||||
|
||||
<!-- loading overlay -->
|
||||
<div v-if="processing" class="absolute top-0 left-0 w-full h-full bg-black bg-opacity-30 flex items-center justify-center">
|
||||
@@ -56,6 +56,7 @@
|
||||
import { Capacitor } from '@capacitor/core'
|
||||
import { Dialog } from '@capacitor/dialog'
|
||||
import { AbsFileSystem, AbsDownloader } from '@/plugins/capacitor'
|
||||
import cellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
|
||||
|
||||
export default {
|
||||
async asyncData({ store, params, redirect, app }) {
|
||||
@@ -115,7 +116,11 @@ export default {
|
||||
startingDownload: false
|
||||
}
|
||||
},
|
||||
mixins: [cellularPermissionHelpers],
|
||||
computed: {
|
||||
transformedDescription() {
|
||||
return this.parseDescription(this.description)
|
||||
},
|
||||
bookCoverAspectRatio() {
|
||||
return this.$store.getters['libraries/getBookCoverAspectRatio']
|
||||
},
|
||||
@@ -310,6 +315,24 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
parseDescription(description) {
|
||||
const timeMarkerLinkRegex = /<a href="#([^"]*?\b\d{1,2}:\d{1,2}(?::\d{1,2})?)">(.*?)<\/a>/g
|
||||
const timeMarkerRegex = /\b\d{1,2}:\d{1,2}(?::\d{1,2})?\b/g
|
||||
|
||||
function convertToSeconds(time) {
|
||||
const timeParts = time.split(':').map(Number)
|
||||
return timeParts.reduce((acc, part, index) => acc * 60 + part, 0)
|
||||
}
|
||||
|
||||
return description.replace(timeMarkerLinkRegex, (match, href, displayTime) => {
|
||||
const time = displayTime.match(timeMarkerRegex)[0]
|
||||
const seekTimeInSeconds = convertToSeconds(time)
|
||||
return `<span class="time-marker cursor-pointer text-blue-400 hover:text-blue-300" data-time="${seekTimeInSeconds}">${displayTime}</span>`
|
||||
}).replace(timeMarkerRegex, (match) => {
|
||||
const seekTimeInSeconds = convertToSeconds(match)
|
||||
return `<span class="time-marker cursor-pointer text-blue-400 hover:text-blue-300" data-time="${seekTimeInSeconds}">${match}</span>`
|
||||
})
|
||||
},
|
||||
async deleteLocalEpisode() {
|
||||
await this.$hapticsImpact()
|
||||
|
||||
@@ -351,28 +374,56 @@ export default {
|
||||
} else {
|
||||
this.$store.commit('setPlayerIsStartingPlayback', this.episode.id)
|
||||
|
||||
if (this.localEpisodeId && this.localLibraryItemId && !this.isLocal) {
|
||||
console.log('Play local episode', this.localEpisodeId, this.localLibraryItemId)
|
||||
const playbackData = this.generatePlaybackData()
|
||||
this.emitPlayItemEvent(playbackData)
|
||||
}
|
||||
},
|
||||
async clickPlaybackTime(event) {
|
||||
const startTime = event.target.getAttribute('data-time')
|
||||
if (this.playerIsStartingPlayback) return
|
||||
|
||||
this.$eventBus.$emit('play-item', {
|
||||
libraryItemId: this.localLibraryItemId,
|
||||
episodeId: this.localEpisodeId,
|
||||
serverLibraryItemId: this.serverLibraryItemId,
|
||||
serverEpisodeId: this.serverEpisodeId
|
||||
})
|
||||
} else {
|
||||
this.$eventBus.$emit('play-item', {
|
||||
libraryItemId: this.libraryItemId,
|
||||
episodeId: this.episode.id,
|
||||
serverLibraryItemId: this.serverLibraryItemId,
|
||||
serverEpisodeId: this.serverEpisodeId
|
||||
})
|
||||
}
|
||||
await this.$hapticsImpact()
|
||||
|
||||
this.$store.commit('setPlayerIsStartingPlayback', this.episode.id)
|
||||
|
||||
const playbackData = this.generatePlaybackData(startTime)
|
||||
this.emitPlayItemEvent(playbackData)
|
||||
},
|
||||
generatePlaybackData(startTime) {
|
||||
const playbackData = {
|
||||
libraryItemId: this.libraryItemId,
|
||||
episodeId: this.episode.id,
|
||||
serverLibraryItemId: this.serverLibraryItemId,
|
||||
serverEpisodeId: this.serverEpisodeId,
|
||||
startTime
|
||||
}
|
||||
|
||||
if (this.localEpisodeId && this.localLibraryItemId && !this.isLocal) {
|
||||
playbackData.libraryItemId = this.localLibraryItemId
|
||||
playbackData.episodeId = this.localEpisodeId
|
||||
}
|
||||
|
||||
return playbackData
|
||||
},
|
||||
emitPlayItemEvent(playbackData) {
|
||||
this.$eventBus.$emit('play-item', playbackData)
|
||||
},
|
||||
bindTimeMarkerEvents() {
|
||||
const container = document.querySelector('.description-container')
|
||||
if (container) {
|
||||
container.addEventListener('click', (event) => {
|
||||
if (event.target.classList.contains('time-marker')) {
|
||||
this.clickPlaybackTime(event)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
async downloadClick() {
|
||||
if (this.downloadItem || this.startingDownload) return
|
||||
|
||||
const hasPermission = await this.checkCellularPermission('download')
|
||||
if (!hasPermission) return
|
||||
|
||||
this.startingDownload = true
|
||||
setTimeout(() => {
|
||||
this.startingDownload = false
|
||||
@@ -557,9 +608,13 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.$eventBus.$on('new-local-library-item', this.newLocalLibraryItem)
|
||||
this.bindTimeMarkerEvents()
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.$eventBus.$off('new-local-library-item', this.newLocalLibraryItem)
|
||||
document.querySelectorAll('.time-marker').forEach(marker => {
|
||||
marker.removeEventListener('click', this.clickPlaybackTime)
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -28,7 +28,10 @@
|
||||
<div class="relative z-10 px-3 py-4">
|
||||
<!-- title -->
|
||||
<div class="text-center mb-2">
|
||||
<h1 class="text-xl font-semibold">{{ title }}</h1>
|
||||
<div class="flex items-center justify-center">
|
||||
<h1 class="text-xl font-semibold">{{ title }}</h1>
|
||||
<widgets-explicit-indicator v-if="isExplicit" />
|
||||
</div>
|
||||
<p v-if="subtitle" class="text-fg text-base">{{ subtitle }}</p>
|
||||
</div>
|
||||
|
||||
@@ -168,6 +171,7 @@
|
||||
import { Dialog } from '@capacitor/dialog'
|
||||
import { AbsFileSystem, AbsDownloader } from '@/plugins/capacitor'
|
||||
import { FastAverageColor } from 'fast-average-color'
|
||||
import cellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
|
||||
|
||||
export default {
|
||||
async asyncData({ store, params, redirect, app, query }) {
|
||||
@@ -184,7 +188,7 @@ export default {
|
||||
if (libraryItem?.libraryItemId?.startsWith('li_')) {
|
||||
// Detect old library item id
|
||||
console.error('Local library item has old server library item id', libraryItem.libraryItemId)
|
||||
} else if (query.noredirect !== '1' && libraryItem?.libraryItemId && libraryItem?.serverAddress === store.getters['user/getServerAddress'] && store.state.networkConnected) {
|
||||
} else if (query.noredirect !== '1' && libraryItem?.libraryItemId && libraryItem?.serverAddress === store.getters['user/getServerAddress'] && store.state.socketConnected) {
|
||||
const queryParams = new URLSearchParams()
|
||||
queryParams.set('localLibraryItemId', libraryItemId)
|
||||
if (libraryItem.mediaType === 'podcast') {
|
||||
@@ -218,6 +222,7 @@ export default {
|
||||
startingDownload: false
|
||||
}
|
||||
},
|
||||
mixins: [cellularPermissionHelpers],
|
||||
computed: {
|
||||
isIos() {
|
||||
return this.$platform === 'ios'
|
||||
@@ -436,6 +441,9 @@ export default {
|
||||
isInvalid() {
|
||||
return this.libraryItem.isInvalid
|
||||
},
|
||||
isExplicit() {
|
||||
return !!this.mediaMetadata.explicit
|
||||
},
|
||||
showPlay() {
|
||||
return !this.isMissing && !this.isInvalid && (this.numTracks || this.episodes.length)
|
||||
},
|
||||
@@ -601,9 +609,11 @@ export default {
|
||||
this.download(localFolder)
|
||||
},
|
||||
async downloadClick() {
|
||||
if (this.downloadItem || this.startingDownload) {
|
||||
return
|
||||
}
|
||||
if (this.downloadItem || this.startingDownload) return
|
||||
|
||||
const hasPermission = await this.checkCellularPermission('download')
|
||||
if (!hasPermission) return
|
||||
|
||||
this.startingDownload = true
|
||||
setTimeout(() => {
|
||||
this.startingDownload = false
|
||||
|
||||
@@ -17,7 +17,10 @@
|
||||
|
||||
<div class="w-full max-w-full media-item-container overflow-y-auto overflow-x-hidden relative pb-4" :class="{ 'media-order-changed': orderChanged }">
|
||||
<div v-if="!isPodcast && audioTracksCopy.length" class="w-full py-2">
|
||||
<p class="text-base mb-2">Audio Tracks ({{ audioTracks.length }})</p>
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<p class="text-base">Audio Tracks ({{ audioTracks.length }})</p>
|
||||
<p class="text-xs text-fg-muted px-2">{{ $strings.LabelTotalSize }}: {{ $bytesPretty(totalAudioSize) }}</p>
|
||||
</div>
|
||||
|
||||
<draggable v-model="audioTracksCopy" v-bind="dragOptions" handle=".drag-handle" draggable=".item" tag="div" @start="drag = true" @end="drag = false" @update="draggableUpdate" :disabled="isIos">
|
||||
<transition-group type="transition" :name="!drag ? 'dragtrack' : null">
|
||||
@@ -46,7 +49,10 @@
|
||||
</div>
|
||||
|
||||
<div v-if="isPodcast" class="w-full py-2">
|
||||
<p class="text-base mb-2">Episodes ({{ episodes.length }})</p>
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<p class="text-base">Episodes ({{ episodes.length }})</p>
|
||||
<p class="text-xs text-fg-muted px-2">{{ $strings.LabelTotalSize }}: {{ $bytesPretty(totalEpisodesSize) }}</p>
|
||||
</div>
|
||||
<template v-for="episode in episodes">
|
||||
<div :key="episode.id" class="flex items-center my-1">
|
||||
<div class="w-10 h-12 flex items-center justify-center" style="min-width: 48px">
|
||||
@@ -83,22 +89,31 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p v-if="otherFiles.length" class="text-lg py-2">Other Files</p>
|
||||
<template v-for="file in otherFiles">
|
||||
<div :key="file.id" class="flex items-center my-1">
|
||||
<div class="w-12 h-12 flex items-center justify-center">
|
||||
<img v-if="(file.mimeType || '').startsWith('image')" :src="getCapImageSrc(file.contentUrl)" class="w-full h-full object-contain" />
|
||||
<span v-else class="material-icons">music_note</span>
|
||||
</div>
|
||||
<div class="flex-grow px-2">
|
||||
<p class="text-sm">{{ file.filename }}</p>
|
||||
</div>
|
||||
<div class="w-24 text-center text-fg-muted" style="min-width: 96px">
|
||||
<p class="text-xs">{{ file.mimeType }}</p>
|
||||
<p class="text-sm">{{ $bytesPretty(file.size) }}</p>
|
||||
</div>
|
||||
<div v-if="otherFiles.length">
|
||||
<div class="flex justify-between items-center py-2">
|
||||
<p class="text-lg">Other Files</p>
|
||||
<p class="text-xs text-fg-muted px-2">{{ $strings.LabelTotalSize }}: {{ $bytesPretty(totalOtherFilesSize) }}</p>
|
||||
</div>
|
||||
</template>
|
||||
<template v-for="file in otherFiles">
|
||||
<div :key="file.id" class="flex items-center my-1">
|
||||
<div class="w-12 h-12 flex items-center justify-center">
|
||||
<img v-if="(file.mimeType || '').startsWith('image')" :src="getCapImageSrc(file.contentUrl)" class="w-full h-full object-contain" />
|
||||
<span v-else class="material-icons">music_note</span>
|
||||
</div>
|
||||
<div class="flex-grow px-2">
|
||||
<p class="text-sm">{{ file.filename }}</p>
|
||||
</div>
|
||||
<div class="w-24 text-center text-fg-muted" style="min-width: 96px">
|
||||
<p class="text-xs">{{ file.mimeType }}</p>
|
||||
<p class="text-sm">{{ $bytesPretty(file.size) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 text-sm text-fg-muted">
|
||||
{{ $strings.LabelTotalSize }}: {{ $bytesPretty(totalLibraryItemSize) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="px-2 w-full h-full">
|
||||
@@ -218,17 +233,27 @@ export default {
|
||||
},
|
||||
dialogItems() {
|
||||
if (this.selectedAudioTrack || this.selectedEpisode) {
|
||||
return [
|
||||
const items = [
|
||||
{
|
||||
text: this.$strings.ButtonDeleteLocalFile,
|
||||
value: 'track-delete'
|
||||
value: 'track-delete',
|
||||
icon: 'delete'
|
||||
}
|
||||
]
|
||||
if (this.isPodcast && this.selectedEpisode) {
|
||||
items.unshift({
|
||||
text: this.$strings.ButtonPlayEpisode,
|
||||
value: 'play-episode',
|
||||
icon: 'play_arrow'
|
||||
})
|
||||
}
|
||||
return items
|
||||
} else {
|
||||
return [
|
||||
{
|
||||
text: this.$strings.ButtonDeleteLocalItem,
|
||||
value: 'delete'
|
||||
value: 'delete',
|
||||
icon: 'delete'
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -236,6 +261,18 @@ export default {
|
||||
playerIsStartingPlayback() {
|
||||
// Play has been pressed and waiting for native play response
|
||||
return this.$store.state.playerIsStartingPlayback
|
||||
},
|
||||
totalAudioSize() {
|
||||
return this.audioTracks.reduce((acc, item) => item.metadata ? acc + item.metadata.size : acc, 0)
|
||||
},
|
||||
totalEpisodesSize() {
|
||||
return this.episodes.reduce((acc, item) => acc + item.size, 0)
|
||||
},
|
||||
totalOtherFilesSize() {
|
||||
return this.otherFiles.reduce((acc, item) => acc + item.size, 0)
|
||||
},
|
||||
totalLibraryItemSize() {
|
||||
return this.localFiles.reduce((acc, item) => acc + item.size, 0)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -291,6 +328,19 @@ export default {
|
||||
getCapImageSrc(contentUrl) {
|
||||
return Capacitor.convertFileSrc(contentUrl)
|
||||
},
|
||||
async playEpisode() {
|
||||
if (!this.selectedEpisode) return
|
||||
if (this.playerIsStartingPlayback) return
|
||||
await this.$hapticsImpact()
|
||||
this.$store.commit('setPlayerIsStartingPlayback', this.selectedEpisode.serverEpisodeId)
|
||||
|
||||
this.$eventBus.$emit('play-item', {
|
||||
libraryItemId: this.localLibraryItemId,
|
||||
episodeId: this.selectedEpisode.id,
|
||||
serverLibraryItemId: this.libraryItemId,
|
||||
serverEpisodeId: this.selectedEpisode.serverEpisodeId
|
||||
})
|
||||
},
|
||||
async dialogAction(action) {
|
||||
console.log('Dialog action', action)
|
||||
await this.$hapticsImpact()
|
||||
@@ -300,8 +350,10 @@ export default {
|
||||
} else if (action == 'track-delete') {
|
||||
if (this.isPodcast) this.deleteEpisode()
|
||||
else this.deleteTrack()
|
||||
} else if (action == 'play-episode') {
|
||||
this.playEpisode()
|
||||
}
|
||||
this.showDialog = false
|
||||
this.showDialog = false;
|
||||
},
|
||||
getLocalFileForTrack(localFileId) {
|
||||
return this.localFiles.find((lf) => lf.id == localFileId)
|
||||
|
||||
@@ -71,6 +71,7 @@ export default {
|
||||
let lastKey = null
|
||||
let numSaves = 0
|
||||
let numSyncs = 0
|
||||
let lastSaveName = null
|
||||
|
||||
this.mediaEvents.forEach((evt) => {
|
||||
const date = this.$formatDate(evt.timestamp, 'MMM dd, yyyy')
|
||||
@@ -90,7 +91,8 @@ export default {
|
||||
|
||||
// Collapse saves
|
||||
if (evt.name === 'Save') {
|
||||
if (numSaves > 0 && !keyUpdated) {
|
||||
let saveName = evt.name + "-" + evt.serverSyncAttempted + "-" + evt.serverSyncSuccess
|
||||
if (lastSaveName === saveName && numSaves > 0 && !keyUpdated) {
|
||||
include = false
|
||||
const totalInGroup = groups[key].length
|
||||
groups[key][totalInGroup - 1].num = numSaves
|
||||
@@ -98,6 +100,7 @@ export default {
|
||||
} else {
|
||||
numSaves = 1
|
||||
}
|
||||
lastSaveName = saveName
|
||||
} else {
|
||||
numSaves = 0
|
||||
}
|
||||
|
||||
+73
-1
@@ -135,6 +135,21 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Data settings -->
|
||||
<p class="uppercase text-xs font-semibold text-fg-muted mb-2 mt-10">{{ $strings.HeaderDataSettings }}</p>
|
||||
<div class="py-3 flex items-center">
|
||||
<p class="pr-4 w-36">{{ $strings.LabelDownloadUsingCellular }}</p>
|
||||
<div @click.stop="showDownloadUsingCellularOptions">
|
||||
<ui-text-input :value="downloadUsingCellularOption" readonly append-icon="expand_more" style="max-width: 200px" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="py-3 flex items-center">
|
||||
<p class="pr-4 w-36">{{ $strings.LabelStreamingUsingCellular }}</p>
|
||||
<div @click.stop="showStreamingUsingCellularOptions">
|
||||
<ui-text-input :value="streamingUsingCellularOption" readonly append-icon="expand_more" style="max-width: 200px" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-show="loading" class="w-full h-full absolute top-0 left-0 flex items-center justify-center z-10">
|
||||
<ui-loading-indicator />
|
||||
</div>
|
||||
@@ -176,7 +191,9 @@ export default {
|
||||
disableSleepTimerResetFeedback: false,
|
||||
autoSleepTimerAutoRewind: false,
|
||||
autoSleepTimerAutoRewindTime: 300000, // 5 minutes
|
||||
languageCode: 'en-us'
|
||||
languageCode: 'en-us',
|
||||
downloadUsingCellular: 'ALWAYS',
|
||||
streamingUsingCellular: 'ALWAYS'
|
||||
},
|
||||
theme: 'dark',
|
||||
lockCurrentOrientation: false,
|
||||
@@ -245,6 +262,34 @@ export default {
|
||||
text: this.$strings.LabelVeryHigh,
|
||||
value: 'VERY_HIGH'
|
||||
}
|
||||
],
|
||||
downloadUsingCellularItems: [
|
||||
{
|
||||
text: this.$strings.LabelAskConfirmation,
|
||||
value: 'ASK'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelAlways,
|
||||
value: 'ALWAYS'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelNever,
|
||||
value: 'NEVER'
|
||||
}
|
||||
],
|
||||
streamingUsingCellularItems: [
|
||||
{
|
||||
text: this.$strings.LabelAskConfirmation,
|
||||
value: 'ASK'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelAlways,
|
||||
value: 'ALWAYS'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelNever,
|
||||
value: 'NEVER'
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -319,11 +364,21 @@ export default {
|
||||
const minutes = Number(this.settings.autoSleepTimerAutoRewindTime) / 1000 / 60
|
||||
return `${minutes} min`
|
||||
},
|
||||
downloadUsingCellularOption() {
|
||||
const item = this.downloadUsingCellularItems.find((i) => i.value === this.settings.downloadUsingCellular)
|
||||
return item?.text || 'Error'
|
||||
},
|
||||
streamingUsingCellularOption() {
|
||||
const item = this.streamingUsingCellularItems.find((i) => i.value === this.settings.streamingUsingCellular)
|
||||
return item?.text || 'Error'
|
||||
},
|
||||
moreMenuItems() {
|
||||
if (this.moreMenuSetting === 'shakeSensitivity') return this.shakeSensitivityItems
|
||||
else if (this.moreMenuSetting === 'hapticFeedback') return this.hapticFeedbackItems
|
||||
else if (this.moreMenuSetting === 'language') return this.languageOptionItems
|
||||
else if (this.moreMenuSetting === 'theme') return this.themeOptionItems
|
||||
else if (this.moreMenuSetting === 'downloadUsingCellular') return this.downloadUsingCellularItems
|
||||
else if (this.moreMenuSetting === 'streamingUsingCellular') return this.streamingUsingCellularItems
|
||||
return []
|
||||
}
|
||||
},
|
||||
@@ -358,6 +413,14 @@ export default {
|
||||
this.moreMenuSetting = 'theme'
|
||||
this.showMoreMenuDialog = true
|
||||
},
|
||||
showDownloadUsingCellularOptions() {
|
||||
this.moreMenuSetting = 'downloadUsingCellular'
|
||||
this.showMoreMenuDialog = true
|
||||
},
|
||||
showStreamingUsingCellularOptions() {
|
||||
this.moreMenuSetting = 'streamingUsingCellular'
|
||||
this.showMoreMenuDialog = true
|
||||
},
|
||||
clickMenuAction(action) {
|
||||
this.showMoreMenuDialog = false
|
||||
if (this.moreMenuSetting === 'shakeSensitivity') {
|
||||
@@ -372,6 +435,12 @@ export default {
|
||||
} else if (this.moreMenuSetting === 'theme') {
|
||||
this.theme = action
|
||||
this.saveTheme(action)
|
||||
} else if (this.moreMenuSetting === 'downloadUsingCellular') {
|
||||
this.settings.downloadUsingCellular = action
|
||||
this.saveSettings()
|
||||
} else if (this.moreMenuSetting === 'streamingUsingCellular') {
|
||||
this.settings.streamingUsingCellular = action
|
||||
this.saveSettings()
|
||||
}
|
||||
},
|
||||
saveTheme(theme) {
|
||||
@@ -504,6 +573,9 @@ export default {
|
||||
this.settings.autoSleepTimerAutoRewindTime = !isNaN(deviceSettings.autoSleepTimerAutoRewindTime) ? deviceSettings.autoSleepTimerAutoRewindTime : 300000 // 5 minutes
|
||||
|
||||
this.settings.languageCode = deviceSettings.languageCode || 'en-us'
|
||||
|
||||
this.settings.downloadUsingCellular = deviceSettings.downloadUsingCellular || 'ALWAYS'
|
||||
this.settings.streamingUsingCellular = deviceSettings.streamingUsingCellular || 'ALWAYS'
|
||||
},
|
||||
async init() {
|
||||
this.loading = true
|
||||
|
||||
+33
-30
@@ -1,40 +1,41 @@
|
||||
import Vue from "vue"
|
||||
import Vue from 'vue'
|
||||
import enUsStrings from '../strings/en-us.json'
|
||||
|
||||
const defaultCode = 'en-us'
|
||||
let $localStore = null
|
||||
|
||||
const languageCodeMap = {
|
||||
'cs': { label: 'Čeština', dateFnsLocale: 'cs' },
|
||||
'da': { label: 'Dansk', dateFnsLocale: 'da' },
|
||||
'de': { label: 'Deutsch', dateFnsLocale: 'de' },
|
||||
cs: { label: 'Čeština', dateFnsLocale: 'cs' },
|
||||
da: { label: 'Dansk', dateFnsLocale: 'da' },
|
||||
de: { label: 'Deutsch', dateFnsLocale: 'de' },
|
||||
'en-us': { label: 'English', dateFnsLocale: 'enUS' },
|
||||
'es': { label: 'Español', dateFnsLocale: 'es' },
|
||||
'fr': { label: 'Français', dateFnsLocale: 'fr' },
|
||||
'hr': { label: 'Hrvatski', dateFnsLocale: 'hr' },
|
||||
'it': { label: 'Italiano', dateFnsLocale: 'it' },
|
||||
'lt': { label: 'Lietuvių', dateFnsLocale: 'lt' },
|
||||
'hu': { label: 'Magyar', dateFnsLocale: 'hu' },
|
||||
'nl': { label: 'Nederlands', dateFnsLocale: 'nl' },
|
||||
'no': { label: 'Norsk', dateFnsLocale: 'no' },
|
||||
'pl': { label: 'Polski', dateFnsLocale: 'pl' },
|
||||
es: { label: 'Español', dateFnsLocale: 'es' },
|
||||
fi: { label: 'Suomi', dateFnsLocale: 'fi' },
|
||||
fr: { label: 'Français', dateFnsLocale: 'fr' },
|
||||
hr: { label: 'Hrvatski', dateFnsLocale: 'hr' },
|
||||
it: { label: 'Italiano', dateFnsLocale: 'it' },
|
||||
lt: { label: 'Lietuvių', dateFnsLocale: 'lt' },
|
||||
hu: { label: 'Magyar', dateFnsLocale: 'hu' },
|
||||
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' },
|
||||
'sv': { label: 'Svenska', dateFnsLocale: 'sv' },
|
||||
'zh-cn': { label: '简体中文 (Simplified Chinese)', dateFnsLocale: 'zhCN' },
|
||||
ru: { label: 'Русский', dateFnsLocale: 'ru' },
|
||||
sv: { label: 'Svenska', dateFnsLocale: 'sv' },
|
||||
uk: { label: 'Українська', dateFnsLocale: 'uk' },
|
||||
'vi-vn': { label: 'Tiếng Việt', dateFnsLocale: 'vi' },
|
||||
'zh-cn': { label: '简体中文 (Simplified Chinese)', dateFnsLocale: 'zhCN' }
|
||||
}
|
||||
|
||||
function supplant(str, subs) {
|
||||
// source: http://crockford.com/javascript/remedial.html
|
||||
return str.replace(/{([^{}]*)}/g,
|
||||
function (a, b) {
|
||||
var r = subs[b]
|
||||
return typeof r === 'string' || typeof r === 'number' ? r : a
|
||||
}
|
||||
)
|
||||
return str.replace(/{([^{}]*)}/g, function (a, b) {
|
||||
var r = subs[b]
|
||||
return typeof r === 'string' || typeof r === 'number' ? r : a
|
||||
})
|
||||
}
|
||||
|
||||
Vue.prototype.$languageCodeOptions = Object.keys(languageCodeMap).map(code => {
|
||||
Vue.prototype.$languageCodeOptions = Object.keys(languageCodeMap).map((code) => {
|
||||
return {
|
||||
text: languageCodeMap[code].label,
|
||||
value: code
|
||||
@@ -64,12 +65,14 @@ var translations = {
|
||||
|
||||
function loadTranslationStrings(code) {
|
||||
return new Promise((resolve) => {
|
||||
import(`../strings/${code}`).then((fileContents) => {
|
||||
resolve(fileContents.default)
|
||||
}).catch((error) => {
|
||||
console.error('Failed to load i18n strings', code, error)
|
||||
resolve(null)
|
||||
})
|
||||
import(`../strings/${code}`)
|
||||
.then((fileContents) => {
|
||||
resolve(fileContents.default)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed to load i18n strings', code, error)
|
||||
resolve(null)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -80,7 +83,7 @@ async function loadi18n(code) {
|
||||
return false
|
||||
}
|
||||
|
||||
const strings = translations[code] || await loadTranslationStrings(code)
|
||||
const strings = translations[code] || (await loadTranslationStrings(code))
|
||||
if (!strings) {
|
||||
console.warn(`Invalid lang code ${code}`)
|
||||
return false
|
||||
|
||||
@@ -3,37 +3,40 @@
|
||||
Audiobookshelf is a self-hosted audiobook and podcast server.
|
||||
|
||||
### Android (beta)
|
||||
|
||||
Get the Android app on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
|
||||
|
||||
### iOS (early beta)
|
||||
**Beta is currently full. Apple has a hard limit of 10k beta testers. Updates will be posted in Discord/Matrix.**
|
||||
|
||||
Using Test Flight: https://testflight.apple.com/join/wiic7QIW ***(beta is full)***
|
||||
**Beta is currently full. Apple has a hard limit of 10k beta testers. Updates will be posted in Discord.**
|
||||
|
||||
Using Test Flight: https://testflight.apple.com/join/wiic7QIW **_(beta is full)_**
|
||||
|
||||
---
|
||||
|
||||
[Go to the main project repo github.com/advplyr/audiobookshelf](https://github.com/advplyr/audiobookshelf) or the project site [audiobookshelf.org](https://audiobookshelf.org)
|
||||
|
||||
Join us on [discord](https://discord.gg/pJsjuNCKRq) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
|
||||
Join us on [discord](https://discord.gg/pJsjuNCKRq)
|
||||
|
||||
**Requires an Audiobookshelf server to connect with**
|
||||
|
||||
<img alt="Screenshot" src="https://github.com/advplyr/audiobookshelf-app/raw/master/screenshots/DeviceDemoScreens.png" />
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
This application is built using [NuxtJS](https://nuxtjs.org/) and [Capacitor](https://capacitorjs.com/) in order to run on both iOS and Android on the same code base.
|
||||
|
||||
Information on helping with translations of the apps [here](https://www.audiobookshelf.org/faq#how-do-i-help-with-translations).
|
||||
|
||||
### Windows Environment Setup for Android
|
||||
|
||||
Required Software:
|
||||
|
||||
* [Git](https://git-scm.com/downloads)
|
||||
* [Node.js](https://nodejs.org/en/) (version 20)
|
||||
* Code editor of choice([VSCode](https://code.visualstudio.com/download), etc)
|
||||
* [Android Studio](https://developer.android.com/studio)
|
||||
* [Android SDK](https://developer.android.com/studio)
|
||||
- [Git](https://git-scm.com/downloads)
|
||||
- [Node.js](https://nodejs.org/en/) (version 20)
|
||||
- Code editor of choice([VSCode](https://code.visualstudio.com/download), etc)
|
||||
- [Android Studio](https://developer.android.com/studio)
|
||||
- [Android SDK](https://developer.android.com/studio)
|
||||
|
||||
<details>
|
||||
<summary>Install the required software with <a href=(https://docs.microsoft.com/en-us/windows/package-manager/winget/#production-recommended)>winget</a></summary>
|
||||
@@ -60,10 +63,10 @@ Your Windows environment should now be set up and ready to proceed!
|
||||
|
||||
Required Software:
|
||||
|
||||
* [Android Studio](https://developer.android.com/studio)
|
||||
* [Node.js](https://nodejs.org/en/) (version 20)
|
||||
* [Cocoapods](https://guides.cocoapods.org/using/getting-started.html#installation)
|
||||
* [Android SDK](https://developer.android.com/studio)
|
||||
- [Android Studio](https://developer.android.com/studio)
|
||||
- [Node.js](https://nodejs.org/en/) (version 20)
|
||||
- [Cocoapods](https://guides.cocoapods.org/using/getting-started.html#installation)
|
||||
- [Android SDK](https://developer.android.com/studio)
|
||||
|
||||
<details>
|
||||
<summary>Install the required software with <a href=(https://brew.sh/)>homebrew</a></summary>
|
||||
@@ -82,6 +85,7 @@ brew install android-studio node cocoapods
|
||||
Clone or fork the project from terminal or powershell and `cd` into the project directory.
|
||||
|
||||
Install the required node packages:
|
||||
|
||||
```shell
|
||||
npm install
|
||||
```
|
||||
@@ -90,10 +94,12 @@ npm install
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
Generate static web app:
|
||||
|
||||
```shell
|
||||
npm run generate
|
||||
```
|
||||
@@ -102,10 +108,12 @@ npm run generate
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
Copy web app into native android/ios folders:
|
||||
|
||||
```shell
|
||||
npx cap sync
|
||||
```
|
||||
@@ -114,6 +122,7 @@ npx cap sync
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
@@ -127,6 +136,7 @@ npx cap open android
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
@@ -136,15 +146,16 @@ Start coding!
|
||||
|
||||
Required Software:
|
||||
|
||||
* [Xcode](https://developer.apple.com/xcode/)
|
||||
* [Node.js](https://nodejs.org/en/)
|
||||
* [Cocoapods](https://guides.cocoapods.org/using/getting-started.html#installation)
|
||||
- [Xcode](https://developer.apple.com/xcode/)
|
||||
- [Node.js](https://nodejs.org/en/)
|
||||
- [Cocoapods](https://guides.cocoapods.org/using/getting-started.html#installation)
|
||||
|
||||
### Start working on the iOS app
|
||||
|
||||
Clone or fork the project in the terminal and `cd` into the project directory.
|
||||
|
||||
Install the required node packages:
|
||||
|
||||
```shell
|
||||
npm install
|
||||
```
|
||||
@@ -153,10 +164,12 @@ npm install
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
Generate static web app:
|
||||
|
||||
```shell
|
||||
npm run generate
|
||||
```
|
||||
@@ -165,10 +178,12 @@ npm run generate
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
Copy web app into native android/ios folders:
|
||||
|
||||
```shell
|
||||
npx cap sync
|
||||
```
|
||||
@@ -177,6 +192,7 @@ npx cap sync
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
@@ -190,6 +206,7 @@ npx cap open ios
|
||||
<summary>Expand for screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
<br>
|
||||
|
||||
|
||||
+29
-12
@@ -31,16 +31,16 @@ export const state = () => ({
|
||||
})
|
||||
|
||||
export const getters = {
|
||||
getCurrentPlaybackSessionId: state => {
|
||||
getCurrentPlaybackSessionId: (state) => {
|
||||
return state.currentPlaybackSession?.id || null
|
||||
},
|
||||
getIsPlayerOpen: state => {
|
||||
getIsPlayerOpen: (state) => {
|
||||
return !!state.currentPlaybackSession
|
||||
},
|
||||
getIsCurrentSessionLocal: state => {
|
||||
getIsCurrentSessionLocal: (state) => {
|
||||
return state.currentPlaybackSession?.playMethod == PlayMethod.LOCAL
|
||||
},
|
||||
getIsMediaStreaming: state => (libraryItemId, episodeId) => {
|
||||
getIsMediaStreaming: (state) => (libraryItemId, episodeId) => {
|
||||
if (!state.currentPlaybackSession || !libraryItemId) return false
|
||||
|
||||
// Check using local library item id and local episode id
|
||||
@@ -59,24 +59,32 @@ export const getters = {
|
||||
if (!episodeId) return true
|
||||
return state.currentPlaybackSession.episodeId === episodeId
|
||||
},
|
||||
getServerSetting: state => key => {
|
||||
getServerSetting: (state) => (key) => {
|
||||
if (!state.serverSettings) return null
|
||||
return state.serverSettings[key]
|
||||
},
|
||||
getJumpForwardTime: state => {
|
||||
getJumpForwardTime: (state) => {
|
||||
if (!state.deviceData?.deviceSettings) return 10
|
||||
return state.deviceData.deviceSettings.jumpForwardTime || 10
|
||||
},
|
||||
getJumpBackwardsTime: state => {
|
||||
getJumpBackwardsTime: (state) => {
|
||||
if (!state.deviceData?.deviceSettings) return 10
|
||||
return state.deviceData.deviceSettings.jumpBackwardsTime || 10
|
||||
},
|
||||
getAltViewEnabled: state => {
|
||||
getAltViewEnabled: (state) => {
|
||||
if (!state.deviceData?.deviceSettings) return true
|
||||
return state.deviceData.deviceSettings.enableAltView
|
||||
},
|
||||
getOrientationLockSetting: state => {
|
||||
getOrientationLockSetting: (state) => {
|
||||
return state.deviceData?.deviceSettings?.lockOrientation
|
||||
},
|
||||
getCanDownloadUsingCellular: (state) => {
|
||||
if (!state.deviceData?.deviceSettings?.downloadUsingCellular) return 'ALWAYS'
|
||||
return state.deviceData.deviceSettings.downloadUsingCellular || 'ALWAYS'
|
||||
},
|
||||
getCanStreamingUsingCellular: (state) => {
|
||||
if (!state.deviceData?.deviceSettings?.streamingUsingCellular) return 'ALWAYS'
|
||||
return state.deviceData.deviceSettings.streamingUsingCellular || 'ALWAYS'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +124,7 @@ export const mutations = {
|
||||
setPlaybackSession(state, playbackSession) {
|
||||
state.currentPlaybackSession = playbackSession
|
||||
|
||||
state.isCasting = playbackSession?.mediaPlayer === "cast-player"
|
||||
state.isCasting = playbackSession?.mediaPlayer === 'cast-player'
|
||||
},
|
||||
setMediaPlayer(state, mediaPlayer) {
|
||||
state.isCasting = mediaPlayer === 'cast-player'
|
||||
@@ -157,7 +165,16 @@ export const mutations = {
|
||||
state.isNetworkListenerInit = val
|
||||
},
|
||||
setNetworkStatus(state, val) {
|
||||
state.networkConnected = val.connected
|
||||
if (val.connectionType !== 'none') {
|
||||
state.networkConnected = true
|
||||
} else {
|
||||
state.networkConnected = false
|
||||
}
|
||||
if (this.$platform === 'ios') {
|
||||
// Capacitor Network plugin only shows ios device connected if internet access is available.
|
||||
// This fix allows iOS users to use local servers without internet access.
|
||||
state.networkConnected = true
|
||||
}
|
||||
state.networkConnectionType = val.connectionType
|
||||
},
|
||||
setIsNetworkUnmetered(state, val) {
|
||||
@@ -180,4 +197,4 @@ export const mutations = {
|
||||
state.serverSettings = val
|
||||
this.$localStore.setServerSettings(state.serverSettings)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Browser } from '@capacitor/browser'
|
||||
|
||||
export const state = () => ({
|
||||
user: null,
|
||||
serverConnectionConfig: null,
|
||||
@@ -115,6 +117,21 @@ export const actions = {
|
||||
commit('setSettings', userSettings)
|
||||
this.$eventBus.$emit('user-settings', state.settings)
|
||||
}
|
||||
},
|
||||
async openWebClient({ getters }, path = null) {
|
||||
const serverAddress = getters.getServerAddress
|
||||
if (!serverAddress) {
|
||||
console.error('openWebClient: No server address')
|
||||
return
|
||||
}
|
||||
try {
|
||||
let url = serverAddress.replace(/\/$/, '') // Remove trailing slash
|
||||
if (path?.startsWith('/')) url += path
|
||||
|
||||
await Browser.open({ url })
|
||||
} catch (error) {
|
||||
console.error('Error opening browser', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
+314
@@ -0,0 +1,314 @@
|
||||
{
|
||||
"ButtonAdd": "যোগ করুন",
|
||||
"ButtonAddNewServer": "নতুন সার্ভার যোগ করুন",
|
||||
"ButtonAuthors": "লেখকগণ",
|
||||
"ButtonBack": "পেছনে যান",
|
||||
"ButtonCancel": "বাতিল করুন",
|
||||
"ButtonCancelTimer": "টাইমার বাতিল করুন",
|
||||
"ButtonClearFilter": "ফিল্টার পরিষ্কার করুন",
|
||||
"ButtonCloseFeed": "ফিড বন্ধ করুন",
|
||||
"ButtonCollections": "সংগ্রহ",
|
||||
"ButtonConnect": "সংযোগ করুন",
|
||||
"ButtonConnectToServer": "সার্ভারের সাথে সংযোগ করুন",
|
||||
"ButtonCreate": "তৈরি করুন",
|
||||
"ButtonCreateBookmark": "বুকমার্ক তৈরি করুন",
|
||||
"ButtonCreateNewPlaylist": "নতুন প্লেলিস্ট তৈরি করুন",
|
||||
"ButtonDelete": "মুছুন",
|
||||
"ButtonDeleteLocalEpisode": "স্থানীয় পর্ব মুছে ফেলুন",
|
||||
"ButtonDeleteLocalFile": "স্থানীয় ফাইল মুছে ফেলুন",
|
||||
"ButtonDeleteLocalItem": "স্থানীয় আইটেম মুছে ফেলুন",
|
||||
"ButtonDisableAutoTimer": "স্বয়ংক্রিয় টাইমার নিষ্ক্রিয় করুন",
|
||||
"ButtonDisconnect": "সংযোগ বিচ্ছিন্ন করুন",
|
||||
"ButtonGoToWebClient": "ওয়েব ক্লায়েন্টে যান",
|
||||
"ButtonHistory": "ইতিহাস",
|
||||
"ButtonHome": "নীড়",
|
||||
"ButtonIssues": "ইস্যু",
|
||||
"ButtonLatest": "সর্বশেষ",
|
||||
"ButtonLibrary": "লাইব্রেরি",
|
||||
"ButtonLocalMedia": "স্থানীয় মিডিয়া",
|
||||
"ButtonManageLocalFiles": "স্থানীয় ফাইলগুলো পরিচালনা করুন",
|
||||
"ButtonNewFolder": "নতুন ফোল্ডার",
|
||||
"ButtonNextEpisode": "পরবর্তী পর্ব",
|
||||
"ButtonOpenFeed": "ফিড খুলুন",
|
||||
"ButtonOverride": "ওভাররাইড",
|
||||
"ButtonPause": "বিরতি",
|
||||
"ButtonPlay": "বাজান",
|
||||
"ButtonPlayEpisode": "পর্বটি চালান",
|
||||
"ButtonPlaying": "বাজছে",
|
||||
"ButtonPlaylists": "প্লেলিস্ট",
|
||||
"ButtonRead": "পড়ুন",
|
||||
"ButtonRemove": "মুছে ফেলুন",
|
||||
"ButtonRemoveFromServer": "সার্ভার থেকে সরান",
|
||||
"ButtonSave": "সংরক্ষণ করুন",
|
||||
"ButtonSaveOrder": "অর্ডার সংরক্ষণ করুন",
|
||||
"ButtonSearch": "অনুসন্ধান",
|
||||
"ButtonSendEbookToDevice": "ডিভাইসে ইবুক পাঠান",
|
||||
"ButtonSeries": "সিরিজ",
|
||||
"ButtonSetTimer": "টাইমার সেট করুন",
|
||||
"ButtonStream": "স্ট্রীম",
|
||||
"ButtonSubmit": "জমা দিন",
|
||||
"ButtonSwitchServerUser": "সার্ভার/ব্যবহারকারী পরিবর্তন করুন",
|
||||
"ButtonUserStats": "ব্যবহারকারীর পরিসংখ্যান",
|
||||
"ButtonYes": "হ্যাঁ",
|
||||
"HeaderAccount": "অ্যাকাউন্ট",
|
||||
"HeaderAdvanced": "অ্যাডভান্সড",
|
||||
"HeaderAudioTracks": "অডিও ট্র্যাকসগুলো",
|
||||
"HeaderChapters": "অধ্যায়",
|
||||
"HeaderCollection": "সংগ্রহ",
|
||||
"HeaderCollectionItems": "সংগ্রহ আইটেম",
|
||||
"HeaderConnectionStatus": "সংযোগের অবস্থা",
|
||||
"HeaderDataSettings": "ডেটা সেটিংস",
|
||||
"HeaderDetails": "বিস্তারিত",
|
||||
"HeaderDownloads": "ডাউনলোড",
|
||||
"HeaderEbookFiles": "ই-বই ফাইল",
|
||||
"HeaderEpisodes": "পর্ব",
|
||||
"HeaderEreaderSettings": "ই-রিডার সেটিংস",
|
||||
"HeaderLatestEpisodes": "সর্বশেষ পর্ব",
|
||||
"HeaderLibraries": "লাইব্রেরি",
|
||||
"HeaderLocalFolders": "স্থানীয় ফোল্ডার",
|
||||
"HeaderLocalLibraryItems": "স্থানীয় লাইব্রেরি আইটেম",
|
||||
"HeaderNewPlaylist": "নতুন প্লেলিস্ট",
|
||||
"HeaderOpenRSSFeed": "আরএসএস ফিড খুলুন",
|
||||
"HeaderPlaybackSettings": "প্লেব্যাক সেটিংস",
|
||||
"HeaderPlaylist": "প্লেলিস্ট",
|
||||
"HeaderPlaylistItems": "প্লেলিস্ট আইটেম",
|
||||
"HeaderRSSFeed": "আরএসএস ফিডগুলো",
|
||||
"HeaderRSSFeedGeneral": "আরএসএস বিবরণ",
|
||||
"HeaderRSSFeedIsOpen": "আরএসএস ফিড খোলা আছে",
|
||||
"HeaderSelectDownloadLocation": "ডাউনলোড অবস্থান নির্বাচন করুন",
|
||||
"HeaderSettings": "সেটিংস",
|
||||
"HeaderSleepTimer": "স্লিপ টাইমার",
|
||||
"HeaderSleepTimerSettings": "স্লিপ টাইমার সেটিংস",
|
||||
"HeaderStatsMinutesListeningChart": "মিনিট শ্রবণ (গত ৭ দিন)",
|
||||
"HeaderStatsRecentSessions": "সাম্প্রতিক সেশন",
|
||||
"HeaderTableOfContents": "বিষয়বস্তুর সারণী",
|
||||
"HeaderUserInterfaceSettings": "ব্যবহারকারী ইন্টারফেস সেটিংস",
|
||||
"HeaderYourStats": "আপনার পরিসংখ্যান",
|
||||
"LabelAddToPlaylist": "প্লেলিস্টে যোগ করুন",
|
||||
"LabelAdded": "যোগ করা হয়েছে",
|
||||
"LabelAddedAt": "এতে যোগ করা হয়েছে",
|
||||
"LabelAll": "সব",
|
||||
"LabelAllowSeekingOnMediaControls": "মিডিয়া বিজ্ঞপ্তি নিয়ন্ত্রণে অবস্থান খোঁজার অনুমতি দিন",
|
||||
"LabelAlways": "সর্বদা",
|
||||
"LabelAskConfirmation": "নিশ্চিতকরণের জন্য জিজ্ঞাসা করুন",
|
||||
"LabelAuthor": "লেখক",
|
||||
"LabelAuthorFirstLast": "লেখক (প্রথম শেষ)",
|
||||
"LabelAuthorLastFirst": "লেখক (শেষ, প্রথম)",
|
||||
"LabelAuthors": "লেখকগণ",
|
||||
"LabelAutoDownloadEpisodes": "স্বয়ংক্রিয় ডাউনলোড পর্ব",
|
||||
"LabelAutoRewindTime": "স্বয়ংক্রিয় রিওয়াইন্ড সময়",
|
||||
"LabelAutoSleepTimer": "স্বয়ংক্রিয় ঘুমের টাইমার",
|
||||
"LabelAutoSleepTimerAutoRewind": "অটো স্লিপ টাইমার অটো রিওয়াইন্ড",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "অটো স্লিপ টাইমার শেষে আইটেমটি আবার চালানো হলে স্বয়ংক্রিয়ভাবে আপনার অবস্থান রিওয়াইন্ড করবে।",
|
||||
"LabelAutoSleepTimerHelp": "নির্দিষ্ট শুরু এবং শেষ সময়ের মধ্যে মিডিয়া চালানোর সময় একটি স্লিপ টাইমার স্বয়ংক্রিয়ভাবে শুরু হবে।",
|
||||
"LabelBooks": "বইগুলো",
|
||||
"LabelChapterTrack": "অধ্যায় ট্র্যাক",
|
||||
"LabelChapters": "অধ্যায়",
|
||||
"LabelClosePlayer": "প্লেয়ার বন্ধ করুন",
|
||||
"LabelCollapseSeries": "সিরিজ সঙ্কুচিত করুন",
|
||||
"LabelComplete": "সম্পূর্ণ",
|
||||
"LabelContinueBooks": "বই চালিয়ে যান",
|
||||
"LabelContinueEpisodes": "পর্ব চালিয়ে যান",
|
||||
"LabelContinueListening": "শোনা চালিয়ে যান",
|
||||
"LabelContinueReading": "পড়া চালিয়ে যান",
|
||||
"LabelContinueSeries": "সিরিজ চালিয়ে যান",
|
||||
"LabelCustomTime": "কাস্টম সময়",
|
||||
"LabelDescription": "বিবরণ",
|
||||
"LabelDisableAudioFadeOut": "অডিও বিবর্ণ হওয়া অক্ষম করুন",
|
||||
"LabelDisableAudioFadeOutHelp": "স্লিপ টাইমারে ১ মিনিটেরও কম সময় বাকি থাকলে অডিওর ভলিউম কমতে শুরু করবে। বিবর্ণ না হওয়ার জন্য এই সেটিংটি সক্ষম করুন।",
|
||||
"LabelDisableAutoRewind": "অটো রিওয়াইন্ড অক্ষম করুন",
|
||||
"LabelDisableShakeToReset": "ঝাঁকালে রিসেট হওয়া অক্ষম করুন",
|
||||
"LabelDisableShakeToResetHelp": "টাইমার চলার সময় বা টাইমারের মেয়াদ শেষ হওয়ার ২ মিনিটের মধ্যে আপনার ডিভাইস ঝাঁকালে ঘুমের টাইমার রিসেট করবে। ঝাঁকালে রিসেট করা অক্ষম করতে এই সেটিংটি সক্ষম করুন।",
|
||||
"LabelDisableVibrateOnReset": "রিসেট করার সময় কম্পন অক্ষম করুন",
|
||||
"LabelDisableVibrateOnResetHelp": "স্লিপ টাইমার রিসেট হয়ে গেলে আপনার ডিভাইস কম্পিত হবে। স্লিপ টাইমার রিসেট করার সময় কম্পন না করতে এই সেটিংটি সক্ষম করুন।",
|
||||
"LabelDiscover": "আবিষ্কার",
|
||||
"LabelDownload": "ডাউনলোড করুন",
|
||||
"LabelDownloadUsingCellular": "সেলুলার ব্যবহার করে ডাউনলোড করুন",
|
||||
"LabelDownloaded": "ডাউনলোড করা হয়েছে",
|
||||
"LabelDuration": "সময়কাল",
|
||||
"LabelEbook": "ই-বই",
|
||||
"LabelEbooks": "ই-বইগুলো",
|
||||
"LabelEnable": "সক্ষম করুন",
|
||||
"LabelEnableMp3IndexSeeking": "এমপি৩ সূচী খোঁজা সক্ষম করুন",
|
||||
"LabelEnableMp3IndexSeekingHelp": "এই সেটিংটি শুধুমাত্র তখনই সক্রিয় করা উচিত যদি আপনার কাছে MP3 ফাইল থাকে যা সঠিকভাবে খুঁজছে না। ভেরিয়েবল বিটরেট (VBR) MP3 ফাইলের কারণে ভুল চাওয়া হয়। এই সেটিংটি সূচী খুঁজতে বাধ্য করবে, যেখানে ফাইলটি পড়ার সাথে-সাথে একটি টাইম-টু-বাইট ম্যাপিং তৈরি করা হয়। বড় MP3 ফাইলের সাথে কিছু ক্ষেত্রে ফাইলের শেষের দিকে খোঁজার সময় বিলম্ব হবে।",
|
||||
"LabelEnd": "সমাপ্ত",
|
||||
"LabelEndOfChapter": "অধ্যায়ের সমাপ্তি",
|
||||
"LabelEndTime": "শেষ সময়",
|
||||
"LabelEpisode": "পর্ব",
|
||||
"LabelFeedURL": "ফিড ইউআরএল",
|
||||
"LabelFile": "ফাইল",
|
||||
"LabelFileBirthtime": "ফাইল জন্মের সময়",
|
||||
"LabelFileModified": "ফাইল পরিবর্তিত",
|
||||
"LabelFilename": "ফাইলের নাম",
|
||||
"LabelFinished": "সমাপ্ত",
|
||||
"LabelFolder": "ফোল্ডার",
|
||||
"LabelFontBoldness": "হরফ বোল্ডনেস",
|
||||
"LabelFontScale": "ফন্ট স্কেল",
|
||||
"LabelGenre": "ঘরানা",
|
||||
"LabelGenres": "ঘরানাগুলো",
|
||||
"LabelHapticFeedback": "হ্যাপটিক প্রতিক্রিয়া",
|
||||
"LabelHasEbook": "ই-বই আছে",
|
||||
"LabelHasSupplementaryEbook": "পরিপূরক ই-বই আছে",
|
||||
"LabelHeavy": "ভারী",
|
||||
"LabelHigh": "উচু",
|
||||
"LabelHost": "নিমন্ত্রণকর্তা",
|
||||
"LabelInProgress": "প্রগতিতে আছে",
|
||||
"LabelIncomplete": "অসম্পূর্ণ",
|
||||
"LabelInternalAppStorage": "অভ্যন্তরীণ অ্যাপ স্টোরেজ",
|
||||
"LabelJumpBackwardsTime": "পিছনের সময়ে ঝাঁপ",
|
||||
"LabelJumpForwardsTime": "সামনের সময়ে ঝাঁপ",
|
||||
"LabelLanguage": "ভাষা",
|
||||
"LabelLayout": "লেআউট",
|
||||
"LabelLayoutAuto": "স্বয়ংক্রিয়",
|
||||
"LabelLayoutSinglePage": "একক পৃষ্ঠা",
|
||||
"LabelLight": "আলো",
|
||||
"LabelLineSpacing": "লাইন স্পেসিং",
|
||||
"LabelListenAgain": "আবার শুনুন",
|
||||
"LabelLocalBooks": "স্থানীয় বই",
|
||||
"LabelLocalPodcasts": "স্থানীয় পডকাস্ট",
|
||||
"LabelLockOrientation": "ওরিয়েন্টেশন লক করুন",
|
||||
"LabelLockPlayer": "প্লেয়ার লক করুন",
|
||||
"LabelLow": "নিচু",
|
||||
"LabelMediaType": "মিডিয়ার ধরন",
|
||||
"LabelMedium": "মাঝারি",
|
||||
"LabelMore": "আরো",
|
||||
"LabelMoreInfo": "আরো তথ্য",
|
||||
"LabelName": "নাম",
|
||||
"LabelNarrator": "কথক",
|
||||
"LabelNarrators": "কথক",
|
||||
"LabelNavigateWithVolume": "ভলিউম বাটন দিয়ে নেভিগেট করুন",
|
||||
"LabelNavigateWithVolumeDisabled": "বন্ধ",
|
||||
"LabelNavigateWithVolumeEnabled": "চালু",
|
||||
"LabelNavigateWithVolumeMirrored": "মিরর করা হয়েছে",
|
||||
"LabelNever": "কখনও না",
|
||||
"LabelNewestAuthors": "নতুন লেখক",
|
||||
"LabelNewestEpisodes": "নতুনতম পর্ব",
|
||||
"LabelNo": "না",
|
||||
"LabelNotFinished": "সমাপ্ত হয়নি",
|
||||
"LabelNotStarted": "শুরু হয়নি",
|
||||
"LabelOff": "বন্ধ",
|
||||
"LabelPassword": "পাসওয়ার্ড",
|
||||
"LabelPath": "পথ",
|
||||
"LabelPlaybackDirect": "সরাসরি",
|
||||
"LabelPlaybackLocal": "স্থানীয়",
|
||||
"LabelPlaybackSpeed": "প্লেব্যাকের গতি",
|
||||
"LabelPlaybackTranscode": "ট্রান্সকোড",
|
||||
"LabelPodcast": "পডকাস্ট",
|
||||
"LabelPodcasts": "পডকাস্টগুলো",
|
||||
"LabelPreventIndexing": "আইটিউনস এবং গুগল পডকাস্ট ডিরেক্টরি দ্বারা আপনার ফিডকে ইন্ডেক্স করা থেকে বিরত রাখুন",
|
||||
"LabelProgress": "প্রগতি",
|
||||
"LabelPubDate": "প্রকাশের তারিখ",
|
||||
"LabelPublishYear": "প্রকাশের বছর",
|
||||
"LabelRSSFeedCustomOwnerEmail": "কাস্টম মালিকের ইমেইল",
|
||||
"LabelRSSFeedCustomOwnerName": "কাস্টম মালিকের নাম",
|
||||
"LabelRSSFeedPreventIndexing": "সূচীকরণ প্রতিরোধ করুন",
|
||||
"LabelRSSFeedSlug": "আরএসএস ফিড স্লাগ",
|
||||
"LabelRandomly": "এলোমেলোভাবে",
|
||||
"LabelRead": "পড়ুন",
|
||||
"LabelReadAgain": "আবার পড়ুন",
|
||||
"LabelRecentSeries": "সাম্প্রতিক সিরিজ",
|
||||
"LabelRecentlyAdded": "সম্প্রতি যোগ করা হয়েছে",
|
||||
"LabelRemoveFromPlaylist": "প্লেলিস্ট থেকে সরান",
|
||||
"LabelScaleElapsedTimeBySpeed": "অতিবাহিত সময় গতি দ্বারা স্কেল করুন",
|
||||
"LabelSeason": "সেশন",
|
||||
"LabelSelectADevice": "একটি ডিভাইস নির্বাচন করুন",
|
||||
"LabelSeries": "সিরিজ",
|
||||
"LabelServerAddress": "সার্ভার ঠিকানা",
|
||||
"LabelSetEbookAsPrimary": "প্রাথমিক হিসাবে সেট করুন",
|
||||
"LabelSetEbookAsSupplementary": "পরিপূরক হিসেবে সেট করুন",
|
||||
"LabelShakeSensitivity": "ঝাঁকুনির সংবেদনশীলতা",
|
||||
"LabelShowAll": "সব দেখান",
|
||||
"LabelSize": "আকার",
|
||||
"LabelSleepTimer": "স্লিপ টাইমার",
|
||||
"LabelStart": "শুরু",
|
||||
"LabelStartTime": "শুরুর সময়",
|
||||
"LabelStatsBestDay": "সেরা দিন",
|
||||
"LabelStatsDailyAverage": "দৈনিক গড়",
|
||||
"LabelStatsDays": "দিন",
|
||||
"LabelStatsDaysListened": "যেদিন শোনা হয়েছে",
|
||||
"LabelStatsInARow": "এক সারিতে",
|
||||
"LabelStatsItemsFinished": "আইটেম সমাপ্ত",
|
||||
"LabelStatsMinutes": "মিনিট",
|
||||
"LabelStatsMinutesListening": "মিনিট শুনছেন",
|
||||
"LabelStatsWeekListening": "সপ্তাহ শোনা",
|
||||
"LabelStreamingUsingCellular": "সেলুলার ব্যবহার করে স্ট্রিমিং",
|
||||
"LabelTag": "ট্যাগ",
|
||||
"LabelTags": "ট্যাগগুলো",
|
||||
"LabelTheme": "থিম",
|
||||
"LabelThemeDark": "অন্ধকার",
|
||||
"LabelThemeLight": "আলো",
|
||||
"LabelTimeRemaining": "{0}টি অবশিষ্ট",
|
||||
"LabelTitle": "শিরোনাম",
|
||||
"LabelTotalSize": "মোট আকার",
|
||||
"LabelTotalTrack": "মোট ট্র্যাক",
|
||||
"LabelTracks": "ট্র্যাকস",
|
||||
"LabelType": "টাইপ",
|
||||
"LabelUnlockPlayer": "প্লেয়ার আনলক করুন",
|
||||
"LabelUseBookshelfView": "বুকশেলফ ভিউ ব্যবহার করুন",
|
||||
"LabelUser": "ব্যবহারকারী",
|
||||
"LabelUsername": "ব্যবহারকারীর নাম",
|
||||
"LabelVeryHigh": "অত্যন্ত উচ্চ",
|
||||
"LabelVeryLow": "খুবই কম",
|
||||
"LabelYourBookmarks": "আপনার বুকমার্কস",
|
||||
"LabelYourProgress": "আপনার অগ্রগতি",
|
||||
"MessageAndroid10Downloads": "অ্যান্ড্রয়েড ১০ এবং এর নীচের সংস্করণগুলি ডাউনলোডের জন্য অভ্যন্তরীণ অ্যাপ স্টোরেজ ব্যবহার করবে।",
|
||||
"MessageAttemptingServerConnection": "সার্ভার সংযোগের চেষ্টা করা হচ্ছে..।",
|
||||
"MessageAudiobookshelfServerNotConnected": "অডিওবুকশেল্ফ সার্ভার সংযুক্ত করা যায়নি",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>গুরুত্বপূর্ণ!</strong> এই অ্যাপটি এমন একটি অডিওবুকশেল্ফ সার্ভারের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে যা আপনি বা আপনার পরিচিত কেউ হোস্ট করছেন৷ এই অ্যাপ্লিকেশনটি নিজে থেকে কোন বিষয়বস্তু প্রদান করে না।",
|
||||
"MessageBookshelfEmpty": "বুকশেলফ খালি",
|
||||
"MessageConfirmDeleteLocalEpisode": "আপনার ডিভাইস থেকে স্থানীয় পর্ব \"{0}\" সরাবেন? সার্ভারে ফাইলটি প্রভাবিত হবে না।",
|
||||
"MessageConfirmDeleteLocalFiles": "আপনার ডিভাইস থেকে এই আইটেমটির স্থানীয় ফাইলগুলি সরাবেন? সার্ভারে থাকা ফাইল এবং আপনার অগ্রগতি প্রভাবিত হবে না।",
|
||||
"MessageConfirmDiscardProgress": "আপনি কি নিশ্চিত আপনার অগ্রগতি পুনরায় সেট করতে চান?",
|
||||
"MessageConfirmDownloadUsingCellular": "আপনি সেলুলার ডেটা ব্যবহার করে ডাউনলোড করতে চলেছেন৷ এর মধ্যে ক্যারিয়ার ডেটা চার্জ অন্তর্ভুক্ত থাকতে পারে। আপনি কি চালিয়ে যেতে চান?",
|
||||
"MessageConfirmMarkAsFinished": "আপনি কি এই আইটেমটিকে সমাপ্ত হিসাবে চিহ্নিত করার বিষয়ে নিশ্চিত?",
|
||||
"MessageConfirmRemoveBookmark": "আপনি কি বুকমার্ক সরানোর বিষয়ে নিশ্চিত?",
|
||||
"MessageConfirmStreamingUsingCellular": "আপনি সেলুলার ডেটা ব্যবহার করে স্ট্রিম করতে চলেছেন৷ এর মধ্যে ক্যারিয়ার ডেটা চার্জ অন্তর্ভুক্ত থাকতে পারে। আপনি কি চালিয়ে যেতে চান?",
|
||||
"MessageDiscardProgress": "অগ্রগতি বাতিল করুন",
|
||||
"MessageDownloadCompleteProcessing": "ডাউনলোড সম্পূর্ণ। প্রক্রিয়া করা হচ্ছে..।",
|
||||
"MessageDownloading": "ডাউনলোড হচ্ছে..।",
|
||||
"MessageDownloadingEpisode": "ডাউনলোডিং পর্ব",
|
||||
"MessageEpisodesQueuedForDownload": "{0} পর্ব(গুলি) ডাউনলোডের জন্য সারিবদ্ধ",
|
||||
"MessageFeedURLWillBe": "ফিড URL হবে {0}",
|
||||
"MessageFetching": "আনয় হচ্ছে.।",
|
||||
"MessageFollowTheProjectOnGithub": "গিটহাবে প্রকল্পটিকে অনুসরণ করুন",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "আইটেম ডাউনলোড সম্পূর্ণ হয়েছে কিন্তু লাইব্রেরি আইটেম তৈরি করতে ব্যর্থ হয়েছে",
|
||||
"MessageLoading": "লোড হচ্ছে.।",
|
||||
"MessageLoadingServerData": "সার্ভার ডেটা লোড হচ্ছে..।",
|
||||
"MessageMarkAsFinished": "সমাপ্ত হিসাবে চিহ্নিত করুন",
|
||||
"MessageMediaLinkedToADifferentServer": "মিডিয়া একটি ভিন্ন ঠিকানায় একটি অডিওবুকশেল্ফ সার্ভারের সাথে লিঙ্ক করা হয়েছে ({0})৷ এই সার্ভার ঠিকানার সাথে সংযুক্ত হলে অগ্রগতি সিঙ্ক করা হবে।",
|
||||
"MessageMediaLinkedToADifferentUser": "মিডিয়া এই সার্ভারের সাথে লিঙ্ক করা হয়েছে কিন্তু অন্য ব্যবহারকারী দ্বারা ডাউনলোড করা হয়েছে৷ অগ্রগতি শুধুমাত্র সেই ব্যবহারকারীর সাথে সিঙ্ক করা হবে যে এটি ডাউনলোড করেছে।",
|
||||
"MessageMediaLinkedToServer": "সার্ভারের সাথে লিঙ্ক করা হয়েছে {0}",
|
||||
"MessageMediaLinkedToThisServer": "ডাউনলোড করা মিডিয়া এই সার্ভারের সাথে লিঙ্ক করা হয়েছে",
|
||||
"MessageMediaNotLinkedToServer": "মিডিয়া কোন অডিওবুকশেল্ফ সার্ভারের সাথে লিঙ্ক করা নেই৷ কোন অগ্রগতি সিঙ্ক করা হবে না।",
|
||||
"MessageNoBookmarks": "কোন বুকমার্ক নেই",
|
||||
"MessageNoChapters": "কোনও অধ্যায় নেই",
|
||||
"MessageNoItems": "কোন আইটেম নেই",
|
||||
"MessageNoItemsFound": "কোন আইটেম পাওয়া যায়নি",
|
||||
"MessageNoListeningSessions": "কোনও শোনার সেশন নেই",
|
||||
"MessageNoMediaFolders": "কোনো মিডিয়া ফোল্ডার নেই",
|
||||
"MessageNoNetworkConnection": "নেটওয়ার্ক সংযোগ নেই",
|
||||
"MessageNoPodcastsFound": "কোন পডকাস্ট পাওয়া যায়নি",
|
||||
"MessageNoSeries": "কোনো সিরিজ নেই",
|
||||
"MessageNoUpdatesWereNecessary": "কোন আপডেটের প্রয়োজন ছিল না",
|
||||
"MessageNoUserPlaylists": "আপনার কোনো প্লেলিস্ট নেই",
|
||||
"MessageReportBugsAndContribute": "বাগ রিপোর্ট করুন, বৈশিষ্ট্যের অনুরোধ করুন এবং এতে অবদান রাখুন",
|
||||
"MessageSocketConnectedOverMeteredCellular": "মিটারযুক্ত সেলুলারের দ্বারা সকেট সংযোগ করা হয়েছে",
|
||||
"MessageSocketConnectedOverMeteredWifi": "মিটারযুক্ত ওয়াইফাইয়ের মাধ্যমে সকেট সংযুক্ত",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "মিটারবিহীন সেলুলারের দ্বারা সকেট সংযোগ করা হয়েছে",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "মিটারবিহীন ওয়াইফাইয়ের মাধ্যমে সকেট সংযুক্ত",
|
||||
"MessageSocketNotConnected": "সকেট সংযুক্ত নয়",
|
||||
"NoteRSSFeedPodcastAppsHttps": "সতর্কতা: বেশিরভাগ পডকাস্ট অ্যাপের জন্য প্রয়োজন হবে RSS ফিড URL যেটি HTTPS ব্যবহার করছে",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "সতর্কতা: আপনার 1 বা তার বেশি পর্বের একটি পাব তারিখ নেই। কিছু পডকাস্ট অ্যাপের এটি প্রয়োজন।",
|
||||
"ToastBookmarkCreateFailed": "বুকমার্ক তৈরি করতে ব্যর্থ",
|
||||
"ToastBookmarkRemoveFailed": "বুকমার্ক সরাতে ব্যর্থ",
|
||||
"ToastBookmarkUpdateFailed": "বুকমার্ক আপডেট করতে ব্যর্থ",
|
||||
"ToastDownloadNotAllowedOnCellular": "সেলুলার ডেটাতে ডাউনলোড করার অনুমতি নেই",
|
||||
"ToastItemMarkedAsFinishedFailed": "সমাপ্ত হিসাবে চিহ্নিত করতে ব্যর্থ",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "সমাপ্ত হয়নি হিসাবে চিহ্নিত করতে ব্যর্থ",
|
||||
"ToastPlaylistCreateFailed": "প্লেলিস্ট তৈরি করতে ব্যর্থ",
|
||||
"ToastPodcastCreateFailed": "পডকাস্ট তৈরি করতে ব্যর্থ",
|
||||
"ToastPodcastCreateSuccess": "পডকাস্ট সফলভাবে তৈরি করা হয়েছে",
|
||||
"ToastRSSFeedCloseFailed": "RSS ফিড বন্ধ করতে ব্যর্থ",
|
||||
"ToastRSSFeedCloseSuccess": "RSS ফিড বন্ধ",
|
||||
"ToastStreamingNotAllowedOnCellular": "সেলুলার ডেটাতে স্ট্রিমিং অনুমোদিত নয়"
|
||||
}
|
||||
+40
-20
@@ -19,6 +19,7 @@
|
||||
"ButtonDeleteLocalItem": "Smazat místní položku",
|
||||
"ButtonDisableAutoTimer": "Zakázat automatický časovač",
|
||||
"ButtonDisconnect": "Odpojit",
|
||||
"ButtonGoToWebClient": "Otevřít webového klienta",
|
||||
"ButtonHistory": "Historie",
|
||||
"ButtonHome": "Domů",
|
||||
"ButtonIssues": "Problémy",
|
||||
@@ -32,7 +33,8 @@
|
||||
"ButtonOverride": "Přepsat",
|
||||
"ButtonPause": "Pozastavit",
|
||||
"ButtonPlay": "Přehrát",
|
||||
"ButtonPlaying": "Přehrává se",
|
||||
"ButtonPlayEpisode": "Přehrát epizodu",
|
||||
"ButtonPlaying": "Hraje",
|
||||
"ButtonPlaylists": "Seznamy skladeb",
|
||||
"ButtonRead": "Číst",
|
||||
"ButtonRemove": "Odstranit",
|
||||
@@ -55,6 +57,7 @@
|
||||
"HeaderCollection": "Kolekce",
|
||||
"HeaderCollectionItems": "Položky kolekce",
|
||||
"HeaderConnectionStatus": "Stav připojení",
|
||||
"HeaderDataSettings": "Nastavení dat",
|
||||
"HeaderDetails": "Podrobnosti",
|
||||
"HeaderDownloads": "Stahování",
|
||||
"HeaderEbookFiles": "Soubory e-knih",
|
||||
@@ -76,16 +79,18 @@
|
||||
"HeaderSettings": "Nastavení",
|
||||
"HeaderSleepTimer": "Časovač spánku",
|
||||
"HeaderSleepTimerSettings": "Nastavení časovače spánku",
|
||||
"HeaderStatsMinutesListeningChart": "Minuty poslechu (posledních 7 dní)",
|
||||
"HeaderStatsMinutesListeningChart": "Poslech za posledních 7 dní (min)",
|
||||
"HeaderStatsRecentSessions": "Poslední sezení",
|
||||
"HeaderTableOfContents": "Obsah",
|
||||
"HeaderUserInterfaceSettings": "Nastavení uživatelského rozhraní",
|
||||
"HeaderYourStats": "Vaše statistiky",
|
||||
"LabelAddToPlaylist": "Přidat do seznamu skladeb",
|
||||
"LabelAdded": "Přidáno",
|
||||
"LabelAddedAt": "Přidáno v",
|
||||
"LabelAddToPlaylist": "Přidat do seznamu skladeb",
|
||||
"LabelAll": "Vše",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAllowSeekingOnMediaControls": "Povolit vyhledávání polohy v ovládacích prvcích oznámení médií",
|
||||
"LabelAlways": "Vždy",
|
||||
"LabelAskConfirmation": "Požádat o potvrzení",
|
||||
"LabelAuthor": "Autor",
|
||||
"LabelAuthorFirstLast": "Autor (jméno a příjmení)",
|
||||
"LabelAuthorLastFirst": "Autor (příjmení a jméno)",
|
||||
@@ -97,8 +102,8 @@
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Když dojde k uspání automatickým časovačem spánku, pozice přehrávání je posunuta zpět o vybraný čas.",
|
||||
"LabelAutoSleepTimerHelp": "Během přehrávání média v časovém rozmezí \"Od\" a \"Do\" se automaticky spustí časovač spánku.",
|
||||
"LabelBooks": "Knihy",
|
||||
"LabelChapters": "Kapitoly",
|
||||
"LabelChapterTrack": "Stopa kapitoly",
|
||||
"LabelChapters": "Kapitoly",
|
||||
"LabelClosePlayer": "Zavřít přehrávač",
|
||||
"LabelCollapseSeries": "Sbalit sérii",
|
||||
"LabelComplete": "Dokončeno",
|
||||
@@ -118,8 +123,9 @@
|
||||
"LabelDisableVibrateOnResetHelp": "Když je časovač spánku resetován, zařízení zavibruje. Tuto možnost povolte, pokud nechcete, aby zařízení vibrace provádělo při resetování časovače spánku.",
|
||||
"LabelDiscover": "Objevit",
|
||||
"LabelDownload": "Stáhnout",
|
||||
"LabelDownloadUsingCellular": "Stáhnout přes mobilní data",
|
||||
"LabelDownloaded": "Staženo",
|
||||
"LabelDuration": "Trvání",
|
||||
"LabelDuration": "Délka trvání",
|
||||
"LabelEbook": "E-kniha",
|
||||
"LabelEbooks": "E-knihy",
|
||||
"LabelEnable": "Povolit",
|
||||
@@ -136,6 +142,7 @@
|
||||
"LabelFilename": "Název souboru",
|
||||
"LabelFinished": "Dokončeno",
|
||||
"LabelFolder": "Složka",
|
||||
"LabelFontBoldness": "Výraznost písma",
|
||||
"LabelFontScale": "Měřítko písma",
|
||||
"LabelGenre": "Žánr",
|
||||
"LabelGenres": "Žánry",
|
||||
@@ -145,8 +152,8 @@
|
||||
"LabelHeavy": "Těžké",
|
||||
"LabelHigh": "Vysoké",
|
||||
"LabelHost": "Hostitel",
|
||||
"LabelIncomplete": "Neúplné",
|
||||
"LabelInProgress": "Probíhá",
|
||||
"LabelIncomplete": "Neúplné",
|
||||
"LabelInternalAppStorage": "Interní úložiště aplikace",
|
||||
"LabelJumpBackwardsTime": "Délka skoku zpět v čase",
|
||||
"LabelJumpForwardsTime": "Délka skoku vpřed v čase",
|
||||
@@ -156,7 +163,7 @@
|
||||
"LabelLayoutSinglePage": "Jedna stránka",
|
||||
"LabelLight": "Světlé",
|
||||
"LabelLineSpacing": "Řádkování",
|
||||
"LabelListenAgain": "Poslechnout znovu",
|
||||
"LabelListenAgain": "Poslouchat znovu",
|
||||
"LabelLocalBooks": "Místní knihy",
|
||||
"LabelLocalPodcasts": "Místní podcasty",
|
||||
"LabelLockOrientation": "Zamknout orientaci",
|
||||
@@ -169,6 +176,11 @@
|
||||
"LabelName": "Jméno",
|
||||
"LabelNarrator": "Vypravěč",
|
||||
"LabelNarrators": "Vypravěči",
|
||||
"LabelNavigateWithVolume": "Navigace pomocí tlačítek hlasitosti",
|
||||
"LabelNavigateWithVolumeDisabled": "Vypnuto",
|
||||
"LabelNavigateWithVolumeEnabled": "Zapnuto",
|
||||
"LabelNavigateWithVolumeMirrored": "Zrcadleno",
|
||||
"LabelNever": "Nikdy",
|
||||
"LabelNewestAuthors": "Nejnovější autoři",
|
||||
"LabelNewestEpisodes": "Nejnovější epizody",
|
||||
"LabelNo": "Ne",
|
||||
@@ -187,15 +199,16 @@
|
||||
"LabelProgress": "Průběh",
|
||||
"LabelPubDate": "Datum vydání",
|
||||
"LabelPublishYear": "Rok vydání",
|
||||
"LabelRead": "Číst",
|
||||
"LabelReadAgain": "Číst znovu",
|
||||
"LabelRecentlyAdded": "Nedávno přidáno",
|
||||
"LabelRecentSeries": "Nedávné série",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Vlastní e-mail vlastníka",
|
||||
"LabelRSSFeedCustomOwnerName": "Vlastní jméno vlastníka",
|
||||
"LabelRSSFeedPreventIndexing": "Zabránit indexování",
|
||||
"LabelRSSFeedSlug": "Klíčové slovo kanálu RSS",
|
||||
"LabelRandomly": "Náhodně",
|
||||
"LabelRead": "Číst",
|
||||
"LabelReadAgain": "Číst znovu",
|
||||
"LabelRecentSeries": "Nedávné série",
|
||||
"LabelRecentlyAdded": "Nedávno přidáno",
|
||||
"LabelRemoveFromPlaylist": "Odebrat z Playlistu",
|
||||
"LabelScaleElapsedTimeBySpeed": "Škálovat uplynulý čas podle rychlosti",
|
||||
"LabelSeason": "Sezóna",
|
||||
"LabelSelectADevice": "Vyberte zařízení",
|
||||
@@ -207,7 +220,7 @@
|
||||
"LabelShowAll": "Zobrazit vše",
|
||||
"LabelSize": "Velikost",
|
||||
"LabelSleepTimer": "Spánek po",
|
||||
"LabelStart": "Začít",
|
||||
"LabelStart": "Spustit",
|
||||
"LabelStartTime": "Od",
|
||||
"LabelStatsBestDay": "Nejlepší den",
|
||||
"LabelStatsDailyAverage": "Denní průměr",
|
||||
@@ -218,6 +231,7 @@
|
||||
"LabelStatsMinutes": "minut",
|
||||
"LabelStatsMinutesListening": "Minuty poslechu",
|
||||
"LabelStatsWeekListening": "Za týden",
|
||||
"LabelStreamingUsingCellular": "Přehrávání přes mobilní data",
|
||||
"LabelTag": "Štítek",
|
||||
"LabelTags": "Štítky",
|
||||
"LabelTheme": "Téma",
|
||||
@@ -225,6 +239,7 @@
|
||||
"LabelThemeLight": "Světlé",
|
||||
"LabelTimeRemaining": "{0} zbývá",
|
||||
"LabelTitle": "Název",
|
||||
"LabelTotalSize": "Celková velikost",
|
||||
"LabelTotalTrack": "Celková stopa",
|
||||
"LabelTracks": "Stopy",
|
||||
"LabelType": "Typ",
|
||||
@@ -244,15 +259,17 @@
|
||||
"MessageConfirmDeleteLocalEpisode": "Odebrat místní epizodu „{0}“ ze zařízení? Soubor na serveru zůstane nezměněný.",
|
||||
"MessageConfirmDeleteLocalFiles": "Odebrat místní soubory této položky ze zařízení? Soubory na serveru a váš pokrok nebudou ovlivněny.",
|
||||
"MessageConfirmDiscardProgress": "Opravdu chcete zahodit svůj pokrok?",
|
||||
"MessageConfirmDownloadUsingCellular": "Chystáte se stahovat přes mobilní data. Toto může zahrnovat poplatky za mobilní data. Chcete pokračovat?",
|
||||
"MessageConfirmMarkAsFinished": "Opravdu chcete tuto položku označit jako dokončenou?",
|
||||
"MessageConfirmRemoveBookmark": "Opravdu chcete odebrat záložku?",
|
||||
"MessageConfirmStreamingUsingCellular": "Chystáte se přehrávat přes mobilní data. Toto může zahrnovat poplatky za mobilní data. Chcete pokračovat?",
|
||||
"MessageDiscardProgress": "Zahodit pokrok",
|
||||
"MessageDownloadCompleteProcessing": "Stahování dokončeno. Zpracovává se...",
|
||||
"MessageDownloading": "Stahuje se...",
|
||||
"MessageDownloadingEpisode": "Stahuji epizodu",
|
||||
"MessageEpisodesQueuedForDownload": "{0} epizod ve frontě ke stažení",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Epizody zařazené do fronty ke stažení",
|
||||
"MessageFeedURLWillBe": "URL zdroje bude {0}",
|
||||
"MessageFetching": "Získává se...",
|
||||
"MessageFetching": "Načítání...",
|
||||
"MessageFollowTheProjectOnGithub": "Sledujte projekt na GitHubu",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Stahování položky bylo dokončeno, ale nepodařilo se vytvořit položku v knihovně",
|
||||
"MessageLoading": "Načítá se...",
|
||||
@@ -271,24 +288,27 @@
|
||||
"MessageNoMediaFolders": "Žádné složky médií",
|
||||
"MessageNoNetworkConnection": "Žádné připojení k síti",
|
||||
"MessageNoPodcastsFound": "Nebyly nalezeny žádné podcasty",
|
||||
"MessageNoSeries": "Žádné série",
|
||||
"MessageNoUpdatesWereNecessary": "Nebyly nutné žádné aktualizace",
|
||||
"MessageNoUserPlaylists": "Nemáte žádné seznamy skladeb",
|
||||
"MessageReportBugsAndContribute": "Nahlašte chyby, vyžádejte si funkce a přispěte na",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket připojen přes měřenou mobilní síť",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket připojen přes měřenou wifi",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket připojen přes měřenou Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket připojen přes neměřenou mobilní síť",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket připojen přes neměřenou wifi",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket připojen přes neměřenou Wi-Fi",
|
||||
"MessageSocketNotConnected": "Socket není připojen",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Upozornění: Většina aplikací pro podcasty bude vyžadovat, aby adresa URL kanálu RSS používala protokol HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Upozornění: 1 nebo více epizod nemá datum vydání. Některé podcastové aplikace to vyžadují.",
|
||||
"ToastBookmarkCreateFailed": "Vytvoření záložky se nezdařilo",
|
||||
"ToastBookmarkRemoveFailed": "Nepodařilo se odstranit záložku",
|
||||
"ToastBookmarkUpdateFailed": "Aktualizace záložky se nezdařila",
|
||||
"ToastDownloadNotAllowedOnCellular": "Stahování přes mobilní data není povoleno",
|
||||
"ToastItemMarkedAsFinishedFailed": "Nepodařilo se označit jako dokončené",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Nepodařilo se označit jako nedokončené",
|
||||
"ToastPlaylistCreateFailed": "Vytvoření seznamu přehrávání se nezdařilo",
|
||||
"ToastPodcastCreateFailed": "Vytvoření podcastu se nezdařilo",
|
||||
"ToastPodcastCreateSuccess": "Podcast byl úspěšně vytvořen",
|
||||
"ToastRSSFeedCloseFailed": "Nepodařilo se zavřít RSS kanál",
|
||||
"ToastRSSFeedCloseSuccess": "RSS kanál uzavřen"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "RSS kanál uzavřen",
|
||||
"ToastStreamingNotAllowedOnCellular": "Přehrávání přes mobilní data není povoleno"
|
||||
}
|
||||
|
||||
+91
-135
@@ -1,52 +1,54 @@
|
||||
{
|
||||
"ButtonAdd": "Tilføj",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAddNewServer": "Tilføj ny server",
|
||||
"ButtonAuthors": "Forfattere",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonBack": "Tilbage",
|
||||
"ButtonCancel": "Annuller",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonCancelTimer": "Stop timer",
|
||||
"ButtonClearFilter": "Ryd filter",
|
||||
"ButtonCloseFeed": "Luk feed",
|
||||
"ButtonCollections": "Samlinger",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonConnect": "Forbind",
|
||||
"ButtonConnectToServer": "Forbind til Server",
|
||||
"ButtonCreate": "Opret",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonCreateBookmark": "Opret Bogmærker",
|
||||
"ButtonCreateNewPlaylist": "Opret Ny Playlist",
|
||||
"ButtonDelete": "Slet",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonDeleteLocalEpisode": "Slet lokalt afsnit",
|
||||
"ButtonDeleteLocalFile": "Slet lokal fil",
|
||||
"ButtonDeleteLocalItem": "Slet lokalt element",
|
||||
"ButtonDisableAutoTimer": "Afbryd Auto Timer",
|
||||
"ButtonDisconnect": "Luk forbindelse",
|
||||
"ButtonGoToWebClient": "Gå til webklient",
|
||||
"ButtonHistory": "Historik",
|
||||
"ButtonHome": "Hjem",
|
||||
"ButtonIssues": "Problemer",
|
||||
"ButtonLatest": "Seneste",
|
||||
"ButtonLibrary": "Bibliotek",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonLocalMedia": "Lokalt medie",
|
||||
"ButtonManageLocalFiles": "Administrér Lokale Filer",
|
||||
"ButtonNewFolder": "Ny Folder",
|
||||
"ButtonNextEpisode": "Næste Afsnit",
|
||||
"ButtonOpenFeed": "Åbn feed",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPlay": "Afspil",
|
||||
"ButtonPlayEpisode": "Afspil Afsnit",
|
||||
"ButtonPlaying": "Afspiller",
|
||||
"ButtonPlaylists": "Afspilningslister",
|
||||
"ButtonRead": "Læs",
|
||||
"ButtonRemove": "Fjern",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonRemoveFromServer": "Fjern fra Server",
|
||||
"ButtonSave": "Gem",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSaveOrder": "Gem Rækkefølge",
|
||||
"ButtonSearch": "Søg",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSeries": "Serie",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonSendEbookToDevice": "Send E-bog til Enhed",
|
||||
"ButtonSeries": "Serier",
|
||||
"ButtonSetTimer": "Indstil timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "Send",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonSwitchServerUser": "Skift Server/Bruger",
|
||||
"ButtonUserStats": "Bruger statitstik",
|
||||
"ButtonYes": "Ja",
|
||||
"HeaderAccount": "Konto",
|
||||
"HeaderAdvanced": "Avanceret",
|
||||
@@ -54,7 +56,8 @@
|
||||
"HeaderChapters": "Kapitler",
|
||||
"HeaderCollection": "Samling",
|
||||
"HeaderCollectionItems": "Samlingselementer",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderConnectionStatus": "Forbindelsesstatus",
|
||||
"HeaderDataSettings": "Data indstillinger",
|
||||
"HeaderDetails": "Detaljer",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "E-bogsfiler",
|
||||
@@ -62,152 +65,132 @@
|
||||
"HeaderEreaderSettings": "E-læser Indstillinger",
|
||||
"HeaderLatestEpisodes": "Seneste episoder",
|
||||
"HeaderLibraries": "Biblioteker",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderLocalFolders": "Lokale mapper",
|
||||
"HeaderLocalLibraryItems": "Lokale biblioteks elementer",
|
||||
"HeaderNewPlaylist": "Ny afspilningsliste",
|
||||
"HeaderOpenRSSFeed": "Åbn RSS Feed",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaybackSettings": "Afspilnings indstillinger",
|
||||
"HeaderPlaylist": "Afspilningsliste",
|
||||
"HeaderPlaylistItems": "Afspilningsliste Elementer",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS Detaljer",
|
||||
"HeaderRSSFeedIsOpen": "RSS Feed er Åben",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderSelectDownloadLocation": "Vælg Download Placering",
|
||||
"HeaderSettings": "Indstillinger",
|
||||
"HeaderSleepTimer": "Søvntimer",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer instillinger",
|
||||
"HeaderStatsMinutesListeningChart": "Minutter Lyttet (sidste 7 dage)",
|
||||
"HeaderStatsRecentSessions": "Seneste Sessions",
|
||||
"HeaderTableOfContents": "Indholdsfortegnelse",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderUserInterfaceSettings": "Indstillinger for brugergrænseflade",
|
||||
"HeaderYourStats": "Dine Statistikker",
|
||||
"LabelAdded": "Tilføjet",
|
||||
"LabelAddedAt": "Tilføjet Kl.",
|
||||
"LabelAddToPlaylist": "Tilføj til Afspilningsliste",
|
||||
"LabelAdded": "Tilføjet",
|
||||
"LabelAddedAt": "Tilføjet Kl",
|
||||
"LabelAll": "Alle",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAllowSeekingOnMediaControls": "Tillad positionssøgning på mediemeddelelseskontroller",
|
||||
"LabelAlways": "Altid",
|
||||
"LabelAskConfirmation": "Bed om bekræftelse",
|
||||
"LabelAuthor": "Forfatter",
|
||||
"LabelAuthorFirstLast": "Forfatter (Fornavn Efternavn)",
|
||||
"LabelAuthorLastFirst": "Forfatter (Efternavn, Fornavn)",
|
||||
"LabelAuthors": "Forfattere",
|
||||
"LabelAutoDownloadEpisodes": "Auto Download Episoder",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoRewindTime": "Automatisk tilbagespolingstid",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelAutoSleepTimerAutoRewind": "Automatisk sleep timer automatisk tilbagespoling",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Når den automatiske sleep-timer er færdig, vil genafspilning af elementet automatisk spole din position tilbage.",
|
||||
"LabelAutoSleepTimerHelp": "Når der afspilles medie mellem de angivne start- og sluttidspunkter, starter en sleep-timer automatisk.",
|
||||
"LabelBooks": "Bøger",
|
||||
"LabelChapterTrack": "Kapitel spor",
|
||||
"LabelChapters": "Kapitler",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Luk afspiller",
|
||||
"LabelCollapseSeries": "Fold Serie Sammen",
|
||||
"LabelCollapseSeries": "Fold Serier Sammen",
|
||||
"LabelComplete": "Fuldfør",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelContinueBooks": "Fortsæt Bøger",
|
||||
"LabelContinueEpisodes": "Fortsæt Episoder",
|
||||
"LabelContinueListening": "Fortsæt med at lytte",
|
||||
"LabelContinueReading": "Fortsæt med at læse",
|
||||
"LabelContinueSeries": "Fortsæt Serien",
|
||||
"LabelCustomTime": "Brugerdefineret tid",
|
||||
"LabelDescription": "Beskrivelse",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDisableAudioFadeOut": "Deaktiver lydudtoning",
|
||||
"LabelDisableAudioFadeOutHelp": "Lydstyrken begynder at falde, når der er mindre end 1 minut tilbage på sleep-timeren. Aktiver denne indstilling for ikke at fade ud.",
|
||||
"LabelDisableAutoRewind": "Deaktiver automatisk tilbagespoling",
|
||||
"LabelDisableShakeToReset": "Deaktiver ryst for at nulstille",
|
||||
"LabelDisableShakeToResetHelp": "Hvis du ryster din enhed, mens timeren kører ELLER inden for 2 minutter før, at timeren er udløbet, nulstilles sleeptimeren. Aktiver denne indstilling for at deaktivere \"rystelse for at nulstille\".",
|
||||
"LabelDisableVibrateOnReset": "Deaktiver vibrering ved nulstilling",
|
||||
"LabelDisableVibrateOnResetHelp": "Når sleep-timeren nulstilles, vil din enhed vibrere. Aktiver denne indstilling for ikke at vibrere, når sleep-timeren nulstilles.",
|
||||
"LabelDiscover": "Opdag",
|
||||
"LabelDownload": "Download",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDownloadUsingCellular": "Download med mobildata",
|
||||
"LabelDownloaded": "Downloadet",
|
||||
"LabelDuration": "Varighed",
|
||||
"LabelEbook": "E-bog",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEbooks": "E-bøger",
|
||||
"LabelEnable": "Aktivér",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnableMp3IndexSeeking": "Aktiver mp3-indekssøgning",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Denne indstilling bør kun aktiveres, hvis du har mp3-filer, der ikke søger korrekt. Upræcis søgning skyldes højst sandsynligt Variable birate (VBR) MP3-filer. Denne indstilling vil fremtvinge indekssøgning, hvor en tid-til-byte mapping er bygget, mens filen læses. I nogle tilfælde med store MP3-filer vil der være en forsinkelse ved søgning mod slutningen af filen.",
|
||||
"LabelEnd": "Slut",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEndOfChapter": "Slutningen af kapitel",
|
||||
"LabelEndTime": "Sluttidspunkt",
|
||||
"LabelEpisode": "Episode",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFile": "Fil",
|
||||
"LabelFileBirthtime": "Fødselstidspunkt for fil",
|
||||
"LabelFileBirthtime": "Oprettelsestidspunkt for fil",
|
||||
"LabelFileModified": "Fil ændret",
|
||||
"LabelFilename": "Filnavn",
|
||||
"LabelFinished": "Færdig",
|
||||
"LabelFolder": "Mappe",
|
||||
"LabelFontBoldness": "Skrift tykkelse",
|
||||
"LabelFontScale": "Skriftstørrelse",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genrer",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHapticFeedback": "Haptisk feedback",
|
||||
"LabelHasEbook": "Har e-bog",
|
||||
"LabelHasSupplementaryEbook": "Har supplerende e-bog",
|
||||
"LabelHeavy": "Tung",
|
||||
"LabelHigh": "Høj",
|
||||
"LabelHost": "Vært",
|
||||
"LabelIncomplete": "Ufuldstændig",
|
||||
"LabelInProgress": "I gang",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelIncomplete": "Ufuldstændig",
|
||||
"LabelJumpBackwardsTime": "Spring tilbage tid",
|
||||
"LabelJumpForwardsTime": "Spring frem tid",
|
||||
"LabelLanguage": "Sprog",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLineSpacing": "Linjeafstand",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelLockPlayer": "Lås afspiller",
|
||||
"LabelMediaType": "Medietype",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMore": "Mere",
|
||||
"LabelMoreInfo": "Mere info",
|
||||
"LabelName": "Navn",
|
||||
"LabelNarrator": "Fortæller",
|
||||
"LabelNarrators": "Fortællere",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNever": "Aldrig",
|
||||
"LabelNotFinished": "Ikke færdig",
|
||||
"LabelNotStarted": "Ikke påbegyndt",
|
||||
"LabelOff": "Off",
|
||||
"LabelPassword": "Kodeord",
|
||||
"LabelPath": "Sti",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackSpeed": "Afspilningshastighed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Forhindrer, at dit feed bliver indekseret af iTunes og Google podcastkataloger",
|
||||
"LabelProgress": "Fremskridt",
|
||||
"LabelPubDate": "Udgivelsesdato",
|
||||
"LabelPublishYear": "Udgivelsesår",
|
||||
"LabelRead": "Læst",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Brugerdefineret ejerens e-mail",
|
||||
"LabelRSSFeedCustomOwnerName": "Brugerdefineret ejerens navn",
|
||||
"LabelRSSFeedPreventIndexing": "Forhindrer indeksering",
|
||||
"LabelRSSFeedSlug": "RSS-feed-slug",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelRandomly": "Tilfældigt",
|
||||
"LabelRead": "Læst",
|
||||
"LabelRecentSeries": "Seneste serier",
|
||||
"LabelSeason": "Sæson",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSeries": "Serie",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelSetEbookAsPrimary": "Indstil som primær",
|
||||
"LabelSetEbookAsSupplementary": "Indstil som supplerende",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShowAll": "Vis alle",
|
||||
"LabelSize": "Størrelse",
|
||||
"LabelSleepTimer": "Søvntimer",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Starttid",
|
||||
"LabelStatsBestDay": "Bedste dag",
|
||||
"LabelStatsDailyAverage": "Daglig gennemsnit",
|
||||
@@ -225,60 +208,33 @@
|
||||
"LabelThemeLight": "Lys",
|
||||
"LabelTimeRemaining": "{0} tilbage",
|
||||
"LabelTitle": "Titel",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Spor",
|
||||
"LabelType": "Type",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUser": "Bruger",
|
||||
"LabelUsername": "Brugernavn",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelYourBookmarks": "Dine bogmærker",
|
||||
"LabelYourProgress": "Din fremgang",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageDiscardProgress": "Kassér fremgang",
|
||||
"MessageDownloadCompleteProcessing": "Download fuldført. Behandler...",
|
||||
"MessageDownloading": "Downloader...",
|
||||
"MessageDownloadingEpisode": "Downloader episode",
|
||||
"MessageEpisodesQueuedForDownload": "{0} episoder er sat i kø til download",
|
||||
"MessageFeedURLWillBe": "Feed-URL vil være {0}",
|
||||
"MessageFetching": "Henter...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on GitHub",
|
||||
"MessageLoading": "Indlæser...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageMarkAsFinished": "Markér som afsluttet",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "Ingen bogmærker",
|
||||
"MessageNoChapters": "Ingen kapitler",
|
||||
"MessageNoItems": "Ingen elementer",
|
||||
"MessageNoItemsFound": "Ingen elementer fundet",
|
||||
"MessageNoListeningSessions": "Ingen lyttesessioner",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoPodcastsFound": "Ingen podcasts fundet",
|
||||
"MessageNoSeries": "Ingen serier",
|
||||
"MessageNoUpdatesWereNecessary": "Ingen opdateringer var nødvendige",
|
||||
"MessageNoUserPlaylists": "Du har ingen afspilningslister",
|
||||
"MessageReportBugsAndContribute": "Rapporter fejl, anmod om funktioner og bidrag på",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered Wi-Fi",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Advarsel: De fleste podcast-apps kræver, at RSS-feedets URL bruger HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Advarsel: En eller flere af dine episoder har ikke en Pub Date. Nogle podcast-apps kræver dette.",
|
||||
"ToastBookmarkCreateFailed": "Mislykkedes oprettelse af bogmærke",
|
||||
@@ -291,4 +247,4 @@
|
||||
"ToastPodcastCreateSuccess": "Podcast oprettet med succes",
|
||||
"ToastRSSFeedCloseFailed": "Mislykkedes lukning af RSS-feed",
|
||||
"ToastRSSFeedCloseSuccess": "RSS-feed lukket"
|
||||
}
|
||||
}
|
||||
|
||||
+72
-49
@@ -19,6 +19,7 @@
|
||||
"ButtonDeleteLocalItem": "Lösche lokales Element",
|
||||
"ButtonDisableAutoTimer": "Deaktiviere automatischen Timer",
|
||||
"ButtonDisconnect": "Trennen",
|
||||
"ButtonGoToWebClient": "Gehe zum Web Client",
|
||||
"ButtonHistory": "Historie",
|
||||
"ButtonHome": "Startseite",
|
||||
"ButtonIssues": "Probleme",
|
||||
@@ -30,20 +31,21 @@
|
||||
"ButtonNextEpisode": "Nächste Episode",
|
||||
"ButtonOpenFeed": "Feed öffnen",
|
||||
"ButtonOverride": "Überschreiben",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPause": "Pausieren",
|
||||
"ButtonPlay": "Abspielen",
|
||||
"ButtonPlayEpisode": "Episode abspielen",
|
||||
"ButtonPlaying": "Spielt",
|
||||
"ButtonPlaylists": "Wiedergabelisten",
|
||||
"ButtonRead": "Lesen",
|
||||
"ButtonRemove": "Löschen",
|
||||
"ButtonRemove": "Entfernen",
|
||||
"ButtonRemoveFromServer": "Vom Server entfernen",
|
||||
"ButtonSave": "Speichern",
|
||||
"ButtonSaveOrder": "Reihenfolge speichern",
|
||||
"ButtonSearch": "Suchen",
|
||||
"ButtonSendEbookToDevice": "Sende E-Book an Gerät",
|
||||
"ButtonSendEbookToDevice": "E-Buch an Gerät senden",
|
||||
"ButtonSeries": "Serien",
|
||||
"ButtonSetTimer": "Setze Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonStream": "Streamen",
|
||||
"ButtonSubmit": "Ok",
|
||||
"ButtonSwitchServerUser": "Wechsle Server/Benutzer",
|
||||
"ButtonUserStats": "Nutzerstatistiken",
|
||||
@@ -52,21 +54,22 @@
|
||||
"HeaderAdvanced": "Erweitert",
|
||||
"HeaderAudioTracks": "Audiodateien",
|
||||
"HeaderChapters": "Kapitel",
|
||||
"HeaderCollection": "Sammlungen",
|
||||
"HeaderCollection": "Sammlung",
|
||||
"HeaderCollectionItems": "Sammlungseinträge",
|
||||
"HeaderConnectionStatus": "Verbindungsstatus",
|
||||
"HeaderDataSettings": "Daten-Einstellungen",
|
||||
"HeaderDetails": "Details",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "E-Book Dateien",
|
||||
"HeaderEbookFiles": "E-Buch-Dateien",
|
||||
"HeaderEpisodes": "Episoden",
|
||||
"HeaderEreaderSettings": "E-Reader Einstellungen",
|
||||
"HeaderEreaderSettings": "Einstellungen zum Lesen",
|
||||
"HeaderLatestEpisodes": "Neueste Episoden",
|
||||
"HeaderLibraries": "Bibliotheken",
|
||||
"HeaderLocalFolders": "Lokale Ordner",
|
||||
"HeaderLocalLibraryItems": "Lokale Bibliothek Elemente",
|
||||
"HeaderLocalLibraryItems": "Elemente der lokalen Bibliothek",
|
||||
"HeaderNewPlaylist": "Neue Wiedergabeliste",
|
||||
"HeaderOpenRSSFeed": "RSS-Feed öffnen",
|
||||
"HeaderPlaybackSettings": "Wiedergabe Einstellungen",
|
||||
"HeaderPlaybackSettings": "Wiedergabe-Einstellungen",
|
||||
"HeaderPlaylist": "Wiedergabeliste",
|
||||
"HeaderPlaylistItems": "Einträge in der Wiedergabeliste",
|
||||
"HeaderRSSFeed": "RSS-Feed",
|
||||
@@ -74,33 +77,35 @@
|
||||
"HeaderRSSFeedIsOpen": "RSS-Feed ist geöffnet",
|
||||
"HeaderSelectDownloadLocation": "Wähle Download-Speicherort",
|
||||
"HeaderSettings": "Einstellungen",
|
||||
"HeaderSleepTimer": "Sleep-Timer",
|
||||
"HeaderSleepTimerSettings": "Sleep-Timer Einstellungen",
|
||||
"HeaderSleepTimer": "Schlummerfunktion",
|
||||
"HeaderSleepTimerSettings": "Schlummerfunktion Einstellungen",
|
||||
"HeaderStatsMinutesListeningChart": "Hörminuten (letzte 7 Tage)",
|
||||
"HeaderStatsRecentSessions": "Neueste Ereignisse",
|
||||
"HeaderTableOfContents": "Inhaltsverzeichnis",
|
||||
"HeaderUserInterfaceSettings": "Einstellungen der Benutzeroberfläche",
|
||||
"HeaderYourStats": "Eigene Statistiken",
|
||||
"LabelAddToPlaylist": "Zur Wiedergabeliste hinzufügen",
|
||||
"LabelAdded": "Hinzugefügt",
|
||||
"LabelAddedAt": "Hinzugefügt am",
|
||||
"LabelAddToPlaylist": "Zur Wiedergabeliste hinzufügen",
|
||||
"LabelAll": "Alle",
|
||||
"LabelAllowSeekingOnMediaControls": "Erlaube Vor- und Zurückspulen auf dem Medienkontrollelement bei den Benachrichtigungen",
|
||||
"LabelAlways": "Immer",
|
||||
"LabelAskConfirmation": "Bestätigung anfordern",
|
||||
"LabelAuthor": "Autor",
|
||||
"LabelAuthorFirstLast": "Autor (Vorname Nachname)",
|
||||
"LabelAuthorLastFirst": "Autor (Nachname, Vorname)",
|
||||
"LabelAuthors": "Autoren",
|
||||
"LabelAutoDownloadEpisodes": "Episoden automatisch herunterladen",
|
||||
"LabelAutoRewindTime": "Automatische Rückspulzeit",
|
||||
"LabelAutoSleepTimer": "Automatischer Sleep-Timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Automatischer Sleep-Timer automatische Rückspulzeit",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Wenn der Sleep-Timer abgelaufen ist, wird bei der erneuten Wiedergabe des Titels die Position automatisch zurückgespult.",
|
||||
"LabelAutoSleepTimerHelp": "Bei der Wiedergabe von Medien zwischen der angegebenen Start- und Endzeit wird automatisch ein Sleep-Timer gestartet.",
|
||||
"LabelAutoSleepTimer": "Automatische Schlummerfunktion",
|
||||
"LabelAutoSleepTimerAutoRewind": "Automatische Schlummerfunktion automatische Rückspulzeit",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Wenn die Schlummerfunktion abgelaufen ist, wird bei der erneuten Wiedergabe des Titels die Position automatisch zurückgespult.",
|
||||
"LabelAutoSleepTimerHelp": "Bei der Wiedergabe von Medien zwischen der angegebenen Start- und Endzeit wird automatisch eine Schlummerfunktion gestartet.",
|
||||
"LabelBooks": "Bücher",
|
||||
"LabelChapterTrack": "Kapitelspur",
|
||||
"LabelChapters": "Kapitel",
|
||||
"LabelChapterTrack": "Kapitel Spur",
|
||||
"LabelClosePlayer": "Player schließen",
|
||||
"LabelCollapseSeries": "Serien zusammenfassen",
|
||||
"LabelCollapseSeries": "Serien einklappen",
|
||||
"LabelComplete": "Vollständig",
|
||||
"LabelContinueBooks": "Bücher fortfahren",
|
||||
"LabelContinueEpisodes": "Episoden fortfahren",
|
||||
@@ -118,42 +123,44 @@
|
||||
"LabelDisableVibrateOnResetHelp": "Wenn der Sleep-Timer zurückgesetzt wird, vibriert dein Gerät. Aktiviere diese Einstellung, um nicht zu vibrieren, wenn der Sleep-Timer zurückgesetzt wird.",
|
||||
"LabelDiscover": "Entdecken",
|
||||
"LabelDownload": "Herunterladen",
|
||||
"LabelDownloadUsingCellular": "Über mobile Daten herunterladen",
|
||||
"LabelDownloaded": "Heruntergeladen",
|
||||
"LabelDuration": "Laufzeit",
|
||||
"LabelEbook": "E-Book",
|
||||
"LabelEbooks": "E-Books",
|
||||
"LabelEbook": "E-Buch",
|
||||
"LabelEbooks": "E-Bücher",
|
||||
"LabelEnable": "Aktivieren",
|
||||
"LabelEnableMp3IndexSeeking": "MP3-Indexsuche",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Diese Einstellung sollte nur aktiviert werden, wenn du MP3-Dateien hast, bei denen das Navigieren (Seeking) nicht korrekt funktioniert. Ungenaues Navigieren ist höchstwahrscheinlich auf MP3-Dateien mit variabler Bitrate (VBR) zurückzuführen. Diese Einstellung erzwingt das Index-Navigieren (Index Seeking), bei dem eine Zeit-zu-Byte-Zuordnung erstellt wird, während die Datei gelesen wird. In einigen Fällen kann es bei großen MP3-Dateien zu einer Verzögerung kommen, wenn gegen Ende der Datei navigiert wird.",
|
||||
"LabelEnd": "Ende",
|
||||
"LabelEndOfChapter": "Kapitelende",
|
||||
"LabelEndOfChapter": "Ende des Kapitels",
|
||||
"LabelEndTime": "Endzeit",
|
||||
"LabelEpisode": "Episode",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFeedURL": "Feed-URL",
|
||||
"LabelFile": "Datei",
|
||||
"LabelFileBirthtime": "Datei erstellt",
|
||||
"LabelFileModified": "Datei geändert",
|
||||
"LabelFilename": "Dateiname",
|
||||
"LabelFinished": "Beendet",
|
||||
"LabelFolder": "Ordner",
|
||||
"LabelFontBoldness": "Schriftstärke",
|
||||
"LabelFontScale": "Schriftgröße",
|
||||
"LabelGenre": "Kategorie",
|
||||
"LabelGenres": "Kategorien",
|
||||
"LabelHapticFeedback": "Haptische Rückmeldung",
|
||||
"LabelHasEbook": "E-Book verfügbar",
|
||||
"LabelHasSupplementaryEbook": "Ergänzendes E-Book verfügbar",
|
||||
"LabelHasEbook": "E-Buch verfügbar",
|
||||
"LabelHasSupplementaryEbook": "Ergänzendes E-Buch verfügbar",
|
||||
"LabelHeavy": "Stark",
|
||||
"LabelHigh": "Hoch",
|
||||
"LabelHost": "Host",
|
||||
"LabelIncomplete": "Unvollständig",
|
||||
"LabelHost": "Anbieter",
|
||||
"LabelInProgress": "In Bearbeitung",
|
||||
"LabelIncomplete": "Unvollständig",
|
||||
"LabelInternalAppStorage": "Interner App Speicher",
|
||||
"LabelJumpBackwardsTime": "Rückspulzeit",
|
||||
"LabelJumpForwardsTime": "Vorwärtsspulzeit",
|
||||
"LabelLanguage": "Sprache",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayout": "Ansicht",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Einzelne Seite",
|
||||
"LabelLayoutSinglePage": "Eine Seite",
|
||||
"LabelLight": "Leicht",
|
||||
"LabelLineSpacing": "Zeilenabstand",
|
||||
"LabelListenAgain": "Erneut anhören",
|
||||
@@ -169,6 +176,11 @@
|
||||
"LabelName": "Name",
|
||||
"LabelNarrator": "Erzähler",
|
||||
"LabelNarrators": "Erzähler",
|
||||
"LabelNavigateWithVolume": "Mit Lautstärke blättern",
|
||||
"LabelNavigateWithVolumeDisabled": "Aus",
|
||||
"LabelNavigateWithVolumeEnabled": "An",
|
||||
"LabelNavigateWithVolumeMirrored": "Umgekehrt",
|
||||
"LabelNever": "Nie",
|
||||
"LabelNewestAuthors": "Neueste Autoren",
|
||||
"LabelNewestEpisodes": "Neueste Episoden",
|
||||
"LabelNo": "Nein",
|
||||
@@ -187,26 +199,27 @@
|
||||
"LabelProgress": "Fortschritt",
|
||||
"LabelPubDate": "Veröffentlichungsdatum",
|
||||
"LabelPublishYear": "Jahr",
|
||||
"LabelRead": "Lesen",
|
||||
"LabelReadAgain": "Erneut lesen",
|
||||
"LabelRecentlyAdded": "Kürzlich hinzugefügt",
|
||||
"LabelRecentSeries": "Aktuelle Serien",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail",
|
||||
"LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers",
|
||||
"LabelRSSFeedPreventIndexing": "Indizierung verhindern",
|
||||
"LabelRSSFeedSlug": "RSS Feed Schlagwort",
|
||||
"LabelRSSFeedSlug": "RSS-Feed-Schlagwort",
|
||||
"LabelRandomly": "Zufällig",
|
||||
"LabelRead": "Lesen",
|
||||
"LabelReadAgain": "Noch einmal Lesen",
|
||||
"LabelRecentSeries": "Aktuelle Serien",
|
||||
"LabelRecentlyAdded": "Kürzlich hinzugefügt",
|
||||
"LabelRemoveFromPlaylist": "Von Wiedergabeliste entfernen",
|
||||
"LabelScaleElapsedTimeBySpeed": "Vergangene Zeit anhand der Geschwindigkeit skalieren",
|
||||
"LabelSeason": "Staffel",
|
||||
"LabelSelectADevice": "Wähle ein Gerät",
|
||||
"LabelSeries": "Serien",
|
||||
"LabelServerAddress": "Server Adresse",
|
||||
"LabelServerAddress": "Serveradresse",
|
||||
"LabelSetEbookAsPrimary": "Als Hauptbuch setzen",
|
||||
"LabelSetEbookAsSupplementary": "Als Ergänzung setzen",
|
||||
"LabelShakeSensitivity": "Schüttel-Empfindlichkeit",
|
||||
"LabelShowAll": "Alles anzeigen",
|
||||
"LabelSize": "Größe",
|
||||
"LabelSleepTimer": "Sleep-Timer",
|
||||
"LabelSleepTimer": "Schlummerfunktion",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Startzeit",
|
||||
"LabelStatsBestDay": "Bester Tag",
|
||||
@@ -217,14 +230,16 @@
|
||||
"LabelStatsItemsFinished": "Gehörte Medien",
|
||||
"LabelStatsMinutes": "Minuten",
|
||||
"LabelStatsMinutesListening": "Gehörte Minuten",
|
||||
"LabelStatsWeekListening": "Gehörte Wochen",
|
||||
"LabelStatsWeekListening": "Wochenhördauer",
|
||||
"LabelStreamingUsingCellular": "Über mobile Daten streamen",
|
||||
"LabelTag": "Schlagwort",
|
||||
"LabelTags": "Schlagwörter",
|
||||
"LabelTheme": "Theme",
|
||||
"LabelTheme": "Farbschema",
|
||||
"LabelThemeDark": "Dunkel",
|
||||
"LabelThemeLight": "Hell",
|
||||
"LabelTimeRemaining": "{0} verbleibend",
|
||||
"LabelTitle": "Titel",
|
||||
"LabelTotalSize": "Gesamtegröße",
|
||||
"LabelTotalTrack": "Gesamtanzahl Titel",
|
||||
"LabelTracks": "Titel",
|
||||
"LabelType": "Typ",
|
||||
@@ -244,18 +259,20 @@
|
||||
"MessageConfirmDeleteLocalEpisode": "Soll die lokale Episode \"{0}\" von deinem Gerät entfernt werden? Die Datei auf dem Server bleibt davon unberührt.",
|
||||
"MessageConfirmDeleteLocalFiles": "Sollen lokale Dateien dieses Elements von deinem Gerät entfernt werden? Die Dateien auf dem Server und Ihr Fortschritt bleiben davon unberührt.",
|
||||
"MessageConfirmDiscardProgress": "Bist du sicher, dass du deinen Fortschritt zurücksetzen willst?",
|
||||
"MessageConfirmDownloadUsingCellular": "Du bist dabei, über mobile Daten herunterzuladen. Dies kann zu Gebühren deines Mobilfunkanbieters führen. Möchtest du fortfahren?",
|
||||
"MessageConfirmMarkAsFinished": "Bist du sicher, dass du diesen Artikel als beendet markieren willst?",
|
||||
"MessageConfirmRemoveBookmark": "Bist du sicher, dass du das Lesezeichen entfernen willst?",
|
||||
"MessageConfirmStreamingUsingCellular": "Du bist dabei, über mobile Daten zu streamen. Dies kann zu Gebühren deines Mobilfunkanbieters führen. Möchtest du fortfahren?",
|
||||
"MessageDiscardProgress": "Fortschritt verwerfen",
|
||||
"MessageDownloadCompleteProcessing": "Download abgeschlossen. Verarbeite...",
|
||||
"MessageDownloading": "Herunterladen...",
|
||||
"MessageDownloadCompleteProcessing": "Download abgeschlossen. Wird verarbeitet …",
|
||||
"MessageDownloading": "Wird heruntergeladen …",
|
||||
"MessageDownloadingEpisode": "Episode herunterladen",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Episode(n) in der Warteschlange zum Herunterladen",
|
||||
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
|
||||
"MessageFetching": "Abrufen...",
|
||||
"MessageFollowTheProjectOnGithub": "Folge dem Projekt auf Github",
|
||||
"MessageFetching": "Wird abgerufen …",
|
||||
"MessageFollowTheProjectOnGithub": "Folge dem Projekt auf GitHub",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Element-Download abgeschlossen, aber Bibliothekselement kann nicht erstellt werden",
|
||||
"MessageLoading": "Laden...",
|
||||
"MessageLoading": "Wird geladen …",
|
||||
"MessageLoadingServerData": "Lade Server Daten...",
|
||||
"MessageMarkAsFinished": "Als beendet markieren",
|
||||
"MessageMediaLinkedToADifferentServer": "Die Medien sind mit einem Audiobookshelf-Server mit einer anderen Adresse ({0}) verknüpft. Der Fortschritt wird synchronisiert, wenn eine Verbindung zu dieser Serveradresse besteht.",
|
||||
@@ -271,24 +288,30 @@
|
||||
"MessageNoMediaFolders": "Keine Medien Ordner",
|
||||
"MessageNoNetworkConnection": "Keine Netzwerkverbindung",
|
||||
"MessageNoPodcastsFound": "Keine Podcasts gefunden",
|
||||
"MessageNoSeries": "Keine Serie",
|
||||
"MessageNoUpdatesWereNecessary": "Keine Aktualisierungen waren notwendig",
|
||||
"MessageNoUserPlaylists": "Keine Wiedergabelisten vorhanden",
|
||||
"MessageReportBugsAndContribute": "Fehler melden, Funktionen anfordern und mitwirken",
|
||||
"MessageSeriesAlreadyDownloaded": "Du hast bereits alle Bücher in dieser Serie heruntergeladen.",
|
||||
"MessageSeriesDownloadConfirm": "Lade {0} Bücher mit {1} Daten, zusammen {2}, in den Ordner {3} herunter?",
|
||||
"MessageSeriesDownloadConfirmIos": "Lade {0} Bücher mit {1} Daten, zusammen {2}, herunter?",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket verbunden über getaktetes Mobilfunknetz",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket verbunden über getaktetes WLAN",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket verbunden über ungetaktetes Mobilfunknetz",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket verbunden über ungetaktetes Mobilfunknetz",
|
||||
"MessageSocketNotConnected": "Socket nicht verbunden",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Warnung: Die meisten Podcast-Apps verlangen, dass die URL des RSS-Feeds HTTPS verwendet.",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Warnung: Die meisten Podcast-Apps verlangen, dass die URL des RSS-Feeds HTTPS verwendet",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Warnung: 1 oder mehrere deiner Episoden haben kein Veröffentlichungsdatum. Einige Podcast-Apps verlangen dies.",
|
||||
"ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden",
|
||||
"ToastBookmarkRemoveFailed": "Lesezeichen konnte nicht gelöscht werden",
|
||||
"ToastBookmarkRemoveFailed": "Lesezeichen konnte nicht entfernt werden",
|
||||
"ToastBookmarkUpdateFailed": "Lesezeichenaktualisierung fehlgeschlagen",
|
||||
"ToastItemMarkedAsFinishedFailed": "Fehler bei der Markierung des Mediums als \"Beendet\"",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Fehler bei der Markierung des Mediums als \"Nicht Beendet\"",
|
||||
"ToastDownloadNotAllowedOnCellular": "Das Herunterladen über mobile Daten ist nicht erlaubt",
|
||||
"ToastItemMarkedAsFinishedFailed": "Fehler bei der Markierung des Artikels als \"Beendet\"",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Fehler bei der Markierung des Artikels als \"Nicht Beendet\"",
|
||||
"ToastPlaylistCreateFailed": "Erstellen der Wiedergabeliste fehlgeschlagen",
|
||||
"ToastPodcastCreateFailed": "Podcast konnte nicht erstellt werden",
|
||||
"ToastPodcastCreateSuccess": "Podcast erstellt",
|
||||
"ToastRSSFeedCloseFailed": "RSS-Feed konnte nicht geschlossen werden",
|
||||
"ToastRSSFeedCloseSuccess": "RSS-Feed geschlossen"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "RSS-Feed geschlossen",
|
||||
"ToastStreamingNotAllowedOnCellular": "Das Streamen über mobile Daten ist nicht erlaubt"
|
||||
}
|
||||
|
||||
+33
-10
@@ -19,6 +19,7 @@
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonGoToWebClient": "Go to Web Client",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonHome": "Home",
|
||||
"ButtonIssues": "Issues",
|
||||
@@ -32,6 +33,7 @@
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPlay": "Play",
|
||||
"ButtonPlayEpisode": "Play Episode",
|
||||
"ButtonPlaying": "Playing",
|
||||
"ButtonPlaylists": "Playlists",
|
||||
"ButtonRead": "Read",
|
||||
@@ -55,6 +57,7 @@
|
||||
"HeaderCollection": "Collection",
|
||||
"HeaderCollectionItems": "Collection Items",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderDataSettings": "Data Settings",
|
||||
"HeaderDetails": "Details",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Ebook Files",
|
||||
@@ -81,11 +84,13 @@
|
||||
"HeaderTableOfContents": "Table of Contents",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderYourStats": "Your Stats",
|
||||
"LabelAddToPlaylist": "Add to Playlist",
|
||||
"LabelAdded": "Added",
|
||||
"LabelAddedAt": "Added At",
|
||||
"LabelAddToPlaylist": "Add to Playlist",
|
||||
"LabelAll": "All",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAlways": "Always",
|
||||
"LabelAskConfirmation": "Ask for confirmation",
|
||||
"LabelAuthor": "Author",
|
||||
"LabelAuthorFirstLast": "Author (First Last)",
|
||||
"LabelAuthorLastFirst": "Author (Last, First)",
|
||||
@@ -97,8 +102,8 @@
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelBooks": "Books",
|
||||
"LabelChapters": "Chapters",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelChapters": "Chapters",
|
||||
"LabelClosePlayer": "Close player",
|
||||
"LabelCollapseSeries": "Collapse Series",
|
||||
"LabelComplete": "Complete",
|
||||
@@ -118,6 +123,7 @@
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDownload": "Download",
|
||||
"LabelDownloadUsingCellular": "Download using Cellular",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDuration": "Duration",
|
||||
"LabelEbook": "Ebook",
|
||||
@@ -136,6 +142,7 @@
|
||||
"LabelFilename": "Filename",
|
||||
"LabelFinished": "Finished",
|
||||
"LabelFolder": "Folder",
|
||||
"LabelFontBoldness": "Font Boldness",
|
||||
"LabelFontScale": "Font scale",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genres",
|
||||
@@ -145,8 +152,8 @@
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHost": "Host",
|
||||
"LabelIncomplete": "Incomplete",
|
||||
"LabelInProgress": "In Progress",
|
||||
"LabelIncomplete": "Incomplete",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
@@ -169,6 +176,11 @@
|
||||
"LabelName": "Name",
|
||||
"LabelNarrator": "Narrator",
|
||||
"LabelNarrators": "Narrators",
|
||||
"LabelNavigateWithVolume": "Navigate with volume keys",
|
||||
"LabelNavigateWithVolumeDisabled": "Off",
|
||||
"LabelNavigateWithVolumeEnabled": "On",
|
||||
"LabelNavigateWithVolumeMirrored": "Mirrored",
|
||||
"LabelNever": "Never",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
@@ -187,15 +199,16 @@
|
||||
"LabelProgress": "Progress",
|
||||
"LabelPubDate": "Pub Date",
|
||||
"LabelPublishYear": "Publish Year",
|
||||
"LabelRead": "Read",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
|
||||
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
|
||||
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
|
||||
"LabelRSSFeedSlug": "RSS Feed Slug",
|
||||
"LabelRandomly": "Randomly",
|
||||
"LabelRead": "Read",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelSeason": "Season",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
@@ -218,6 +231,7 @@
|
||||
"LabelStatsMinutes": "minutes",
|
||||
"LabelStatsMinutesListening": "Minutes Listening",
|
||||
"LabelStatsWeekListening": "Week Listening",
|
||||
"LabelStreamingUsingCellular": "Streaming using Cellular",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTheme": "Theme",
|
||||
@@ -225,6 +239,7 @@
|
||||
"LabelThemeLight": "Light",
|
||||
"LabelTimeRemaining": "{0} remaining",
|
||||
"LabelTitle": "Title",
|
||||
"LabelTotalSize": "Total Size",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Tracks",
|
||||
"LabelType": "Type",
|
||||
@@ -244,8 +259,10 @@
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmDownloadUsingCellular": "You are about to download using cellular data. This may include carrier data charges. Do you wish to continue?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageConfirmStreamingUsingCellular": "You are about to stream using cellular data. This may include carrier data charges. Do you wish to continue?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
@@ -271,9 +288,13 @@
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoPodcastsFound": "No podcasts found",
|
||||
"MessageNoSeries": "No series",
|
||||
"MessageNoUpdatesWereNecessary": "No updates were necessary",
|
||||
"MessageNoUserPlaylists": "You have no playlists",
|
||||
"MessageReportBugsAndContribute": "Report bugs, request features, and contribute on",
|
||||
"MessageSeriesAlreadyDownloaded": "You have already downloaded all books in this series.",
|
||||
"MessageSeriesDownloadConfirm": "Download missing {0} book(s) with {1} file(s), totaling {2} to folder {3}?",
|
||||
"MessageSeriesDownloadConfirmIos": "Download missing {0} book(s) with {1} file(s), totaling {2}?",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
@@ -284,11 +305,13 @@
|
||||
"ToastBookmarkCreateFailed": "Failed to create bookmark",
|
||||
"ToastBookmarkRemoveFailed": "Failed to remove bookmark",
|
||||
"ToastBookmarkUpdateFailed": "Failed to update bookmark",
|
||||
"ToastDownloadNotAllowedOnCellular": "Downloading is not allowed on cellular data",
|
||||
"ToastItemMarkedAsFinishedFailed": "Failed to mark as Finished",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Failed to mark as Not Finished",
|
||||
"ToastPlaylistCreateFailed": "Failed to create playlist",
|
||||
"ToastPodcastCreateFailed": "Failed to create podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast created successfully",
|
||||
"ToastRSSFeedCloseFailed": "Failed to close RSS feed",
|
||||
"ToastRSSFeedCloseSuccess": "RSS feed closed"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "RSS feed closed",
|
||||
"ToastStreamingNotAllowedOnCellular": "Streaming is not allowed on cellular data"
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
+205
-182
@@ -1,212 +1,225 @@
|
||||
{
|
||||
"ButtonAdd": "Agregar",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAddNewServer": "Agregar nuevo servidor",
|
||||
"ButtonAuthors": "Autores",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonBack": "Atrás",
|
||||
"ButtonCancel": "Cancelar",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonClearFilter": "Quitar Filtros",
|
||||
"ButtonCloseFeed": "Cerrar Fuente",
|
||||
"ButtonCancelTimer": "Cancelar el temporizador",
|
||||
"ButtonClearFilter": "Quitar filtros",
|
||||
"ButtonCloseFeed": "Cerrar fuente",
|
||||
"ButtonCollections": "Colecciones",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonConnect": "Conectar",
|
||||
"ButtonConnectToServer": "Conectar al servidor",
|
||||
"ButtonCreate": "Crear",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonCreateBookmark": "Crear marcador",
|
||||
"ButtonCreateNewPlaylist": "Crear nueva lista de reproducción",
|
||||
"ButtonDelete": "Eliminar",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonDeleteLocalEpisode": "Borrar episodio local",
|
||||
"ButtonDeleteLocalFile": "Borrar archivo local",
|
||||
"ButtonDeleteLocalItem": "Borrar elemento local",
|
||||
"ButtonDisableAutoTimer": "Desactivar temporizador automático",
|
||||
"ButtonDisconnect": "Desconectar",
|
||||
"ButtonGoToWebClient": "Ir al cliente web",
|
||||
"ButtonHistory": "Historial",
|
||||
"ButtonHome": "Inicio",
|
||||
"ButtonIssues": "Problemas",
|
||||
"ButtonLatest": "Últimos",
|
||||
"ButtonLibrary": "Biblioteca",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonOpenFeed": "Abrir Fuente",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonLocalMedia": "Medios locales",
|
||||
"ButtonManageLocalFiles": "Gestionar archivos locales",
|
||||
"ButtonNewFolder": "Nueva carpeta",
|
||||
"ButtonNextEpisode": "Próximo episodio",
|
||||
"ButtonOpenFeed": "Abrir fuente",
|
||||
"ButtonOverride": "Sustituir",
|
||||
"ButtonPause": "Pausar",
|
||||
"ButtonPlay": "Reproducir",
|
||||
"ButtonPlayEpisode": "Reproducir episodio",
|
||||
"ButtonPlaying": "Reproduciendo",
|
||||
"ButtonPlaylists": "Listas de Reproducción",
|
||||
"ButtonPlaylists": "Listas de reproducción",
|
||||
"ButtonRead": "Leer",
|
||||
"ButtonRemove": "Remover",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonRemove": "Eliminar",
|
||||
"ButtonRemoveFromServer": "Eliminar del Servidor",
|
||||
"ButtonSave": "Guardar",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSaveOrder": "Guardar pedido",
|
||||
"ButtonSearch": "Buscar",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSendEbookToDevice": "Enviar libro al dispositivo",
|
||||
"ButtonSeries": "Series",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSetTimer": "Ajustar el temporizador",
|
||||
"ButtonStream": "En directo",
|
||||
"ButtonSubmit": "Enviar",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonYes": "Aceptar",
|
||||
"ButtonSwitchServerUser": "Cambiar servidor/usuario",
|
||||
"ButtonUserStats": "Estadísticas de usuario",
|
||||
"ButtonYes": "Sí",
|
||||
"HeaderAccount": "Cuenta",
|
||||
"HeaderAdvanced": "Avanzado",
|
||||
"HeaderAudioTracks": "Pistas de Audio",
|
||||
"HeaderAudioTracks": "Pistas de audio",
|
||||
"HeaderChapters": "Capítulos",
|
||||
"HeaderCollection": "Colección",
|
||||
"HeaderCollectionItems": "Elementos en la Colección",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderCollectionItems": "Elementos en la colección",
|
||||
"HeaderConnectionStatus": "Estado de la conexión",
|
||||
"HeaderDataSettings": "Ajustes de los datos",
|
||||
"HeaderDetails": "Detalles",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Archivos de Ebook",
|
||||
"HeaderDownloads": "Descargas",
|
||||
"HeaderEbookFiles": "Archivos de libros digitales",
|
||||
"HeaderEpisodes": "Episodios",
|
||||
"HeaderEreaderSettings": "Opciones de Ereader",
|
||||
"HeaderLatestEpisodes": "Últimos Episodios",
|
||||
"HeaderEreaderSettings": "Ajustes del lector",
|
||||
"HeaderLatestEpisodes": "Últimos episodios",
|
||||
"HeaderLibraries": "Bibliotecas",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderLocalFolders": "Carpetas locales",
|
||||
"HeaderLocalLibraryItems": "Elementos de la biblioteca local",
|
||||
"HeaderNewPlaylist": "Nueva lista de reproducción",
|
||||
"HeaderOpenRSSFeed": "Abrir fuente RSS",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaylist": "Lista de Reproducción",
|
||||
"HeaderPlaylistItems": "Elementos de Lista de Reproducción",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderPlaybackSettings": "Ajustes de reproducción",
|
||||
"HeaderPlaylist": "Lista de reproducción",
|
||||
"HeaderPlaylistItems": "Elementos de lista de reproducción",
|
||||
"HeaderRSSFeed": "Fuente RSS",
|
||||
"HeaderRSSFeedGeneral": "Detalles RSS",
|
||||
"HeaderRSSFeedIsOpen": "Fuente RSS esta abierta",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderRSSFeedIsOpen": "Fuente RSS está abierta",
|
||||
"HeaderSelectDownloadLocation": "Seleccionar ubicación de descarga",
|
||||
"HeaderSettings": "Configuraciones",
|
||||
"HeaderSleepTimer": "Temporizador para Dormir",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderStatsMinutesListeningChart": "Minutos Escuchando (Últimos 7 días)",
|
||||
"HeaderStatsRecentSessions": "Sesiones Recientes",
|
||||
"HeaderTableOfContents": "Tabla de Contenidos",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderYourStats": "Tus Estadísticas",
|
||||
"HeaderSleepTimer": "Temporizador de apagado",
|
||||
"HeaderSleepTimerSettings": "Ajustes del temporizador para dormir",
|
||||
"HeaderStatsMinutesListeningChart": "Minutos escuchando (Últimos 7 días)",
|
||||
"HeaderStatsRecentSessions": "Sesiones recientes",
|
||||
"HeaderTableOfContents": "Tabla de contenidos",
|
||||
"HeaderUserInterfaceSettings": "Ajustes de la interfaz de usuario",
|
||||
"HeaderYourStats": "Tus estadísticas",
|
||||
"LabelAddToPlaylist": "Añadido a la lista de reproducción",
|
||||
"LabelAdded": "Añadido",
|
||||
"LabelAddedAt": "Añadido",
|
||||
"LabelAddToPlaylist": "Añadido a la Lista de Reproducción",
|
||||
"LabelAll": "Todos",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAllowSeekingOnMediaControls": "Permitir la búsqueda de posición en los controles de notificación de medios",
|
||||
"LabelAlways": "Siempre",
|
||||
"LabelAskConfirmation": "Pedir confirmación",
|
||||
"LabelAuthor": "Autor",
|
||||
"LabelAuthorFirstLast": "Autor (Nombre Apellido)",
|
||||
"LabelAuthorLastFirst": "Autor (Apellido, Nombre)",
|
||||
"LabelAuthors": "Autores",
|
||||
"LabelAutoDownloadEpisodes": "Descargar Episodios Automáticamente",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelAutoDownloadEpisodes": "Descargar episodios automáticamente",
|
||||
"LabelAutoRewindTime": "Tiempo de rebobinado automático",
|
||||
"LabelAutoSleepTimer": "Temporizador de apagado automático",
|
||||
"LabelAutoSleepTimerAutoRewind": "Temporizador de apagado automático con rebobinado automático",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Cuando el temporizador de auto apagado finaliza, reproducir el elemento nuevamente rebobinará automáticamente tu posición.",
|
||||
"LabelAutoSleepTimerHelp": "Cuando se reproduce contenido multimedia entre las horas de inicio y finalización especificadas, se activará automáticamente un temporizador de apagado.",
|
||||
"LabelBooks": "Libros",
|
||||
"LabelChapterTrack": "Seguimiento de Capítulo",
|
||||
"LabelChapters": "Capítulos",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Cerrar Reproductor",
|
||||
"LabelCollapseSeries": "Colapsar Serie",
|
||||
"LabelClosePlayer": "Cerrar reproductor",
|
||||
"LabelCollapseSeries": "Colapsar serie",
|
||||
"LabelComplete": "Completo",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelContinueBooks": "Continuar libros",
|
||||
"LabelContinueEpisodes": "Continuar episodios",
|
||||
"LabelContinueListening": "Seguir escuchando",
|
||||
"LabelContinueReading": "Continuar leyendo",
|
||||
"LabelContinueSeries": "Continuar series",
|
||||
"LabelCustomTime": "Tiempo personalizado",
|
||||
"LabelDescription": "Descripción",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDisableAudioFadeOut": "Desactivar el fundido de audio",
|
||||
"LabelDisableAudioFadeOutHelp": "El volumen de audio comenzará a disminuir cuando quede menos de 1 minuto en el temporizador de apagado. Habilite este ajuste para que no se desvanezca.",
|
||||
"LabelDisableAutoRewind": "Desactivar rebobinado automático",
|
||||
"LabelDisableShakeToReset": "Desactivar agitar para reiniciar",
|
||||
"LabelDisableShakeToResetHelp": "Si agitas el dispositivo mientras el temporizador está en marcha o en los 2 minutos siguientes a la expiración del temporizador, éste se reiniciará. Habilita esta configuración para desactivar el restablecimiento al agitar.",
|
||||
"LabelDisableVibrateOnReset": "Desactivar vibración al reiniciar",
|
||||
"LabelDisableVibrateOnResetHelp": "Cuando el temporizador de apagado se reinicia, el dispositivo vibra. Activa esta opción para que no vibre cuando se reinicie el temporizador.",
|
||||
"LabelDiscover": "Descubrir",
|
||||
"LabelDownload": "Descargar",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDownloadUsingCellular": "Descargar usando el móvil",
|
||||
"LabelDownloaded": "Descargado",
|
||||
"LabelDuration": "Duración",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEbook": "Libro electrónico",
|
||||
"LabelEbooks": "Libros electrónicos",
|
||||
"LabelEnable": "Habilitar",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnableMp3IndexSeeking": "Activar la búsqueda de índices mp3",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Esta configuración solo debe habilitarse si tienes archivos mp3 que no se están buscando correctamente. La búsqueda inexacta probablemente se deba a archivos MP3 de tasa de bits variable (VBR). Esta configuración forzará la búsqueda de índice, en la que se construye un mapeo de tiempo a bytes mientras se lee el archivo. En algunos casos, con archivos MP3 grandes, puede haber un retraso al buscar hacia el final del archivo.",
|
||||
"LabelEnd": "Fin",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEndOfChapter": "Fin del capítulo",
|
||||
"LabelEndTime": "Hora de finalización",
|
||||
"LabelEpisode": "Episodio",
|
||||
"LabelFeedURL": "Fuente de URL",
|
||||
"LabelFile": "Archivo",
|
||||
"LabelFileBirthtime": "Archivo Creado en",
|
||||
"LabelFileBirthtime": "Archivo creado en",
|
||||
"LabelFileModified": "Archivo modificado",
|
||||
"LabelFilename": "Nombre del Archivo",
|
||||
"LabelFilename": "Nombre del archivo",
|
||||
"LabelFinished": "Terminado",
|
||||
"LabelFolder": "Carpeta",
|
||||
"LabelFontScale": "Tamaño de Fuente",
|
||||
"LabelGenre": "Genero",
|
||||
"LabelFontBoldness": "Nivel de negrilla en fuente",
|
||||
"LabelFontScale": "Tamaño de fuente",
|
||||
"LabelGenre": "Género",
|
||||
"LabelGenres": "Géneros",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHapticFeedback": "Respuesta táctil",
|
||||
"LabelHasEbook": "Tiene un libro",
|
||||
"LabelHasSupplementaryEbook": "Tiene un libro complementario",
|
||||
"LabelHeavy": "Pesado",
|
||||
"LabelHigh": "Alto",
|
||||
"LabelHost": "Host",
|
||||
"LabelInProgress": "En proceso",
|
||||
"LabelIncomplete": "Incompleto",
|
||||
"LabelInProgress": "En Proceso",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelLanguage": "Lenguaje",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelInternalAppStorage": "Almacenamiento interno de aplicaciones",
|
||||
"LabelJumpBackwardsTime": "Saltar atrás en el tiempo",
|
||||
"LabelJumpForwardsTime": "Salto adelante en el tiempo",
|
||||
"LabelLanguage": "Idioma",
|
||||
"LabelLayout": "Diseño",
|
||||
"LabelLayoutAuto": "Automático",
|
||||
"LabelLayoutSinglePage": "Página única",
|
||||
"LabelLight": "Claro",
|
||||
"LabelLineSpacing": "Interlineado",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelMediaType": "Tipo de Multimedia",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelListenAgain": "Volver a escuchar",
|
||||
"LabelLocalBooks": "Libros Locales",
|
||||
"LabelLocalPodcasts": "Podcasts Locales",
|
||||
"LabelLockOrientation": "Bloquear orientación",
|
||||
"LabelLockPlayer": "Bloquear el reproductor",
|
||||
"LabelLow": "Bajo",
|
||||
"LabelMediaType": "Tipo de multimedia",
|
||||
"LabelMedium": "Medio",
|
||||
"LabelMore": "Más",
|
||||
"LabelMoreInfo": "Más Información",
|
||||
"LabelMoreInfo": "Más información",
|
||||
"LabelName": "Nombre",
|
||||
"LabelNarrator": "Narrador",
|
||||
"LabelNarrators": "Narradores",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNavigateWithVolume": "Navegar con las teclas de volumen",
|
||||
"LabelNavigateWithVolumeDisabled": "Apagar",
|
||||
"LabelNavigateWithVolumeEnabled": "Encender",
|
||||
"LabelNavigateWithVolumeMirrored": "Espejo",
|
||||
"LabelNever": "Nunca",
|
||||
"LabelNewestAuthors": "Autores más recientes",
|
||||
"LabelNewestEpisodes": "Episodios más recientes",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "No Terminado",
|
||||
"LabelNotStarted": "Sin Iniciar",
|
||||
"LabelOff": "Off",
|
||||
"LabelNotFinished": "No terminado",
|
||||
"LabelNotStarted": "Sin iniciar",
|
||||
"LabelOff": "Apagado",
|
||||
"LabelPassword": "Contraseña",
|
||||
"LabelPath": "Ruta de Carpeta",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPath": "Ruta de carpeta",
|
||||
"LabelPlaybackDirect": "Directo",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPlaybackSpeed": "Velocidad de reproducción",
|
||||
"LabelPlaybackTranscode": "Transcodificar",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Evite que su fuente sea indexada por los directorios de podcasts de iTunes y Google",
|
||||
"LabelProgress": "Progreso",
|
||||
"LabelPubDate": "Fecha de Publicación",
|
||||
"LabelPublishYear": "Año de Publicación",
|
||||
"LabelRead": "Leído",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Email de dueño personalizado",
|
||||
"LabelPubDate": "Fecha de publicación",
|
||||
"LabelPublishYear": "Año de publicación",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Correo electrónico de dueño personalizado",
|
||||
"LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado",
|
||||
"LabelRSSFeedPreventIndexing": "Prevenir Indexado",
|
||||
"LabelRSSFeedPreventIndexing": "Prevenir indexado",
|
||||
"LabelRSSFeedSlug": "Fuente RSS Slug",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelRandomly": "Aleatorio",
|
||||
"LabelRead": "Leído",
|
||||
"LabelReadAgain": "Volver a leer",
|
||||
"LabelRecentSeries": "Series Recientes",
|
||||
"LabelRecentlyAdded": "Añadido Recientemente",
|
||||
"LabelRemoveFromPlaylist": "Eliminar de la Lista de Reproducción",
|
||||
"LabelScaleElapsedTimeBySpeed": "Escala el tiempo transcurrido según la velocidad",
|
||||
"LabelSeason": "Temporada",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSelectADevice": "Selecciona un dispositivo",
|
||||
"LabelSeries": "Series",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelServerAddress": "Dirección del servidor",
|
||||
"LabelSetEbookAsPrimary": "Establecer como primario",
|
||||
"LabelSetEbookAsSupplementary": "Establecer como suplementario",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShakeSensitivity": "Sensibilidad a la sacudida",
|
||||
"LabelShowAll": "Mostrar Todos",
|
||||
"LabelSize": "Tamaño",
|
||||
"LabelSleepTimer": "Temporizador para Dormir",
|
||||
"LabelSleepTimer": "Temporizador de apagado",
|
||||
"LabelStart": "Iniciar",
|
||||
"LabelStartTime": "Tiempo de Inicio",
|
||||
"LabelStatsBestDay": "Mejor Día",
|
||||
@@ -218,6 +231,7 @@
|
||||
"LabelStatsMinutes": "minutos",
|
||||
"LabelStatsMinutesListening": "Minutos Escuchando",
|
||||
"LabelStatsWeekListening": "Tiempo escuchando en la Semana",
|
||||
"LabelStreamingUsingCellular": "Streaming por móvil",
|
||||
"LabelTag": "Etiqueta",
|
||||
"LabelTags": "Etiquetas",
|
||||
"LabelTheme": "Tema",
|
||||
@@ -225,70 +239,79 @@
|
||||
"LabelThemeLight": "Claro",
|
||||
"LabelTimeRemaining": "{0} restante",
|
||||
"LabelTitle": "Título",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTotalSize": "Tamaño Total",
|
||||
"LabelTotalTrack": "Pista Total",
|
||||
"LabelTracks": "Pistas",
|
||||
"LabelType": "Tipo",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUnlockPlayer": "Desbloquear Reproductor",
|
||||
"LabelUseBookshelfView": "Usar la Vista de Estantería",
|
||||
"LabelUser": "Usuario",
|
||||
"LabelUsername": "Nombre de Usuario",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelVeryHigh": "Muy Alto",
|
||||
"LabelVeryLow": "Muy Bajo",
|
||||
"LabelYourBookmarks": "Tus Marcadores",
|
||||
"LabelYourProgress": "Tu Progreso",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageAndroid10Downloads": "Android 10 e inferiores utilizarán el almacenamiento interno de aplicaciones para las descargas.",
|
||||
"MessageAttemptingServerConnection": "Intentando conectar con el servidor...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Servidor de Audiobookshelf no conectado",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>¡Importante!</strong> Esta aplicación está diseñada para trabajar con un servidor Audiobookshelf que usted o alguien que usted conoce es el anfitrión. Esta aplicación no proporciona ningún contenido.",
|
||||
"MessageBookshelfEmpty": "Estantería vacía",
|
||||
"MessageConfirmDeleteLocalEpisode": "¿Eliminar episodio local \"{0}\" de su dispositivo? El archivo en el servidor no se verá afectado.",
|
||||
"MessageConfirmDeleteLocalFiles": "¿Eliminar los archivos locales de este elemento de tu dispositivo? Los archivos del servidor y tu progreso no se verán afectados.",
|
||||
"MessageConfirmDiscardProgress": "¿Estás seguro de que quieres reiniciar tu progreso?",
|
||||
"MessageConfirmDownloadUsingCellular": "Estas a punto de realizar una descarga utilizando datos móviles. Esto puede incluir cargos de datos del operador. ¿Deseas continuar?",
|
||||
"MessageConfirmMarkAsFinished": "¿Está seguro de que desea marcar este artículo como terminado?",
|
||||
"MessageConfirmRemoveBookmark": "¿Estás seguro de que quieres eliminar el marcador?",
|
||||
"MessageConfirmStreamingUsingCellular": "Estás a punto de hacer streaming utilizando datos móviles. Esto puede incluir cargos de datos del operador. ¿Deseas continuar?",
|
||||
"MessageDiscardProgress": "Descartar Progreso",
|
||||
"MessageDownloadCompleteProcessing": "Descarga Completada. Procesando...",
|
||||
"MessageDownloading": "Descargando...",
|
||||
"MessageDownloadingEpisode": "Descargando Capitulo",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Episodio(s) en cola para descargar",
|
||||
"MessageFeedURLWillBe": "URL de la fuente será {0}",
|
||||
"MessageFetching": "Buscando...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageFollowTheProjectOnGithub": "Sigue el proyecto en GitHub",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Se ha completado la descarga del elemento, pero no se ha podido crear el elemento de la biblioteca",
|
||||
"MessageLoading": "Cargando...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageMarkAsFinished": "Marcar como Terminado",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "Sin Marcadores",
|
||||
"MessageNoChapters": "Sin Capítulos",
|
||||
"MessageNoItems": "Sin Elementos",
|
||||
"MessageNoItemsFound": "Ningún Elemento Encontrado",
|
||||
"MessageNoListeningSessions": "Ninguna Session Escuchada",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageLoadingServerData": "Cargando datos del servidor...",
|
||||
"MessageMarkAsFinished": "Marcar como terminado",
|
||||
"MessageMediaLinkedToADifferentServer": "El contenido está vinculado a un servidor de Audiobookshelf en una dirección diferente ({0}). El progreso se sincronizará cuando se conecte a esta dirección de servidor.",
|
||||
"MessageMediaLinkedToADifferentUser": "El contenido está vinculado a este servidor pero fue descargado por otro usuario. El progreso solo se sincronizará con el usuario que lo descargó.",
|
||||
"MessageMediaLinkedToServer": "Vinculado al servidor {0}",
|
||||
"MessageMediaLinkedToThisServer": "El contenido descargado está vinculado a este servidor",
|
||||
"MessageMediaNotLinkedToServer": "El contenido multimedia no está vinculado a un servidor de Audiobookshelf. No se sincronizará ningún progreso.",
|
||||
"MessageNoBookmarks": "Sin marcadores",
|
||||
"MessageNoChapters": "Sin capítulos",
|
||||
"MessageNoItems": "Sin elementos",
|
||||
"MessageNoItemsFound": "Ningún elemento encontrado",
|
||||
"MessageNoListeningSessions": "Ninguna sesión escuchada",
|
||||
"MessageNoMediaFolders": "Sin carpetas multimedia",
|
||||
"MessageNoNetworkConnection": "Sin conexión de red",
|
||||
"MessageNoPodcastsFound": "Ningún podcast encontrado",
|
||||
"MessageNoSeries": "Ninguna serie",
|
||||
"MessageNoUpdatesWereNecessary": "No fue necesario actualizar",
|
||||
"MessageNoUserPlaylists": "No tienes lista de reproducciones",
|
||||
"MessageNoUserPlaylists": "No tienes ninguna lista de reproducción",
|
||||
"MessageReportBugsAndContribute": "Reporte erres, solicite funciones y contribuya en",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"MessageSeriesAlreadyDownloaded": "Ya has descargado todos los libros de esta serie.",
|
||||
"MessageSeriesDownloadConfirm": "¿Descargar {0} libro(s) faltante(s) con {1} archivo(s), totalizando {2} a la carpeta {3}?",
|
||||
"MessageSeriesDownloadConfirmIos": "¿Descargar {0} libro(s) faltantes con {1} archivo(s), con un total de {2}?",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Conexión de socket a través de red celular de tarifa por consumo",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket conectado a través de una red Wi-Fi con tarificación por consumo",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket conectado a través de red celular sin tarificación por consumo",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket conectado a través de una red Wi-Fi sin tarificación por consumo",
|
||||
"MessageSocketNotConnected": "Socket no conectado",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Advertencia: La mayoría de las aplicaciones de podcast requieren que la URL de la fuente RSS use HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Advertencia: 1 o más de sus episodios no tienen fecha de publicación. Algunas aplicaciones de podcast lo requieren.",
|
||||
"ToastBookmarkCreateFailed": "Error al crear marcador",
|
||||
"ToastBookmarkRemoveFailed": "Error al eliminar marcador",
|
||||
"ToastBookmarkUpdateFailed": "Error al actualizar el marcador",
|
||||
"ToastItemMarkedAsFinishedFailed": "Error al marcar como Terminado",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Error al marcar como No Terminado",
|
||||
"ToastPlaylistCreateFailed": "Error al crear la lista de reproducción.",
|
||||
"ToastDownloadNotAllowedOnCellular": "Las descargas no están permitidas con datos móviles",
|
||||
"ToastItemMarkedAsFinishedFailed": "Error al marcar como terminado",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "No se ha podido marcar como no finalizado",
|
||||
"ToastPlaylistCreateFailed": "Error al crear la lista de reproducción",
|
||||
"ToastPodcastCreateFailed": "Error al crear podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast creado",
|
||||
"ToastRSSFeedCloseFailed": "Error al cerrar fuente RSS",
|
||||
"ToastRSSFeedCloseSuccess": "Fuente RSS cerrada"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "Fuente RSS cerrada",
|
||||
"ToastStreamingNotAllowedOnCellular": "El streaming no está permitido con datos móviles"
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
+280
@@ -0,0 +1,280 @@
|
||||
{
|
||||
"ButtonAdd": "Lisää",
|
||||
"ButtonAddNewServer": "Lisää uusi palvelin",
|
||||
"ButtonAuthors": "Tekijät",
|
||||
"ButtonBack": "Takaisin",
|
||||
"ButtonCancel": "Peruuta",
|
||||
"ButtonCancelTimer": "Peruuta ajastin",
|
||||
"ButtonClearFilter": "Poista suodatus",
|
||||
"ButtonCloseFeed": "Sulje syöte",
|
||||
"ButtonCollections": "Kokoelmat",
|
||||
"ButtonConnect": "Yhdistä",
|
||||
"ButtonConnectToServer": "Yhdistä palvelimelle",
|
||||
"ButtonCreate": "Luo",
|
||||
"ButtonCreateBookmark": "Luo kirjanmerkki",
|
||||
"ButtonCreateNewPlaylist": "Luo uusi soittolista",
|
||||
"ButtonDelete": "Poista",
|
||||
"ButtonDeleteLocalEpisode": "Poista paikallinen jakso",
|
||||
"ButtonDeleteLocalFile": "Poista paikallinen tiedosto",
|
||||
"ButtonDeleteLocalItem": "Poista paikallinen sisältö",
|
||||
"ButtonDisableAutoTimer": "Sammuta automaattiajastin",
|
||||
"ButtonDisconnect": "Katkaise yhteys",
|
||||
"ButtonGoToWebClient": "Siirry Web-käyttöliittymään",
|
||||
"ButtonHistory": "Historia",
|
||||
"ButtonHome": "Koti",
|
||||
"ButtonIssues": "Ongelmat",
|
||||
"ButtonLatest": "Viimeisimmät",
|
||||
"ButtonLibrary": "Kirjasto",
|
||||
"ButtonLocalMedia": "Paikallinen media",
|
||||
"ButtonManageLocalFiles": "Hallitse paikallsiia tiedostoja",
|
||||
"ButtonNewFolder": "Uusi kansio",
|
||||
"ButtonNextEpisode": "Seuraava jakso",
|
||||
"ButtonOpenFeed": "Avaa syöte",
|
||||
"ButtonOverride": "Ohita",
|
||||
"ButtonPause": "Pysäytä",
|
||||
"ButtonPlay": "Toista",
|
||||
"ButtonPlayEpisode": "Toista jakso",
|
||||
"ButtonPlaying": "Toistetaan",
|
||||
"ButtonPlaylists": "Soittolistat",
|
||||
"ButtonRead": "Lue",
|
||||
"ButtonRemove": "Poista",
|
||||
"ButtonRemoveFromServer": "Poista palvelimelta",
|
||||
"ButtonSave": "Tallenna",
|
||||
"ButtonSaveOrder": "Tallenna järjestys",
|
||||
"ButtonSearch": "Etsi",
|
||||
"ButtonSendEbookToDevice": "Lähetä kirja lukulaitteeseen",
|
||||
"ButtonSeries": "Sarjat",
|
||||
"ButtonSetTimer": "Aseta ajastin",
|
||||
"ButtonStream": "Suoratoisto",
|
||||
"ButtonSubmit": "Lähetä",
|
||||
"ButtonSwitchServerUser": "Vaihda palvelinta/käyttäjää",
|
||||
"ButtonUserStats": "Käyttäjän tilastot",
|
||||
"ButtonYes": "Kyllä",
|
||||
"HeaderAccount": "Tili",
|
||||
"HeaderAdvanced": "Edistynyt",
|
||||
"HeaderAudioTracks": "Ääniraidat",
|
||||
"HeaderChapters": "Luvut",
|
||||
"HeaderCollection": "Kokoelma",
|
||||
"HeaderCollectionItems": "Kokoelman osat",
|
||||
"HeaderConnectionStatus": "Kokoelman tila",
|
||||
"HeaderDataSettings": "Tietojen asetukset",
|
||||
"HeaderDetails": "Yksityiskohdat",
|
||||
"HeaderDownloads": "Lataukset",
|
||||
"HeaderEbookFiles": "E-kirjatiedostot",
|
||||
"HeaderEpisodes": "Jaksot",
|
||||
"HeaderEreaderSettings": "E-lukijan asetukset",
|
||||
"HeaderLatestEpisodes": "Viimeisimmät jaksot",
|
||||
"HeaderLibraries": "Kirjastot",
|
||||
"HeaderLocalFolders": "Paikalliset kansiot",
|
||||
"HeaderLocalLibraryItems": "Paikallisen kirjaston niteet",
|
||||
"HeaderNewPlaylist": "Uusi soittolista",
|
||||
"HeaderOpenRSSFeed": "Avaa RSS-syöte",
|
||||
"HeaderPlaybackSettings": "Toistoasetukset",
|
||||
"HeaderPlaylist": "Soittolista",
|
||||
"HeaderPlaylistItems": "Soittolistan kohteet",
|
||||
"HeaderRSSFeed": "RSS syöte",
|
||||
"HeaderRSSFeedGeneral": "RSS yksityiskohdat",
|
||||
"HeaderRSSFeedIsOpen": "RSS syöte on avoinna",
|
||||
"HeaderSelectDownloadLocation": "Valitse tallennussijainti",
|
||||
"HeaderSettings": "Asetukset",
|
||||
"HeaderSleepTimer": "Uniajastin",
|
||||
"HeaderSleepTimerSettings": "Uniajastimen asetukset",
|
||||
"HeaderStatsMinutesListeningChart": "Kuunteluminuutit (viim. 7 pv)",
|
||||
"HeaderStatsRecentSessions": "Viimeaikaiset istunnot",
|
||||
"HeaderTableOfContents": "Sisällysluettelo",
|
||||
"HeaderUserInterfaceSettings": "Käyttöliittymän asetukset",
|
||||
"HeaderYourStats": "Tilastosi",
|
||||
"LabelAddToPlaylist": "Lisää soittolistaan",
|
||||
"LabelAdded": "Lisätty",
|
||||
"LabelAddedAt": "Lisätty listalle",
|
||||
"LabelAll": "Kaikki",
|
||||
"LabelAllowSeekingOnMediaControls": "Salli kelaaminen ilmoituksen säätimillä",
|
||||
"LabelAlways": "Aina",
|
||||
"LabelAskConfirmation": "Kysy varmistusta",
|
||||
"LabelAuthor": "Tekijä",
|
||||
"LabelAuthorFirstLast": "Tekijä (Etunimi Sukunimi)",
|
||||
"LabelAuthorLastFirst": "Tekijä (Sukunimi, Etunimi)",
|
||||
"LabelAuthors": "Tekijät",
|
||||
"LabelAutoDownloadEpisodes": "Lataa jaksot automaattisesti",
|
||||
"LabelAutoRewindTime": "Automaattisen takaisinkelauksen kesto",
|
||||
"LabelAutoSleepTimer": "Automaattinen uniajastin",
|
||||
"LabelAutoSleepTimerAutoRewind": "Automaattisen uniajastimen automaattinen takaisinkelaus",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Kun automaattinen uniajastin päättyy, ensi kerralla toistetaan osa kuunenltua uudelleen.",
|
||||
"LabelAutoSleepTimerHelp": "Toiston alkaessa tällä aikävälillä unikytkin kytketään automaattisesti käyttöön.",
|
||||
"LabelBooks": "Kirjat",
|
||||
"LabelChapterTrack": "Luvun raita",
|
||||
"LabelChapters": "Luvut",
|
||||
"LabelClosePlayer": "Sulje soitin",
|
||||
"LabelCollapseSeries": "Pienennä sarja",
|
||||
"LabelComplete": "Valmis",
|
||||
"LabelContinueBooks": "Jatka kirjoja",
|
||||
"LabelContinueEpisodes": "Jatka jaksoja",
|
||||
"LabelContinueListening": "Jatka kuuntelua",
|
||||
"LabelContinueReading": "Jatka lukemista",
|
||||
"LabelContinueSeries": "Jatka sarjoja",
|
||||
"LabelCustomTime": "Mukautettu aika",
|
||||
"LabelDescription": "Kuvaus",
|
||||
"LabelDisableAudioFadeOut": "Poista äänen häivytys käytöstä",
|
||||
"LabelDisableAudioFadeOutHelp": "Äänenvoimakkuus alkaa laskea kun uniajastimessa on jäljellä alle minuutti. Laita tämä asetus pois päältä estääksesi sen.",
|
||||
"LabelDisableAutoRewind": "Poista käytöstä automaattinen takaisinkelaus",
|
||||
"LabelDisableShakeToReset": "Poista uniajastimnen nollaus ravistamalla käytöstä",
|
||||
"LabelDisableShakeToResetHelp": "Ravistamalla laitettasi uniajastimen kuluessa tai enintään kaksi minuuttia sen loppumisen jälkeen uudistaa ajastimen.",
|
||||
"LabelDisableVibrateOnReset": "Poista värinä käytöstä nollattaessa",
|
||||
"LabelDisableVibrateOnResetHelp": "Kun uniajastin nollautuu, laitteesi tärisee. Kytke tämä asetus päälle poistaaksesi tärinä kun uniajastin nollautuu.",
|
||||
"LabelDiscover": "Löydä",
|
||||
"LabelDownload": "Lataa",
|
||||
"LabelDownloadUsingCellular": "Lataa käyttäen mobiilidataa",
|
||||
"LabelDownloaded": "Ladatut",
|
||||
"LabelDuration": "Kesto",
|
||||
"LabelEbook": "E-kirja",
|
||||
"LabelEbooks": "E-kirjat",
|
||||
"LabelEnable": "Ota käyttöön",
|
||||
"LabelEnd": "Loppu",
|
||||
"LabelEndOfChapter": "Luvun loppu",
|
||||
"LabelEpisode": "Jakso",
|
||||
"LabelFeedURL": "Syötteen URL",
|
||||
"LabelFile": "Tiedosto",
|
||||
"LabelFileBirthtime": "Tiedoston syntymäaika",
|
||||
"LabelFileModified": "Muutettu tiedosto",
|
||||
"LabelFilename": "Tiedostonimi",
|
||||
"LabelFinished": "Valmis",
|
||||
"LabelFolder": "Kansio",
|
||||
"LabelGenre": "Lajityyppi",
|
||||
"LabelGenres": "Lajityypit",
|
||||
"LabelHapticFeedback": "Tuntopalaute",
|
||||
"LabelHigh": "Korkea",
|
||||
"LabelHost": "Isäntä",
|
||||
"LabelInProgress": "Kesken",
|
||||
"LabelIncomplete": "Keskeneräinen",
|
||||
"LabelJumpBackwardsTime": "Hyppää taaksepäin ajassa",
|
||||
"LabelJumpForwardsTime": "Hyppää eteenpäin ajassa",
|
||||
"LabelLanguage": "Kieli",
|
||||
"LabelLight": "Vaalea",
|
||||
"LabelLineSpacing": "Riviväli",
|
||||
"LabelListenAgain": "Kuuntele uudelleen",
|
||||
"LabelLocalBooks": "Paikalliset kirjat",
|
||||
"LabelLocalPodcasts": "Paikalliset podcastit",
|
||||
"LabelLockPlayer": "Lukitse soitin",
|
||||
"LabelLow": "Matala",
|
||||
"LabelMediaType": "Mediatyyppi",
|
||||
"LabelMedium": "Keskitaso",
|
||||
"LabelMore": "Lisää",
|
||||
"LabelMoreInfo": "Lisätietoja",
|
||||
"LabelName": "Nimi",
|
||||
"LabelNarrator": "Lukija",
|
||||
"LabelNarrators": "Lukijat",
|
||||
"LabelNavigateWithVolume": "Navigoi äänenvoimakkuus-painikkeilla",
|
||||
"LabelNavigateWithVolumeDisabled": "Pois päältä",
|
||||
"LabelNavigateWithVolumeEnabled": "Päällä",
|
||||
"LabelNever": "Ei koskaan",
|
||||
"LabelNewestAuthors": "Uusimmat kirjailijat",
|
||||
"LabelNewestEpisodes": "Uusimmat jaksot",
|
||||
"LabelNo": "Ei",
|
||||
"LabelNotStarted": "Ei aloitettu",
|
||||
"LabelOff": "Pois päältä",
|
||||
"LabelPassword": "Salasana",
|
||||
"LabelPath": "Polku",
|
||||
"LabelPlaybackLocal": "Paikallinen",
|
||||
"LabelPlaybackSpeed": "Toistonopeus",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcastit",
|
||||
"LabelPublishYear": "Julkaisuvuosi",
|
||||
"LabelRSSFeedPreventIndexing": "Estä indeksointi",
|
||||
"LabelRandomly": "Satunnaisesti",
|
||||
"LabelRead": "Lue",
|
||||
"LabelReadAgain": "Lue uudelleen",
|
||||
"LabelRecentSeries": "Viimeisimmät sarjat",
|
||||
"LabelRecentlyAdded": "Viimeeksi lisätyt",
|
||||
"LabelRemoveFromPlaylist": "Poista soittolistalta",
|
||||
"LabelScaleElapsedTimeBySpeed": "Skaalaa kulunut aika nopeuden mukaan",
|
||||
"LabelSeason": "Kausi",
|
||||
"LabelSelectADevice": "Valitse laite",
|
||||
"LabelSeries": "Sarja",
|
||||
"LabelServerAddress": "Palvelimen osoite",
|
||||
"LabelSetEbookAsPrimary": "Aseta ensisijaiseksi",
|
||||
"LabelSetEbookAsSupplementary": "Aseta täydentäväksi",
|
||||
"LabelShakeSensitivity": "Ravistusherkkyys",
|
||||
"LabelShowAll": "Näytä kaikki",
|
||||
"LabelSize": "Koko",
|
||||
"LabelSleepTimer": "Uniajastin",
|
||||
"LabelStart": "Aloita",
|
||||
"LabelStartTime": "Aloitusaika",
|
||||
"LabelStatsBestDay": "Paras päivä",
|
||||
"LabelStatsDailyAverage": "Päivittäinen keskiarvo",
|
||||
"LabelStatsDays": "Päivää",
|
||||
"LabelStatsDaysListened": "Päivää kuunneltu",
|
||||
"LabelStatsInARow": "peräjälkeen",
|
||||
"LabelStatsMinutes": "minuuttia",
|
||||
"LabelStatsMinutesListening": "Minuuttia kuunneltu",
|
||||
"LabelStatsWeekListening": "Viikon aikana kuunneltu",
|
||||
"LabelTag": "Tägi",
|
||||
"LabelTags": "Tägit",
|
||||
"LabelTheme": "Teema",
|
||||
"LabelThemeDark": "Tumma",
|
||||
"LabelThemeLight": "Kirkas",
|
||||
"LabelTimeRemaining": "{0} jäljellä",
|
||||
"LabelTitle": "Nimi",
|
||||
"LabelTotalSize": "Kokonaiskoko",
|
||||
"LabelTracks": "Raidat",
|
||||
"LabelType": "Tyyppi",
|
||||
"LabelUseBookshelfView": "Käytä kirjahyllynäkymää",
|
||||
"LabelUser": "Käyttäjä",
|
||||
"LabelUsername": "Käyttäjätunnus",
|
||||
"LabelVeryHigh": "Erittäin korkea",
|
||||
"LabelVeryLow": "Erittäin matala",
|
||||
"LabelYourBookmarks": "Kirjanmerkkisi",
|
||||
"LabelYourProgress": "Edistymisesi",
|
||||
"MessageAndroid10Downloads": "Android 10 ja sitä vanhemmat käyttävät sovelluksen sisäistä tallennustilaa latauksiin.",
|
||||
"MessageAttemptingServerConnection": "Yritetään palvelinyhteyttä...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf palvelinta ei ole yhdistetty",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Tärkeää!</strong> Tämä sovellus on suunniteltu toimimaan sinun tai tuttavasi Audiobookshelf-palvelimen kanssa. Tämä sovellus ei tarjoa sisältöä.",
|
||||
"MessageBookshelfEmpty": "Kirjahylly on tyhjä",
|
||||
"MessageConfirmDeleteLocalEpisode": "Poista jakso \"{0}\" laitteeltasi? Tämä ei vaikuta palvelimella olevaan tiedostoon.",
|
||||
"MessageConfirmDeleteLocalFiles": "Poista tämän kohteen tiedostot laitteestasi? Tämä ei vaikuta palvelimella oleviin tiedostoihin tai edistymiseesi.",
|
||||
"MessageConfirmDiscardProgress": "Haluatko varmasti nollata edistymisesi?",
|
||||
"MessageConfirmDownloadUsingCellular": "Olet lataamassa mobiilidatan avulla. Tämä voi aiheuttaa operaattorin datamaksuja. Haluatko jatkaa?",
|
||||
"MessageConfirmMarkAsFinished": "Haluatko varmasti merkitä tämän kohteen valmiiksi?",
|
||||
"MessageConfirmRemoveBookmark": "Haluatko varmasti poistaa kirjanmerkin?",
|
||||
"MessageConfirmStreamingUsingCellular": "Olet suoratoistamassa matkapuhelindatan avulla. Tämä voi aiheuttaa operaattorin datamaksuja. Haluatko jatkaa?",
|
||||
"MessageDiscardProgress": "Hylkää edistyminen",
|
||||
"MessageDownloadCompleteProcessing": "Lataus valmis. Käsitellään...",
|
||||
"MessageDownloading": "Ladataan...",
|
||||
"MessageDownloadingEpisode": "Ladataan jaksoa",
|
||||
"MessageEpisodesQueuedForDownload": "{0} jaksoa on latausjonossa",
|
||||
"MessageFeedURLWillBe": "Syötteen URL tulee olemaan {0}",
|
||||
"MessageFetching": "Haetaan...",
|
||||
"MessageFollowTheProjectOnGithub": "Seuraa projektia Githubissa",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Kohteen lataus on valmis, mutta kirjastokohteen luominen epäonnistui",
|
||||
"MessageLoading": "Ladataan...",
|
||||
"MessageLoadingServerData": "Ladataan palvelintietoja...",
|
||||
"MessageMarkAsFinished": "Merkitse valmiiksi",
|
||||
"MessageMediaLinkedToADifferentServer": "Media on linkitetty Audiobookshelf-palvelimeen eri osoitteessa ({0}). Edistyminen synkronoidaan, kun olet yhdistänyt tähän palvelinosoitteeseen.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media on linkitetty tähän palvelimeen, mutta sen latasi eri käyttäjä. Edistyminen synkronoidaan vain käyttäjälle, joka latasi sen.",
|
||||
"MessageMediaLinkedToServer": "Linkitetty palvelimeen {0}",
|
||||
"MessageMediaLinkedToThisServer": "Ladattu media on linkitetty tähän palvelimeen",
|
||||
"MessageMediaNotLinkedToServer": "Mediaa ei ole linkitetty Audiobookshelf-palvelimeen. Edistystä ei synkronoida.",
|
||||
"MessageNoBookmarks": "Ei kirjanmerkkejä",
|
||||
"MessageNoChapters": "Ei kappaleita",
|
||||
"MessageNoItems": "Ei kohteita",
|
||||
"MessageNoItemsFound": "Kohteita ei löytynyt",
|
||||
"MessageNoListeningSessions": "Ei kuunteluistuntoja",
|
||||
"MessageNoMediaFolders": "Ei mediakansioita",
|
||||
"MessageNoNetworkConnection": "Ei verkkoyhteyttä",
|
||||
"MessageNoPodcastsFound": "Podcasteja ei löytynyt",
|
||||
"MessageNoSeries": "Ei sarjoja",
|
||||
"MessageNoUpdatesWereNecessary": "Päivityksiä ei tarvittu",
|
||||
"MessageNoUserPlaylists": "Sinulla ei ole soittolistoja",
|
||||
"MessageReportBugsAndContribute": "Ilmoita virheistä, toivo ominaisuuksia ja osallistu",
|
||||
"ToastBookmarkCreateFailed": "Kirjanmerkin luominen epäonnistui",
|
||||
"ToastBookmarkRemoveFailed": "Kirjanmerkin poistaminen epäonnistui",
|
||||
"ToastBookmarkUpdateFailed": "Kirjanmerkin päivittäminen epäonnistui",
|
||||
"ToastDownloadNotAllowedOnCellular": "Lataaminen ei ole sallittua mobiilidatalla",
|
||||
"ToastItemMarkedAsFinishedFailed": "Valmiiksi merkitseminen epäonnistui",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Valmiiksi merkitsemisen poisto epäonnistui",
|
||||
"ToastPlaylistCreateFailed": "Soittolistan luominen epäonnistui",
|
||||
"ToastPodcastCreateFailed": "Podcastin luominen epäonnistui",
|
||||
"ToastPodcastCreateSuccess": "Podcastin luominen onnistui",
|
||||
"ToastRSSFeedCloseFailed": "RSS syötteen sulkeminen epäonnistui",
|
||||
"ToastRSSFeedCloseSuccess": "RSS syöte suljettu",
|
||||
"ToastStreamingNotAllowedOnCellular": "Suoratoisto ei ole sallittu mobiilidatalla"
|
||||
}
|
||||
+184
-164
@@ -1,133 +1,139 @@
|
||||
{
|
||||
"ButtonAdd": "Ajouter",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAddNewServer": "Ajouter un serveur",
|
||||
"ButtonAuthors": "Auteurs",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonBack": "Retour",
|
||||
"ButtonCancel": "Annuler",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonCancelTimer": "Annuler la minuterie",
|
||||
"ButtonClearFilter": "Effacer le filtre",
|
||||
"ButtonCloseFeed": "Fermer le flux",
|
||||
"ButtonCollections": "Collections",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonConnect": "Connecter",
|
||||
"ButtonConnectToServer": "Se connecter au serveur",
|
||||
"ButtonCreate": "Créer",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonDelete": "Effacer",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonCreateBookmark": "Créer un marque-page",
|
||||
"ButtonCreateNewPlaylist": "Créer une nouvelle liste de lecture",
|
||||
"ButtonDelete": "Supprimer",
|
||||
"ButtonDeleteLocalEpisode": "Supprimer l’épisode de l’appareil",
|
||||
"ButtonDeleteLocalFile": "Supprimer le fichier de l’appareil",
|
||||
"ButtonDeleteLocalItem": "Supprimer l’élément de l’appareil",
|
||||
"ButtonDisableAutoTimer": "Désactiver la minuterie automatique",
|
||||
"ButtonDisconnect": "Déconnecter",
|
||||
"ButtonGoToWebClient": "Ouvrir dans le navigateur",
|
||||
"ButtonHistory": "Historique",
|
||||
"ButtonHome": "Accueil",
|
||||
"ButtonIssues": "Parutions",
|
||||
"ButtonIssues": "Problèmes",
|
||||
"ButtonLatest": "Dernière version",
|
||||
"ButtonLibrary": "Bibliothèque",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonLocalMedia": "Médias locaux",
|
||||
"ButtonManageLocalFiles": "Gérer les fichiers locaux",
|
||||
"ButtonNewFolder": "Nouveau dossier",
|
||||
"ButtonNextEpisode": "Prochain épisode",
|
||||
"ButtonOpenFeed": "Ouvrir le flux",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonOverride": "Remplacer",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPlay": "Écouter",
|
||||
"ButtonPlay": "Lire",
|
||||
"ButtonPlayEpisode": "Lire l’épisode",
|
||||
"ButtonPlaying": "En lecture",
|
||||
"ButtonPlaylists": "Listes de lecture",
|
||||
"ButtonRead": "Lire",
|
||||
"ButtonRemove": "Supprimer",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonRemoveFromServer": "Retirer du serveur",
|
||||
"ButtonSave": "Sauvegarder",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSaveOrder": "Sauvegarder l’ordre",
|
||||
"ButtonSearch": "Chercher",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSendEbookToDevice": "Envoyer le livre à l’appareil",
|
||||
"ButtonSeries": "Séries",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSetTimer": "Régler la minuterie",
|
||||
"ButtonStream": "Flux",
|
||||
"ButtonSubmit": "Soumettre",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonSwitchServerUser": "Changer de serveur / utilisateur",
|
||||
"ButtonUserStats": "Statistiques utilisateur",
|
||||
"ButtonYes": "Oui",
|
||||
"HeaderAccount": "Compte",
|
||||
"HeaderAdvanced": "Avancé",
|
||||
"HeaderAudioTracks": "Pistes audio",
|
||||
"HeaderChapters": "Chapitres",
|
||||
"HeaderCollection": "Collection",
|
||||
"HeaderCollectionItems": "Entrées de la Collection",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderCollectionItems": "Entrées de la collection",
|
||||
"HeaderConnectionStatus": "Status de connexion",
|
||||
"HeaderDataSettings": "Paramètres de données",
|
||||
"HeaderDetails": "Détails",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Fichier des livres numériques",
|
||||
"HeaderDownloads": "Téléchargements",
|
||||
"HeaderEbookFiles": "Fichiers des livres numériques",
|
||||
"HeaderEpisodes": "Épisodes",
|
||||
"HeaderEreaderSettings": "Options Ereader",
|
||||
"HeaderEreaderSettings": "Paramètres de la liseuse",
|
||||
"HeaderLatestEpisodes": "Dernier épisodes",
|
||||
"HeaderLibraries": "Bibliothèque",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderOpenRSSFeed": "Ouvrir Flux RSS",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderLocalFolders": "Dossiers locaux",
|
||||
"HeaderLocalLibraryItems": "Éléments de la bibliothèque locale",
|
||||
"HeaderNewPlaylist": "Nouvelle liste de lecture",
|
||||
"HeaderOpenRSSFeed": "Ouvrir le flux RSS",
|
||||
"HeaderPlaybackSettings": "Paramètres de lecture",
|
||||
"HeaderPlaylist": "Liste de lecture",
|
||||
"HeaderPlaylistItems": "Éléments de la liste de lecture",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "Détails de flux RSS",
|
||||
"HeaderRSSFeedIsOpen": "Le Flux RSS est actif",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderRSSFeed": "Flux RSS",
|
||||
"HeaderRSSFeedGeneral": "Détails du flux RSS",
|
||||
"HeaderRSSFeedIsOpen": "Le flux RSS est actif",
|
||||
"HeaderSelectDownloadLocation": "Sélectionner le dossier de téléchargement",
|
||||
"HeaderSettings": "Paramètres",
|
||||
"HeaderSleepTimer": "Minuterie",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderSleepTimerSettings": "Paramètres du minuteur nocturne",
|
||||
"HeaderStatsMinutesListeningChart": "Minutes d’écoute (7 derniers jours)",
|
||||
"HeaderStatsRecentSessions": "Sessions récentes",
|
||||
"HeaderTableOfContents": "Table des matières",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderUserInterfaceSettings": "Paramètres de l'interface",
|
||||
"HeaderYourStats": "Vos statistiques",
|
||||
"LabelAddToPlaylist": "Ajouter à la liste de lecture",
|
||||
"LabelAdded": "Ajouté",
|
||||
"LabelAddedAt": "Date d’ajout",
|
||||
"LabelAddToPlaylist": "Ajouter à la liste de lecture",
|
||||
"LabelAll": "Tout",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAllowSeekingOnMediaControls": "Autoriser la recherche de position depuis la notification du lecteur multimédia",
|
||||
"LabelAlways": "Toujours",
|
||||
"LabelAskConfirmation": "Demander une confirmation",
|
||||
"LabelAuthor": "Auteur",
|
||||
"LabelAuthorFirstLast": "Auteur (Prénom Nom)",
|
||||
"LabelAuthorLastFirst": "Auteur (Nom, Prénom)",
|
||||
"LabelAuthors": "Auteurs",
|
||||
"LabelAutoDownloadEpisodes": "Téléchargement automatique d’épisode",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelAutoDownloadEpisodes": "Téléchargement automatique des épisodes",
|
||||
"LabelAutoRewindTime": "Saut arrière automatique",
|
||||
"LabelAutoSleepTimer": "Minuteur nocturne automatique",
|
||||
"LabelAutoSleepTimerAutoRewind": "Saut arrière automatique du minuteur nocturne",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Lorsque le minuteur nocturne se termine, relire l'élément fera un saut en arrière.",
|
||||
"LabelAutoSleepTimerHelp": "Lorsqu'un éléments est lu entre l'heure de début et de fin, un minuteur nocturne se lance automatiquement.",
|
||||
"LabelBooks": "Livres",
|
||||
"LabelChapterTrack": "Piste des chapitres",
|
||||
"LabelChapters": "Chapitres",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Fermer le lecteur",
|
||||
"LabelCollapseSeries": "Réduire les séries",
|
||||
"LabelComplete": "Complet",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelContinueBooks": "Continuer les Livres",
|
||||
"LabelContinueEpisodes": "Continuer les épisodes",
|
||||
"LabelContinueListening": "Continuer la lecture",
|
||||
"LabelContinueReading": "Continuer la lecture",
|
||||
"LabelContinueSeries": "Continuer les séries",
|
||||
"LabelCustomTime": "Temps personalisé",
|
||||
"LabelDescription": "Description",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDisableAudioFadeOut": "Désactiver la diminution automatique du volume",
|
||||
"LabelDisableAudioFadeOutHelp": "Le volume audio diminuera lorsqu’il restera moins d’une minute avant la mise en veille. Activez ce paramètre pour que le volume ne diminue pas.",
|
||||
"LabelDisableAutoRewind": "Désactiver le saut arrière automatique",
|
||||
"LabelDisableShakeToReset": "Désactiver secouer pour redémarrer",
|
||||
"LabelDisableShakeToResetHelp": "Si vous secouez votre appareil pendant que la minuterie est en cours OU dans les 2 minutes qui suivent son expiration, alors la minuterie de sommeil sera réinitialisée. Activez ce paramètre pour désactiver la fonction « Secouer pour réinitialiser ».",
|
||||
"LabelDisableVibrateOnReset": "Désactiver la vibration au redémarrage",
|
||||
"LabelDisableVibrateOnResetHelp": "Lorsque le minuteur est redémarré, l'appareil vibre. Sélectionner pour désactiver les vibrations.",
|
||||
"LabelDiscover": "Découvrir",
|
||||
"LabelDownload": "Téléchargement",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDownloadUsingCellular": "Télécharger via les données mobiles",
|
||||
"LabelDownloaded": "Téléchargé",
|
||||
"LabelDuration": "Durée",
|
||||
"LabelEbook": "Livre numérique",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEbooks": "Livres numériques",
|
||||
"LabelEnable": "Activer",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnableMp3IndexSeeking": "Activer la recherche par index pour mp3",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Ce paramètres ne devrai être activer que si vous avez des problèmes avec des fichiers mp3 que vous ne pouvez pas chercher. La mauvaise indexation est probablement du au Bitrate Variable (VBR) du fichier MP3. Ce paramètre va forcer l'indexation. Une correspondance Temps-Octet est construit durant la lecture. Dans certains cas, avec de gros fichier MP3, il y aura du délais lors de la recherche vers la fin du fichier.",
|
||||
"LabelEnd": "Fin",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEndOfChapter": "Fin du chapitre",
|
||||
"LabelEndTime": "Heure de Fin",
|
||||
"LabelEpisode": "Épisode",
|
||||
"LabelFeedURL": "URL du flux",
|
||||
"LabelFile": "Fichier",
|
||||
@@ -136,88 +142,96 @@
|
||||
"LabelFilename": "Nom de fichier",
|
||||
"LabelFinished": "Fini(e)",
|
||||
"LabelFolder": "Dossier",
|
||||
"LabelFontBoldness": "Graisse de la police",
|
||||
"LabelFontScale": "Taille de la police de caractère",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genres",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHapticFeedback": "Retour haptique",
|
||||
"LabelHasEbook": "A un livre numérique",
|
||||
"LabelHasSupplementaryEbook": "A un livre numérique supplémentaire",
|
||||
"LabelHeavy": "Puissant",
|
||||
"LabelHigh": "Importante",
|
||||
"LabelHost": "Hôte",
|
||||
"LabelIncomplete": "Incomplet",
|
||||
"LabelInProgress": "En cours",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelIncomplete": "Incomplet",
|
||||
"LabelInternalAppStorage": "Stockage Interne de l'application",
|
||||
"LabelJumpBackwardsTime": "Durée du saut arrière",
|
||||
"LabelJumpForwardsTime": "Durée du saut avant",
|
||||
"LabelLanguage": "Langue",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLayout": "Mise en page",
|
||||
"LabelLayoutAuto": "Automatique",
|
||||
"LabelLayoutSinglePage": "Page seule",
|
||||
"LabelLight": "Léger",
|
||||
"LabelLineSpacing": "Interligne",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelListenAgain": "Écouter à nouveau",
|
||||
"LabelLocalBooks": "Livres locaux",
|
||||
"LabelLocalPodcasts": "Podcasts locaux",
|
||||
"LabelLockOrientation": "Verrouiller l'orientation",
|
||||
"LabelLockPlayer": "Verrouiller le lecteur",
|
||||
"LabelLow": "Basse",
|
||||
"LabelMediaType": "Type de média",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMedium": "Moyenne",
|
||||
"LabelMore": "Plus",
|
||||
"LabelMoreInfo": "Plus d’info",
|
||||
"LabelMoreInfo": "Plus d’infos",
|
||||
"LabelName": "Nom",
|
||||
"LabelNarrator": "Narrateur",
|
||||
"LabelNarrators": "Narrateurs",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "Non terminé(e)",
|
||||
"LabelNotStarted": "Non Démarré(e)",
|
||||
"LabelOff": "Off",
|
||||
"LabelNavigateWithVolume": "Naviguer avec les touches de volume",
|
||||
"LabelNavigateWithVolumeDisabled": "Désactivé",
|
||||
"LabelNavigateWithVolumeEnabled": "Activé",
|
||||
"LabelNavigateWithVolumeMirrored": "En miroir",
|
||||
"LabelNever": "Jamais",
|
||||
"LabelNewestAuthors": "Auteurs récents",
|
||||
"LabelNewestEpisodes": "Épisodes récents",
|
||||
"LabelNo": "Non",
|
||||
"LabelNotFinished": "Non terminé",
|
||||
"LabelNotStarted": "Pas commencé",
|
||||
"LabelOff": "Éteint",
|
||||
"LabelPassword": "Mot de passe",
|
||||
"LabelPath": "Chemin",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPlaybackSpeed": "Vitesse de lecture",
|
||||
"LabelPlaybackTranscode": "Transcoder",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Empêcher l’indexation de votre flux par les bases de données iTunes et Google podcast",
|
||||
"LabelProgress": "Progression",
|
||||
"LabelPubDate": "Date de publication",
|
||||
"LabelPublishYear": "Année d’édition",
|
||||
"LabelRead": "Lire",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Courriel du propriétaire personnalisé",
|
||||
"LabelPublishYear": "Année de publication",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Courriel personnalisée du propriétaire",
|
||||
"LabelRSSFeedCustomOwnerName": "Nom propriétaire personnalisé",
|
||||
"LabelRSSFeedPreventIndexing": "Empêcher l’indexation",
|
||||
"LabelRSSFeedSlug": "Identificateur d’adresse du Flux RSS ",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelRSSFeedSlug": "Identifiant d’URL du flux RSS",
|
||||
"LabelRandomly": "Au hasard",
|
||||
"LabelRead": "Lire",
|
||||
"LabelReadAgain": "Lire à nouveau",
|
||||
"LabelRecentSeries": "Séries récentes",
|
||||
"LabelRecentlyAdded": "Ajouts récents",
|
||||
"LabelRemoveFromPlaylist": "Supprimer de la Liste de Lecture",
|
||||
"LabelScaleElapsedTimeBySpeed": "Traduire le temps restant en fonction de la vitesse de lecture",
|
||||
"LabelSeason": "Saison",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSelectADevice": "Sélectionner un Appareil",
|
||||
"LabelSeries": "Séries",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelServerAddress": "Adresse du serveur",
|
||||
"LabelSetEbookAsPrimary": "Définir comme principale",
|
||||
"LabelSetEbookAsSupplementary": "Définir comme supplémentaire",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShowAll": "Afficher Tout",
|
||||
"LabelShakeSensitivity": "Sensibilité à la secousse",
|
||||
"LabelShowAll": "Tout afficher",
|
||||
"LabelSize": "Taille",
|
||||
"LabelSleepTimer": "Minuterie",
|
||||
"LabelStart": "Démarrer",
|
||||
"LabelStartTime": "Heure de Démarrage",
|
||||
"LabelStatsBestDay": "Meilleur Jour",
|
||||
"LabelStartTime": "Heure de démarrage",
|
||||
"LabelStatsBestDay": "Meilleur jour",
|
||||
"LabelStatsDailyAverage": "Moyenne Journalière",
|
||||
"LabelStatsDays": "Jours",
|
||||
"LabelStatsDaysListened": "Jours d’écoute",
|
||||
"LabelStatsInARow": "d’affilé(s)",
|
||||
"LabelStatsItemsFinished": "Articles terminés",
|
||||
"LabelStatsItemsFinished": "Éléments terminés",
|
||||
"LabelStatsMinutes": "minutes",
|
||||
"LabelStatsMinutesListening": "Minutes d’écoute",
|
||||
"LabelStatsWeekListening": "Écoute de la semaine",
|
||||
"LabelStreamingUsingCellular": "Diffuser via les données mobiles",
|
||||
"LabelTag": "Étiquette",
|
||||
"LabelTags": "Étiquettes",
|
||||
"LabelTheme": "Thème",
|
||||
@@ -225,70 +239,76 @@
|
||||
"LabelThemeLight": "Clair",
|
||||
"LabelTimeRemaining": "{0} restantes",
|
||||
"LabelTitle": "Titre",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTotalSize": "Taille totale",
|
||||
"LabelTotalTrack": "Pistes totale",
|
||||
"LabelTracks": "Pistes",
|
||||
"LabelType": "Type",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUnlockPlayer": "Déverrouiller le lecteur",
|
||||
"LabelUseBookshelfView": "Utiliser l'interface bibliothèque",
|
||||
"LabelUser": "Utilisateur",
|
||||
"LabelUsername": "Nom d’utilisateur",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelYourBookmarks": "Vos signets",
|
||||
"LabelVeryHigh": "Très importante",
|
||||
"LabelVeryLow": "Très peu importante",
|
||||
"LabelYourBookmarks": "Vos favoris",
|
||||
"LabelYourProgress": "Votre progression",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageAndroid10Downloads": "Android 10 et en dessous utiliseront le stockage interne de l'application pour les téléchargements.",
|
||||
"MessageAttemptingServerConnection": "Tentative de connexion...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Serveur Audiobookshelf non connecté",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important !</strong> Cette application est faite pour fonctionner avec un serveur Audiobookshelf. L'application ne fournit aucun contenu.",
|
||||
"MessageBookshelfEmpty": "Bibliothèque vide",
|
||||
"MessageConfirmDeleteLocalEpisode": "Retirer l’épisode local « {0} » de votre appareil ? Le fichier sur le serveur ne sera pas affecté.",
|
||||
"MessageConfirmDeleteLocalFiles": "Supprimer les fichiers locaux de cet élément de votre appareil ? Les fichiers sur le serveur ainsi que votre progression ne serons pas affectés.",
|
||||
"MessageConfirmDiscardProgress": "Êtes-vous sûr·e de vouloir supprimer votre progression ?",
|
||||
"MessageConfirmDownloadUsingCellular": "Vous êtes sur le point d’effectuer un téléchargement en utilisant des données mobiles.Il se peut que des frais de données soient facturés par votre opérateur. Souhaitez-vous continuer ?",
|
||||
"MessageConfirmMarkAsFinished": "Êtes-vous sûr·e de vouloir marquer cette élement comme terminé ?",
|
||||
"MessageConfirmRemoveBookmark": "Êtes-vous sûr·e de vouloir supprimer le marque-page ?",
|
||||
"MessageConfirmStreamingUsingCellular": "Vous êtes sur le point de diffuser du contenu en utilisant des données mobiles. Il se peut que des frais de données soient facturés par votre opérateur. Souhaitez-vous continuer ?",
|
||||
"MessageDiscardProgress": "Supprimer la progression",
|
||||
"MessageDownloadCompleteProcessing": "Téléchargement terminé. Analyse…",
|
||||
"MessageDownloading": "Téléchargement…",
|
||||
"MessageDownloadingEpisode": "Téléchargement de l’épisode",
|
||||
"MessageEpisodesQueuedForDownload": "{0} épisode(s) mis en file pour téléchargement",
|
||||
"MessageFeedURLWillBe": "l’URL du flux sera {0}",
|
||||
"MessageFetching": "Récupération…",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageFollowTheProjectOnGithub": "Suivre le projet sur GitHub",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Le téléchargement est terminé mais l’ajout de l’élément dans la bibliothèque a échoué",
|
||||
"MessageLoading": "Chargement…",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageLoadingServerData": "Chargement des données du serveur...",
|
||||
"MessageMarkAsFinished": "Marquer comme terminé",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "Aucun signet",
|
||||
"MessageMediaLinkedToADifferentServer": "L'élément est lié à un serveur Audiobookshelf sur une autre adresse ({0}). La progression sera synchroniser lors de la connexion au serveur à cette adresse.",
|
||||
"MessageMediaLinkedToADifferentUser": "L'élément est lié a ce serveur, mais a ete téléchargé par un autre utilisateur. La progression ne sera synchronisé que pour l'utilisateur qui l'a téléchargé..",
|
||||
"MessageMediaLinkedToServer": "Lié au serveur {0}",
|
||||
"MessageMediaLinkedToThisServer": "L'élément téléchargé est lié à a ce serveur",
|
||||
"MessageMediaNotLinkedToServer": "L'élément n'est lié à aucun serveur. La progression ne sera pas synchronisé.",
|
||||
"MessageNoBookmarks": "Aucun favoris",
|
||||
"MessageNoChapters": "Aucun chapitre",
|
||||
"MessageNoItems": "Aucun article",
|
||||
"MessageNoItemsFound": "Aucun article trouvé",
|
||||
"MessageNoItems": "Aucun élément",
|
||||
"MessageNoItemsFound": "Aucun élément trouvé",
|
||||
"MessageNoListeningSessions": "Aucune session d’écoute en cours",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoMediaFolders": "Aucun dossier multimédia",
|
||||
"MessageNoNetworkConnection": "Pas de connexion réseau",
|
||||
"MessageNoPodcastsFound": "Aucun podcast trouvé",
|
||||
"MessageNoSeries": "Aucune série",
|
||||
"MessageNoUpdatesWereNecessary": "Aucune mise à jour n’était nécessaire",
|
||||
"MessageNoUserPlaylists": "Vous n’avez aucune liste de lecture",
|
||||
"MessageReportBugsAndContribute": "Remonter des anomalies, demander des fonctionnalités et contribuer sur",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Attention : la majorité des application de podcast nécessite une adresse de flux en HTTPS.",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Attention : un ou plusieurs de vos épisodes ne possèdent pas de date de publication. Certaines applications de podcast le requièrent.",
|
||||
"ToastBookmarkCreateFailed": "Échec de la création de signet",
|
||||
"ToastBookmarkRemoveFailed": "Échec de la suppression de signet",
|
||||
"ToastBookmarkUpdateFailed": "Échec de la mise à jour de signet",
|
||||
"MessageReportBugsAndContribute": "Signalez des anomalies, demandez des fonctionnalités et contribuez sur",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connecté via données cellulaire limitée",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connecté via Wi-Fi limitée",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connecté via données cellulaire",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connecté via Wi-Fi",
|
||||
"MessageSocketNotConnected": "Socket non connecté",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Attention : la majorité des application de podcast nécessite une adresse de flux HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Attention : un ou plusieurs de vos épisodes ne possèdent pas de date de publication. Certaines applications de podcast le requièrent.",
|
||||
"ToastBookmarkCreateFailed": "Échec de la création de marque-page",
|
||||
"ToastBookmarkRemoveFailed": "Échec de la suppression de marque-page",
|
||||
"ToastBookmarkUpdateFailed": "Échec de la mise à jour de marsue-page",
|
||||
"ToastDownloadNotAllowedOnCellular": "Le téléchargement sur les données mobile n’est pas autorisé",
|
||||
"ToastItemMarkedAsFinishedFailed": "Échec de l’annotation terminée",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Échec de l’annotation non-terminée",
|
||||
"ToastPlaylistCreateFailed": "Échec de la création de la liste de lecture",
|
||||
"ToastPodcastCreateFailed": "Échec de la création du Podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast créé",
|
||||
"ToastPodcastCreateSuccess": "Podcast créé avec succès",
|
||||
"ToastRSSFeedCloseFailed": "Échec de la fermeture du flux RSS",
|
||||
"ToastRSSFeedCloseSuccess": "Flux RSS fermé"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "Flux RSS fermé",
|
||||
"ToastStreamingNotAllowedOnCellular": "La diffusion sur les données mobile n’est pas autorisée"
|
||||
}
|
||||
|
||||
+5
-268
@@ -1,294 +1,31 @@
|
||||
{
|
||||
"ButtonAdd": "ઉમેરો",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAuthors": "લેખકો",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonCancel": "રદ કરો",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonClearFilter": "ફિલ્ટર જતુ કરો ",
|
||||
"ButtonClearFilter": "ફિલ્ટર જતુ કરો",
|
||||
"ButtonCloseFeed": "ફીડ બંધ કરો",
|
||||
"ButtonCollections": "સંગ્રહ",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonCreate": "બનાવો",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonDelete": "કાઢી નાખો",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonHome": "ઘર",
|
||||
"ButtonIssues": "સમસ્યાઓ",
|
||||
"ButtonLatest": "નવીનતમ",
|
||||
"ButtonLibrary": "પુસ્તકાલય",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonOpenFeed": "ફીડ ખોલો",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPlay": "ચલાવો",
|
||||
"ButtonPlaying": "ચલાવી રહ્યું છે",
|
||||
"ButtonPlaylists": "પ્લેલિસ્ટ",
|
||||
"ButtonRead": "વાંચો",
|
||||
"ButtonRemove": "કાઢી નાખો",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonSave": "સાચવો",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSearch": "શોધો",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSeries": "સિરીઝ",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "સબમિટ કરો",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonYes": "હા",
|
||||
"HeaderAccount": "એકાઉન્ટ",
|
||||
"HeaderAdvanced": "અડ્વાન્સડ",
|
||||
"HeaderAudioTracks": "Audio Tracks",
|
||||
"HeaderChapters": "Chapters",
|
||||
"HeaderCollection": "Collection",
|
||||
"HeaderCollectionItems": "Collection Items",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderDetails": "Details",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Ebook Files",
|
||||
"HeaderEpisodes": "Episodes",
|
||||
"HeaderEreaderSettings": "Ereader Settings",
|
||||
"HeaderLatestEpisodes": "Latest episodes",
|
||||
"HeaderLibraries": "Libraries",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderOpenRSSFeed": "Open RSS Feed",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaylist": "Playlist",
|
||||
"HeaderPlaylistItems": "Playlist Items",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS Details",
|
||||
"HeaderRSSFeedIsOpen": "RSS Feed is Open",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderSettings": "Settings",
|
||||
"HeaderSleepTimer": "Sleep Timer",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderStatsMinutesListeningChart": "Minutes Listening (last 7 days)",
|
||||
"HeaderStatsRecentSessions": "Recent Sessions",
|
||||
"HeaderTableOfContents": "Table of Contents",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderYourStats": "Your Stats",
|
||||
"LabelAdded": "Added",
|
||||
"LabelAddedAt": "Added At",
|
||||
"LabelAddToPlaylist": "Add to Playlist",
|
||||
"LabelAll": "All",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAuthor": "Author",
|
||||
"LabelAuthorFirstLast": "Author (First Last)",
|
||||
"LabelAuthorLastFirst": "Author (Last, First)",
|
||||
"LabelAuthors": "Authors",
|
||||
"LabelAutoDownloadEpisodes": "Auto Download Episodes",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelBooks": "Books",
|
||||
"LabelChapters": "Chapters",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Close player",
|
||||
"LabelCollapseSeries": "Collapse Series",
|
||||
"LabelComplete": "Complete",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelDescription": "Description",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDownload": "Download",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDuration": "Duration",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEnable": "Enable",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnd": "End",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEpisode": "Episode",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFile": "File",
|
||||
"LabelFileBirthtime": "File Birthtime",
|
||||
"LabelFileModified": "File Modified",
|
||||
"LabelFilename": "Filename",
|
||||
"LabelFinished": "Finished",
|
||||
"LabelFolder": "Folder",
|
||||
"LabelFontScale": "Font scale",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genres",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHost": "Host",
|
||||
"LabelIncomplete": "Incomplete",
|
||||
"LabelInProgress": "In Progress",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelLanguage": "Language",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLineSpacing": "Line spacing",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelMediaType": "Media Type",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMore": "More",
|
||||
"LabelMoreInfo": "More Info",
|
||||
"LabelName": "Name",
|
||||
"LabelNarrator": "Narrator",
|
||||
"LabelNarrators": "Narrators",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "Not Finished",
|
||||
"LabelNotStarted": "Not Started",
|
||||
"LabelOff": "Off",
|
||||
"LabelPassword": "Password",
|
||||
"LabelPath": "Path",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories",
|
||||
"LabelProgress": "Progress",
|
||||
"LabelPubDate": "Pub Date",
|
||||
"LabelPublishYear": "Publish Year",
|
||||
"LabelRead": "Read",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
|
||||
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
|
||||
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
|
||||
"LabelRSSFeedSlug": "RSS Feed Slug",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelSeason": "Season",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSeries": "Series",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelSetEbookAsPrimary": "Set as primary",
|
||||
"LabelSetEbookAsSupplementary": "Set as supplementary",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShowAll": "Show All",
|
||||
"LabelSize": "Size",
|
||||
"LabelSleepTimer": "Sleep timer",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Start Time",
|
||||
"LabelStatsBestDay": "Best Day",
|
||||
"LabelStatsDailyAverage": "Daily Average",
|
||||
"LabelStatsDays": "Days",
|
||||
"LabelStatsDaysListened": "Days Listened",
|
||||
"LabelStatsInARow": "in a row",
|
||||
"LabelStatsItemsFinished": "Items Finished",
|
||||
"LabelStatsMinutes": "minutes",
|
||||
"LabelStatsMinutesListening": "Minutes Listening",
|
||||
"LabelStatsWeekListening": "Week Listening",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTheme": "Theme",
|
||||
"LabelThemeDark": "Dark",
|
||||
"LabelThemeLight": "Light",
|
||||
"LabelTimeRemaining": "{0} remaining",
|
||||
"LabelTitle": "Title",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Tracks",
|
||||
"LabelType": "Type",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUser": "User",
|
||||
"LabelUsername": "Username",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelYourBookmarks": "Your Bookmarks",
|
||||
"LabelYourProgress": "Your Progress",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageDownloadingEpisode": "Downloading episode",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download",
|
||||
"MessageFeedURLWillBe": "Feed URL will be {0}",
|
||||
"MessageFetching": "Fetching...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageLoading": "Loading...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageMarkAsFinished": "Mark as Finished",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "No Bookmarks",
|
||||
"MessageNoChapters": "No Chapters",
|
||||
"MessageNoItems": "No Items",
|
||||
"MessageNoItemsFound": "No items found",
|
||||
"MessageNoListeningSessions": "No Listening Sessions",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoPodcastsFound": "No podcasts found",
|
||||
"MessageNoUpdatesWereNecessary": "No updates were necessary",
|
||||
"MessageNoUserPlaylists": "You have no playlists",
|
||||
"MessageReportBugsAndContribute": "Report bugs, request features, and contribute on",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Warning: Most podcast apps will require the RSS feed URL is using HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Warning: 1 or more of your episodes do not have a Pub Date. Some podcast apps require this.",
|
||||
"ToastBookmarkCreateFailed": "Failed to create bookmark",
|
||||
"ToastBookmarkRemoveFailed": "Failed to remove bookmark",
|
||||
"ToastBookmarkUpdateFailed": "Failed to update bookmark",
|
||||
"ToastItemMarkedAsFinishedFailed": "Failed to mark as Finished",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Failed to mark as Not Finished",
|
||||
"ToastPlaylistCreateFailed": "Failed to create playlist",
|
||||
"ToastPodcastCreateFailed": "Failed to create podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast created successfully",
|
||||
"ToastRSSFeedCloseFailed": "Failed to close RSS feed",
|
||||
"ToastRSSFeedCloseSuccess": "RSS feed closed"
|
||||
}
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on GitHub",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered Wi-Fi"
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
+4
-267
@@ -1,294 +1,31 @@
|
||||
{
|
||||
"ButtonAdd": "जोड़ें",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAuthors": "लेखक",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonCancel": "रद्द करें",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonClearFilter": "लागू फ़िल्टर साफ़ करें",
|
||||
"ButtonCloseFeed": "फ़ीड बंद करें",
|
||||
"ButtonCollections": "संग्रह",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonCreate": "बनाएं",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonDelete": "हटाएं",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonHome": "घर",
|
||||
"ButtonIssues": "समस्याएं",
|
||||
"ButtonLatest": "नवीनतम",
|
||||
"ButtonLibrary": "पुस्तकालय",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonOpenFeed": "फ़ीड खोलें",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPlay": "चलाएँ",
|
||||
"ButtonPlaying": "चल रही है",
|
||||
"ButtonPlaylists": "प्लेलिस्ट्स",
|
||||
"ButtonRead": "पढ़ लिया",
|
||||
"ButtonRemove": "हटाएं",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonSave": "सहेजें",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSearch": "खोजें",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSeries": "सीरीज",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "जमा करें",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonYes": "हाँ",
|
||||
"HeaderAccount": "खाता",
|
||||
"HeaderAdvanced": "विकसित",
|
||||
"HeaderAudioTracks": "Audio Tracks",
|
||||
"HeaderChapters": "Chapters",
|
||||
"HeaderCollection": "Collection",
|
||||
"HeaderCollectionItems": "Collection Items",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderDetails": "Details",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Ebook Files",
|
||||
"HeaderEpisodes": "Episodes",
|
||||
"HeaderEreaderSettings": "Ereader Settings",
|
||||
"HeaderLatestEpisodes": "Latest episodes",
|
||||
"HeaderLibraries": "Libraries",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderOpenRSSFeed": "Open RSS Feed",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaylist": "Playlist",
|
||||
"HeaderPlaylistItems": "Playlist Items",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS Details",
|
||||
"HeaderRSSFeedIsOpen": "RSS Feed is Open",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderSettings": "Settings",
|
||||
"HeaderSleepTimer": "Sleep Timer",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderStatsMinutesListeningChart": "Minutes Listening (last 7 days)",
|
||||
"HeaderStatsRecentSessions": "Recent Sessions",
|
||||
"HeaderTableOfContents": "Table of Contents",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderYourStats": "Your Stats",
|
||||
"LabelAdded": "Added",
|
||||
"LabelAddedAt": "Added At",
|
||||
"LabelAddToPlaylist": "Add to Playlist",
|
||||
"LabelAll": "All",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAuthor": "Author",
|
||||
"LabelAuthorFirstLast": "Author (First Last)",
|
||||
"LabelAuthorLastFirst": "Author (Last, First)",
|
||||
"LabelAuthors": "Authors",
|
||||
"LabelAutoDownloadEpisodes": "Auto Download Episodes",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelBooks": "Books",
|
||||
"LabelChapters": "Chapters",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Close player",
|
||||
"LabelCollapseSeries": "Collapse Series",
|
||||
"LabelComplete": "Complete",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelDescription": "Description",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDownload": "Download",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDuration": "Duration",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEnable": "Enable",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnd": "End",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEpisode": "Episode",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFile": "File",
|
||||
"LabelFileBirthtime": "File Birthtime",
|
||||
"LabelFileModified": "File Modified",
|
||||
"LabelFilename": "Filename",
|
||||
"LabelFinished": "Finished",
|
||||
"LabelFolder": "Folder",
|
||||
"LabelFontScale": "Font scale",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genres",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHost": "Host",
|
||||
"LabelIncomplete": "Incomplete",
|
||||
"LabelInProgress": "In Progress",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelLanguage": "Language",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLineSpacing": "Line spacing",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelMediaType": "Media Type",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMore": "More",
|
||||
"LabelMoreInfo": "More Info",
|
||||
"LabelName": "Name",
|
||||
"LabelNarrator": "Narrator",
|
||||
"LabelNarrators": "Narrators",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "Not Finished",
|
||||
"LabelNotStarted": "Not Started",
|
||||
"LabelOff": "Off",
|
||||
"LabelPassword": "Password",
|
||||
"LabelPath": "Path",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories",
|
||||
"LabelProgress": "Progress",
|
||||
"LabelPubDate": "Pub Date",
|
||||
"LabelPublishYear": "Publish Year",
|
||||
"LabelRead": "Read",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
|
||||
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
|
||||
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
|
||||
"LabelRSSFeedSlug": "RSS Feed Slug",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelSeason": "Season",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSeries": "Series",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelSetEbookAsPrimary": "Set as primary",
|
||||
"LabelSetEbookAsSupplementary": "Set as supplementary",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShowAll": "Show All",
|
||||
"LabelSize": "Size",
|
||||
"LabelSleepTimer": "Sleep timer",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Start Time",
|
||||
"LabelStatsBestDay": "Best Day",
|
||||
"LabelStatsDailyAverage": "Daily Average",
|
||||
"LabelStatsDays": "Days",
|
||||
"LabelStatsDaysListened": "Days Listened",
|
||||
"LabelStatsInARow": "in a row",
|
||||
"LabelStatsItemsFinished": "Items Finished",
|
||||
"LabelStatsMinutes": "minutes",
|
||||
"LabelStatsMinutesListening": "Minutes Listening",
|
||||
"LabelStatsWeekListening": "Week Listening",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTheme": "Theme",
|
||||
"LabelThemeDark": "Dark",
|
||||
"LabelThemeLight": "Light",
|
||||
"LabelTimeRemaining": "{0} remaining",
|
||||
"LabelTitle": "Title",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Tracks",
|
||||
"LabelType": "Type",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUser": "User",
|
||||
"LabelUsername": "Username",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelYourBookmarks": "Your Bookmarks",
|
||||
"LabelYourProgress": "Your Progress",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageDownloadingEpisode": "Downloading episode",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download",
|
||||
"MessageFeedURLWillBe": "Feed URL will be {0}",
|
||||
"MessageFetching": "Fetching...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageLoading": "Loading...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageMarkAsFinished": "Mark as Finished",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "No Bookmarks",
|
||||
"MessageNoChapters": "No Chapters",
|
||||
"MessageNoItems": "No Items",
|
||||
"MessageNoItemsFound": "No items found",
|
||||
"MessageNoListeningSessions": "No Listening Sessions",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoPodcastsFound": "No podcasts found",
|
||||
"MessageNoUpdatesWereNecessary": "No updates were necessary",
|
||||
"MessageNoUserPlaylists": "You have no playlists",
|
||||
"MessageReportBugsAndContribute": "Report bugs, request features, and contribute on",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Warning: Most podcast apps will require the RSS feed URL is using HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Warning: 1 or more of your episodes do not have a Pub Date. Some podcast apps require this.",
|
||||
"ToastBookmarkCreateFailed": "Failed to create bookmark",
|
||||
"ToastBookmarkRemoveFailed": "Failed to remove bookmark",
|
||||
"ToastBookmarkUpdateFailed": "Failed to update bookmark",
|
||||
"ToastItemMarkedAsFinishedFailed": "Failed to mark as Finished",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Failed to mark as Not Finished",
|
||||
"ToastPlaylistCreateFailed": "Failed to create playlist",
|
||||
"ToastPodcastCreateFailed": "Failed to create podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast created successfully",
|
||||
"ToastRSSFeedCloseFailed": "Failed to close RSS feed",
|
||||
"ToastRSSFeedCloseSuccess": "RSS feed closed"
|
||||
}
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on GitHub",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered Wi-Fi"
|
||||
}
|
||||
|
||||
+264
-244
@@ -1,294 +1,314 @@
|
||||
{
|
||||
"ButtonAdd": "Dodaj",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAddNewServer": "Dodaj novi poslužitelj",
|
||||
"ButtonAuthors": "Autori",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonBack": "Natrag",
|
||||
"ButtonCancel": "Odustani",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonClearFilter": "Clear Filter",
|
||||
"ButtonCloseFeed": "Zatvori feed",
|
||||
"ButtonCollections": "Kolekcije",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonCreate": "Napravi",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonDelete": "Obriši",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonCancelTimer": "Poništi timer",
|
||||
"ButtonClearFilter": "Poništi filter",
|
||||
"ButtonCloseFeed": "Zatvori izvor",
|
||||
"ButtonCollections": "Zbirke",
|
||||
"ButtonConnect": "Povezivanje",
|
||||
"ButtonConnectToServer": "Poveži se s poslužiteljem",
|
||||
"ButtonCreate": "Izradi",
|
||||
"ButtonCreateBookmark": "Izradi knjižnu oznaku",
|
||||
"ButtonCreateNewPlaylist": "Izradi popis za izvođenje",
|
||||
"ButtonDelete": "Izbriši",
|
||||
"ButtonDeleteLocalEpisode": "Izbriši lokalni nastavak",
|
||||
"ButtonDeleteLocalFile": "Izbriši lokalnu datoteku",
|
||||
"ButtonDeleteLocalItem": "Izbriši lokalnu stavku",
|
||||
"ButtonDisableAutoTimer": "Onemogući automatski timer",
|
||||
"ButtonDisconnect": "Prekini vezu",
|
||||
"ButtonGoToWebClient": "Otvori web sučelje",
|
||||
"ButtonHistory": "Povijest",
|
||||
"ButtonHome": "Početna stranica",
|
||||
"ButtonIssues": "Problemi",
|
||||
"ButtonLatest": "Najnovije",
|
||||
"ButtonLibrary": "Biblioteka",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonOpenFeed": "Otvori feed",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPlay": "Pokreni",
|
||||
"ButtonPlaying": "Playing",
|
||||
"ButtonPlaylists": "Playlists",
|
||||
"ButtonLibrary": "Knjižnica",
|
||||
"ButtonLocalMedia": "Lokalni medijski zapisi",
|
||||
"ButtonManageLocalFiles": "Upravljanje lokalnim datotekama",
|
||||
"ButtonNewFolder": "Nova mapa",
|
||||
"ButtonNextEpisode": "Sljedeći nastavak",
|
||||
"ButtonOpenFeed": "Otvori izvor",
|
||||
"ButtonOverride": "Zanemari",
|
||||
"ButtonPause": "Pauziraj",
|
||||
"ButtonPlay": "Reproduciraj",
|
||||
"ButtonPlayEpisode": "Reproduciraj nastavak",
|
||||
"ButtonPlaying": "Izvodi se",
|
||||
"ButtonPlaylists": "Popisi za izvođenje",
|
||||
"ButtonRead": "Pročitaj",
|
||||
"ButtonRemove": "Ukloni",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonRemoveFromServer": "Ukloni s poslužitelja",
|
||||
"ButtonSave": "Spremi",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSaveOrder": "Spremi redoslijed",
|
||||
"ButtonSearch": "Traži",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSeries": "Serije",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "Submit",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonSendEbookToDevice": "Pošalji e-knjigu na uređaj",
|
||||
"ButtonSeries": "Serijali",
|
||||
"ButtonSetTimer": "Postavi timer",
|
||||
"ButtonStream": "Izvođenje strujanjem",
|
||||
"ButtonSubmit": "Pošalji",
|
||||
"ButtonSwitchServerUser": "Promijeni poslužitelj/korisnika",
|
||||
"ButtonUserStats": "Statistika korisnika",
|
||||
"ButtonYes": "Da",
|
||||
"HeaderAccount": "Korisnički račun",
|
||||
"HeaderAdvanced": "Napredno",
|
||||
"HeaderAudioTracks": "Audio Tracks",
|
||||
"HeaderAudioTracks": "Zvučni zapisi",
|
||||
"HeaderChapters": "Poglavlja",
|
||||
"HeaderCollection": "Kolekcija",
|
||||
"HeaderCollectionItems": "Stvari u kolekciji",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderDetails": "Detalji",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Ebook Files",
|
||||
"HeaderEpisodes": "Epizode",
|
||||
"HeaderEreaderSettings": "Ereader Settings",
|
||||
"HeaderLatestEpisodes": "Najnovije epizode",
|
||||
"HeaderLibraries": "Biblioteke",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderOpenRSSFeed": "Otvori RSS Feed",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaylist": "Playlist",
|
||||
"HeaderPlaylistItems": "Playlist Items",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS Details",
|
||||
"HeaderRSSFeedIsOpen": "RSS Feed je otvoren",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderCollection": "Zbirka",
|
||||
"HeaderCollectionItems": "Stavke u zbirci",
|
||||
"HeaderConnectionStatus": "Stanje veze",
|
||||
"HeaderDataSettings": "Podatkovne postavke",
|
||||
"HeaderDetails": "Pojedinosti",
|
||||
"HeaderDownloads": "Preuzimanja",
|
||||
"HeaderEbookFiles": "Datoteke e-knjiga",
|
||||
"HeaderEpisodes": "Nastavci",
|
||||
"HeaderEreaderSettings": "Postavke e-čitača",
|
||||
"HeaderLatestEpisodes": "Najnoviji nastavci",
|
||||
"HeaderLibraries": "Knjižnice",
|
||||
"HeaderLocalFolders": "Lokalne mape",
|
||||
"HeaderLocalLibraryItems": "Stavke iz lokalne knjižnice",
|
||||
"HeaderNewPlaylist": "Novi popis za izvođenje",
|
||||
"HeaderOpenRSSFeed": "Otvori RSS izvor",
|
||||
"HeaderPlaybackSettings": "Postavke izvođenja",
|
||||
"HeaderPlaylist": "Popis za izvođenje",
|
||||
"HeaderPlaylistItems": "Stavke popisa za izvođenje",
|
||||
"HeaderRSSFeed": "RSS izvor",
|
||||
"HeaderRSSFeedGeneral": "RSS pojedinosti",
|
||||
"HeaderRSSFeedIsOpen": "RSS izvor je otvoren",
|
||||
"HeaderSelectDownloadLocation": "Odaberi lokaciju za preuzimanja",
|
||||
"HeaderSettings": "Postavke",
|
||||
"HeaderSleepTimer": "Sleep Timer",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderStatsMinutesListeningChart": "Minuta odslušanih (posljednjih 7 dana)",
|
||||
"HeaderSleepTimer": "Timer za spavanje",
|
||||
"HeaderSleepTimerSettings": "Postavke timera za spavanje",
|
||||
"HeaderStatsMinutesListeningChart": "Odslušanih minuta (posljednjih 7 dana)",
|
||||
"HeaderStatsRecentSessions": "Nedavne sesije",
|
||||
"HeaderTableOfContents": "Table of Contents",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderYourStats": "Tvoja statistika",
|
||||
"LabelAdded": "Added",
|
||||
"LabelAddedAt": "Added At",
|
||||
"LabelAddToPlaylist": "Add to Playlist",
|
||||
"LabelAll": "All",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"HeaderTableOfContents": "Sadržaj",
|
||||
"HeaderUserInterfaceSettings": "Postavke korisničkog sučelja",
|
||||
"HeaderYourStats": "Vaša statistika",
|
||||
"LabelAddToPlaylist": "Dodaj na popis za izvođenje",
|
||||
"LabelAdded": "Dodano",
|
||||
"LabelAddedAt": "Dodano",
|
||||
"LabelAll": "Sve",
|
||||
"LabelAllowSeekingOnMediaControls": "Dopusti pretraživanje položaja na obavijesti s upravljanjem medijima",
|
||||
"LabelAlways": "Uvijek",
|
||||
"LabelAskConfirmation": "Zatraži potvrdu",
|
||||
"LabelAuthor": "Autor",
|
||||
"LabelAuthorFirstLast": "Author (First Last)",
|
||||
"LabelAuthorLastFirst": "Author (Last, First)",
|
||||
"LabelAuthorFirstLast": "Autor (Ime Prezime)",
|
||||
"LabelAuthorLastFirst": "Autor (Prezime, Ime)",
|
||||
"LabelAuthors": "Autori",
|
||||
"LabelAutoDownloadEpisodes": "Automatski preuzmi epizode",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelAutoDownloadEpisodes": "Automatski preuzmi nastavke",
|
||||
"LabelAutoRewindTime": "Automatsko vraćanje unatrag",
|
||||
"LabelAutoSleepTimer": "Automatski timer za spavanje",
|
||||
"LabelAutoSleepTimerAutoRewind": "Automatsko vraćanje unatrag timera za spavanje",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Nakon što se aktivira timer za spavanje, stavka koju ste slušali automatski će se vratiti na zadani položaj.",
|
||||
"LabelAutoSleepTimerHelp": "Automatski timer za spavanje uključit će se u zadano vrijeme prilikom izvođenja medija.",
|
||||
"LabelBooks": "Knjige",
|
||||
"LabelChapters": "Chapters",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Close player",
|
||||
"LabelCollapseSeries": "Collapse Series",
|
||||
"LabelComplete": "Complete",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelChapterTrack": "Zapis poglavlja",
|
||||
"LabelChapters": "Poglavlja",
|
||||
"LabelClosePlayer": "Zatvori reproduktor",
|
||||
"LabelCollapseSeries": "Serijale prikaži sažeto",
|
||||
"LabelComplete": "Dovršeno",
|
||||
"LabelContinueBooks": "Nastavi knjige",
|
||||
"LabelContinueEpisodes": "Nastavi nastavke",
|
||||
"LabelContinueListening": "Nastavi slušati",
|
||||
"LabelContinueReading": "Nastavi čitati",
|
||||
"LabelContinueSeries": "Nastavi serijal",
|
||||
"LabelCustomTime": "Prilagođeno vrijeme",
|
||||
"LabelDescription": "Opis",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDisableAudioFadeOut": "Onemogući stišavanje zvuka",
|
||||
"LabelDisableAudioFadeOutHelp": "Zvuk će se početi stišavati kada preostane manje od minute na timeru za spavanje. Ako ne želite stišavati zvuk, uključite ovu mogućnost.",
|
||||
"LabelDisableAutoRewind": "Onemogući automatsko vraćanje",
|
||||
"LabelDisableShakeToReset": "Onemogući ponovno postavljanje timera trešnjom",
|
||||
"LabelDisableShakeToResetHelp": "Ukoliko zatresete svoj uređaj tijekom trajanja timera ILI unutar dvije minute od isteka timera, timer će ponovno početi odbrojavati. Uključite ovu mogućnost ako želite onemogućiti tu opciju.",
|
||||
"LabelDisableVibrateOnReset": "Onemogući vibraciju prilikom vraćanja timera na početak",
|
||||
"LabelDisableVibrateOnResetHelp": "Vaš će uređaj zavibrirati kad timer za spavanje ponovno počne odbrojavati. Ako ne želite da uređaj zavibrira kada odbrojavanje ponovno započne, uključite ovu mogućnost.",
|
||||
"LabelDiscover": "Otkrij",
|
||||
"LabelDownload": "Preuzmi",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDownloadUsingCellular": "Preuzmi koristeći mobilne podatke",
|
||||
"LabelDownloaded": "Preuzeto",
|
||||
"LabelDuration": "Trajanje",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEnable": "Uključi",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEbook": "E-knjiga",
|
||||
"LabelEbooks": "E-knjige",
|
||||
"LabelEnable": "Omogući",
|
||||
"LabelEnableMp3IndexSeeking": "Omogući pretraživanje mp3 datoteka po indeksu",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Ovu mogućnost uključite samo ako imate mp3 datoteke koje ne možete pravilno pretraživati. Nepravilno pretraživanje najčešće uzrokuju MP3 datoteke s promjenjivom brzinom protoka (VBR). Ova postavka omogućit će pretraživanje pomoću indeksa, kod kojega se izrađuje mapa vremena i bajtova prilikom čitanja datoteke. U nekim slučajevima, kod velikih MP3 datoteka, može doći do kašnjenja kod pretraživanja na kraju datoteke.",
|
||||
"LabelEnd": "Kraj",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEpisode": "Epizoda",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelEndOfChapter": "Kraj poglavlja",
|
||||
"LabelEndTime": "Vrijeme završetka",
|
||||
"LabelEpisode": "Nastavak",
|
||||
"LabelFeedURL": "URL izvora",
|
||||
"LabelFile": "Datoteka",
|
||||
"LabelFileBirthtime": "File Birthtime",
|
||||
"LabelFileModified": "File Modified",
|
||||
"LabelFilename": "Ime datoteke",
|
||||
"LabelFinished": "Finished",
|
||||
"LabelFolder": "Folder",
|
||||
"LabelFontScale": "Font scale",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelFileBirthtime": "Datoteka stvorena",
|
||||
"LabelFileModified": "Datoteka izmijenjena",
|
||||
"LabelFilename": "Naziv datoteke",
|
||||
"LabelFinished": "Dovršeno",
|
||||
"LabelFolder": "Mapa",
|
||||
"LabelFontBoldness": "Debljina slova",
|
||||
"LabelFontScale": "Veličina slova",
|
||||
"LabelGenre": "Žanr",
|
||||
"LabelGenres": "Žanrovi",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHost": "Host",
|
||||
"LabelIncomplete": "Nepotpuno",
|
||||
"LabelHapticFeedback": "Haptičke povratne informacije",
|
||||
"LabelHasEbook": "Ima e-knjigu",
|
||||
"LabelHasSupplementaryEbook": "Ima dopunsku e-knjigu",
|
||||
"LabelHeavy": "Jako",
|
||||
"LabelHigh": "Jako",
|
||||
"LabelHost": "Poslužitelj",
|
||||
"LabelInProgress": "U tijeku",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelIncomplete": "Nepotpuno",
|
||||
"LabelInternalAppStorage": "Unutarnja pohrana aplikacije",
|
||||
"LabelJumpBackwardsTime": "Trajanje skoka unatrag",
|
||||
"LabelJumpForwardsTime": "Trajanje skoka unaprijed",
|
||||
"LabelLanguage": "Jezik",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLineSpacing": "Line spacing",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelMediaType": "Media Type",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelLayout": "Prikaz",
|
||||
"LabelLayoutAuto": "Automatski",
|
||||
"LabelLayoutSinglePage": "Jedna stranica",
|
||||
"LabelLight": "Lagano",
|
||||
"LabelLineSpacing": "Razmak između redaka",
|
||||
"LabelListenAgain": "Ponovno poslušaj",
|
||||
"LabelLocalBooks": "Lokalne knjige",
|
||||
"LabelLocalPodcasts": "Lokalni podcasti",
|
||||
"LabelLockOrientation": "Zaključaj zakretanje",
|
||||
"LabelLockPlayer": "Zaključaj upravljanje",
|
||||
"LabelLow": "Slabo",
|
||||
"LabelMediaType": "Vrsta medija",
|
||||
"LabelMedium": "Srednje",
|
||||
"LabelMore": "Više",
|
||||
"LabelMoreInfo": "More Info",
|
||||
"LabelMoreInfo": "Više informacija",
|
||||
"LabelName": "Ime",
|
||||
"LabelNarrator": "Narrator",
|
||||
"LabelNarrators": "Naratori",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "Nedovršeno",
|
||||
"LabelNotStarted": "Not Started",
|
||||
"LabelOff": "Off",
|
||||
"LabelPassword": "Lozinka",
|
||||
"LabelNarrator": "Pripovjedač",
|
||||
"LabelNarrators": "Pripovjedači",
|
||||
"LabelNavigateWithVolume": "Navigacija tipkama za glasnoću",
|
||||
"LabelNavigateWithVolumeDisabled": "Isključeno",
|
||||
"LabelNavigateWithVolumeEnabled": "Uključeno",
|
||||
"LabelNavigateWithVolumeMirrored": "Zrcali",
|
||||
"LabelNever": "Nikada",
|
||||
"LabelNewestAuthors": "Najnoviji autori",
|
||||
"LabelNewestEpisodes": "Najnovije epizode",
|
||||
"LabelNo": "Ne",
|
||||
"LabelNotFinished": "Nije dovršeno",
|
||||
"LabelNotStarted": "Nije započeto",
|
||||
"LabelOff": "Isključeno",
|
||||
"LabelPassword": "Zaporka",
|
||||
"LabelPath": "Putanja",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPlaybackDirect": "Izravno",
|
||||
"LabelPlaybackLocal": "Lokalno",
|
||||
"LabelPlaybackSpeed": "Brzina izvođenja",
|
||||
"LabelPlaybackTranscode": "Transkodiraj",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories",
|
||||
"LabelPodcasts": "Podcasti",
|
||||
"LabelPreventIndexing": "Spriječite da iTunes i Google indeksiraju vaš feed za svoje popise podcasta",
|
||||
"LabelProgress": "Napredak",
|
||||
"LabelPubDate": "Datam izdavanja",
|
||||
"LabelPublishYear": "Godina izdavanja",
|
||||
"LabelRead": "Read",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
|
||||
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
|
||||
"LabelRSSFeedPreventIndexing": "Prevent Indexing",
|
||||
"LabelRSSFeedSlug": "RSS Feed Slug",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelPubDate": "Datum izdavanja",
|
||||
"LabelPublishYear": "Godina objavljivanja",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Prilagođena adresa e-pošte vlasnika",
|
||||
"LabelRSSFeedCustomOwnerName": "Prilagođeno ime vlasnika",
|
||||
"LabelRSSFeedPreventIndexing": "Onemogući indeksiranje",
|
||||
"LabelRSSFeedSlug": "Slug RSS izvora",
|
||||
"LabelRandomly": "Nasumično",
|
||||
"LabelRead": "Čitaj",
|
||||
"LabelReadAgain": "Ponovno čitaj",
|
||||
"LabelRecentSeries": "Najnoviji serijali",
|
||||
"LabelRecentlyAdded": "Nedavno dodano",
|
||||
"LabelRemoveFromPlaylist": "Ukloni s popisa za izvođenje",
|
||||
"LabelScaleElapsedTimeBySpeed": "Prilagodi preostalo vrijeme brzini izvođenja",
|
||||
"LabelSeason": "Sezona",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSeries": "Serije",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelSetEbookAsPrimary": "Set as primary",
|
||||
"LabelSetEbookAsSupplementary": "Set as supplementary",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelSelectADevice": "Odabir uređaja",
|
||||
"LabelSeries": "Serijal",
|
||||
"LabelServerAddress": "Adresa poslužitelja",
|
||||
"LabelSetEbookAsPrimary": "Postavi kao primarno",
|
||||
"LabelSetEbookAsSupplementary": "Postavi kao dopunsko",
|
||||
"LabelShakeSensitivity": "Osjetljivost trešnje",
|
||||
"LabelShowAll": "Prikaži sve",
|
||||
"LabelSize": "Veličina",
|
||||
"LabelSleepTimer": "Sleep timer",
|
||||
"LabelStart": "Pokreni",
|
||||
"LabelSleepTimer": "Timer za spavanje",
|
||||
"LabelStart": "Početak",
|
||||
"LabelStartTime": "Vrijeme pokretanja",
|
||||
"LabelStatsBestDay": "Najbolji dan",
|
||||
"LabelStatsDailyAverage": "Dnevni prosjek",
|
||||
"LabelStatsDays": "Dani",
|
||||
"LabelStatsDaysListened": "Dana slušao",
|
||||
"LabelStatsInARow": "u redu",
|
||||
"LabelStatsItemsFinished": "Završenih stavki",
|
||||
"LabelStatsDaysListened": "Dana slušano",
|
||||
"LabelStatsInARow": "uzastopno",
|
||||
"LabelStatsItemsFinished": "Dovršenih stavki",
|
||||
"LabelStatsMinutes": "minute",
|
||||
"LabelStatsMinutesListening": "Minuta odslušano",
|
||||
"LabelStatsWeekListening": "Tjedno slušanje",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTheme": "Theme",
|
||||
"LabelThemeDark": "Dark",
|
||||
"LabelThemeLight": "Light",
|
||||
"LabelStreamingUsingCellular": "Strujanje preko mobilnih podataka",
|
||||
"LabelTag": "Oznaka",
|
||||
"LabelTags": "Oznake",
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeDark": "Tamna",
|
||||
"LabelThemeLight": "Svijetla",
|
||||
"LabelTimeRemaining": "{0} preostalo",
|
||||
"LabelTitle": "Naslov",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Tracks",
|
||||
"LabelType": "Tip",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelTotalSize": "Ukupna veličina",
|
||||
"LabelTotalTrack": "Ukupno zapisa",
|
||||
"LabelTracks": "Zvučni zapisi",
|
||||
"LabelType": "Vrsta",
|
||||
"LabelUnlockPlayer": "Otključaj izvođač",
|
||||
"LabelUseBookshelfView": "Uključi izgled police s knjigama",
|
||||
"LabelUser": "Korisnik",
|
||||
"LabelUsername": "Korisničko ime",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelYourBookmarks": "Tvoje knjižne oznake",
|
||||
"LabelYourProgress": "Tvoj napredak",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageDownloadingEpisode": "Preuzimam epizodu",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Epizoda/-e u redu za preuzimanje",
|
||||
"MessageFeedURLWillBe": "Feed URL će biti {0}",
|
||||
"MessageFetching": "Dobavljam...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"LabelVeryHigh": "Vrlo jako",
|
||||
"LabelVeryLow": "Vrlo slabo",
|
||||
"LabelYourBookmarks": "Vaše knjižne oznake",
|
||||
"LabelYourProgress": "Vaš napredak",
|
||||
"MessageAndroid10Downloads": "Na Androidu 10 i novijem za preuzimanja se upotrebljava unutarnja pohrana.",
|
||||
"MessageAttemptingServerConnection": "Pokušavam se povezati s poslužiteljem...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Poslužitelj Audiobookshelf nije povezan",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Važno!</strong> Ova je aplikacija predviđena za rad s poslužiteljem Audiobookshelf na vašem poslužitelju kojim upravljate vi ili netko koga znate. Ova aplikacija ne nudi nikakav sadržaj.",
|
||||
"MessageBookshelfEmpty": "Polica s knjigama je prazna",
|
||||
"MessageConfirmDeleteLocalEpisode": "Želite li ukloniti lokalni nastavak \"{0}\" sa svog uređaja? Ovo ne utječe na datoteku na poslužitelju.",
|
||||
"MessageConfirmDeleteLocalFiles": "Želite li ukloniti lokalne datoteke ove stavke sa svog uređaja? Ovo ne utječe na datoteke na poslužitelju niti na vaš napredak.",
|
||||
"MessageConfirmDiscardProgress": "Jeste li sigurni da želite iz izbrisati svoj napredak?",
|
||||
"MessageConfirmDownloadUsingCellular": "Spremate se pokrenuti preuzimanje koristeći mobilne podatke. Ovo može uzrokovati dodatne troškove. Želite li nastaviti?",
|
||||
"MessageConfirmMarkAsFinished": "Sigurno želite označiti ovu stavku dovršenom?",
|
||||
"MessageConfirmRemoveBookmark": "Sigurno želite ukloniti knjižnu oznaku?",
|
||||
"MessageConfirmStreamingUsingCellular": "Pokrenut ćete strujanje korištenjem mobilnih podataka. Ovo može uzrokovati dodatne troškove. Želite li nastaviti?",
|
||||
"MessageDiscardProgress": "Zanemari napredak",
|
||||
"MessageDownloadCompleteProcessing": "Preuzimanje dovršeno. Obrađujem...",
|
||||
"MessageDownloading": "Preuzimanje...",
|
||||
"MessageDownloadingEpisode": "Preuzimam nastavak",
|
||||
"MessageEpisodesQueuedForDownload": "{0} nastavak(a) u redu za preuzimanje",
|
||||
"MessageFeedURLWillBe": "URL izvora bit će {0}",
|
||||
"MessageFetching": "Dohvaćam...",
|
||||
"MessageFollowTheProjectOnGithub": "Pratite projekt na GitHubu",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Stavka je uspješno preuzeta, ali nije uspjela izrada knjižničke stavke",
|
||||
"MessageLoading": "Učitavam...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageMarkAsFinished": "Označi kao završeno",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "Nema knjižnih bilješki",
|
||||
"MessageLoadingServerData": "Učitavam podatke poslužitelja...",
|
||||
"MessageMarkAsFinished": "Označi kao dovršeno",
|
||||
"MessageMediaLinkedToADifferentServer": "Medijski zapis vezan je s Audiobookshelf poslužiteljem na drugoj adresi ({0}). Napredak će se sinkronizirati samo dok ste povezani s poslužiteljem na toj adresi.",
|
||||
"MessageMediaLinkedToADifferentUser": "Medijski zapis povezan je s ovim poslužiteljem, ali preuzeo ga je drugi korisnik. Napredak će se sinkronizirati isključivo korisniku koji ga je preuzeo.",
|
||||
"MessageMediaLinkedToServer": "Povezani s poslužiteljem {0}",
|
||||
"MessageMediaLinkedToThisServer": "Preuzeti medijski zapis povezan je s ovim poslužiteljem",
|
||||
"MessageMediaNotLinkedToServer": "Medijski zapis nije povezan s poslužiteljem Audiobookshelf. Napredak se neće sinkronizirati.",
|
||||
"MessageNoBookmarks": "Nema knjižnih oznaka",
|
||||
"MessageNoChapters": "Nema poglavlja",
|
||||
"MessageNoItems": "Nema stavki",
|
||||
"MessageNoItemsFound": "Nijedna stavka pronađena",
|
||||
"MessageNoListeningSessions": "Nema Listening Sessions",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoPodcastsFound": "Nijedan podcast pronađen",
|
||||
"MessageNoUpdatesWereNecessary": "Aktualiziranje nije bilo potrebno",
|
||||
"MessageNoUserPlaylists": "You have no playlists",
|
||||
"MessageReportBugsAndContribute": "Prijavte bugove, zatržite featurese i doprinosite na",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Upozorenje: Večina podcasta će trebati RSS feed URL koji koristi HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Upozorenje: 1 ili više vaših epizoda nemaju datum objavljivanja. Neke podcast aplikacije zahtjevaju to.",
|
||||
"ToastBookmarkCreateFailed": "Kreiranje knjižne bilješke neuspješno",
|
||||
"ToastBookmarkRemoveFailed": "Brisanje knjižne bilješke nauspješno",
|
||||
"ToastBookmarkUpdateFailed": "Aktualizacija knjižne bilješke neuspješna",
|
||||
"ToastItemMarkedAsFinishedFailed": "Označi kao Završeno neuspješno",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Označi kao Nezavršeno neuspješno",
|
||||
"ToastPlaylistCreateFailed": "Failed to create playlist",
|
||||
"ToastPodcastCreateFailed": "Neuspješno kreiranje podcasta",
|
||||
"ToastPodcastCreateSuccess": "Podcast uspješno kreiran",
|
||||
"ToastRSSFeedCloseFailed": "Neuspješno zatvaranje RSS Feeda",
|
||||
"ToastRSSFeedCloseSuccess": "RSS Feed zatvoren"
|
||||
}
|
||||
"MessageNoItemsFound": "Nema pronađenih stavki",
|
||||
"MessageNoListeningSessions": "Nema sesija slušanja",
|
||||
"MessageNoMediaFolders": "Nema medijskih mapa",
|
||||
"MessageNoNetworkConnection": "Nema mrežne veze",
|
||||
"MessageNoPodcastsFound": "Nije pronađen niti jedan podcast",
|
||||
"MessageNoSeries": "Nema serijala",
|
||||
"MessageNoUpdatesWereNecessary": "Ažuriranje nije bilo potrebno",
|
||||
"MessageNoUserPlaylists": "Nemate popisa za izvođenje",
|
||||
"MessageReportBugsAndContribute": "Prijavite pogreške, zatražite funkcionalnosti i doprinesite na",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket je povezan preko mobilnih podataka",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket je povezan preko mobilne mreže s praćenjem potrošnje",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket je povezan preko mobilne mreže kod koje se ne prati potrošnja",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket je povezan preko Wi-Fi mreže na kojoj se ne prati potrošnja",
|
||||
"MessageSocketNotConnected": "Socket nije povezan",
|
||||
"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.",
|
||||
"ToastBookmarkCreateFailed": "Izrada knjižne oznake nije uspjela",
|
||||
"ToastBookmarkRemoveFailed": "Brisanje knjižne bilješke nije uspjelo",
|
||||
"ToastBookmarkUpdateFailed": "Ažuriranje knjižne oznake nije uspjelo",
|
||||
"ToastDownloadNotAllowedOnCellular": "Preuzimanje korištenjem mobilnih podataka onemogućeno je",
|
||||
"ToastItemMarkedAsFinishedFailed": "Označavanje kao Dovršeno nije uspjelo",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Označavanje kao Nije dovršeno nije uspjelo",
|
||||
"ToastPlaylistCreateFailed": "Popis za izvođenje nije izrađen",
|
||||
"ToastPodcastCreateFailed": "Podcast nije izrađen",
|
||||
"ToastPodcastCreateSuccess": "Podcast uspješno izrađen",
|
||||
"ToastRSSFeedCloseFailed": "RSS izvor nije uspješno zatvoren",
|
||||
"ToastRSSFeedCloseSuccess": "RSS izvor zatvoren",
|
||||
"ToastStreamingNotAllowedOnCellular": "Strujanje korištenjem mobilnih podataka onemogućeno je"
|
||||
}
|
||||
|
||||
+33
-13
@@ -19,6 +19,7 @@
|
||||
"ButtonDeleteLocalItem": "Helyi elem törlése",
|
||||
"ButtonDisableAutoTimer": "Automatikus időzítő letiltása",
|
||||
"ButtonDisconnect": "Kapcsolat bontása",
|
||||
"ButtonGoToWebClient": "Webes kliens megnyitása",
|
||||
"ButtonHistory": "Előzmények",
|
||||
"ButtonHome": "Kezdőlap",
|
||||
"ButtonIssues": "Problémák",
|
||||
@@ -32,6 +33,7 @@
|
||||
"ButtonOverride": "Felülírás",
|
||||
"ButtonPause": "Szünet",
|
||||
"ButtonPlay": "Lejátszás",
|
||||
"ButtonPlayEpisode": "Epizód lejátszása",
|
||||
"ButtonPlaying": "Lejátszás folyamatban",
|
||||
"ButtonPlaylists": "Lejátszási listák",
|
||||
"ButtonRead": "Olvasás",
|
||||
@@ -55,6 +57,7 @@
|
||||
"HeaderCollection": "Gyűjtemény",
|
||||
"HeaderCollectionItems": "Gyűjtemény elemek",
|
||||
"HeaderConnectionStatus": "Kapcsolat állapota",
|
||||
"HeaderDataSettings": "Adat beállítások",
|
||||
"HeaderDetails": "Részletek",
|
||||
"HeaderDownloads": "Letöltések",
|
||||
"HeaderEbookFiles": "E-könyv fájlok",
|
||||
@@ -81,11 +84,13 @@
|
||||
"HeaderTableOfContents": "Tartalomjegyzék",
|
||||
"HeaderUserInterfaceSettings": "Felhasználói felület beállításai",
|
||||
"HeaderYourStats": "Saját statisztikák",
|
||||
"LabelAddToPlaylist": "Hozzáadás a lejátszási listához",
|
||||
"LabelAdded": "Hozzáadva",
|
||||
"LabelAddedAt": "Hozzáadva ekkor",
|
||||
"LabelAddToPlaylist": "Hozzáadás a lejátszási listához",
|
||||
"LabelAll": "Összes",
|
||||
"LabelAllowSeekingOnMediaControls": "Pozíció keresés engedélyezése a média értesítési vezérlőkön",
|
||||
"LabelAlways": "Mindig",
|
||||
"LabelAskConfirmation": "Kérjen megerősítést",
|
||||
"LabelAuthor": "Szerző",
|
||||
"LabelAuthorFirstLast": "Szerző (Keresztnév Vezetéknév)",
|
||||
"LabelAuthorLastFirst": "Szerző (Vezetéknév, Keresztnév)",
|
||||
@@ -97,8 +102,8 @@
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Amikor az automatikus alvásidőzítő befejeződik, az elem újrajátszásakor automatikusan visszatekeri a pozíciót.",
|
||||
"LabelAutoSleepTimerHelp": "Amikor a megadott kezdési és befejezési idők között média lejátszása történik, egy alvásidőzítő automatikusan elindul.",
|
||||
"LabelBooks": "Könyv",
|
||||
"LabelChapters": "Fejezetek",
|
||||
"LabelChapterTrack": "Fejezet sáv",
|
||||
"LabelChapters": "Fejezetek",
|
||||
"LabelClosePlayer": "Lejátszó bezárása",
|
||||
"LabelCollapseSeries": "Sorozatok összecsukása",
|
||||
"LabelComplete": "Kész",
|
||||
@@ -118,6 +123,7 @@
|
||||
"LabelDisableVibrateOnResetHelp": "Amikor az alvásidőzítő visszaállításra kerül, az eszköz rezegni fog. Engedélyezze ezt a beállítást, hogy ne rezegjen az alvásidőzítő visszaállításakor.",
|
||||
"LabelDiscover": "Felfedezés",
|
||||
"LabelDownload": "Letöltés",
|
||||
"LabelDownloadUsingCellular": "Letöltés mobilinternettel",
|
||||
"LabelDownloaded": "Letöltve",
|
||||
"LabelDuration": "Időtartam",
|
||||
"LabelEbook": "E-könyv",
|
||||
@@ -136,6 +142,7 @@
|
||||
"LabelFilename": "Fájlnév",
|
||||
"LabelFinished": "Befejezve",
|
||||
"LabelFolder": "Mappa",
|
||||
"LabelFontBoldness": "Betű vastagság",
|
||||
"LabelFontScale": "Betűméret skála",
|
||||
"LabelGenre": "Műfaj",
|
||||
"LabelGenres": "Műfajok",
|
||||
@@ -144,9 +151,9 @@
|
||||
"LabelHasSupplementaryEbook": "Van kiegészítő e-könyv",
|
||||
"LabelHeavy": "Nehéz",
|
||||
"LabelHigh": "Magas",
|
||||
"LabelHost": "Házigazda",
|
||||
"LabelIncomplete": "Befejezetlen",
|
||||
"LabelHost": "Kiszolgáló",
|
||||
"LabelInProgress": "Folyamatban",
|
||||
"LabelIncomplete": "Befejezetlen",
|
||||
"LabelInternalAppStorage": "Belső alkalmazástároló",
|
||||
"LabelJumpBackwardsTime": "Visszaugrás ideje",
|
||||
"LabelJumpForwardsTime": "Előreugrás ideje",
|
||||
@@ -169,6 +176,11 @@
|
||||
"LabelName": "Név",
|
||||
"LabelNarrator": "Előadó",
|
||||
"LabelNarrators": "Előadók",
|
||||
"LabelNavigateWithVolume": "Navigálás a hangerőgombokkal",
|
||||
"LabelNavigateWithVolumeDisabled": "Kikapcsolva",
|
||||
"LabelNavigateWithVolumeEnabled": "Bekapcsolva",
|
||||
"LabelNavigateWithVolumeMirrored": "Tükrözve",
|
||||
"LabelNever": "Soha",
|
||||
"LabelNewestAuthors": "Legújabb szerzők",
|
||||
"LabelNewestEpisodes": "Legújabb epizódok",
|
||||
"LabelNo": "Nem",
|
||||
@@ -187,15 +199,16 @@
|
||||
"LabelProgress": "Haladás",
|
||||
"LabelPubDate": "Közzététel dátuma",
|
||||
"LabelPublishYear": "Kiadás éve",
|
||||
"LabelRead": "Olvasás",
|
||||
"LabelReadAgain": "Újraolvasás",
|
||||
"LabelRecentlyAdded": "Legutóbb hozzáadva",
|
||||
"LabelRecentSeries": "Legutóbbi sorozatok",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Egyéni tulajdonos e-mail",
|
||||
"LabelRSSFeedCustomOwnerName": "Egyéni tulajdonos neve",
|
||||
"LabelRSSFeedPreventIndexing": "Indexelés megakadályozása",
|
||||
"LabelRSSFeedSlug": "RSS hírcsatorna rövid cím",
|
||||
"LabelRandomly": "Véletlenszerűen",
|
||||
"LabelRead": "Olvasás",
|
||||
"LabelReadAgain": "Újraolvasás",
|
||||
"LabelRecentSeries": "Legutóbbi sorozatok",
|
||||
"LabelRecentlyAdded": "Legutóbb hozzáadva",
|
||||
"LabelRemoveFromPlaylist": "Eltávolítás a lejátszási listáról",
|
||||
"LabelScaleElapsedTimeBySpeed": "Eltelt idő skálázása sebesség szerint",
|
||||
"LabelSeason": "Évad",
|
||||
"LabelSelectADevice": "Eszköz kiválasztása",
|
||||
@@ -218,6 +231,7 @@
|
||||
"LabelStatsMinutes": "perc",
|
||||
"LabelStatsMinutesListening": "Hallgatás percekben",
|
||||
"LabelStatsWeekListening": "Heti hallgatás",
|
||||
"LabelStreamingUsingCellular": "Streamelés mobilinternettel",
|
||||
"LabelTag": "Címke",
|
||||
"LabelTags": "Címkék",
|
||||
"LabelTheme": "Téma",
|
||||
@@ -225,6 +239,7 @@
|
||||
"LabelThemeLight": "Világos",
|
||||
"LabelTimeRemaining": "{0} maradt",
|
||||
"LabelTitle": "Cím",
|
||||
"LabelTotalSize": "Összes méret",
|
||||
"LabelTotalTrack": "Összes szám",
|
||||
"LabelTracks": "Számok",
|
||||
"LabelType": "Típus",
|
||||
@@ -244,8 +259,10 @@
|
||||
"MessageConfirmDeleteLocalEpisode": "\"{0}\" helyi epizód eltávolítása az eszközről? A szerveren lévő fájl nem érintett.",
|
||||
"MessageConfirmDeleteLocalFiles": "Ezen elem helyi fájljainak eltávolítása az eszközről? A szerveren lévő fájlok és a haladás nem érintettek.",
|
||||
"MessageConfirmDiscardProgress": "Biztosan alaphelyzetbe akarja állítani a haladást?",
|
||||
"MessageConfirmDownloadUsingCellular": "Mobiladat-hálózaton keresztül készülsz letölteni. Ez adatforgalmi díjakkal járhat. Szeretnéd folytatni?",
|
||||
"MessageConfirmMarkAsFinished": "Biztosan befejezettnek jelöli ezt az elemet?",
|
||||
"MessageConfirmRemoveBookmark": "Biztosan eltávolítja a könyvjelzőt?",
|
||||
"MessageConfirmStreamingUsingCellular": "Mobiladat-hálózaton keresztül készülsz streamelni. Ez adatforgalmi díjakkal járhat. Szeretnéd folytatni?",
|
||||
"MessageDiscardProgress": "Haladás elvetése",
|
||||
"MessageDownloadCompleteProcessing": "Letöltés kész. Feldolgozás...",
|
||||
"MessageDownloading": "Letöltés...",
|
||||
@@ -253,7 +270,7 @@
|
||||
"MessageEpisodesQueuedForDownload": "{0} epizód letöltésre vár",
|
||||
"MessageFeedURLWillBe": "A hírcsatorna URL-je lesz: {0}",
|
||||
"MessageFetching": "Lekérdezés...",
|
||||
"MessageFollowTheProjectOnGithub": "Kövesse a projektet a Githubon",
|
||||
"MessageFollowTheProjectOnGithub": "Kövesse a projektet a GitHubon",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "A könyv letöltése befejeződött, de nem sikerült létrehozni a könyvtári elemet",
|
||||
"MessageLoading": "Betöltés...",
|
||||
"MessageLoadingServerData": "Szerveradatok betöltése...",
|
||||
@@ -271,9 +288,10 @@
|
||||
"MessageNoMediaFolders": "Nincsenek médiamappák",
|
||||
"MessageNoNetworkConnection": "Nincs hálózati kapcsolat",
|
||||
"MessageNoPodcastsFound": "Nem találhatók podcastok",
|
||||
"MessageNoSeries": "Nincsenek sorozatok",
|
||||
"MessageNoUpdatesWereNecessary": "Nem volt szükséges frissítés",
|
||||
"MessageNoUserPlaylists": "Nincsenek lejátszási listái",
|
||||
"MessageReportBugsAndContribute": "Hibák jelentése, funkciók kérése és hozzájárulás a",
|
||||
"MessageReportBugsAndContribute": "Hibák jelentése, funkciók kérése és hozzájárulás itt",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Csatlakoztatva mért mobilhálózaton keresztül",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Csatlakoztatva mért Wi-Fi hálózaton keresztül",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Csatlakoztatva korlátlan mobilhálózaton keresztül",
|
||||
@@ -284,11 +302,13 @@
|
||||
"ToastBookmarkCreateFailed": "A könyvjelző létrehozása sikertelen",
|
||||
"ToastBookmarkRemoveFailed": "A könyvjelző eltávolítása sikertelen",
|
||||
"ToastBookmarkUpdateFailed": "A könyvjelző frissítése sikertelen",
|
||||
"ToastDownloadNotAllowedOnCellular": "Letöltés mobilinternettel nem engedélyezett",
|
||||
"ToastItemMarkedAsFinishedFailed": "Az elem befejezettnek jelölése sikertelen",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Az elem befejezetlennek jelölése sikertelen",
|
||||
"ToastPlaylistCreateFailed": "A lejátszási lista létrehozása sikertelen",
|
||||
"ToastPodcastCreateFailed": "A podcast létrehozása sikertelen",
|
||||
"ToastPodcastCreateSuccess": "A podcast sikeresen létrehozva",
|
||||
"ToastRSSFeedCloseFailed": "Az RSS hírcsatorna bezárása sikertelen",
|
||||
"ToastRSSFeedCloseSuccess": "Az RSS hírcsatorna sikeresen bezárva"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "Az RSS hírcsatorna sikeresen bezárva",
|
||||
"ToastStreamingNotAllowedOnCellular": "Streamelés mobilinternettel nem engedélyezett"
|
||||
}
|
||||
|
||||
+166
-146
@@ -1,76 +1,79 @@
|
||||
{
|
||||
"ButtonAdd": "Aggiungi",
|
||||
"ButtonAddNewServer": "Aggiungi Nuovo Server",
|
||||
"ButtonAddNewServer": "Aggiungi un nuovo server",
|
||||
"ButtonAuthors": "Autori",
|
||||
"ButtonBack": "Indietro",
|
||||
"ButtonCancel": "Cancella",
|
||||
"ButtonCancelTimer": "Cancella Timer",
|
||||
"ButtonClearFilter": "Elimina Filtri",
|
||||
"ButtonCloseFeed": "Chudi i Feed",
|
||||
"ButtonCancelTimer": "Annulla il timer",
|
||||
"ButtonClearFilter": "Elimina filtri",
|
||||
"ButtonCloseFeed": "Chiudi flusso",
|
||||
"ButtonCollections": "Raccolte",
|
||||
"ButtonConnect": "Connetti",
|
||||
"ButtonConnectToServer": "Connetti al Server",
|
||||
"ButtonConnectToServer": "Connetti al server",
|
||||
"ButtonCreate": "Crea",
|
||||
"ButtonCreateBookmark": "Crea Segnalibro",
|
||||
"ButtonCreateNewPlaylist": "Crea Nuova Playlist",
|
||||
"ButtonCreateBookmark": "Crea un segnalibro",
|
||||
"ButtonCreateNewPlaylist": "Crea una nuova playlist",
|
||||
"ButtonDelete": "Elimina",
|
||||
"ButtonDeleteLocalEpisode": "Cancella episodio locale",
|
||||
"ButtonDeleteLocalFile": "Elimina File locale",
|
||||
"ButtonDeleteLocalItem": "Elimina oggetto locale",
|
||||
"ButtonDisableAutoTimer": "Disattiva Auto Timer",
|
||||
"ButtonDeleteLocalFile": "Elimina il file locale",
|
||||
"ButtonDeleteLocalItem": "Elimina l'oggetto locale",
|
||||
"ButtonDisableAutoTimer": "Disattiva il timer automatico",
|
||||
"ButtonDisconnect": "Disconnetti",
|
||||
"ButtonGoToWebClient": "Apri il client web",
|
||||
"ButtonHistory": "Cronologia",
|
||||
"ButtonHome": "Home",
|
||||
"ButtonHome": "Pagina principale",
|
||||
"ButtonIssues": "Errori",
|
||||
"ButtonLatest": "Ultimi",
|
||||
"ButtonLibrary": "Libreria",
|
||||
"ButtonLocalMedia": "Media Locali",
|
||||
"ButtonManageLocalFiles": "Gestisci file Locali",
|
||||
"ButtonNewFolder": "Nuova Cartella",
|
||||
"ButtonNextEpisode": "Prossimo Episodio",
|
||||
"ButtonOpenFeed": "Apri Feed",
|
||||
"ButtonLibrary": "Biblioteca",
|
||||
"ButtonLocalMedia": "Media locali",
|
||||
"ButtonManageLocalFiles": "Gestisci file locali",
|
||||
"ButtonNewFolder": "Nuova cartella",
|
||||
"ButtonNextEpisode": "Prossimo episodio",
|
||||
"ButtonOpenFeed": "Apri il flusso",
|
||||
"ButtonOverride": "Oltrepassa",
|
||||
"ButtonPause": "Pausa",
|
||||
"ButtonPlay": "Play",
|
||||
"ButtonPlaying": "In Riproduzione",
|
||||
"ButtonPlaylists": "Playlists",
|
||||
"ButtonPlay": "Riproduci",
|
||||
"ButtonPlayEpisode": "Riproduci episodio",
|
||||
"ButtonPlaying": "In riproduzione",
|
||||
"ButtonPlaylists": "Playlist",
|
||||
"ButtonRead": "Leggi",
|
||||
"ButtonRemove": "Rimuovi",
|
||||
"ButtonRemoveFromServer": "Rimuovi dal server",
|
||||
"ButtonSave": "Salva",
|
||||
"ButtonSaveOrder": "Salva Ordine",
|
||||
"ButtonSaveOrder": "Salva l'ordine",
|
||||
"ButtonSearch": "Cerca",
|
||||
"ButtonSendEbookToDevice": "Invia Ebook al Device",
|
||||
"ButtonSendEbookToDevice": "Invia il libro al dispositivo",
|
||||
"ButtonSeries": "Serie",
|
||||
"ButtonSetTimer": "Imposta Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "Invia",
|
||||
"ButtonSwitchServerUser": "Cambia Server/Utente",
|
||||
"ButtonUserStats": "Statistiche Utente",
|
||||
"ButtonYes": "Si",
|
||||
"ButtonUserStats": "Statistiche utente",
|
||||
"ButtonYes": "Sì",
|
||||
"HeaderAccount": "Account",
|
||||
"HeaderAdvanced": "Avanzate",
|
||||
"HeaderAudioTracks": "Tracce Audio",
|
||||
"HeaderAudioTracks": "Tracce audio",
|
||||
"HeaderChapters": "Capitoli",
|
||||
"HeaderCollection": "Raccolta",
|
||||
"HeaderCollectionItems": "Elementi della Raccolta",
|
||||
"HeaderConnectionStatus": "Stato Connessione",
|
||||
"HeaderCollectionItems": "Elementi della raccolta",
|
||||
"HeaderConnectionStatus": "Stato connessione",
|
||||
"HeaderDataSettings": "Impostazioni dei dati",
|
||||
"HeaderDetails": "Dettagli",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Ebook File",
|
||||
"HeaderDownloads": "Scaricamenti",
|
||||
"HeaderEbookFiles": "File dei libri",
|
||||
"HeaderEpisodes": "Episodi",
|
||||
"HeaderEreaderSettings": "Impostazioni Ereader",
|
||||
"HeaderEreaderSettings": "Impostazioni lettore",
|
||||
"HeaderLatestEpisodes": "Ultimi Episodi",
|
||||
"HeaderLibraries": "Librerie",
|
||||
"HeaderLocalFolders": "Cartelle Locali",
|
||||
"HeaderLocalLibraryItems": "Oggetti Libreria Locale",
|
||||
"HeaderNewPlaylist": "Nuova Playlist",
|
||||
"HeaderOpenRSSFeed": "Apri RSS Feed",
|
||||
"HeaderPlaybackSettings": "Impostazioni Playback",
|
||||
"HeaderLibraries": "Biblioteche",
|
||||
"HeaderLocalFolders": "Cartelle locali",
|
||||
"HeaderLocalLibraryItems": "Oggetti della biblioteca locale",
|
||||
"HeaderNewPlaylist": "Nuova playlist",
|
||||
"HeaderOpenRSSFeed": "Apri il flusso RSS",
|
||||
"HeaderPlaybackSettings": "Impostazioni rirpoduzione",
|
||||
"HeaderPlaylist": "Playlist",
|
||||
"HeaderPlaylistItems": "Elementi della playlist",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS Dettagli",
|
||||
"HeaderRSSFeed": "Flusso RSS",
|
||||
"HeaderRSSFeedGeneral": "Dettagli RSS",
|
||||
"HeaderRSSFeedIsOpen": "RSS Feed è aperto",
|
||||
"HeaderSelectDownloadLocation": "Selezione Posizione Download",
|
||||
"HeaderSettings": "Impostazioni",
|
||||
@@ -78,27 +81,29 @@
|
||||
"HeaderSleepTimerSettings": "Impostazione tempo Sleep",
|
||||
"HeaderStatsMinutesListeningChart": "Minuti ascoltati (Ultimi 7 Giorni)",
|
||||
"HeaderStatsRecentSessions": "Sessioni Recenti",
|
||||
"HeaderTableOfContents": "Tabella dei Contenuti",
|
||||
"HeaderUserInterfaceSettings": "Impostazioni Interfaccia Utente",
|
||||
"HeaderYourStats": "Statistiche Personali",
|
||||
"HeaderTableOfContents": "Indice",
|
||||
"HeaderUserInterfaceSettings": "Impostazioni interfaccia utente",
|
||||
"HeaderYourStats": "Statistiche personali",
|
||||
"LabelAddToPlaylist": "Aggiungi alla playlist",
|
||||
"LabelAdded": "Aggiunto",
|
||||
"LabelAddedAt": "Aggiunto il",
|
||||
"LabelAddToPlaylist": "aggiungi alla Playlist",
|
||||
"LabelAll": "Tutti",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAllowSeekingOnMediaControls": "Consenti la ricerca della posizione sui controlli delle notifiche multimediali",
|
||||
"LabelAlways": "Sempre",
|
||||
"LabelAskConfirmation": "Richiedi una conferma",
|
||||
"LabelAuthor": "Autore",
|
||||
"LabelAuthorFirstLast": "Autore (Per Nome)",
|
||||
"LabelAuthorLastFirst": "Autori (Per Cognome)",
|
||||
"LabelAuthors": "Autori",
|
||||
"LabelAutoDownloadEpisodes": "Auto Download Episodi",
|
||||
"LabelAutoRewindTime": "Auto Riavvolgimento",
|
||||
"LabelAutoRewindTime": "Auto avvolgimento",
|
||||
"LabelAutoSleepTimer": "Auto Ibernazione",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto Ibernazione e riavvolgimento",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Al termine del timer di spegnimento automatico, la riproduzione dell'elemento riavvolgerà automaticamente la tua posizione.",
|
||||
"LabelAutoSleepTimerHelp": "Durante la riproduzione di contenuti multimediali tra l'ora di inizio e quella di fine specificate, verrà avviato automaticamente un timer di spegnimento.",
|
||||
"LabelBooks": "Libri",
|
||||
"LabelChapterTrack": "Traccia capitolo",
|
||||
"LabelChapters": "Capitoli",
|
||||
"LabelChapterTrack": "Traccia Capitolo",
|
||||
"LabelClosePlayer": "Chiudi player",
|
||||
"LabelCollapseSeries": "Comprimi Serie",
|
||||
"LabelComplete": "Completo",
|
||||
@@ -106,189 +111,204 @@
|
||||
"LabelContinueEpisodes": "Continua Episodi",
|
||||
"LabelContinueListening": "Continua Ascolto",
|
||||
"LabelContinueReading": "Continua Lettura",
|
||||
"LabelContinueSeries": "Continua Serie",
|
||||
"LabelContinueSeries": "Continua serie",
|
||||
"LabelCustomTime": "Personalizza tempo",
|
||||
"LabelDescription": "Descrizione",
|
||||
"LabelDisableAudioFadeOut": "Disabilita audio fade out",
|
||||
"LabelDisableAudioFadeOut": "Disabilita dissolvenza audio in uscita",
|
||||
"LabelDisableAudioFadeOutHelp": "Il volume dell'audio inizierà a diminuire quando rimane meno di 1 minuto sul timer di spegnimento. Abilita questa impostazione per non diminuirlo.",
|
||||
"LabelDisableAutoRewind": "Disabilita auto riavvolgimento",
|
||||
"LabelDisableShakeToReset": "Disabilita shake to reset",
|
||||
"LabelDisableShakeToReset": "Disabilita Agita per ripristinare",
|
||||
"LabelDisableShakeToResetHelp": "Scuotendo il dispositivo mentre il timer è in esecuzione O entro 2 minuti dalla scadenza del timer si ripristinerà il timer di spegnimento. Abilita questa impostazione per disabilitare lo scuotimento per ripristinare.",
|
||||
"LabelDisableVibrateOnReset": "Disabilita vibrazione reset",
|
||||
"LabelDisableVibrateOnReset": "Disabilita vibrazione ripristino",
|
||||
"LabelDisableVibrateOnResetHelp": "Quando il timer di spegnimento viene reimpostato, il dispositivo vibrerà. Abilita questa impostazione per non vibrare quando il timer di spegnimento viene reimpostato.",
|
||||
"LabelDiscover": "Scopri",
|
||||
"LabelDownload": "Download",
|
||||
"LabelDownload": "Scarica",
|
||||
"LabelDownloadUsingCellular": "Scarica usando i dati mobili",
|
||||
"LabelDownloaded": "Scaricati",
|
||||
"LabelDuration": "Durata",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEbook": "Libro digitale",
|
||||
"LabelEbooks": "Libri digitali",
|
||||
"LabelEnable": "Abilita",
|
||||
"LabelEnableMp3IndexSeeking": "Abilita la ricerca dell'indice mp3",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Questa impostazione dovrebbe essere abilitata solo se hai file mp3 che non vengono ricercati correttamente. La ricerca imprecisa è molto probabilmente dovuta ai file MP3 a birate variabile (VBR). Questa impostazione imporrà la ricerca dell'indice, in cui viene creata una mappatura tempo-byte durante la lettura del file. In alcuni casi, con file MP3 di grandi dimensioni, si verificherà un ritardo durante la ricerca verso la fine del file.",
|
||||
"LabelEnd": "Fine",
|
||||
"LabelEndOfChapter": "End del capitolo",
|
||||
"LabelEndOfChapter": "Fine Capitolo",
|
||||
"LabelEndTime": "Tempo alla fine",
|
||||
"LabelEpisode": "Episodio",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFeedURL": "URL del flusso",
|
||||
"LabelFile": "File",
|
||||
"LabelFileBirthtime": "Data Creazione",
|
||||
"LabelFileBirthtime": "Data di creazione",
|
||||
"LabelFileModified": "Ultima modifica",
|
||||
"LabelFilename": "Nome File",
|
||||
"LabelFilename": "Nome del file",
|
||||
"LabelFinished": "Finita",
|
||||
"LabelFolder": "Cartella",
|
||||
"LabelFontScale": "Dimensione Font",
|
||||
"LabelFontBoldness": "Grassetto",
|
||||
"LabelFontScale": "Dimensione font",
|
||||
"LabelGenre": "Genere",
|
||||
"LabelGenres": "Generi",
|
||||
"LabelHapticFeedback": "Feedback tattile",
|
||||
"LabelHasEbook": "Ha l'ebook",
|
||||
"LabelHasSupplementaryEbook": "Ha un ebook supplementale",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHasEbook": "Ha un libro",
|
||||
"LabelHasSupplementaryEbook": "Ha un libro supplementale",
|
||||
"LabelHeavy": "Forte",
|
||||
"LabelHigh": "Alto",
|
||||
"LabelHost": "Host",
|
||||
"LabelInProgress": "In corso",
|
||||
"LabelIncomplete": "Incompleta",
|
||||
"LabelInProgress": "In Corso",
|
||||
"LabelInternalAppStorage": "Archiviazione interna delle app",
|
||||
"LabelJumpBackwardsTime": "Vai indietro nel tempo",
|
||||
"LabelJumpForwardsTime": "Vai avanti nel tempo",
|
||||
"LabelLanguage": "Lingua",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayout": "Disposizione",
|
||||
"LabelLayoutAuto": "Automatico",
|
||||
"LabelLayoutSinglePage": "Pagina singola",
|
||||
"LabelLight": "Light",
|
||||
"LabelLight": "Leggera",
|
||||
"LabelLineSpacing": "Interlinea",
|
||||
"LabelListenAgain": "Ascolta ancora",
|
||||
"LabelLocalBooks": "Libri Locali",
|
||||
"LabelLocalPodcasts": "Podcasts Locali",
|
||||
"LabelLocalBooks": "Libri locali",
|
||||
"LabelLocalPodcasts": "Podcast locali",
|
||||
"LabelLockOrientation": "Blocca orientamento",
|
||||
"LabelLockPlayer": "Blocca Player",
|
||||
"LabelLow": "Basso",
|
||||
"LabelLow": "Bassa",
|
||||
"LabelMediaType": "Tipo Media",
|
||||
"LabelMedium": "Medio",
|
||||
"LabelMore": "Molto",
|
||||
"LabelMoreInfo": "Più Info",
|
||||
"LabelMoreInfo": "Più info",
|
||||
"LabelName": "Nome",
|
||||
"LabelNarrator": "Narratore",
|
||||
"LabelNarrators": "Narratori",
|
||||
"LabelNewestAuthors": "Nuovi Autori",
|
||||
"LabelNewestEpisodes": "Nuovi Episodi",
|
||||
"LabelNavigateWithVolume": "Navigare con i tasti del volume",
|
||||
"LabelNavigateWithVolumeDisabled": "Disattivo",
|
||||
"LabelNavigateWithVolumeEnabled": "Attivo",
|
||||
"LabelNavigateWithVolumeMirrored": "Invertito",
|
||||
"LabelNever": "Mai",
|
||||
"LabelNewestAuthors": "Nuovi autori",
|
||||
"LabelNewestEpisodes": "Nuovi episodi",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "Da Completare",
|
||||
"LabelNotFinished": "Da completare",
|
||||
"LabelNotStarted": "Non iniziato",
|
||||
"LabelOff": "Off",
|
||||
"LabelOff": "Disattivato",
|
||||
"LabelPassword": "Password",
|
||||
"LabelPath": "Percorso",
|
||||
"LabelPlaybackDirect": "Diretto",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Velocità Playback",
|
||||
"LabelPlaybackLocal": "Locale",
|
||||
"LabelPlaybackSpeed": "Velocità di riproduzione",
|
||||
"LabelPlaybackTranscode": "Transcodifica",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPodcasts": "Podcast",
|
||||
"LabelPreventIndexing": "Impedisci che il tuo feed venga indicizzato da iTunes e dalle directory dei podcast di Google",
|
||||
"LabelProgress": "Cominciati",
|
||||
"LabelPubDate": "Data Pubblicazione",
|
||||
"LabelPublishYear": "Anno Pubblicazione",
|
||||
"LabelRead": "Leggi",
|
||||
"LabelReadAgain": "Leggi Ancora",
|
||||
"LabelRecentlyAdded": "Aggiunti Recentemente",
|
||||
"LabelRecentSeries": "Serie Recenti",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Email del proprietario personalizzato",
|
||||
"LabelPubDate": "Data di pubblicazione",
|
||||
"LabelPublishYear": "Anno di pubblicazione",
|
||||
"LabelRSSFeedCustomOwnerEmail": "E-mail del proprietario personalizzato",
|
||||
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
|
||||
"LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione",
|
||||
"LabelRSSFeedSlug": "RSS Feed Slug",
|
||||
"LabelRSSFeedSlug": "Parole chiave del flusso RSS",
|
||||
"LabelRandomly": "Casualmente",
|
||||
"LabelRead": "Leggi",
|
||||
"LabelReadAgain": "Leggi ancora",
|
||||
"LabelRecentSeries": "Serie recenti",
|
||||
"LabelRecentlyAdded": "Aggiunti recentemente",
|
||||
"LabelRemoveFromPlaylist": "Rimuovi dalla playlist",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scala il tempo trascorso in base alla velocità",
|
||||
"LabelSeason": "Stagione",
|
||||
"LabelSelectADevice": "Seletiona dispositivo",
|
||||
"LabelSeries": "Serie",
|
||||
"LabelServerAddress": "Indiritto Server",
|
||||
"LabelSetEbookAsPrimary": "Imposta come Primario",
|
||||
"LabelSetEbookAsSupplementary": "Imposta come Suplementare",
|
||||
"LabelShakeSensitivity": "Sensibilita Shake",
|
||||
"LabelShowAll": "Mostra Tutto",
|
||||
"LabelServerAddress": "Indiritto server",
|
||||
"LabelSetEbookAsPrimary": "Imposta come primario",
|
||||
"LabelSetEbookAsSupplementary": "Imposta come suplementare",
|
||||
"LabelShakeSensitivity": "Sensibilità alla scossa",
|
||||
"LabelShowAll": "Mostra tutto",
|
||||
"LabelSize": "Dimensione",
|
||||
"LabelSleepTimer": "Sleep timer",
|
||||
"LabelSleepTimer": "Temporizzatore",
|
||||
"LabelStart": "Inizo",
|
||||
"LabelStartTime": "Tempo di inizio",
|
||||
"LabelStatsBestDay": "Giorno Migliore",
|
||||
"LabelStatsBestDay": "Giorno migliore",
|
||||
"LabelStatsDailyAverage": "Media giornaliera",
|
||||
"LabelStatsDays": "Giorni",
|
||||
"LabelStatsDaysListened": "Giorni di Ascolto",
|
||||
"LabelStatsInARow": "Di fila",
|
||||
"LabelStatsItemsFinished": "Libri Completati",
|
||||
"LabelStatsMinutes": "Minuti",
|
||||
"LabelStatsMinutesListening": "Ascolto in Minuti",
|
||||
"LabelStatsWeekListening": "Ascolto Settimanale",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelStatsDaysListened": "Giorni di ascolto",
|
||||
"LabelStatsInARow": "di fila",
|
||||
"LabelStatsItemsFinished": "Libri completati",
|
||||
"LabelStatsMinutes": "minuti",
|
||||
"LabelStatsMinutesListening": "Minuti di ascolto",
|
||||
"LabelStatsWeekListening": "Ascolto settimanale",
|
||||
"LabelStreamingUsingCellular": "Streaming usando i dati mobili",
|
||||
"LabelTag": "Etichetta",
|
||||
"LabelTags": "Etichette",
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeDark": "Scuro",
|
||||
"LabelThemeLight": "Chiaro",
|
||||
"LabelTimeRemaining": "{0} rimanente",
|
||||
"LabelTitle": "Titolo",
|
||||
"LabelTotalTrack": "Traccia Totale",
|
||||
"LabelTotalSize": "Dimensione totale",
|
||||
"LabelTotalTrack": "Traccia totale",
|
||||
"LabelTracks": "Traccia",
|
||||
"LabelType": "Tipo",
|
||||
"LabelUnlockPlayer": "Sblocca Player",
|
||||
"LabelUseBookshelfView": "Usa visualizzazione libreria",
|
||||
"LabelUnlockPlayer": "Sblocca il player",
|
||||
"LabelUseBookshelfView": "Usa visualizzazione biblioteca",
|
||||
"LabelUser": "Utente",
|
||||
"LabelUsername": "Username",
|
||||
"LabelVeryHigh": "Molto Alto",
|
||||
"LabelVeryLow": "Molto Basso",
|
||||
"LabelYourBookmarks": "I tuoi Preferiti",
|
||||
"LabelUsername": "Nome utente",
|
||||
"LabelVeryHigh": "Molto alto",
|
||||
"LabelVeryLow": "Molto basso",
|
||||
"LabelYourBookmarks": "I tuoi preferiti",
|
||||
"LabelYourProgress": "Completato al",
|
||||
"MessageAndroid10Downloads": "Android 10 e versioni precedenti utilizzeranno la memoria interna dell'app per i download.",
|
||||
"MessageAttemptingServerConnection": "Tentativo di connessione al server...",
|
||||
"MessageAndroid10Downloads": "Android 10 e versioni precedenti utilizzeranno la memoria interna dell'app per gli scaricamenti.",
|
||||
"MessageAttemptingServerConnection": "Tentativo di connessione al server…",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server non connesso",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Importante!</strong> Questa app è progettata per funzionare con un server Audiobookshelf ospitato da te o da qualcuno che conosci. Questa app non fornisce alcun contenuto.",
|
||||
"MessageBookshelfEmpty": "Bookshelf vuoto",
|
||||
"MessageBookshelfEmpty": "Scaffale vuoto",
|
||||
"MessageConfirmDeleteLocalEpisode": "Rimuovi episodi locali \"{0}\" dal tuo dispositivo? i file sul server non verranno toccati.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove i file locali dell'oggetto? i file sul server e i progressi non verranno toccati.",
|
||||
"MessageConfirmDiscardProgress": "Sei sicuro di voler resettare i tuoi progressi?",
|
||||
"MessageConfirmMarkAsFinished": "Sei sicuro di voler contrassegnare questo elemento come finito?",
|
||||
"MessageConfirmRemoveBookmark": "Sei sicuro di voler rimuovere il segnalibro?",
|
||||
"MessageDiscardProgress": "Elimina Progressi",
|
||||
"MessageDownloadCompleteProcessing": "Download completato. Elaboratione...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageDownloadingEpisode": "Download episodio in corso",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Episodio(i) in coda per il Download",
|
||||
"MessageFeedURLWillBe": "Feed URL Saranno {0}",
|
||||
"MessageFetching": "Recupero Info...",
|
||||
"MessageFollowTheProjectOnGithub": "Segui il progetto su Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Download dell'elemento completato ma impossibile creare l'elemento della libreria",
|
||||
"MessageLoading": "Caricamento...",
|
||||
"MessageLoadingServerData": "Caricamento dati dal server...",
|
||||
"MessageConfirmDeleteLocalFiles": "Rimuovi i file locali dell'oggetto? I file sul server e i progressi non verranno toccati.",
|
||||
"MessageConfirmDiscardProgress": "Sei sicuro/sicura di voler ripristinare i tuoi progressi?",
|
||||
"MessageConfirmDownloadUsingCellular": "Stai per eseguire il download utilizzando la rete dati cellulare. Ciò potrebbe includere addebiti per i dati dell'operatore. Vuoi continuare?",
|
||||
"MessageConfirmMarkAsFinished": "Sei sicuro/sicura di voler contrassegnare questo elemento come finito?",
|
||||
"MessageConfirmRemoveBookmark": "Sei sicuro/sicura di voler rimuovere il segnalibro?",
|
||||
"MessageConfirmStreamingUsingCellular": "Stai per eseguire lo streaming utilizzando la rete dati. Ciò potrebbe includere addebiti per i dati dell'operatore. Vuoi continuare?",
|
||||
"MessageDiscardProgress": "Elimina i progressi",
|
||||
"MessageDownloadCompleteProcessing": "Scaricamento completato. Elaborazione…",
|
||||
"MessageDownloading": "Scaricamento…",
|
||||
"MessageDownloadingEpisode": "Scaricamento dell’episodio in corso",
|
||||
"MessageEpisodesQueuedForDownload": "{0} episodio(i) in coda per lo scaricamento",
|
||||
"MessageFeedURLWillBe": "l’URL del flusso sarà {0}",
|
||||
"MessageFetching": "Recupero info…",
|
||||
"MessageFollowTheProjectOnGithub": "Segui il progetto su GitHub",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Scaricamento dell’elemento completato ma impossibile creare l'elemento nella biblioteca",
|
||||
"MessageLoading": "Caricamento…",
|
||||
"MessageLoadingServerData": "Caricamento dati dal server…",
|
||||
"MessageMarkAsFinished": "Segna come finito",
|
||||
"MessageMediaLinkedToADifferentServer": "Il supporto è collegato a un server Audiobookshelf su un indirizzo diverso ({0}). I progressi verranno sincronizzati quando ci si connette a questo indirizzo del server.",
|
||||
"MessageMediaLinkedToADifferentServer": "L’elemento è collegato a un server Audiobookshelf su un indirizzo diverso ({0}). I progressi verranno sincronizzati quando ci si connette a questo indirizzo del server.",
|
||||
"MessageMediaLinkedToADifferentUser": "Il contenuto multimediale è collegato a questo server ma è stato scaricato da un utente diverso. I progressi verranno sincronizzati solo con l'utente che lo ha scaricato.",
|
||||
"MessageMediaLinkedToServer": "Collegato al server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Il supporto scaricato è collegato a questo server",
|
||||
"MessageMediaLinkedToThisServer": "L’elemento scaricato è collegato a questo server",
|
||||
"MessageMediaNotLinkedToServer": "I contenuti multimediali non sono collegati a un server Audiobookshelf. Nessun progresso verrà sincronizzato.",
|
||||
"MessageNoBookmarks": "Nessun Preferito",
|
||||
"MessageNoChapters": "Nessun Capitolo",
|
||||
"MessageNoItems": "Nessun Oggetto",
|
||||
"MessageNoItemsFound": "Nessun Oggetto trovato",
|
||||
"MessageNoBookmarks": "Nessun preferito",
|
||||
"MessageNoChapters": "Nessun capitolo",
|
||||
"MessageNoItems": "Nessun oggetto",
|
||||
"MessageNoItemsFound": "Nessun oggetto trovato",
|
||||
"MessageNoListeningSessions": "Nessuna sessione di ascolto",
|
||||
"MessageNoMediaFolders": "Nessuna Cartella Media",
|
||||
"MessageNoMediaFolders": "Nessuna cartella media",
|
||||
"MessageNoNetworkConnection": "Nessuna connessione di rete",
|
||||
"MessageNoPodcastsFound": "Nessun podcasts trovato",
|
||||
"MessageNoPodcastsFound": "Nessun podcast trovato",
|
||||
"MessageNoSeries": "Nessuna serie",
|
||||
"MessageNoUpdatesWereNecessary": "Nessun aggiornamento necessario",
|
||||
"MessageNoUserPlaylists": "non hai nessuna Playlist",
|
||||
"MessageReportBugsAndContribute": "Segnala bug, richiedi funzionalità e contribuisci",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Collegato tramite Rete cellulare a consumo",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Collegato tramite rete wifi a consumo",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Collegato tramite Rete cellularer",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Collegato tramite rete wif",
|
||||
"MessageNoUserPlaylists": "Non hai nessuna Playlist",
|
||||
"MessageReportBugsAndContribute": "Segnala errori, richiedi funzionalità e contribuisci",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Collegato tramite rete cellulare a consumo",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Collegato tramite rete Wi-Fi a consumo",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Collegato tramite rete cellulare",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Collegato tramite rete Wi-Fi",
|
||||
"MessageSocketNotConnected": "Non connesso",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Avviso: la maggior parte delle app di podcast richiede che l'URL del feed RSS utilizzi HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Avviso: 1 o più delle tue puntate non hanno una data di pubblicazione. Alcune app di podcast lo richiedono.",
|
||||
"ToastBookmarkCreateFailed": "Creazione segnalibro fallita",
|
||||
"ToastBookmarkRemoveFailed": "Rimozione Segnalibro fallita",
|
||||
"ToastBookmarkUpdateFailed": "Aggiornamento Segnalibro fallito",
|
||||
"ToastBookmarkRemoveFailed": "Rimozione segnalibro fallita",
|
||||
"ToastBookmarkUpdateFailed": "Aggiornamento segnalibro fallito",
|
||||
"ToastDownloadNotAllowedOnCellular": "Lo scaricamento non è consentito sui dati mobili",
|
||||
"ToastItemMarkedAsFinishedFailed": "Errore nel segnare il file come finito",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Errore nel segnare il file come non completo",
|
||||
"ToastPlaylistCreateFailed": "Errore Creazione playlist",
|
||||
"ToastPodcastCreateFailed": "Errore Creazione podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast creato Correttamente",
|
||||
"ToastRSSFeedCloseFailed": "Errore chiusura RSS feed",
|
||||
"ToastRSSFeedCloseSuccess": "RSS feed chiuso"
|
||||
}
|
||||
"ToastPlaylistCreateFailed": "Errore creazione playlist",
|
||||
"ToastPodcastCreateFailed": "Errore creazione podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast creato correttamente",
|
||||
"ToastRSSFeedCloseFailed": "Errore chiusura flusso RSS",
|
||||
"ToastRSSFeedCloseSuccess": "Flusso RSS chiuso",
|
||||
"ToastStreamingNotAllowedOnCellular": "Lo streaming non è consentito sui dati mobili"
|
||||
}
|
||||
|
||||
+11
-135
@@ -1,52 +1,28 @@
|
||||
{
|
||||
"ButtonAdd": "Pridėti",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAuthors": "Autoriai",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonBack": "Atgal",
|
||||
"ButtonCancel": "Atšaukti",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonClearFilter": "Valyti filtrą",
|
||||
"ButtonCloseFeed": "Uždaryti srautą",
|
||||
"ButtonCollections": "Kolekcijos",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonCreate": "Kurti",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonDelete": "Ištrinti",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonHome": "Pradžia",
|
||||
"ButtonIssues": "Problemos",
|
||||
"ButtonLatest": "Naujausias",
|
||||
"ButtonLibrary": "Biblioteka",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonOpenFeed": "Atidaryti srautą",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonPause": "Pauzė",
|
||||
"ButtonPlay": "Groti",
|
||||
"ButtonPlaying": "Grojama",
|
||||
"ButtonPlaylists": "Grojaraščiai",
|
||||
"ButtonRead": "Skaityti",
|
||||
"ButtonRemove": "Pašalinti",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonSave": "Išsaugoti",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSearch": "Ieškoti",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSeries": "Serijos",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSubmit": "Pateikti",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonYes": "Taip",
|
||||
"HeaderAccount": "Paskyra",
|
||||
"HeaderAdvanced": "Papildomi",
|
||||
@@ -54,80 +30,43 @@
|
||||
"HeaderChapters": "Skyriai",
|
||||
"HeaderCollection": "Kolekcija",
|
||||
"HeaderCollectionItems": "Kolekcijos elementai",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderDetails": "Detalės",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Eknygos failai",
|
||||
"HeaderEpisodes": "Epizodai",
|
||||
"HeaderEreaderSettings": "Elektroninių skaitytuvų nustatymai",
|
||||
"HeaderLatestEpisodes": "Naujausi epizodai",
|
||||
"HeaderLibraries": "Bibliotekos",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderOpenRSSFeed": "Atidaryti RSS srautą",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaylist": "Grojaraštis",
|
||||
"HeaderPlaylistItems": "Grojaraščio elementai",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS informacija",
|
||||
"HeaderRSSFeedIsOpen": "RSS srautas yra atidarytas",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderSettings": "Nustatymai",
|
||||
"HeaderSleepTimer": "Miego laikmatis",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderStatsMinutesListeningChart": "Klausymo minutės (paskutinės 7 dienos)",
|
||||
"HeaderStatsRecentSessions": "Naujausios sesijos",
|
||||
"HeaderTableOfContents": "Turinys",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderYourStats": "Jūsų statistika",
|
||||
"LabelAddToPlaylist": "Pridėti į grojaraštį",
|
||||
"LabelAdded": "Pridėta",
|
||||
"LabelAddedAt": "Pridėta {0}",
|
||||
"LabelAddToPlaylist": "Pridėti į grojaraštį",
|
||||
"LabelAll": "Visi",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAuthor": "Autorius",
|
||||
"LabelAuthorFirstLast": "Autorius (Vardas Pavardė)",
|
||||
"LabelAuthorLastFirst": "Autorius (Pavardė, Vardas)",
|
||||
"LabelAuthors": "Autoriai",
|
||||
"LabelAutoDownloadEpisodes": "Automatiškai atsisiųsti epizodus",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelBooks": "Knygos",
|
||||
"LabelChapters": "Skyriai",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Uždaryti grotuvą",
|
||||
"LabelCollapseSeries": "Suskleisti seriją",
|
||||
"LabelComplete": "Baigta",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelDescription": "Aprašymas",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDownload": "Atsisiųsti",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDuration": "Trukmė",
|
||||
"LabelEbook": "Elektroninė knyga",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEnable": "Įjungti",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnd": "Pabaiga",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEpisode": "Epizodas",
|
||||
"LabelFeedURL": "Srauto URL",
|
||||
"LabelFile": "Failas",
|
||||
@@ -139,71 +78,38 @@
|
||||
"LabelFontScale": "Šrifto mastelis",
|
||||
"LabelGenre": "Žanras",
|
||||
"LabelGenres": "Žanrai",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHost": "Serveris",
|
||||
"LabelIncomplete": "Nebaigta",
|
||||
"LabelInProgress": "Vyksta",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelIncomplete": "Nebaigta",
|
||||
"LabelLanguage": "Kalba",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLineSpacing": "Tarpas tarp eilučių",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelListenAgain": "Klausytis iš naujo",
|
||||
"LabelMediaType": "Medijos tipas",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMore": "Daugiau",
|
||||
"LabelMoreInfo": "Daugiau informacijos",
|
||||
"LabelName": "Pavadinimas",
|
||||
"LabelNarrator": "Skaitytojas",
|
||||
"LabelNarrators": "Skaitytojai",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNotFinished": "Nebaigta",
|
||||
"LabelNotStarted": "Nepasileista",
|
||||
"LabelOff": "Off",
|
||||
"LabelPassword": "Slaptažodis",
|
||||
"LabelPath": "Kelias",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPodcast": "Tinklalaidė",
|
||||
"LabelPodcasts": "Tinklalaidės",
|
||||
"LabelPreventIndexing": "Neleisti indeksuoti jūsų srauto „iTunes“ ir Google podcast kataloguose",
|
||||
"LabelProgress": "Progresas",
|
||||
"LabelPubDate": "Publikavimo data",
|
||||
"LabelPublishYear": "Leidimo metai",
|
||||
"LabelRead": "Skaityta",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Pasirinktinis savininko el. paštas",
|
||||
"LabelRSSFeedCustomOwnerName": "Pasirinktinis savininko vardas",
|
||||
"LabelRSSFeedPreventIndexing": "Neleisti indeksuoti",
|
||||
"LabelRSSFeedSlug": "RSS srauto identifikatorius",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelRead": "Skaityta",
|
||||
"LabelReadAgain": "Skaityti dar kartą",
|
||||
"LabelSeason": "Sezonas",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSeries": "Serija",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelSetEbookAsPrimary": "Nustatyti kaip pagrindinę",
|
||||
"LabelSetEbookAsSupplementary": "Nustatyti kaip papildomą",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShowAll": "Rodyti viską",
|
||||
"LabelSize": "Dydis",
|
||||
"LabelSleepTimer": "Miego laikmatis",
|
||||
@@ -225,60 +131,30 @@
|
||||
"LabelThemeLight": "Šviesi",
|
||||
"LabelTimeRemaining": "{0} likę",
|
||||
"LabelTitle": "Pavadinimas",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Takeliai",
|
||||
"LabelType": "Tipas",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUser": "Vartotojas",
|
||||
"LabelUsername": "Vartotojo vardas",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelYourBookmarks": "Jūsų skirtukai",
|
||||
"LabelYourProgress": "Jūsų pažanga",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageDownloadingEpisode": "Epizodas atsisiunčiamas",
|
||||
"MessageEpisodesQueuedForDownload": "{0} epizodai laukia atsisiuntimo",
|
||||
"MessageFeedURLWillBe": "Srauto URL bus {0}",
|
||||
"MessageFetching": "Surenkama...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on GitHub",
|
||||
"MessageLoading": "Kraunama...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageMarkAsFinished": "Pažymėti kaip užbaigtą",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageNoBookmarks": "Nėra žymų",
|
||||
"MessageNoChapters": "Nėra skyrių",
|
||||
"MessageNoItems": "Nėra elementų",
|
||||
"MessageNoItemsFound": "Elementų nerasta",
|
||||
"MessageNoListeningSessions": "Klausymo sesijų nėra",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoPodcastsFound": "Tinklalaidžių nerasta",
|
||||
"MessageNoUpdatesWereNecessary": "Nereikalingi jokie atnaujinimai",
|
||||
"MessageNoUserPlaylists": "Neturite grojaraščių",
|
||||
"MessageReportBugsAndContribute": "Praneškite apie klaidas, prašykite naujovių ir prisidėkite",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered Wi-Fi",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered Wi-Fi",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Įspėjimas: Dauguma tinklalaidžių programų reikalauja, kad RSS kanalo URL būtų naudojamas su HTTPS",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Įspėjimas: Vienas ar daugiau jūsų epizodų neturi publikavimo datos. Kai kurios tinklalaidžių programos to reikalauja.",
|
||||
"ToastBookmarkCreateFailed": "Žymos sukurti nepavyko",
|
||||
@@ -291,4 +167,4 @@
|
||||
"ToastPodcastCreateSuccess": "Tinklalaidė sėkmingai sukurta",
|
||||
"ToastRSSFeedCloseFailed": "RSS srauto uždaryti nepavyko",
|
||||
"ToastRSSFeedCloseSuccess": "RSS srautas uždarytas"
|
||||
}
|
||||
}
|
||||
|
||||
+155
-135
@@ -1,52 +1,54 @@
|
||||
{
|
||||
"ButtonAdd": "Toevoegen",
|
||||
"ButtonAddNewServer": "Add New Server",
|
||||
"ButtonAddNewServer": "Nieuwe server toevoegen",
|
||||
"ButtonAuthors": "Auteurs",
|
||||
"ButtonBack": "Back",
|
||||
"ButtonBack": "Terug",
|
||||
"ButtonCancel": "Annuleren",
|
||||
"ButtonCancelTimer": "Cancel Timer",
|
||||
"ButtonCancelTimer": "Timer annuleren",
|
||||
"ButtonClearFilter": "Filter verwijderen",
|
||||
"ButtonCloseFeed": "Feed sluiten",
|
||||
"ButtonCollections": "Collecties",
|
||||
"ButtonConnect": "Connect",
|
||||
"ButtonConnectToServer": "Connect to Server",
|
||||
"ButtonConnect": "Verbinden",
|
||||
"ButtonConnectToServer": "Verbind met server",
|
||||
"ButtonCreate": "Creëer",
|
||||
"ButtonCreateBookmark": "Create Bookmark",
|
||||
"ButtonCreateNewPlaylist": "Create New Playlist",
|
||||
"ButtonCreateBookmark": "Creëer bladwijzer",
|
||||
"ButtonCreateNewPlaylist": "Maak nieuwe afspeellijst",
|
||||
"ButtonDelete": "Verwijder",
|
||||
"ButtonDeleteLocalEpisode": "Delete local episode",
|
||||
"ButtonDeleteLocalFile": "Delete local file",
|
||||
"ButtonDeleteLocalItem": "Delete local item",
|
||||
"ButtonDisableAutoTimer": "Disable Auto Timer",
|
||||
"ButtonDisconnect": "Disconnect",
|
||||
"ButtonHistory": "History",
|
||||
"ButtonHome": "Home",
|
||||
"ButtonIssues": "Issues",
|
||||
"ButtonDeleteLocalEpisode": "Verwijder lokale aflevering",
|
||||
"ButtonDeleteLocalFile": "Verwijder lokaal bestand",
|
||||
"ButtonDeleteLocalItem": "Verwijder lokaal item",
|
||||
"ButtonDisableAutoTimer": "Automatische Timer Uitschakelen",
|
||||
"ButtonDisconnect": "Verbreek verbinding",
|
||||
"ButtonGoToWebClient": "Ga naar Web Client",
|
||||
"ButtonHistory": "Geschiedenis",
|
||||
"ButtonHome": "Thuis",
|
||||
"ButtonIssues": "Problemen",
|
||||
"ButtonLatest": "Meest recent",
|
||||
"ButtonLibrary": "Bibliotheek",
|
||||
"ButtonLocalMedia": "Local Media",
|
||||
"ButtonManageLocalFiles": "Manage Local Files",
|
||||
"ButtonNewFolder": "New Folder",
|
||||
"ButtonNextEpisode": "Next Episode",
|
||||
"ButtonLocalMedia": "Lokale Media",
|
||||
"ButtonManageLocalFiles": "Beheer Lokale Bestanden",
|
||||
"ButtonNewFolder": "Nieuwe map",
|
||||
"ButtonNextEpisode": "Volgende aflevering",
|
||||
"ButtonOpenFeed": "Feed openen",
|
||||
"ButtonOverride": "Override",
|
||||
"ButtonPause": "Pause",
|
||||
"ButtonOverride": "Overschrijven",
|
||||
"ButtonPause": "Pauze",
|
||||
"ButtonPlay": "Afspelen",
|
||||
"ButtonPlayEpisode": "Aflevering afspelen",
|
||||
"ButtonPlaying": "Speelt",
|
||||
"ButtonPlaylists": "Afspeellijsten",
|
||||
"ButtonRead": "Lees",
|
||||
"ButtonRemove": "Verwijder",
|
||||
"ButtonRemoveFromServer": "Remove from Server",
|
||||
"ButtonRemoveFromServer": "Verwijder van server",
|
||||
"ButtonSave": "Opslaan",
|
||||
"ButtonSaveOrder": "Save Order",
|
||||
"ButtonSaveOrder": "Volgorde bewaren",
|
||||
"ButtonSearch": "Zoeken",
|
||||
"ButtonSendEbookToDevice": "Send Ebook to Device",
|
||||
"ButtonSendEbookToDevice": "Verzend Ebook naar Apparaat",
|
||||
"ButtonSeries": "Series",
|
||||
"ButtonSetTimer": "Set Timer",
|
||||
"ButtonStream": "Stream",
|
||||
"ButtonSetTimer": "Zet Timer",
|
||||
"ButtonStream": "Streamen",
|
||||
"ButtonSubmit": "Indienen",
|
||||
"ButtonSwitchServerUser": "Switch Server/User",
|
||||
"ButtonUserStats": "User Stats",
|
||||
"ButtonSwitchServerUser": "Verwissel server/gebruiker",
|
||||
"ButtonUserStats": "Gebruiker statistieken",
|
||||
"ButtonYes": "Ja",
|
||||
"HeaderAccount": "Account",
|
||||
"HeaderAdvanced": "Geavanceerd",
|
||||
@@ -54,80 +56,84 @@
|
||||
"HeaderChapters": "Hoofdstukken",
|
||||
"HeaderCollection": "Collectie",
|
||||
"HeaderCollectionItems": "Collectie-objecten",
|
||||
"HeaderConnectionStatus": "Connection Status",
|
||||
"HeaderConnectionStatus": "Verbindingsstatus",
|
||||
"HeaderDataSettings": "Data Instellingen",
|
||||
"HeaderDetails": "Details",
|
||||
"HeaderDownloads": "Downloads",
|
||||
"HeaderEbookFiles": "Ebook Files",
|
||||
"HeaderEbookFiles": "Ebook bestanden",
|
||||
"HeaderEpisodes": "Afleveringen",
|
||||
"HeaderEreaderSettings": "Ereader-instellingen",
|
||||
"HeaderLatestEpisodes": "Laatste afleveringen",
|
||||
"HeaderLibraries": "Bibliotheken",
|
||||
"HeaderLocalFolders": "Local Folders",
|
||||
"HeaderLocalLibraryItems": "Local Library Items",
|
||||
"HeaderNewPlaylist": "New Playlist",
|
||||
"HeaderLocalFolders": "Lokale Folders",
|
||||
"HeaderLocalLibraryItems": "Lokale Bibliotheek Items",
|
||||
"HeaderNewPlaylist": "Nieuwe afspeellijst",
|
||||
"HeaderOpenRSSFeed": "Open RSS-feed",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"HeaderPlaybackSettings": "Afspeel instellingen",
|
||||
"HeaderPlaylist": "Afspeellijst",
|
||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||
"HeaderRSSFeed": "RSS Feed",
|
||||
"HeaderRSSFeedGeneral": "RSS-details",
|
||||
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
||||
"HeaderSelectDownloadLocation": "Select Download Location",
|
||||
"HeaderSelectDownloadLocation": "Selecteer Download Locatie",
|
||||
"HeaderSettings": "Instellingen",
|
||||
"HeaderSleepTimer": "Slaaptimer",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Settings",
|
||||
"HeaderSleepTimerSettings": "Sleep Timer Instellingen",
|
||||
"HeaderStatsMinutesListeningChart": "Minuten geluisterd (laatste 7 dagen)",
|
||||
"HeaderStatsRecentSessions": "Recente sessies",
|
||||
"HeaderTableOfContents": "Inhoudsopgave",
|
||||
"HeaderUserInterfaceSettings": "User Interface Settings",
|
||||
"HeaderUserInterfaceSettings": "Gebruiker Interface Instellingen",
|
||||
"HeaderYourStats": "Je statistieken",
|
||||
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
|
||||
"LabelAdded": "Toegevoegd",
|
||||
"LabelAddedAt": "Toegevoegd op",
|
||||
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
|
||||
"LabelAll": "Alle",
|
||||
"LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls",
|
||||
"LabelAllowSeekingOnMediaControls": "Positie zoeken toestaan via media notificatie",
|
||||
"LabelAlways": "Altijd",
|
||||
"LabelAskConfirmation": "Vraag voor bevestiging",
|
||||
"LabelAuthor": "Auteur",
|
||||
"LabelAuthorFirstLast": "Auteur (Voornaam Achternaam)",
|
||||
"LabelAuthorLastFirst": "Auteur (Achternaam, Voornaam)",
|
||||
"LabelAuthors": "Auteurs",
|
||||
"LabelAutoDownloadEpisodes": "Afleveringen automatisch downloaden",
|
||||
"LabelAutoRewindTime": "Auto rewind time",
|
||||
"LabelAutoSleepTimer": "Auto sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Auto sleep timer auto rewind",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "When the auto sleep timer finishes, playing the item again will automatically rewind your position.",
|
||||
"LabelAutoSleepTimerHelp": "When playing media between the specified start and end times a sleep timer will automatically start.",
|
||||
"LabelAutoRewindTime": "Automatisch Terugspoelen",
|
||||
"LabelAutoSleepTimer": "Automatische sleep timer",
|
||||
"LabelAutoSleepTimerAutoRewind": "Automatische slaap timer automatisch terugspoelen.",
|
||||
"LabelAutoSleepTimerAutoRewindHelp": "Wanneer de automatische slaap timer afloop zal het item terugspoelen naar de vorige positie.",
|
||||
"LabelAutoSleepTimerHelp": "Wanneer er tussen de opgegeven begin- en eindtijd media wordt afgespeeld, start er automatisch een slaaptimer.",
|
||||
"LabelBooks": "Boeken",
|
||||
"LabelChapterTrack": "Hoofdstuk Track",
|
||||
"LabelChapters": "Hoofdstukken",
|
||||
"LabelChapterTrack": "Chapter Track",
|
||||
"LabelClosePlayer": "Sluit speler",
|
||||
"LabelCollapseSeries": "Series inklappen",
|
||||
"LabelComplete": "Compleet",
|
||||
"LabelContinueBooks": "Continue Books",
|
||||
"LabelContinueEpisodes": "Continue Episodes",
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCustomTime": "Custom time",
|
||||
"LabelContinueBooks": "Doorgaan met Boeken",
|
||||
"LabelContinueEpisodes": "Doorgaan met Episodes",
|
||||
"LabelContinueListening": "Verder Luisteren",
|
||||
"LabelContinueReading": "Verder lezen",
|
||||
"LabelContinueSeries": "Doorgaan met Serie",
|
||||
"LabelCustomTime": "Custom Tijd",
|
||||
"LabelDescription": "Beschrijving",
|
||||
"LabelDisableAudioFadeOut": "Disable audio fade out",
|
||||
"LabelDisableAudioFadeOutHelp": "Audio volume will start decreasing when there is less than 1 minute remaining on the sleep timer. Enable this setting to not fade out.",
|
||||
"LabelDisableAutoRewind": "Disable auto rewind",
|
||||
"LabelDisableShakeToReset": "Disable shake to reset",
|
||||
"LabelDisableShakeToResetHelp": "Shaking your device while the timer is running OR within 2 minutes of the timer expiring will reset the sleep timer. Enable this setting to disable shake to reset.",
|
||||
"LabelDisableVibrateOnReset": "Disable vibrate on reset",
|
||||
"LabelDisableVibrateOnResetHelp": "When the sleep timer gets reset your device will vibrate. Enable this setting to not vibrate when the sleep timer resets.",
|
||||
"LabelDiscover": "Discover",
|
||||
"LabelDisableAudioFadeOut": "Audio fade out uitschakelen",
|
||||
"LabelDisableAudioFadeOutHelp": "Het audiovolume zal afnemen wanneer er minder dan 1 minuut resteert op de slaaptimer. Schakel deze instelling in om niet uit te faden.",
|
||||
"LabelDisableAutoRewind": "Automatisch terugspoelen uitschakelen",
|
||||
"LabelDisableShakeToReset": "Schudden om te resetten uitschakelen",
|
||||
"LabelDisableShakeToResetHelp": "Schudden van uw apparaat terwijl de timer loopt OF binnen 2 minuten nadat de timer afloopt, zal de slaaptimer resetten. Schakel deze instelling in om schudden om te resetten uit te schakelen.",
|
||||
"LabelDisableVibrateOnReset": "Vibratie bij reset uitschakelen",
|
||||
"LabelDisableVibrateOnResetHelp": "Wanneer de slaaptimer wordt gereset, trilt uw apparaat. Schakel deze instelling in om niet te trillen wanneer de slaaptimer wordt gereset.",
|
||||
"LabelDiscover": "Ontdekken",
|
||||
"LabelDownload": "Download",
|
||||
"LabelDownloaded": "Downloaded",
|
||||
"LabelDownloadUsingCellular": "Download met mobiele data",
|
||||
"LabelDownloaded": "Gedownload",
|
||||
"LabelDuration": "Duur",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEbooks": "Eboeken",
|
||||
"LabelEnable": "Inschakelen",
|
||||
"LabelEnableMp3IndexSeeking": "Enable mp3 index seeking",
|
||||
"LabelEnableMp3IndexSeekingHelp": "This setting should only be enabled if you have mp3 files that are not seeking correctly. Inaccurate seeking is most likely due to Variable birate (VBR) MP3 files. This setting will force index seeking, in which a time-to-byte mapping is built as the file is read. In some cases with large MP3 files there will be a delay when seeking towards the end of the file.",
|
||||
"LabelEnableMp3IndexSeeking": "MP3-index zoeken inschakelen",
|
||||
"LabelEnableMp3IndexSeekingHelp": "Deze instelling moet alleen worden ingeschakeld als u mp3-bestanden hebt die niet correct zoeken. Onnauwkeurig zoeken is waarschijnlijk te wijten aan Variable birate (VBR) MP3-bestanden. Deze instelling forceert indexzoeken, waarbij een time-to-byte mapping wordt opgebouwd terwijl het bestand wordt gelezen. In sommige gevallen met grote MP3-bestanden zal er een vertraging zijn bij het zoeken richting het einde van het bestand.",
|
||||
"LabelEnd": "Einde",
|
||||
"LabelEndOfChapter": "End of Chapter",
|
||||
"LabelEndTime": "End time",
|
||||
"LabelEndOfChapter": "Einde van het Hoofdstuk",
|
||||
"LabelEndTime": "Eindtijd",
|
||||
"LabelEpisode": "Aflevering",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFile": "Bestand",
|
||||
@@ -136,32 +142,33 @@
|
||||
"LabelFilename": "Bestandsnaam",
|
||||
"LabelFinished": "Voltooid",
|
||||
"LabelFolder": "Map",
|
||||
"LabelFontBoldness": "Font Boldness",
|
||||
"LabelFontScale": "Lettertype schaal",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genres",
|
||||
"LabelHapticFeedback": "Haptic feedback",
|
||||
"LabelHasEbook": "Has ebook",
|
||||
"LabelHasSupplementaryEbook": "Has supplementary ebook",
|
||||
"LabelHeavy": "Heavy",
|
||||
"LabelHigh": "High",
|
||||
"LabelHapticFeedback": "Haptische feedback",
|
||||
"LabelHasEbook": "Heeft Ebook",
|
||||
"LabelHasSupplementaryEbook": "Heeft aanvullend Ebook",
|
||||
"LabelHeavy": "Zwaar",
|
||||
"LabelHigh": "Hoog",
|
||||
"LabelHost": "Host",
|
||||
"LabelIncomplete": "Incompleet",
|
||||
"LabelInProgress": "Bezig",
|
||||
"LabelInternalAppStorage": "Internal App Storage",
|
||||
"LabelJumpBackwardsTime": "Jump backwards time",
|
||||
"LabelJumpForwardsTime": "Jump forwards time",
|
||||
"LabelIncomplete": "Incompleet",
|
||||
"LabelInternalAppStorage": "Interne App Opslag",
|
||||
"LabelJumpBackwardsTime": "Terug in tijd springen",
|
||||
"LabelJumpForwardsTime": "Verder in tijd springen",
|
||||
"LabelLanguage": "Taal",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutAuto": "Auto",
|
||||
"LabelLayoutSinglePage": "Single page",
|
||||
"LabelLight": "Light",
|
||||
"LabelLayoutAuto": "Automatisch",
|
||||
"LabelLayoutSinglePage": "Enkele pagina",
|
||||
"LabelLight": "Licht",
|
||||
"LabelLineSpacing": "Regelruimte",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
"LabelLocalBooks": "Local Books",
|
||||
"LabelLocalPodcasts": "Local Podcasts",
|
||||
"LabelLockOrientation": "Lock orientation",
|
||||
"LabelLockPlayer": "Lock Player",
|
||||
"LabelLow": "Low",
|
||||
"LabelListenAgain": "Opnieuw Beluisteren",
|
||||
"LabelLocalBooks": "Lokale Boeken",
|
||||
"LabelLocalPodcasts": "Lokale Podcasts",
|
||||
"LabelLockOrientation": "Oriëntatie vergrendelen",
|
||||
"LabelLockPlayer": "Speler vergrendelen",
|
||||
"LabelLow": "Laag",
|
||||
"LabelMediaType": "Mediatype",
|
||||
"LabelMedium": "Medium",
|
||||
"LabelMore": "Meer",
|
||||
@@ -169,41 +176,47 @@
|
||||
"LabelName": "Naam",
|
||||
"LabelNarrator": "Verteller",
|
||||
"LabelNarrators": "Vertellers",
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNo": "No",
|
||||
"LabelNavigateWithVolume": "Navigeer met volume knoppen",
|
||||
"LabelNavigateWithVolumeDisabled": "Uit",
|
||||
"LabelNavigateWithVolumeEnabled": "Aam",
|
||||
"LabelNavigateWithVolumeMirrored": "Gespiegeld",
|
||||
"LabelNever": "Nooit",
|
||||
"LabelNewestAuthors": "Nieuwste Auteurs",
|
||||
"LabelNewestEpisodes": "Nieuwste Afleveringen",
|
||||
"LabelNo": "Nee",
|
||||
"LabelNotFinished": "Niet Voltooid",
|
||||
"LabelNotStarted": "Niet Gestart",
|
||||
"LabelOff": "Off",
|
||||
"LabelOff": "Uit",
|
||||
"LabelPassword": "Wachtwoord",
|
||||
"LabelPath": "Pad",
|
||||
"LabelPlaybackDirect": "Direct",
|
||||
"LabelPlaybackLocal": "Local",
|
||||
"LabelPlaybackSpeed": "Playback Speed",
|
||||
"LabelPlaybackTranscode": "Transcode",
|
||||
"LabelPlaybackLocal": "Lokaal",
|
||||
"LabelPlaybackSpeed": "Afspeelsnelheid",
|
||||
"LabelPlaybackTranscode": "Transcoderen",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcasts": "Podcasts",
|
||||
"LabelPreventIndexing": "Voorkom indexering van je feed door iTunes- en Google podcastmappen",
|
||||
"LabelProgress": "Voortgang",
|
||||
"LabelPubDate": "Publicatiedatum",
|
||||
"LabelPublishYear": "Jaar van uitgave",
|
||||
"LabelRead": "Lees",
|
||||
"LabelReadAgain": "Read Again",
|
||||
"LabelRecentlyAdded": "Recently Added",
|
||||
"LabelRecentSeries": "Recent Series",
|
||||
"LabelRemoveFromPlaylist": "Remove from Playlist",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
||||
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
||||
"LabelRSSFeedPreventIndexing": "Voorkom indexering",
|
||||
"LabelRSSFeedSlug": "RSS-feed slug",
|
||||
"LabelScaleElapsedTimeBySpeed": "Scale Elapsed Time by Speed",
|
||||
"LabelRandomly": "Willekeurig",
|
||||
"LabelRead": "Lees",
|
||||
"LabelReadAgain": "Opnieuw Lezen",
|
||||
"LabelRecentSeries": "Recente Serie",
|
||||
"LabelRecentlyAdded": "Recent Toegevoegd",
|
||||
"LabelRemoveFromPlaylist": "Verwijder van Afspeellijst",
|
||||
"LabelScaleElapsedTimeBySpeed": "Schaal verstreken tijd per snelheid",
|
||||
"LabelSeason": "Seizoen",
|
||||
"LabelSelectADevice": "Select a device",
|
||||
"LabelSelectADevice": "Apparaat Selecteren",
|
||||
"LabelSeries": "Serie",
|
||||
"LabelServerAddress": "Server address",
|
||||
"LabelServerAddress": "Server adres",
|
||||
"LabelSetEbookAsPrimary": "Stel in als primair",
|
||||
"LabelSetEbookAsSupplementary": "Stel in als supplementair",
|
||||
"LabelShakeSensitivity": "Shake sensitivity",
|
||||
"LabelShakeSensitivity": "Schud-gevoeligheid",
|
||||
"LabelShowAll": "Toon alle",
|
||||
"LabelSize": "Grootte",
|
||||
"LabelSleepTimer": "Slaaptimer",
|
||||
@@ -218,6 +231,7 @@
|
||||
"LabelStatsMinutes": "minuten",
|
||||
"LabelStatsMinutesListening": "Minuten luisterend",
|
||||
"LabelStatsWeekListening": "Week luisterend",
|
||||
"LabelStreamingUsingCellular": "Streamen met Mobiele Data",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTheme": "Thema",
|
||||
@@ -225,70 +239,76 @@
|
||||
"LabelThemeLight": "Licht",
|
||||
"LabelTimeRemaining": "{0} te gaan",
|
||||
"LabelTitle": "Titel",
|
||||
"LabelTotalTrack": "Total Track",
|
||||
"LabelTracks": "Tracks",
|
||||
"LabelTotalSize": "Totale grootte",
|
||||
"LabelTotalTrack": "Totaal audiospoor",
|
||||
"LabelTracks": "Audiosporen",
|
||||
"LabelType": "Type",
|
||||
"LabelUnlockPlayer": "Unlock Player",
|
||||
"LabelUseBookshelfView": "Use bookshelf view",
|
||||
"LabelUnlockPlayer": "Speler Ontgrendelen",
|
||||
"LabelUseBookshelfView": "Gebruik boekenplankweergave",
|
||||
"LabelUser": "Gebruiker",
|
||||
"LabelUsername": "Gebruikersnaam",
|
||||
"LabelVeryHigh": "Very High",
|
||||
"LabelVeryLow": "Very Low",
|
||||
"LabelVeryHigh": "Zeer Hoog",
|
||||
"LabelVeryLow": "Zeer Laag",
|
||||
"LabelYourBookmarks": "Je boekwijzers",
|
||||
"LabelYourProgress": "Je voortgang",
|
||||
"MessageAndroid10Downloads": "Android 10 and below will use internal app storage for downloads.",
|
||||
"MessageAttemptingServerConnection": "Attempting server connection...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server not connected",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> This app is designed to work with an Audiobookshelf server that you or someone you know is hosting. This app does not provide any content.",
|
||||
"MessageBookshelfEmpty": "Bookshelf empty",
|
||||
"MessageConfirmDeleteLocalEpisode": "Remove local episode \"{0}\" from your device? The file on the server will be unaffected.",
|
||||
"MessageConfirmDeleteLocalFiles": "Remove local files of this item from your device? The files on the server and your progress will be unaffected.",
|
||||
"MessageConfirmDiscardProgress": "Are you sure you want to reset your progress?",
|
||||
"MessageConfirmMarkAsFinished": "Are you sure you want to mark this item as finished?",
|
||||
"MessageConfirmRemoveBookmark": "Are you sure you want to remove bookmark?",
|
||||
"MessageDiscardProgress": "Discard Progress",
|
||||
"MessageDownloadCompleteProcessing": "Download complete. Processing...",
|
||||
"MessageDownloading": "Downloading...",
|
||||
"MessageAndroid10Downloads": "Android 10 en onder zullen interne app opslag gebruiken voor downloads.",
|
||||
"MessageAttemptingServerConnection": "Serverconnectie proberen...",
|
||||
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server niet geconnecteerd",
|
||||
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> Deze app is ontworpen om te werken met een Audiobookshelf-server die u of iemand die u kent host. Deze app biedt geen content.",
|
||||
"MessageBookshelfEmpty": "Boekenplank leeg",
|
||||
"MessageConfirmDeleteLocalEpisode": "Lokale aflevering \"{0}\" van uw apparaat verwijderen? Het bestand op de server blijft onaangetast.",
|
||||
"MessageConfirmDeleteLocalFiles": "Lokale bestanden van dit item van uw apparaat verwijderen? De bestanden op de server en uw voortgang worden niet beïnvloed.",
|
||||
"MessageConfirmDiscardProgress": "Weet u zeker dat u uw voortgang wilt resetten?",
|
||||
"MessageConfirmDownloadUsingCellular": "U staat op het punt om te downloaden met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
|
||||
"MessageConfirmMarkAsFinished": "Weet u zeker dat u dit item als voltooid wilt markeren?",
|
||||
"MessageConfirmRemoveBookmark": "Weet u zeker dat u de bladwijzer wilt verwijderen?",
|
||||
"MessageConfirmStreamingUsingCellular": "U staat op het punt om te streamen met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
|
||||
"MessageDiscardProgress": "Voortgang negeren",
|
||||
"MessageDownloadCompleteProcessing": "Download compleet. Verwerken...",
|
||||
"MessageDownloading": "Downloaden...",
|
||||
"MessageDownloadingEpisode": "Aflevering aan het dowloaden",
|
||||
"MessageEpisodesQueuedForDownload": "{0} aflevering(en) in de rij om te downloaden",
|
||||
"MessageFeedURLWillBe": "Feed URL zal {0} zijn",
|
||||
"MessageFetching": "Aan het ophalen...",
|
||||
"MessageFollowTheProjectOnGithub": "Follow the project on Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Item download complete but failed to create library item",
|
||||
"MessageFollowTheProjectOnGithub": "Volg dit project op Github",
|
||||
"MessageItemDownloadCompleteFailedToCreate": "Itemdownload voltooid, maar het aanmaken van een bibliotheekitem is mislukt",
|
||||
"MessageLoading": "Aan het laden...",
|
||||
"MessageLoadingServerData": "Loading server data...",
|
||||
"MessageLoadingServerData": "Server data laden...",
|
||||
"MessageMarkAsFinished": "Markeer als Voltooid",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is linked to an Audiobookshelf server on a different address ({0}). Progress will be synced when connected to this server address.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is linked to this server but was downloaded by a different user. Progress will only be synced to the user that downloaded it.",
|
||||
"MessageMediaLinkedToServer": "Linked to server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Downloaded media is linked to this server",
|
||||
"MessageMediaNotLinkedToServer": "Media is not linked to an Audiobookshelf server. No progress will be synced.",
|
||||
"MessageMediaLinkedToADifferentServer": "Media is gekoppeld aan een Audiobookshelf-server op een ander adres ({0}). De voortgang wordt gesynchroniseerd wanneer er verbinding is met dit serveradres.",
|
||||
"MessageMediaLinkedToADifferentUser": "Media is gekoppeld aan deze server, maar is gedownload door een andere gebruiker. De voortgang wordt alleen gesynchroniseerd met de gebruiker die het heeft gedownload.",
|
||||
"MessageMediaLinkedToServer": "Gelinkt met server {0}",
|
||||
"MessageMediaLinkedToThisServer": "Gedownloade media is gekoppeld aan deze server",
|
||||
"MessageMediaNotLinkedToServer": "Media is niet gekoppeld aan een Audiobookshelf-server. Er wordt geen voortgang gesynchroniseerd.",
|
||||
"MessageNoBookmarks": "Geen boekwijzers",
|
||||
"MessageNoChapters": "Geen hoofdstukken",
|
||||
"MessageNoItems": "Geen onderdelen",
|
||||
"MessageNoItemsFound": "Geen onderdelen gevonden",
|
||||
"MessageNoListeningSessions": "Geen luistersessies",
|
||||
"MessageNoMediaFolders": "No Media Folders",
|
||||
"MessageNoNetworkConnection": "No network connection",
|
||||
"MessageNoMediaFolders": "Geen Media Folders",
|
||||
"MessageNoNetworkConnection": "Geen netwerk connectie",
|
||||
"MessageNoPodcastsFound": "Geen podcasts gevonden",
|
||||
"MessageNoSeries": "Geen series",
|
||||
"MessageNoUpdatesWereNecessary": "Geen bijwerkingen waren noodzakelijk",
|
||||
"MessageNoUserPlaylists": "Je hebt geen afspeellijsten",
|
||||
"MessageReportBugsAndContribute": "Rapporteer bugs, vraag functionaliteiten aan en draag bij op",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket connected over metered cellular",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket connected over metered wifi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket connected over unmetered cellular",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket connected over unmetered wifi",
|
||||
"MessageSocketNotConnected": "Socket not connected",
|
||||
"MessageSocketConnectedOverMeteredCellular": "Socket verbonden via gemeten mobiele verbinding",
|
||||
"MessageSocketConnectedOverMeteredWifi": "Socket verbonden via gemeten WiFi",
|
||||
"MessageSocketConnectedOverUnmeteredCellular": "Socket verbonden via ongemeten mobiele verbinding",
|
||||
"MessageSocketConnectedOverUnmeteredWifi": "Socket verbonden via ongemeten WiFi",
|
||||
"MessageSocketNotConnected": "Socket niet verbonden",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Waarschuwing: De meeste podcast-apps zullen eisen dat de RSS-feed URL HTTPS gebruikt",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Waarschuwing: 1 of meer van je afleveringen hebben geen Pub Datum. Sommige podcast-apps vereisen dit.",
|
||||
"ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt",
|
||||
"ToastBookmarkRemoveFailed": "Verwijderen boekwijzer mislukt",
|
||||
"ToastBookmarkUpdateFailed": "Bijwerken boekwijzer mislukt",
|
||||
"ToastDownloadNotAllowedOnCellular": "Downloaden is niet toegestaan via mobiele verbinding",
|
||||
"ToastItemMarkedAsFinishedFailed": "Markeren als Voltooid mislukt",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Markeren als Niet Voltooid mislukt",
|
||||
"ToastPlaylistCreateFailed": "Aanmaken afspeellijst mislukt",
|
||||
"ToastPodcastCreateFailed": "Podcast aanmaken mislukt",
|
||||
"ToastPodcastCreateSuccess": "Podcast aangemaakt",
|
||||
"ToastRSSFeedCloseFailed": "Sluiten RSS-feed mislukt",
|
||||
"ToastRSSFeedCloseSuccess": "RSS-feed gesloten"
|
||||
}
|
||||
"ToastRSSFeedCloseSuccess": "RSS-feed gesloten",
|
||||
"ToastStreamingNotAllowedOnCellular": "Streamen is niet toegstaan via mobiele verbinding"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user