Compare commits

...

93 Commits

Author SHA1 Message Date
Arkadiusz Fal
39f6319043 Bump build number to 171 2023-12-09 22:08:21 +01:00
Arkadiusz Fal
6a2dc9164e Update CHANGELOG 2023-12-09 22:08:20 +01:00
Arkadiusz Fal
37d3f43596 Add channel view help labels 2023-12-09 22:08:20 +01:00
Arkadiusz Fal
aef0ba6ffd Fix displaying account username 2023-12-09 22:08:20 +01:00
Arkadiusz Fal
1ae12cfa21 Add localizations for fa, es, tr, ru 2023-12-09 22:08:20 +01:00
Arkadiusz Fal
8475669aab Update packages 2023-12-09 22:08:20 +01:00
Arkadiusz Fal
6fec76fcb3 Merge pull request #584 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-12-09 22:08:13 +01:00
Arkadiusz Fal
08b2e7ceac Translated using Weblate (Polish)
Currently translated at 100.0% (537 of 537 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/pl/
2023-12-09 22:08:00 +01:00
Anonymous
60972f0c7b Translated using Weblate (English)
Currently translated at 100.0% (537 of 537 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/en/
2023-12-09 22:08:00 +01:00
Arkadiusz Fal
a49db76588 Merge pull request #564 from stonerl/collapsible-chapters
make chapters collapsible and highlight current chapter
2023-12-09 21:51:24 +01:00
Arkadiusz Fal
bd0c86060b Merge pull request #583 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-12-09 21:34:14 +01:00
Arkadiusz Fal
9849f31e1f Translated using Weblate (Polish)
Currently translated at 100.0% (535 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/pl/
2023-12-09 21:33:58 +01:00
Arkadiusz Fal
00ac222af6 Merge pull request #568 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-12-09 21:25:54 +01:00
Vijay
732a8d7385 Translated using Weblate (Hindi)
Currently translated at 65.7% (352 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hi/
2023-12-09 21:03:19 +01:00
Vijay
a009ad7d53 Translated using Weblate (Hindi)
Currently translated at 63.5% (340 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hi/
2023-12-09 21:03:19 +01:00
Kaambiz
91c7c9fc8e Translated using Weblate (Persian)
Currently translated at 78.1% (418 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/fa/
2023-12-09 21:03:19 +01:00
Alper Zengintaş
e836f87c88 Translated using Weblate (Turkish)
Currently translated at 49.9% (267 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/tr/
2023-12-09 21:03:19 +01:00
Kaambiz
1e1a23acd0 Added translation using Weblate (Persian) 2023-12-09 21:03:19 +01:00
Sloom
d8d728a48f Translated using Weblate (Arabic (Najdi))
Currently translated at 0.3% (2 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ars/
2023-12-09 21:03:19 +01:00
maboroshin
067e8a79bf Translated using Weblate (Japanese)
Currently translated at 99.6% (533 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ja/
2023-12-09 21:03:19 +01:00
joaooliva
576f40360d Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (535 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/pt_BR/
2023-12-09 21:03:19 +01:00
gallegonovato
c679a52903 Translated using Weblate (Spanish)
Currently translated at 100.0% (535 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-12-09 21:03:19 +01:00
Alper Zengintaş
82f109290d Translated using Weblate (Turkish)
Currently translated at 46.7% (250 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/tr/
2023-12-09 21:03:19 +01:00
Ophiushi
765006b185 Translated using Weblate (French)
Currently translated at 100.0% (535 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/fr/
2023-12-09 21:03:19 +01:00
Anonymous
86cddb06e4 Translated using Weblate (English)
Currently translated at 100.0% (535 of 535 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/en/
2023-12-09 21:03:19 +01:00
Sloom
012b5156b7 Added translation using Weblate (Arabic (Najdi)) 2023-12-09 21:03:19 +01:00
Arkadiusz Fal
d6c04540e9 Merge pull request #569 from stonerl/no-180-rotation
disable portraitUpsideDown on iPhones
2023-12-09 21:03:14 +01:00
Arkadiusz Fal
3144b52b55 Merge pull request #578 from stonerl/description-fix
macOS: disable hit testing when not expanded
2023-12-09 21:01:30 +01:00
Toni Förster
b04385ceae macOS: disable hit testing when not expanded
fixes overspilling of text when clicking on collapsed descriptions
2023-12-05 00:36:12 +01:00
Toni Förster
721a97dc41 no need for NotificationCenter 2023-12-05 00:07:36 +01:00
Toni Förster
4ca8adc4dd move onReceive to the chapter header in VideoDetails 2023-12-04 23:00:20 +01:00
Toni Förster
d361ef01d4 move updating the time to PlayerModel
this makes the chapter view much much smoother
2023-12-04 21:58:49 +01:00
Toni Förster
0d9c27319d make time updates work for .mpv and .avp
- time update notifications work for both backends
- only init mpv timers when mpv is the active backend
- move notification extension to playerbackend
2023-12-04 14:47:26 +01:00
Toni Förster
600b8d198b add option to expand vertical chapters by default 2023-12-04 01:04:39 +01:00
Toni Förster
d65224320e chapters can only be clicked if expanded or horizontal 2023-12-04 00:39:29 +01:00
Toni Förster
586cea7d44 subscribe chapters to currentTime notification 2023-12-04 00:07:39 +01:00
Toni Förster
aa5d6733b2 remove superfluous vars and chaptermodel 2023-12-03 20:04:57 +01:00
Toni Förster
982dca1846 highlight current chapter when clicked on it 2023-11-29 00:31:53 +01:00
Toni Förster
7de702ad23 change color to appRed for chapter 2023-11-28 23:06:37 +01:00
Toni Förster
13ef96cd02 separate tvOS View 2023-11-28 20:05:04 +01:00
Toni Förster
4ec6f35c5d highlight current chapter 2023-11-28 16:45:36 +01:00
Toni Förster
7f19f7aa47 disable portraitUpsideDown on iPhones 2023-11-27 18:05:17 +01:00
Toni Förster
fb5cd0f681 vertical chapters are full width and max 3 lines 2023-11-27 14:18:43 +01:00
Toni Förster
3feafc153c remove toggle for vertical chapters 2023-11-27 13:34:18 +01:00
Toni Förster
8f08674527 vertical chapters with images are always collapsed 2023-11-27 12:13:51 +01:00
Toni Förster
a7baaeb485 iOS click on collapsed chapters expands the view 2023-11-26 21:24:52 +01:00
Toni Förster
b0d81cdefd iOS - chapters header is a button now 2023-11-26 21:24:52 +01:00
Toni Förster
a33a1d7658 formatting 2023-11-26 21:24:51 +01:00
Toni Förster
e436dec4ba make chapters collapsible
Chapters are now collapsible by default only the first two chapters are shown. The second will be shown opaque to indicate more chapters.
2023-11-26 21:24:50 +01:00
Arkadiusz Fal
eb1dfe69cd Bump build number to 170 2023-11-26 19:09:45 +01:00
Arkadiusz Fal
9f5720d393 Update CHANGELOG 2023-11-26 19:09:26 +01:00
Arkadiusz Fal
675db6f651 Update packages 2023-11-26 18:59:10 +01:00
Arkadiusz Fal
fb5e86c2cb Merge pull request #559 from stonerl/collapsable-details
make description collapsible
2023-11-26 18:57:27 +01:00
Toni Förster
d384a4c520 iOS click on collapsed description text expands it 2023-11-26 15:42:47 +01:00
Toni Förster
6994271eca iOS - the description header is a button now 2023-11-26 15:42:47 +01:00
Toni Förster
ed5fa8e4aa no preview shows nothing now 2023-11-26 15:42:47 +01:00
Toni Förster
cbdf295d67 fix macOS layout 2023-11-26 15:42:47 +01:00
Toni Förster
5d78946320 add stepper for previewed line (broken on macOS) 2023-11-26 15:42:47 +01:00
Toni Förster
84fdc22861 formatting 2023-11-26 15:42:46 +01:00
Toni Förster
a57645f824 make description collapsible 2023-11-26 15:42:46 +01:00
Arkadiusz Fal
e78f40c555 Merge pull request #560 from stonerl/clickable-links
make links in description clickable
2023-11-26 12:28:58 +01:00
Arkadiusz Fal
23f5fc9575 Merge pull request #562 from stonerl/honor-aspect-ratio
honour the aspect ratio when resizing
2023-11-26 12:27:02 +01:00
Toni Förster
fc7a7b085f fixed styling 2023-11-26 10:33:58 +01:00
Arkadiusz Fal
7ffa34b0f9 Merge pull request #554 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-11-25 22:26:26 +01:00
maboroshin
177e28121b Translated using Weblate (Japanese)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ja/
2023-11-25 22:26:19 +01:00
gallegonovato
68a35b8804 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
ooosssay
9ec9a680a6 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
gallegonovato
7629931747 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
ooosssay
afb22e6c25 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
gallegonovato
052fc86388 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
ooosssay
4de51f29c8 Translated using Weblate (Spanish)
Currently translated at 98.4% (525 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
gallegonovato
d1a1f4da38 Translated using Weblate (Spanish)
Currently translated at 98.4% (525 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
ooosssay
d1153ed97d Translated using Weblate (Spanish)
Currently translated at 97.5% (520 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
1c356560d5 Translated using Weblate (Spanish)
Currently translated at 97.5% (520 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
bbd18d921b Translated using Weblate (Spanish)
Currently translated at 91.5% (488 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
9e4860d97c Translated using Weblate (Spanish)
Currently translated at 88.7% (473 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
ooosssay
50d42f721f Translated using Weblate (Spanish)
Currently translated at 88.7% (473 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
9bfccb49e3 Translated using Weblate (Spanish)
Currently translated at 86.3% (460 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
Sergio Varela
919126f9b0 Translated using Weblate (Spanish)
Currently translated at 86.1% (459 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
Toni Förster
d00903569f Translated using Weblate (German)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/de/
2023-11-25 22:26:18 +01:00
Toni Förster
25e7b0d3e1 Translated using Weblate (German)
Currently translated at 99.8% (532 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/de/
2023-11-25 22:26:18 +01:00
Arkadiusz Fal
2aafe33417 Merge pull request #565 from stonerl/private-instances
support for private instances
2023-11-25 22:26:13 +01:00
Toni Förster
e525f36824 formatting 2023-11-22 10:24:41 +01:00
Toni Förster
5a5f5a8696 code formatting 2023-11-22 10:21:21 +01:00
Toni Förster
45d2968d9e support for private instances
closes #552

and some formatting
2023-11-21 18:14:17 +01:00
Toni Förster
c3e1465f31 fix broken fullscreen on macOS 2023-11-21 17:58:44 +01:00
Toni Förster
df47ffb013 change default minWidth with hidden sidebar 2023-11-21 17:49:29 +01:00
Toni Förster
8900f96ce7 honour the aspect ratio when resizing
The `defaultMinimumHeightLeft? has been adjusted to make the radio of the video view 16:9 in its initial state. Also on macOS when resizing the window, the aspect ratio of the view now correlates with the video.
2023-11-21 13:47:51 +01:00
Toni Förster
ed69780d52 removed superfluous braces 2023-11-21 01:13:01 +01:00
Toni Förster
691a3305e7 make links in description clickable
Adds clickable links to macOS. I it is a naive approach, but it works.

Probably closes #51
2023-11-21 00:58:40 +01:00
Arkadiusz Fal
987f6dcac8 Bump build number to 169 2023-11-04 11:34:45 +01:00
Arkadiusz Fal
1113a94d67 Update CHANGELOG 2023-11-04 11:34:25 +01:00
Arkadiusz Fal
8c6fc7d561 Update dependencies 2023-11-04 11:33:01 +01:00
31 changed files with 1203 additions and 344 deletions

View File

@@ -1,3 +1,21 @@
## Build 168
## Build 171
* Collapsible chapters view, player setting "Open vertical chapters expanded"
* Current chapter is highlighted
* Disabled portrait upside down orientation on iPhone
* Fixed issue with handling private Invidious instances requests
* Added Persian, Spanish, Turkish and Russian localizations
* Fixed issue with displaying account username
* Updated dependencies
* Other minor changes and improvements
**Big thanks to [@stonerl](https://github.com/stonerl) for the last contributions!**
**And to past, current and future project contributors!**
## Previous builds
* Description is collapsible with a button
* Links in description are clickable on macOS
* Aspect ratio is honored on resize on macOS
* Added support for private Invidious instances
* Fixed issue where Piped login token would not refresh
* Update dependencies
* Fixed issue with MPV subtitles not working
* Other minor changes and improvements

View File

@@ -3,25 +3,25 @@ GEM
specs:
CFPropertyList (3.0.6)
rexml
addressable (2.8.5)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.840.0)
aws-sdk-core (3.185.1)
aws-eventstream (~> 1, >= 1.0.2)
aws-eventstream (1.3.0)
aws-partitions (1.864.0)
aws-sdk-core (3.190.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.72.0)
aws-sdk-core (~> 3, >= 3.184.0)
aws-sdk-kms (1.74.0)
aws-sdk-core (~> 3, >= 3.188.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.136.0)
aws-sdk-core (~> 3, >= 3.181.0)
aws-sdk-s3 (1.141.0)
aws-sdk-core (~> 3, >= 3.189.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.6)
aws-sigv4 (1.6.0)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
@@ -32,11 +32,10 @@ GEM
declarative (0.0.20)
digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
domain_name (0.6.20231109)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.104.0)
excon (0.105.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@@ -66,7 +65,7 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.7)
fastlane (2.216.0)
fastlane (2.217.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -107,9 +106,9 @@ GEM
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.51.0)
google-apis-androidpublisher_v3 (0.53.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.1)
google-apis-core (0.11.2)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@@ -122,24 +121,25 @@ GEM
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-apis-storage_v1 (0.29.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.6.1)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-env (2.0.1)
faraday (>= 1.0, < 3.a)
google-cloud-errors (1.3.1)
google-cloud-storage (1.44.0)
google-cloud-storage (1.45.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.19.0)
google-apis-storage_v1 (~> 0.29.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
googleauth (1.9.0)
faraday (>= 1.0, < 3.a)
google-cloud-env (~> 2.0, >= 2.0.1)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
@@ -149,7 +149,7 @@ GEM
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
json (2.6.3)
json (2.7.1)
jwt (2.7.1)
mini_magick (4.12.0)
mini_mime (1.1.5)
@@ -160,8 +160,8 @@ GEM
optparse (0.1.1)
os (1.1.4)
plist (3.7.0)
public_suffix (5.0.3)
rake (13.0.6)
public_suffix (5.0.4)
rake (13.1.0)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
@@ -189,9 +189,6 @@ GEM
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (2.5.0)
webrick (1.8.1)
word_wrap (1.0.0)

View File

@@ -596,6 +596,8 @@ final class AVPlayerBackend: PlayerBackend {
if self.controlsUpdates {
self.updateControls()
}
self.model.updateTime(self.currentTime!)
}
}

View File

@@ -182,13 +182,21 @@ final class MPVBackend: PlayerBackend {
}
init() {
// swiftlint:disable shorthand_optional_binding
clientTimer = .init(interval: .seconds(Self.timeUpdateInterval), mode: .infinite) { [weak self] _ in
self?.getTimeUpdates()
guard let self = self, self.model.activeBackend == .mpv else {
return
}
self.getTimeUpdates()
}
networkStateTimer = .init(interval: .seconds(Self.networkStateUpdateInterval), mode: .infinite) { [weak self] _ in
self?.updateNetworkState()
guard let self = self, self.model.activeBackend == .mpv else {
return
}
self.updateNetworkState()
}
// swiftlint:enable shorthand_optional_binding
}
typealias AreInIncreasingOrder = (Stream, Stream) -> Bool
@@ -432,6 +440,8 @@ final class MPVBackend: PlayerBackend {
timeObserverThrottle.execute {
self.model.updateWatch(time: self.currentTime)
}
self.model.updateTime(self.currentTime!)
}
private func stopClientUpdates() {

View File

@@ -131,6 +131,8 @@ final class PlayerModel: ObservableObject {
@Default(.rotateToLandscapeOnEnterFullScreen) private var rotateToLandscapeOnEnterFullScreen
#endif
@Published var currentChapterIndex: Int?
var accounts: AccountsModel { .shared }
var comments: CommentsModel { .shared }
var controls: PlayerControlsModel { .shared }
@@ -1112,4 +1114,36 @@ final class PlayerModel: ObservableObject {
onPlayStream.forEach { $0(stream) }
onPlayStream.removeAll()
}
func updateTime(_ cmTime: CMTime) {
let time = CMTimeGetSeconds(cmTime)
let newChapterIndex = chapterForTime(time)
if currentChapterIndex != newChapterIndex {
DispatchQueue.main.async {
self.currentChapterIndex = newChapterIndex
}
}
}
private func chapterForTime(_ time: Double) -> Int? {
guard let chapters = self.videoForDisplay?.chapters else {
return nil
}
for (index, chapter) in chapters.enumerated() {
let nextChapterStartTime = index < (chapters.count - 1) ? chapters[index + 1].start : nil
if let nextChapterStart = nextChapterStartTime {
if time >= chapter.start, time < nextChapterStart {
return index
}
} else {
if time >= chapter.start {
return index
}
}
}
return nil
}
}

View File

@@ -105,6 +105,7 @@ extension PlayerModel {
func playerAPI(_ video: Video) -> VideosAPI? {
guard let url = video.instanceURL else { return accounts.api }
if accounts.current?.url == url { return accounts.api }
switch video.app {
case .local:
return nil

View File

@@ -364,6 +364,7 @@ struct ChannelVideosView: View {
}
} label: {
Label("Unsubscribe", systemImage: "xmark.circle")
.help("Unsubscribe")
#if os(iOS)
.labelStyle(.automatic)
#else
@@ -380,6 +381,7 @@ struct ChannelVideosView: View {
}
} label: {
Label("Subscribe", systemImage: "circle")
.help("Subscribe")
#if os(iOS)
.labelStyle(.automatic)
#else
@@ -413,6 +415,7 @@ struct ChannelVideosView: View {
feed.markChannelAsWatched(channel.id)
} label: {
Label("Mark channel feed as watched", systemImage: "checkmark.circle.fill")
.help("Mark channel feed as watched")
}
.disabled(!feed.canMarkAllFeedAsWatched)
}
@@ -423,6 +426,7 @@ struct ChannelVideosView: View {
feed.markChannelAsUnwatched(channel.id)
} label: {
Label("Mark channel feed as unwatched", systemImage: "checkmark.circle")
.help("Mark channel feed as unwatched")
}
}

View File

@@ -147,6 +147,7 @@ extension Defaults.Keys {
static let expandVideoDescriptionDefault = true
#endif
static let expandVideoDescription = Key<Bool>("expandVideoDescription", default: expandVideoDescriptionDefault)
static let collapsedLinesDescription = Key<Int>("collapsedLinesDescription", default: 5)
static let showChannelAvatarInChannelsLists = Key<Bool>("showChannelAvatarInChannelsLists", default: true)
static let showChannelAvatarInVideosListing = Key<Bool>("showChannelAvatarInVideosListing", default: true)
@@ -264,6 +265,7 @@ extension Defaults.Keys {
static let hideWatched = Key<Bool>("hideWatched", default: false)
static let showInspector = Key<ShowInspectorSetting>("showInspector", default: .onlyLocal)
static let showChapters = Key<Bool>("showChapters", default: true)
static let expandChapters = Key<Bool>("expandChapters", default: true)
static let showRelated = Key<Bool>("showRelated", default: true)
static let widgetsSettings = Key<[WidgetSettings]>("widgetsSettings", default: [])
}

View File

@@ -30,7 +30,6 @@ struct AccountViewButton: View {
if accountPickerDisplaysUsername {
label
.labelStyle(.titleOnly)
}
}
}
@@ -47,6 +46,6 @@ struct AccountViewButton: View {
}
private var label: some View {
Label(model.current?.description ?? "Select Account", systemImage: "globe")
Text(model.current?.description ?? "Select Account")
}
}

View File

@@ -2,28 +2,85 @@ import Foundation
import SDWebImageSwiftUI
import SwiftUI
struct ChapterView: View {
var chapter: Chapter
#if !os(tvOS)
struct ChapterView: View {
var chapter: Chapter
var player = PlayerModel.shared
var chapterIndex: Int
@ObservedObject private var player = PlayerModel.shared
var body: some View {
Button {
player.backend.seek(to: chapter.start, seekType: .userInteracted)
} label: {
Group {
#if os(tvOS)
horizontalChapter
#else
verticalChapter
#endif
}
.contentShape(Rectangle())
var isCurrentChapter: Bool {
player.currentChapterIndex == chapterIndex
}
var body: some View {
Button(action: {
player.backend.seek(to: chapter.start, seekType: .userInteracted)
}) {
Group {
verticalChapter
}
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
var verticalChapter: some View {
VStack(spacing: 12) {
if !chapter.image.isNil {
smallImage(chapter)
}
VStack(alignment: .leading, spacing: 4) {
Text(chapter.title)
.lineLimit(3)
.multilineTextAlignment(.leading)
.font(.headline)
.foregroundColor(isCurrentChapter ? Color("AppRedColor") : .primary)
Text(chapter.start.formattedAsPlaybackTime(allowZero: true) ?? "")
.font(.system(.subheadline).monospacedDigit())
.foregroundColor(.secondary)
}
.frame(maxWidth: !chapter.image.isNil ? Self.thumbnailWidth : nil, alignment: .leading)
}
}
@ViewBuilder func smallImage(_ chapter: Chapter) -> some View {
WebImage(url: chapter.image, options: [.lowPriority])
.resizable()
.placeholder {
ProgressView()
}
.indicator(.activity)
.frame(width: Self.thumbnailWidth, height: Self.thumbnailHeight)
.mask(RoundedRectangle(cornerRadius: 6))
}
static var thumbnailWidth: Double {
250
}
static var thumbnailHeight: Double {
thumbnailWidth / 1.7777
}
.buttonStyle(.plain)
}
#if os(tvOS)
#else
struct ChapterViewTVOS: View {
var chapter: Chapter
var player = PlayerModel.shared
var body: some View {
Button {
player.backend.seek(to: chapter.start, seekType: .userInteracted)
} label: {
Group {
horizontalChapter
}
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
var horizontalChapter: some View {
HStack(spacing: 12) {
@@ -41,53 +98,36 @@ struct ChapterView: View {
}
.frame(maxWidth: .infinity, alignment: .leading)
}
#else
var verticalChapter: some View {
VStack(spacing: 12) {
if !chapter.image.isNil {
smallImage(chapter)
@ViewBuilder func smallImage(_ chapter: Chapter) -> some View {
WebImage(url: chapter.image, options: [.lowPriority])
.resizable()
.placeholder {
ProgressView()
}
VStack(alignment: .leading, spacing: 4) {
Text(chapter.title)
.lineLimit(2)
.multilineTextAlignment(.leading)
.font(.headline)
Text(chapter.start.formattedAsPlaybackTime(allowZero: true) ?? "")
.font(.system(.subheadline).monospacedDigit())
.foregroundColor(.secondary)
}
.frame(maxWidth: Self.thumbnailWidth, alignment: .leading)
}
.indicator(.activity)
.frame(width: Self.thumbnailWidth, height: Self.thumbnailHeight)
.mask(RoundedRectangle(cornerRadius: 12))
}
#endif
@ViewBuilder func smallImage(_ chapter: Chapter) -> some View {
WebImage(url: chapter.image, options: [.lowPriority])
.resizable()
.placeholder {
ProgressView()
}
.indicator(.activity)
.frame(width: Self.thumbnailWidth, height: Self.thumbnailHeight)
#if os(tvOS)
.mask(RoundedRectangle(cornerRadius: 12))
#else
.mask(RoundedRectangle(cornerRadius: 6))
#endif
}
static var thumbnailWidth: Double {
250
}
static var thumbnailWidth: Double {
250
static var thumbnailHeight: Double {
thumbnailWidth / 1.7777
}
}
static var thumbnailHeight: Double {
thumbnailWidth / 1.7777
}
}
#endif
struct ChapterView_Preview: PreviewProvider {
static var previews: some View {
ChapterView(chapter: .init(title: "Chapter", start: 30))
.injectFixtureEnvironmentObjects()
#if os(tvOS)
ChapterViewTVOS(chapter: .init(title: "Chapter", start: 30))
.injectFixtureEnvironmentObjects()
#else
ChapterView(chapter: .init(title: "Chapter", start: 30), chapterIndex: 0)
.injectFixtureEnvironmentObjects()
#endif
}
}

View File

@@ -4,6 +4,7 @@ import SwiftUI
struct ChaptersView: View {
@ObservedObject private var player = PlayerModel.shared
@Binding var expand: Bool
var chapters: [Chapter] {
player.videoForDisplay?.chapters ?? []
@@ -15,45 +16,71 @@ struct ChaptersView: View {
var body: some View {
if !chapters.isEmpty {
#if os(tvOS)
List {
Section {
ForEach(chapters) { chapter in
ChapterView(chapter: chapter)
}
}
.listRowBackground(Color.clear)
}
.listStyle(.plain)
#else
if chaptersHaveImages {
ScrollView(.horizontal) {
LazyHStack(spacing: 20) {
if chaptersHaveImages {
#if os(tvOS)
List {
Section {
ForEach(chapters) { chapter in
ChapterView(chapter: chapter)
ChapterViewTVOS(chapter: chapter)
}
}
.padding(.horizontal, 15)
.listRowBackground(Color.clear)
}
.frame(minHeight: ChapterView.thumbnailHeight + 100)
} else {
.listStyle(.plain)
#else
ScrollView(.horizontal) {
LazyHStack(spacing: 20) { chapterViews(for: chapters[...]) }.padding(.horizontal, 15)
}
#endif
} else if expand {
#if os(tvOS)
Section {
ForEach(chapters) { chapter in
ChapterView(chapter: chapter)
ChapterViewTVOS(chapter: chapter)
}
}
.padding(.horizontal)
}
#endif
} else {
NoCommentsView(text: "No chapters information available".localized(), systemImage: "xmark.circle.fill")
#else
Section { chapterViews(for: chapters[...]) }.padding(.horizontal)
#endif
} else {
#if os(iOS)
Button(action: {
self.expand.toggle()
}) {
Section {
chapterViews(for: chapters.prefix(3), opacity: 0.3, clickable: false)
}.padding(.horizontal)
}
#elseif os(macOS)
Section {
chapterViews(for: chapters.prefix(3), opacity: 0.3, clickable: false)
}.padding(.horizontal)
#else
Section {
ForEach(chapters) { chapter in
ChapterViewTVOS(chapter: chapter)
}
}
#endif
}
}
}
#if !os(tvOS)
private func chapterViews(for chaptersToShow: ArraySlice<Chapter>, opacity: Double = 1.0, clickable: Bool = true) -> some View {
ForEach(Array(chaptersToShow.indices), id: \.self) { index in
let chapter = chaptersToShow[index]
ChapterView(chapter: chapter, chapterIndex: index)
.opacity(index == 0 ? 1.0 : opacity)
.allowsHitTesting(clickable)
}
}
#endif
}
struct ChaptersView_Previews: PreviewProvider {
static var previews: some View {
ChaptersView()
ChaptersView(expand: .constant(false))
.injectFixtureEnvironmentObjects()
}
}

View File

@@ -6,11 +6,10 @@ import Foundation
import SwiftUI
struct VideoDescription: View {
static let collapsedLines = 5
private var search: SearchModel { .shared }
@Default(.showKeywords) private var showKeywords
@Default(.expandVideoDescription) private var expandVideoDescription
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
var video: Video
var detailsSize: CGSize?
@@ -21,64 +20,90 @@ struct VideoDescription: View {
}
var body: some View {
Group {
if !expandVideoDescription && !expand {
Button {
expand = true
} label: {
descriptionView
}
.buttonStyle(.plain)
} else {
descriptionView
descriptionView.id(video.videoID)
}
@ViewBuilder var descriptionView: some View {
if !expand && collapsedLinesDescription == 0 {
EmptyView()
} else {
VStack {
#if os(iOS)
ActiveLabelDescriptionRepresentable(
description: description,
detailsSize: detailsSize,
expand: expand
)
#else
textDescription
#endif
keywords
}
.contentShape(Rectangle())
.overlay(
Group {
#if canImport(UIKit)
if !expand {
Button(action: { expand.toggle() }) {
Rectangle()
.foregroundColor(.clear)
}
}
#endif
}
)
}
.id(video.videoID)
}
var descriptionView: some View {
VStack {
#if os(iOS)
ActiveLabelDescriptionRepresentable(
description: description,
detailsSize: detailsSize,
expand: shouldExpand
)
#else
textDescription
#endif
keywords
}
.contentShape(Rectangle())
}
var shouldExpand: Bool {
expandVideoDescription || expand
}
@ViewBuilder var textDescription: some View {
#if !os(iOS)
#if canImport(AppKit)
Group {
if #available(macOS 12, *) {
Text(description)
DescriptionWithLinks(description: description, detailsSize: detailsSize)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(shouldExpand ? 500 : Self.collapsedLines)
#if !os(tvOS)
.lineLimit(expand ? 500 : collapsedLinesDescription)
.textSelection(.enabled)
#endif
} else {
Text(description)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(shouldExpand ? 500 : Self.collapsedLines)
.lineLimit(expand ? 500 : collapsedLinesDescription)
}
}
.multilineTextAlignment(.leading)
.font(.system(size: 14))
.lineSpacing(3)
.allowsHitTesting(expand)
#endif
}
// If possibe convert URLs to clickable links
#if canImport(AppKit)
@available(macOS 12, *)
struct DescriptionWithLinks: View {
let description: String
let detailsSize: CGSize?
let separators = CharacterSet(charactersIn: " \n")
var formattedString: AttributedString {
var attrString = AttributedString(description)
let words = description.unicodeScalars.split(whereSeparator: separators.contains).map(String.init)
words.forEach { word in
if word.hasPrefix("https://") || word.hasPrefix("http://"), let url = URL(string: String(word)) {
if let range = attrString.range(of: word) {
attrString[range].link = url
}
}
}
return attrString
}
var body: some View {
Text(formattedString)
}
}
#endif
@ViewBuilder var keywords: some View {
if showKeywords {
ScrollView(.horizontal, showsIndicators: showScrollIndicators) {
@@ -109,7 +134,7 @@ struct VideoDescription: View {
}
var showScrollIndicators: Bool {
#if os(macOS)
#if canImport(AppKit)
false
#else
true
@@ -127,6 +152,8 @@ struct VideoDescription: View {
@Environment(\.openURL) private var openURL
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
var player = PlayerModel.shared
func makeUIView(context _: Context) -> some UIView {
@@ -160,7 +187,12 @@ struct VideoDescription: View {
}
func updateNumberOfLines() {
label.numberOfLines = expand ? 0 : VideoDescription.collapsedLines
if expand || collapsedLinesDescription > 0 {
label.numberOfLines = expand ? 0 : collapsedLinesDescription
label.isHidden = false
} else {
label.isHidden = true
}
}
func urlTapHandler(_ url: URL) {

View File

@@ -169,6 +169,7 @@ struct VideoDetails: View {
@State private var subscriptionToggleButtonDisabled = false
@State private var page = DetailsPage.info
@State private var descriptionExpanded = false
@State private var chaptersExpanded = false
@Environment(\.navigationStyle) private var navigationStyle
#if os(iOS)
@@ -190,6 +191,7 @@ struct VideoDetails: View {
@Default(.showScrollToTopInComments) private var showScrollToTopInComments
#endif
@Default(.expandVideoDescription) private var expandVideoDescription
@Default(.expandChapters) private var expandChapters
var body: some View {
VStack(alignment: .leading, spacing: 0) {
@@ -243,6 +245,10 @@ struct VideoDetails: View {
}
})
.background(colorScheme == .dark ? Color.black : .white)
.onAppear {
descriptionExpanded = expandVideoDescription
chaptersExpanded = expandChapters
}
}
#if os(iOS)
@@ -317,7 +323,7 @@ struct VideoDetails: View {
!video.chapters.isEmpty
{
Section(header: chaptersHeader) {
ChaptersView()
ChaptersView(expand: $chaptersExpanded)
}
}
@@ -407,25 +413,78 @@ struct VideoDetails: View {
}
var descriptionHeader: some View {
HStack {
Text("Description".localized())
if !expandVideoDescription, !descriptionExpanded {
Spacer()
Image(systemName: "arrow.up.and.down")
.imageScale(.small)
#if canImport(UIKit)
Button(action: {
descriptionExpanded.toggle()
}) {
HStack {
Text("Description".localized())
Spacer()
Image(systemName: descriptionExpanded ? "chevron.up" : "chevron.down")
.imageScale(.small)
}
.padding(.horizontal)
.font(.caption)
.foregroundColor(.secondary)
}
#elseif canImport(AppKit)
HStack {
Text("Description".localized())
Spacer()
Button { descriptionExpanded.toggle()
} label: {
Image(systemName: descriptionExpanded ? "chevron.up" : "chevron.down")
.imageScale(.small)
}
}
}
.padding(.horizontal)
.font(.caption)
.foregroundColor(.secondary)
}
var chaptersHeader: some View {
Text("Chapters".localized())
.padding(.horizontal)
.font(.caption)
.foregroundColor(.secondary)
#endif
}
var chaptersHaveImages: Bool {
player.videoForDisplay?.chapters.allSatisfy { $0.image != nil } ?? false
}
var chaptersHeader: some View {
Group {
if !chaptersHaveImages {
#if canImport(UIKit)
Button(action: {
chaptersExpanded.toggle()
}) {
HStack {
Text("Chapters".localized())
Spacer()
Image(systemName: chaptersExpanded ? "chevron.up" : "chevron.down")
.imageScale(.small)
}
.padding(.horizontal)
.font(.caption)
.foregroundColor(.secondary)
}
#elseif canImport(AppKit)
HStack {
Text("Chapters".localized())
Spacer()
Button(action: { chaptersExpanded.toggle() }) {
Image(systemName: chaptersExpanded ? "chevron.up" : "chevron.down")
.imageScale(.small)
}
}
.padding(.horizontal)
.font(.caption)
.foregroundColor(.secondary)
#endif
} else {
// No button, just the title when there are images
Text("Chapters".localized())
.font(.caption)
.foregroundColor(.secondary)
.padding(.horizontal)
}
}
}
}

View File

@@ -27,10 +27,7 @@ struct VideoPlayerSizeModifier: ViewModifier {
content
.frame(width: geometry.size.width)
.frame(maxHeight: maxHeight)
#if !os(macOS)
.aspectRatio(ratio, contentMode: usedAspectRatioContentMode)
#endif
}
var ratio: CGFloat? { // swiftlint:disable:this no_cgfloat
@@ -46,10 +43,10 @@ struct VideoPlayerSizeModifier: ViewModifier {
}
var usedAspectRatioContentMode: ContentMode {
#if os(iOS)
fullScreen ? .fill : .fit
#else
#if os(tvOS)
.fit
#else
fullScreen ? .fill : .fit
#endif
}

View File

@@ -22,7 +22,7 @@ struct VideoPlayerView: View {
static let defaultAspectRatio = 16 / 9.0
static var defaultMinimumHeightLeft: Double {
#if os(macOS)
300
335
#else
200
#endif
@@ -156,7 +156,7 @@ struct VideoPlayerView: View {
.persistentSystemOverlays(!fullScreenPlayer)
#endif
#if os(macOS)
.frame(minWidth: 1100, minHeight: 700)
.frame(minWidth: playerSidebar != .never ? 1100 : 650, minHeight: 700)
#endif
}

View File

@@ -10,6 +10,7 @@ struct PlayerSettings: View {
@Default(.showKeywords) private var showKeywords
#if !os(tvOS)
@Default(.showScrollToTopInComments) private var showScrollToTopInComments
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
#endif
@Default(.expandVideoDescription) private var expandVideoDescription
@Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer
@@ -31,6 +32,7 @@ struct PlayerSettings: View {
@Default(.showInspector) private var showInspector
@Default(.showChapters) private var showChapters
@Default(.expandChapters) private var expandChapters
@Default(.showRelated) private var showRelated
@ObservedObject private var accounts = AccountsModel.shared
@@ -77,7 +79,9 @@ struct PlayerSettings: View {
#if !os(tvOS)
Section(header: SettingsHeader(text: "Info".localized())) {
expandVideoDescriptionToggle
collapsedLineDescriptionStepper
showChaptersToggle
expandChaptersToggle
showRelatedToggle
#if os(macOS)
HStack {
@@ -194,6 +198,24 @@ struct PlayerSettings: View {
Toggle("Open video description expanded", isOn: $expandVideoDescription)
}
#if !os(tvOS)
private var collapsedLineDescriptionStepper: some View {
LazyVStack {
Stepper(value: $collapsedLinesDescription, in: 0 ... 10) {
Text("Description preview")
#if os(macOS)
Spacer()
#endif
if collapsedLinesDescription == 0 {
Text("No preview")
} else {
Text("\(collapsedLinesDescription) lines")
}
}
}
}
#endif
private var returnYouTubeDislikeToggle: some View {
Toggle("Enable Return YouTube Dislike", isOn: $enableReturnYouTubeDislike)
}
@@ -262,7 +284,13 @@ struct PlayerSettings: View {
}
private var showChaptersToggle: some View {
Toggle("Chapters", isOn: $showChapters)
Toggle("Chapters (if available)", isOn: $showChapters)
}
private var expandChaptersToggle: some View {
Toggle("Open vertical chapters expanded", isOn: $expandChapters)
.disabled(!showChapters)
.foregroundColor(showChapters ? .primary : .secondary)
}
private var showRelatedToggle: some View {

View File

@@ -0,0 +1,4 @@
" subscribers" = " المشتركين";
"%@ Channel" = "القناة";

View File

@@ -93,10 +93,10 @@
"Player" = "Player";
"Charging" = "Aufladen";
"Clear" = "Löschen";
"Clear Search History..." = "Suchverlauf löschen...";
"Clear Search History..." = "Suchverlauf löschen";
"Filter: active" = "Filter: aktiv";
"Find Other" = "Andere finden";
"Edit..." = "Bearbeiten...";
"Edit..." = "Bearbeiten";
/* Selected video has just finished playing */
"Just watched" = "Kürzlich angesehen";
@@ -133,7 +133,7 @@
"Are you sure you want to restore default quality profiles?" = "Möchten Sie die Standardqualitätsprofile wirklich wiederherstellen?";
"Autoplaying Next" = "Nächstes Element automatisch abspielen";
"Based on system color scheme" = "Basierend auf System Farbschema";
"Buffering stream..." = "Lädt…";
"Buffering stream..." = "Lädt …";
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Fehler und tolle Ideen für Funktionen können an den Github Issue Tracker gesendet werden. ";
"Categories to Skip" = "Zu überspringende Kategorien";
"Close PiP and open player when application enters foreground" = "Schließe Bild-in-Bild und öffne den Player wenn die App in den Vordergrund geholt wird";
@@ -167,7 +167,7 @@
"Issues Tracker" = "Issues Tracker";
"Enter fullscreen in landscape" = "Vollbild im Querformat aufrufen";
"Error when accessing playlist" = "Fehler beim Zugriff auf Wiedergabeliste";
"Finding something to play..." = "Etwas zu spielen finden...";
"Finding something to play..." = "Etwas zu spielen finden";
"Fullscreen size" = "Vollbildgröße";
/* Video date filter in search */
@@ -182,7 +182,7 @@
"Large" = "Groß";
/* Loading stream OSD */
"Loading streams..." = "Lädt Streams...";
"Loading streams..." = "Lädt Streams";
/* Video duration filter in search */
"Long" = "Lang";
@@ -199,7 +199,7 @@
"More info can be found in:" = "Weitere Informationen finden Sie in:";
"Movies" = "Filme";
"Music" = "Musik";
"Loading..." = "Lädt...";
"Loading..." = "Lädt";
"Lock portrait mode" = "Hochformatmodus sperren";
"Mark as watched" = "Als gesehen markieren";
"Mark video as watched after playing" = "Video nach dem Abspielen als angesehen markieren";
@@ -210,7 +210,7 @@
"Only when signed in" = "Nur wenn Sie eingeloggt sind";
/* Loading stream OSD */
"Opening %@ stream..." = "Öffne %@-stream...";
"Opening %@ stream..." = "Öffne %@-stream";
"Connection failed" = "Verbindung fehlgeschlagen";
"Continue from %@" = "Ab %@ fortsetzen";
"Contributing" = "Beitragen";
@@ -227,7 +227,7 @@
"I want to ask a question" = "Ich möchte eine Frage stellen";
"If you are interested what's coming in future updates, you can track project Milestones." = "Wenn Sie sich für künftige Updates interessieren, können Sie die Meilensteine des Projekts verfolgen.";
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "Das große Layout ist nicht für alle Geräte geeignet und kann dazu führen, dass die Bedienelemente nicht auf den Bildschirm passen.";
"Opening audio stream..." = "Audiostream wird geöffnet...";
"Opening audio stream..." = "Audiostream wird geöffnet";
"Orientation" = "Ausrichtung";
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Die Wiedergabeliste \"%@\" wird gelöscht.\nDies kann nicht rückgängig gemacht werden.";
"Preferred Formats" = "Bevorzugte Formate";
@@ -248,7 +248,7 @@
/* Video sort order in search */
"Rating" = "Bewertung";
"Settings" = "Einstellungen";
"Share..." = "Teilen...";
"Share..." = "Teilen";
"Remove from Playlist" = "Aus Wiedergabeliste entfernen";
"Remove from the queue" = "Aus der Warteschlange entfernen";
"Replies" = "Antworten anzeigen";
@@ -257,7 +257,7 @@
"Resolution" = "Auflösung";
"Restart the app to apply the settings above." = "Starten Sie die App neu, um die Einstellungen zu übernehmen.";
"Restart/Play next" = "Von Anfang an/Als Nächstes spielen";
"Restore default profiles..." = "Standardprofile wiederherstellen...";
"Restore default profiles..." = "Standardprofile wiederherstellen";
"Rotate to portrait when exiting fullscreen" = "Auf Hochformat drehen, wenn der Vollbildmodus beendet wird";
"Round corners" = "Runde Ecken";
"Switch to public locations" = "Zu öffentlichen Adressen wechseln";
@@ -271,10 +271,10 @@
/* Video sort order in search */
"Views" = "Aufrufe";
"Watched" = "Beobachtet";
"Watched" = "Gesehen";
/* Selected video was played on given date */
"Watched %@" = "Beobachtet %@";
"Watched %@" = "%@ gesehen";
/* Selected video is being played */
"Watching now" = "Jetzt anschauen";
@@ -309,7 +309,7 @@
/* Player controls layout size for TV */
"TV" = "Fernsehen";
"unknown" = "unbekannt";
"Unsubscribe" = "Deabonnieren";
"Unsubscribe" = "Abbestellen";
"Upload date" = "Uploaddatum";
"URL" = "URL";
"Wi-Fi" = "Wi-Fi";
@@ -357,7 +357,7 @@
"Hardware decoder" = "Hardware-Decoder";
"Save history of searches, channels and playlists" = "Verlauf von Suchen, Kanälen und Wiedergabelisten speichern";
"Search history is empty" = "Suchverlauf ist leer";
"Search..." = "Suche...";
"Search..." = "Suche";
"Sections" = "Abschnitte";
"Seek gesture sensitivity" = "Suchgesten-Sensibilität";
"Seek gesture speed" = "Geschwindigkeit der Suchgesten";
@@ -427,7 +427,7 @@
"Could not refresh Trending" = "Trends kann nicht aktualisiert werden";
"Could not open channel" = "Kanal kann nicht geöffnet werden";
"This URL could not be opened" = "Diese URL kann nicht geöffnet werden";
"Share Logs..." = "Logs teilen…";
"Share Logs..." = "Logs teilen …";
"Channel could not be found" = "Der Kanal konnte nicht gefunden werden";
"Could not refresh Subscriptions" = "Abonnements konnten nicht aktualisiert werden";
"If you want this app to be available in your language, join translation project." = "Wenn Sie wünschen, dass diese App auch in Ihrer Sprache verfügbar ist, nehmen Sie am Übersetzungsprojekt teil.";
@@ -439,11 +439,11 @@
"Show Home" = "Startseite anzeigen";
"Video Details" = "Videodetails";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Teilen von Dateien über den Finder auf einem Mac\noder iTunes unter Windows";
"Recent History" = "Neueste Verlauf";
"Recent History" = "Neuester Verlauf";
"Show Open Videos toolbar button" = "Schaltfläche \"Videos öffnen\" in der Symbolleiste anzeigen";
"Edit Favorites…" = "Favoriten bearbeiten…";
"Edit Favorites…" = "Favoriten bearbeiten …";
"Show Documents" = "Dokumente anzeigen";
"Buttons labels" = "Tasten-Etiketten";
"Buttons labels" = "Schaltflächen-Etiketten";
"Inspector visibility" = "Sichtbarkeit der Inspector";
"Pages toolbar position" = "Position der Seitensymbolleiste";
"Clear Queue before opening" = "Warteschlange vor dem Öffnen löschen";
@@ -482,7 +482,7 @@
"Sample Rate" = "Samplerate";
"Files" = "Dateien";
"Could not find any links to open in your clipboard" = "Kann keine Links zum Öffnen in Ihrer Zwischenablage finden";
"Remove…" = "Entfernen…";
"Remove…" = "Entfernen …";
"Show Inspector" = "Inspector einblenden";
"Actions buttons" = "Aktionsschaltflächen";
"Show sidebar" = "Seitenleiste anzeigen";
@@ -503,7 +503,7 @@
"Verified" = "Verifiziert";
"Channel" = "Kanal";
"Short videos: visible" = "Kurze Videos: sichtbar";
"Player Bar" = "Spielerleiste";
"Player Bar" = "Video-Player-Leiste";
"Short videos: hidden" = "Kurze Videos: versteckt";
"Play all unwatched" = "Alle ungesehen abspielen";
"Double tap gesture" = "Doppeltippgeste";
@@ -539,7 +539,7 @@
"Subscribe/Unsubscribe" = "Abonnieren/abbestellen";
"Are you sure you want to clear cache?" = "Möchten Sie den Cache wirklich löschen?";
"Single tap gesture" = "Einmalige Antippen-Geste";
"Seeking" = "Suchend";
"Seeking" = "Suchen";
"List" = "Liste";
"Cells" = "Zellen";
"Show Next in Queue" = "Nächste in Warteschlange anzeigen";
@@ -564,12 +564,12 @@
"Lock" = "Sperre";
"Description" = "Beschreibung";
"Seek" = "Suchen";
"Enter account credentials to connect..." = "Geben Sie die Kontozugangsdaten ein, um eine Verbindung herzustellen...";
"Enter account credentials to connect..." = "Geben Sie die Kontozugangsdaten ein, um eine Verbindung herzustellen";
"Show scroll to top button in comments" = "Schaltfläche Nach oben scrollen in Kommentaren anzeigen";
"Enter location address to connect..." = "Geben Sie die Internetadresse ein, um eine Verbindung herzustellen...";
"Enter location address to connect..." = "Geben Sie die Internetadresse ein, um eine Verbindung herzustellen";
"Opened File" = "Geöffnete Datei";
"File Extension" = "Dateierweiterung";
"Opening file..." = "Datei öffnen...";
"Opening file..." = "Datei öffnen";
"Close video and player on end" = "Video und Player am Ende beenden";
"Use system controls with AVPlayer" = "Systemsteuerung mit AVPlayer verwenden";
"Public account" = "Öffentliches Konto";
@@ -582,12 +582,12 @@
"Available" = "Verfügbar";
"Startup section" = "Bereich Startup";
"Home Settings" = "Startseite Einstellungen";
"Watched: hidden" = "Beobachtet: versteckt";
"(watched and shorts hidden)" = "(beobachtet und shorts versteckt)";
"Watched: visible" = "Beobachtet: sichtbar";
"Watched: hidden" = "Gesehene: versteckt";
"(watched and shorts hidden)" = "(gesehene und Shorts versteckt)";
"Watched: visible" = "Gesehene: sichtbar";
"No videos to show" = "Keine Videos zu zeigen";
"(watched hidden)" = "(versteckt beobachtet)";
"(shorts hidden)" = "(shorts versteckt)";
"(watched hidden)" = "(gesehene versteckt)";
"(shorts hidden)" = "(Shorts versteckt)";
"Disable filters" = "Filter deaktivieren";
"Limit" = "Grenze";
"Are you sure you want to remove %@ from Favorites?" = "Möchten Sie %@ wirklich aus den Favoriten entfernen?";
@@ -597,3 +597,6 @@
"Play Now in AVPlayer" = "Jetzt in AVPlayer abspielen";
"Show channel avatars in videos lists" = "Kanal-Avatare in Videolisten anzeigen";
"Show channel avatars in channels lists" = "Kanal-Avatare in Kanallisten anzeigen";
"Podcasts" = "Podcasts";
"Add %@" = "%@ hinzufügen";
"Releases" = "Veröffentlichungen";

View File

@@ -598,3 +598,7 @@
"Podcasts" = "Podcasts";
"Releases" = "Releases";
"Add %@" = "Add %@";
"Description preview" = "Description preview";
"No preview" = "No preview";
"Open vertical chapters expanded" = "Open vertical chapters expanded";
"Chapters (if available)" = "Chapters (if available)";

View File

@@ -53,7 +53,7 @@
"Are you sure you want to restore default quality profiles?" = "¿Estás seguro de que quieres restablecer los ajustes por defecto de los perfiles de calidad?";
"Are you sure you want to unsubscribe from %@?" = "¿Estás seguro de que quieres dejar de estar suscrito a %@?";
"Cancel" = "Cancelar";
"Autoplaying Next" = "Autorreproducir el siguiente";
"Autoplaying Next" = "Autoreproducir el siguiente";
"Based on system color scheme" = "Basado en el tema del sistema";
"Clear Search History..." = "Limpiar el historial de búsqueda...";
"Battery" = "Batería";
@@ -116,7 +116,7 @@
"Decrease rate" = "Tasa de disminución";
"Decreased opacity" = "Opacidad disminuida";
"High" = "Alto";
"%lld videos" = "%lld vídeos";
"%lld videos" = "%lld videos";
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Recordatorios explícitos para marquen \"me gusta\", se suscriban o interactúen con ellos en cualquier plataforma de pago o gratuita (por ejemplo, haciendo clic en un vídeo).";
"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "Los formatos se seleccionarán en orden como se indica.\nHLS es un formato adaptable (no aplica la configuración de resolución).";
"Fullscreen size" = "Tamaño de pantalla completa";
@@ -169,7 +169,7 @@
"Stream & Player" = "Transmisión y reproductor";
"Picture in Picture" = "Imagen en imagen";
"Visibility" = "Visibilidad";
"Edit Favorites…" = "Editar Favoritos...";
"Edit Favorites…" = "Editar los favoritos";
"Center" = "Centrar";
"Wiki" = "Wiki";
"Live Streams" = "Transmisiones en vivo";
@@ -250,7 +250,7 @@
"Actions buttons" = "Botones de acciones";
"Files" = "Archivos";
"Sign In Required" = "Inicio de sesión requerido";
"Buttons labels" = "Etiquetas de botones";
"Buttons labels" = "Etiquetas de los botones";
"Next" = "Siguiente";
"Default Profile" = "Perfil por defecto";
"Paste" = "Pegar";
@@ -258,7 +258,7 @@
"File" = "Archivo";
"Right" = "Derecha";
"Reset search filters" = "Restablecer filtros de búsqueda";
"Channel" = "Vanal";
"Channel" = "Canal";
"Open Files" = "Abrir archivos";
"You can find information about using Yattee in the Wiki pages." = "Puede encontrar información sobre el uso de Yattee en la Wiki.";
"Lock portrait mode" = "Bloquear modo retrato";
@@ -266,7 +266,7 @@
/* Loading stream OSD */
"Loading streams..." = "Cargando secuencias...";
"Public Locations" = "Ubicaciones Públicas";
"Public Locations" = "Ubicaciones públicas";
"Yattee" = "Yattee";
"No results" = "No hay resultados";
"Driver" = "Driver";
@@ -397,7 +397,7 @@
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Se eliminará la lista de reproducción \"%@\".\nNo se puede revertir.";
"Playlists" = "Listas de reproducción";
"Popular" = "Popular";
"Proxy videos" = "Proxy videos";
"Proxy videos" = "Utilizar un proxy para ver los vídeos";
"Regular size" = "Tamaño regular";
"Related" = "Relacionado";
@@ -456,7 +456,7 @@
"Press and hold remote button to open captions and quality menus" = "Mantenga presionado el botón del control remoto para abrir subtítulos y menús de calidad";
"Comments are disabled" = "Los comentarios están deshabilitados";
"No comments" = "Sin comentarios";
"Share Logs..." = "Compartir registros...";
"Share Logs..." = "Compartir registros";
"Open logs in Finder" = "Abrir registros en Finder";
"Could not open video" = "No se pudo abrir el video";
"Channel could not be found" = "No se pudo encontrar el canal";
@@ -481,14 +481,14 @@
"Playback" = "Reproducción";
"Restart/Play next" = "Reiniciar/Reproducir siguiente";
"This cannot be reverted" = "Esto no se puede revertir";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Esto no se puede revertir. Es posible que deba cambiar entre vistas o reiniciar la aplicación para ver los cambios";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Esto no se puede revertir. Es posible que deba cambiar entre vistas o reiniciar la aplicación para ver los cambios.";
"Could not open channel" = "No se pudo abrir el canal";
"Recent History" = "Historial reciente";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Comparta archivos desde Finder en una Mac\no iTunes en Windows";
"Pages toolbar position" = "Posición de la barra de herramientas de páginas";
"Video actions buttons" = "Botones de acciones de video";
"Video" = "Video";
"Show Open Videos toolbar button" = "Mostrar el botón de la barra de herramientas Abrir videos";
"Show Open Videos toolbar button" = "Mostrar el botón de los vídeos abiertos en la barra de herramientas";
"Show Documents" = "Mostrar documentos";
"Clear Queue before opening" = "Borrar cola antes de abrir";
"Open" = "Abrir";
@@ -498,21 +498,107 @@
"Audio" = "Audio";
"Codec" = "Codec";
"Size" = "Tamaño";
"Remove…" = "Eliminar...";
"Remove…" = "Eliminar";
"Playback history is empty" = "El historial de reproducción está vacío";
"Copy%@link" = "Copiar%@enlace";
"Share%@link" = "Compartir%@enlace";
"Open expanded" = "Abrir maximizada";
"Single tap gesture" = "Gesto con un solo toque";
"Open expanded" = "Abrir maximizado";
"Single tap gesture" = "Gesto de un solo toque";
"Right click channel thumbnail to open context menu with more actions" = "Haz clic con el botón derecho en la miniatura del canal para abrir el menú contextual con más acciones";
"Short videos: visible" = "Vídeos cortos: visibles";
"Short videos: visible" = "Videos cortos: visible";
"Tap and hold channel thumbnail to open context menu with more actions" = "Mantén pulsada la miniatura del canal para abrir el menú contextual con más acciones";
"Maximum width expanded" = "Ancho máximo ampliado";
"Short videos: hidden" = "Vídeos cortos: ocultos";
"Maximum width expanded" = "Ancho máximo expandido";
"Short videos: hidden" = "Videos cortos: oculto";
"Clear all" = "Borrar todo";
"Always show controls buttons" = "Mostrar siempre los botones de control";
"Mark channel feed as unwatched" = "Marcar el canal como no visto";
"Mark channel feed as unwatched" = "Marcar el feed del canal como no visto";
"Play all unwatched" = "Reproducir todo lo no visto";
"Mark channel feed as watched" = "Marcar el canal como visto";
"Double tap gesture" = "Doble toque";
"Mark channel feed as watched" = "Marcar el feed del canal como visto";
"Double tap gesture" = "Gesto de doble toque";
"Player Bar" = "Barra del reproductor";
"Controls Buttons" = "Botones de control";
"Seeking" = "Buscando";
"Total size: %@" = "Tamaño total: %@";
"Gesture: backwards" = "Gesto: atrás";
"Gesture: fowards" = "Gesto: adelante";
"System controls" = "Controles del sistema";
"Close video" = "Cerrar vídeo";
"Controls button: backwards" = "Botón de control: hacia atrás";
"Controls button: forwards" = "Botón de control: hacia delante";
"Show unwatched feed badges" = "Mostrar insignias de feeds no vistos";
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "Los ajustes de los gestos controlan el intervalo de salto para el gesto de doble toque en el lado izquierdo/derecho del reproductor. Para cambiar los ajustes de los controles del sistema es necesario reiniciar.";
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "Los ajustes gestuales controlan el intervalo de salto para el doble clic en el lado izquierdo/derecho del reproductor. Para cambiar la configuración de los controles del sistema es necesario reiniciar.";
"Open channels with description expanded" = "Canales abiertos con la descripción ampliada";
"Subscribe/Unsubscribe" = "Suscribirse/Desuscribirse";
"Are you sure you want to clear cache?" = "¿Seguro que quieres borrar la caché?";
"Lock orientation" = "Bloquear orientación";
"Cache" = "Cache";
"Actions Buttons" = "Botones de Acción";
"Music Mode" = "Modo Música";
"Play next item" = "Reproducir siguiente elemento";
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "Los ajustes gestuales controlan el intervalo del salto de los botones de la flecha del mando a distancia (para Siri Remote de 2ª generación o posterior). Para cambiar los ajustes de los controles del sistema es necesario reiniciar.";
"Show cache status" = "Mostrar estado de cache";
"Show Next in Queue" = "Mostrar el siguiente en la cola";
"Hide player" = "Ocultar al jugador";
"Toggle player" = "Alternar el reproductor";
"Inspector" = "Inspector";
"Playback Settings" = "Ajustes de la reproducción";
"Show toggle watch status button" = "Mostrar el botón para alternar estado de la visualización";
"Queue - shuffled" = "Cola - aleatoria";
"Cells" = "Celdas";
"Do nothing" = "No hacer nada";
"Next in Queue" = "Siguiente en la cola";
"Open video description expanded" = "Abrir la descripción del vídeo ampliada";
"Mark all as unwatched" = "Marcar todo como no visto";
"Mark all as watched" = "Marcar todo como visto";
"List" = "Lista";
"Toggle size" = "Alternar el tamaño";
"Open channel" = "Abrir el canal";
"Feed" = "Feed";
"Available" = "Disponible";
"Loop one" = "Bucle uno";
"Use system controls with AVPlayer" = "Utilizar los controles del sistema con AVPlayer";
"Opening file..." = "Abriendo el archivo...";
"No videos to show" = "No hay vídeos que mostrar";
"Autoplay next" = "Reproducir automáticamente la siguiente";
"Home Settings" = "Ajustes iniciales";
"Watched: visible" = "Visto: visible";
"Fullscreen" = "A pantalla completa";
"Seek" = "Buscar";
"Landscape left" = "Apaisado a la izquierda";
"(watched and shorts hidden)" = "(ocultar videos reproducidos y cortos)";
"Rotate when entering fullscreen on landscape video" = "Rotar al entrar en pantalla completa en un vídeo apaisado";
"Enter account credentials to connect..." = "Introduce las credenciales de la cuenta para conectarte...";
"Watched: hidden" = "Visto: oculto";
"Stream" = "Stream";
"Replay" = "Repetir";
"(watched hidden)" = "(ocultar lo reproducido)";
"Show scroll to top button in comments" = "Mostrar el botón de desplazamiento hacia arriba en los comentarios";
"Enter location address to connect..." = "Introduzca la dirección para conectarse...";
"File Extension" = "Extensión del archivo";
"Opened File" = "Archivo abierto";
"Public account" = "Cuenta pública";
"Lock" = "Bloquear";
"No rotation" = "Sin rotación";
"Startup section" = "Sección de inicio";
"Browse without account" = "Navegar sin cuenta";
"Close video and player on end" = "Cerrar el vídeo y el reproductor al final";
"Landscape right" = "Apaisado a la derecha";
"Your Accounts" = "Tus cuentas";
"Description" = "Descripción";
"Maximum feed items" = "Número máximo de elementos en el feed";
"Are you sure you want to remove %@ from Favorites?" = "¿Estás seguro de que quieres eliminar %@ de favoritos?";
"Limit" = "Límite";
"Keep channels with unwatched videos on top of subscriptions list" = "Mantén los canales con los vídeos sin ver en la parte superior de la lista de suscripciones";
"(shorts hidden)" = "(cortos ocultos)";
"Disable filters" = "Desactivar los filtros";
"Podcasts" = "Podcasts";
"Releases" = "Lanzamientos";
"Show channel avatars in channels lists" = "Mostrar los avatares de los canales en las listas de los canales";
"Play Now in MPV" = "Reproducir ahora en MPV";
"Show channel avatars in videos lists" = "Mostrar los avatares de los canales en las listas de los vídeos";
"Add %@" = "Añada %@";
"Show video context menu options to force selected backend" = "Mostrar las opciones del menú contextual del vídeo para forzar el backend seleccionado";
"Play Now in AVPlayer" = "Reproducir ahora en AVPlayer";
"Description preview" = "Vista previa de la descripción";
"No preview" = "Sin vista previa";

View File

@@ -0,0 +1,485 @@
"Podcasts" = "پادکست‌ها";
"Reset watched status when playing again" = "بازنشانی وضعیت تماشای ویدیو هنگام تماشای مجدد";
"Finding something to play..." = "یافتن چیزی برای پخش…";
"Available" = "در دسترس";
/* Player controls layout size */
"Very Large" = "خیلی بزرگ";
"Audio" = "صدا";
"Custom Locations" = "سرویس دهندگان سفارشی";
"Always use AVPlayer for live videos" = "همیشه از AVPlayer برای ویدیوهای پخش زنده استفاده کن";
"Clear Search History..." = "پاک کردن سابقهٔ جست و جو…";
"Related" = "مرتبط";
"Close Video" = "بستن پخش کننده";
"Add to %@" = "افزودن به %@";
"Could not open playlist" = "فهرست پخش باز نشد";
"Disabled" = "غیرفعال";
"Share..." = "اشتراک گذاری…";
"For videos which feature music as the primary content." = "برای ویدیوهایی که محتوای اصلیشان موسیقی است.";
"Save history of searches, channels and playlists" = "ذخیرهٔ سابقهٔ جست و جو، کانال‌ها و فهرست‌های پخش";
"Clear Queue before opening" = "صف را پیش از باز کردن خالی کن";
"Show playback statistics" = "نمایش آمار پخش";
"Could not extract channel information" = "اطلاعات کانال دریافت نشد";
"Video" = "ویدیو";
"Matrix Chat" = "چت Matrix";
"Loop one" = "پخش دوبارهٔ تکی";
"Settings" = "تنظیمات";
"10 seconds forwards/backwards" = "۱۰ ثانیه جلو/عقب";
"Show progress of watching on thumbnails" = "پیشرفت پخش را روی تصویر بندانگشتی نشان بده";
"Recents" = "تازه‌ترین‌ها";
"Could not open channel" = "کانال باز نمی‌شود";
"Select location closest to you:" = "نزدیکترین سرویس دهنده را انتخاب کنید:";
"Fullscreen size" = "ابعاد تمام صفحه";
"No Playlists" = "بدون فهرست پخش";
"Highest quality" = "بالاترین کیفیت";
"Edit..." = "ویرایش…";
"Based on system color scheme" = "براساس طرح رنگ سیستم";
"Quality" = "کیفیت";
"Pause" = "مکث";
"Controls Buttons" = "دکمه‌های کنترل";
/* Subscriptions title */
"Subscriptions" = "اشتراک‌ها";
" subscribers" = " مشترکان";
"Channels" = "کانال‌ها";
"Resolution" = "وضوح تصویر";
"Button" = "دکمه";
"Badge & Decreased opacity" = "نشان و کاهش شفافیت";
"Milestones" = "نقطهٔ عطف";
"Are you sure you want to restore default quality profiles?" = "آیا از بازنشانی نمایه‌های کیفیت پیش‌فرض مطمئنید؟";
"Show sidebar" = "نمایش نوار کناری";
"Error" = "خطا";
/* Video date filter in search */
"Week" = "هفته";
"Make default" = "پیش فرض شو";
"Verified" = "تاییدشده";
"Subscribe/Unsubscribe" = "اشتراک/لغو اشتراک";
"Close player when closing video" = "هنگامی که ویدیو بسته می‌شود پخش کننده را ببند";
"It can be changed later in settings. You can use your own locations too." = "می‌توانید بعدا در تنظیمات تغییر دهید. همچنان می‌توانید از سرویس دهندهٔ خودتان استفاده کنید.";
"Comments are disabled" = "نظرها غیرفعال است";
"Queue is empty" = "صف خالیست";
"Playback Mode" = "وضعیت پخش";
"Country" = "کشور";
"Share" = "اشتراک‌گذاری";
"Play in PiP" = "در تصویر-در-تصویر پخش کن";
"System controls buttons" = "دکمه‌های کنترل سیستم";
"Picture in Picture" = "تصویر-در-تصویر";
"Comments" = "نظرها";
"\"%@\" will be irreversibly removed from this device." = "\"%@\" از دستگاه حذف شده و غیرقابل بازگردانی خواهد بود.";
"Now Playing" = "در حال پخش";
"Charging" = "در حال شارژ";
"Refresh" = "تازه‌سازی";
/* Player controls layout size */
"Large" = "بزرگ";
"Are you sure you want to unsubscribe from %@?" = "آیا از لفو اشتراک %@ مطمئنید؟";
/* Video duration filter in search */
"Short" = "Short";
"Switch to public locations" = "به سرویس دهندهٔ عمومی منتقل شو";
"Profiles" = "نمایه‌ها";
"New Playlist" = "فهرست پخش جدید";
"Automatic" = "خودکار";
"Opening file..." = "در حال باز کردن فایل…";
"Add Quality Profile" = "افزودن نمایهٔ کیفیت";
"Close video after playing last in the queue" = "ویدیو را پس از پخش آخرین مورد فهرست ببند";
/* Player controls layout size */
"Small" = "کوچک";
"Clear" = "پاک کردن";
"Anonymous" = "ناشناس";
"Channel could not be found" = "کانال پیدا نشد";
"Add to Favorites" = "افزودن به موردعلاقه‌ها";
"Total size: %@" = "مجموع اندازه: %@";
"Wi-Fi" = "اینترنت Wi-Fi";
/* Selected video is being played */
"Watching now" = "در حال تماشا";
"Size" = "اندازه";
"Connection failed" = "اتصال موفق نبود";
"Could not open video" = "ویدیو باز نشد";
"Badge color" = "رنگ نشان";
/* Player controls layout size */
"Medium" = "متوسط";
"Reset search filters" = "بازنشانی صافی‌های جست و جو";
"Play" = "پخش";
/* Trending category, section containing all kinds of videos */
"All" = "همه";
"No videos to show" = "ویدیویی برای نمایش نیست";
"Username" = "نام کاربری";
"Don't use public locations" = "از سرویس دهندگان عمومی استفاده نکنید";
"I have a feature request" = "درخواست ویژگی و قابلیت دارم";
"Clear All Recents" = "همهٔ موارد اخیر را پاک کن";
"Regular size" = "ابعاد معمولی";
"Autoplay next" = "پخش خودکار بعدی";
"Shuffle" = "شافل";
"This cannot be reverted" = "این گزینه غیرقابل بازگشت است";
"unknown" = "ناشناخته";
"Could not create share link" = "پیوند اشتراک‌گذاری ساخته نشد";
"Home Settings" = "تنظیمات صفحهٔ اصلی";
"You have no Playlists" = "فهرست پخشی ندارید";
"Watched: visible" = "تماشاشده‌ها: قابل رویت";
"Are you sure you want to remove this document?" = "از حذف این سند مطمئنید؟";
/* Video sort order in search */
"Rating" = "امتیازدهی";
"Public" = "عمومی";
"Add to Playlist..." = "افزودن به فهرست پخش…";
"Category" = "دسته‌بندی";
"Fullscreen" = "تمام صفحه";
"No description" = "بدون شرح";
"Gaming" = "بازی";
"Apply to all" = "اعمال روی همه";
"Close" = "بستن";
/* Video date filter in search */
"Year" = "سال";
"Continue" = "ادامه";
"Show channel name" = "نمایش نام کانال";
"Remove Location" = "حذف سرویس دهنده";
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "چیدمان بزرگ مناسب همهٔ دستگاه‌ها نیست و استفاده از آن ممکن است باعث بیرون ماندن کنترل‌ها از صفحهٔ نمایش شود.";
"Shorts" = "Shortها";
"Show Favorites" = "نمایش موردعلاقه‌ها";
"Interface" = "رابط کاربری";
"Unsubscribe" = "لغو اشتراک";
"URL" = "نشانی";
"Short videos: visible" = "ویدیوهای Short: قابل رویت";
"Hardware decoder" = "دکودر سخت‌افزاری";
"Search history is empty" = "سابقهٔ جست و جو خالیست";
"Playback Settings" = "تنظیمات پخش";
"Are you sure you want to clear search history?" = "آیا از حذف سابقهٔ جست و جو مطمئنید؟";
"Could not load video" = "ویدیو دریافت نشد";
"Show video length" = "طول ویدیو را نشان بده";
"Hide" = "مخفی کردن";
"Clear Search History" = "پاک کردن سابقهٔ جست و جو";
"Play Now in MPV" = "الان در MPV پخش کن";
"Switch to other public location" = "به یک سرویس دهندهٔ عمومی دیگر منتقل شو";
"Restart the app to apply the settings above." = "برای اعمال تنظیمات بالا اپ را دوباره راه‌اندازی کنید.";
"Are you sure you want to clear cache?" = "آیا از حذف حافظهٔ مخفی مطمئنید؟";
"Filter" = "صافی";
"Open Settings" = "باز کردن تنظیمات";
"Buffering stream..." = "بافر کردن استریم…";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "فهرست پخش خالیست\n\nروی ویدیو ضربه بزنید و نگه دارید، سپس\n\"افزودن به فهرست پخش\" را انتخاب کنید";
"Playback history is empty" = "سابقهٔ پخش خالیست";
"Chapters" = "فصل‌های ویدیو";
"(watched and shorts hidden)" = "(تماشاشده‌ها و Shortها مخفی)";
/* Video sort order in search */
"Views" = "بازدیدها";
"I want to ask a question" = "می‌خواهم سوالی بپرسم";
"Show keywords" = "نمایش کلیدواژه‌ها";
"Edit" = "ویرایش";
"Could not refresh Playlists" = "فهرست پخش بازسازی نشد";
"Categories to Skip" = "دسته‌بندی‌هایی که رد می‌شوند";
"Private" = "خصوصی";
"This video could not be opened" = "این ویدیو باز نمی‌شود";
"Center" = "وسط";
"High" = "بالا";
/* Video date filter in search */
"Today" = "امروز";
"Remove from Playlist" = "حذف از فهرست پخش";
"URL to Open" = "نشانی برای باز کردن";
"Replies" = "پاسخ‌ها";
"Movies" = "فیلم‌ها";
"Unlisted" = "فهرست نشده";
"Wiki" = "ویکی";
"Sort" = "ترتیب";
"Frontend URL" = "نشانی Frontend";
"Restore default profiles..." = "بازنشانی نمایه‌های پیش‌فرض…";
"Any format" = "هر فرمتی";
"Open" = "باز کردن";
"Filter: active" = "صافی: فعال";
"Play Music" = "موسیقی را پخش کن";
"Clear All" = "همه را پاک کن";
"Add Account" = "افزودن حساب کاربری";
"Cancel" = "لغو";
"Accounts are not supported for the application of this instance" = "حساب کاربری در این سرویس دهنده پشتیبانی نمی‌شود";
"System controls" = "کنترل‌های سیستم";
"Hide player" = "پخش‌کننده را مخفی کن";
"Lock orientation" = "قفل چرخش صفحه";
"Cache" = "حافظهٔ مخفی";
/* Video date filter in search */
"Hour" = "ساعت";
"Open Videos" = "باز کردن ویدیو";
"Add" = "افزودن";
"Show icons and text when space permits" = "اگر جا بود متن و آیکن‌ها را نشان بده";
"Documents" = "مستندات";
"Play Next" = "بعدی را پخش کن";
"Battery" = "باتری";
"Rotate to portrait when exiting fullscreen" = "پس از خروج از تمام صفحه به حالت عمودی بچرخ";
"Could not delete document" = "سند حذف نشد";
"Show account username" = "نمایش نام کاربری";
"Queue - shuffled" = "صف - شافل";
"Source" = "منبع";
"Always" = "همیشه";
/* Video duration filter in search */
"Long" = "دراز";
"Mark video as watched after playing" = "ویدیو را پس از پخش به عنوان تماشا شده نشانه بگذار";
"%@ Playlist" = "%@ فهرست‌ پخش";
"Playback queue is empty" = "صف پخش خالیست";
"Add profile..." = "افزودن نمایه…";
"Short videos: hidden" = "ویدیوهای Short: مخفی";
"No documents" = "بدون مستندات";
"Lowest" = "پایینترین";
"Not available" = "در دسترس نیست";
"Add Location" = "افزودن سرویس دهنده";
"Public Locations" = "سرویس دهندگان عمومی";
"Remove from history" = "حذف از سابقه";
"Could not update your token." = "Token شما به روز نشد.";
"Channel" = "کانال";
"Limit" = "محدود";
/* Locations settings, custom instance is selected as current */
"Custom" = "سفارشی";
"Close video" = "ویدیو را ببند";
"Remove from Favorites" = "حذف از موردعلاقه‌ها";
"Watched: hidden" = "تماشاشده: مخفی";
"Close PiP and open player when application enters foreground" = "هنگامی که اپ باز می‌شود تصویر-در-تصویر را ببند و پخش‌کننده را باز کن";
"Show Documents" = "نمایش مستندات";
/* SponsorBlock category name */
"Outro" = "انتها";
"Music Mode" = "وضعیت موسیقی";
"Edit Playlist" = "ویرایش فهرست پخش";
"Mark as watched" = "نشانه گذاری به عنوان تماشا شده";
"Stream" = "استریم";
"Remove…" = "حذف…";
"Add Location..." = "افزودن سرویس دهنده…";
"%@ subscribers" = "%@ مشترکان";
/* SponsorBlock category name */
"Sponsor" = "حامی مالی";
"Remove from the queue" = "حذف از صف";
"Quality Profile" = "نمایهٔ کیفیت";
"LIVE" = "زنده";
"Accounts" = "حساب‌ها";
"Done" = "انجام شد";
"Enter links to open, one per line" = "پیوندها را وارد کنید تا باز شوند، هر خط یک پیوند";
"Files" = "فایل‌ها";
"No results" = "بدون نتیجه";
"Current: %@\n%@" = "فعلی: %@\n%@";
"Donations" = "حمایت مالی";
"%@ Channel" = "%@ کانال";
"Do nothing" = "کاری نکن";
"File" = "فایل";
"Yattee %@ (build %@)" = "Yattee %@ (بیلد %@)";
"Proxy videos" = "پروکسی کردن ویدیوها";
"Player" = "پخش‌کننده";
"Play next item" = "مورد بعدی را پخش کن";
"Controls" = "کنترل‌ها";
"This URL could not be opened" = "این نشانی باز نمی‌شود";
"Trending" = "پرطرفدار";
"Opening audio stream..." = "باز کردن استریم صوتی…";
"Statistics" = "آمار";
"Pause when player is closed" = "پس از بسته شدن پخش‌کننده مکث کن";
"Play All" = "همه را پخش کن";
"Sort: %@" = "ترتیب: %@";
/* Loading stream OSD */
"Opening %@ stream..." = "باز کردن استریم %@…";
"Next in Queue" = "مورد بعد در صف";
"Honor orientation lock" = "قفل چرخش صفحه را در نظر بگیر";
"Rate" = "امتیاز";
"Playing Next" = "پخش بعدی";
"%lld videos" = "%lld ویدیو";
"Enable Return YouTube Dislike" = "فعال کردن بازگرداندن YouTube Dislike";
"Country Name or Code" = "نام یا کد کشور";
"Clear the queue" = "پاک کردن صف";
"Could not extract playlist ID" = "شناسهٔ فهرست پخش دریافت نشد";
"Could not load streams" = "استریم قابل دریافت نیست";
"Are you sure you want to clear history of watched videos?" = "آیا از حذف سابقهٔ تماشا مطمئنید؟";
"Mark all as unwatched" = "همه را به عنوان تماشانشده نشانه بگذار";
"Thumbnails" = "بندانگشتی‌ها";
"Left" = "چپ";
"Open \"Playlists\" tab to create new one" = "زبانهٔ «فهرست پخش» را باز کنید تا یک فهرست جدید بسازید";
"Replay" = "پخش دوباره";
"Remove" = "حذف کردن";
"Close player when starting PiP" = "هنگامی که تصویر-در-تصویر آغاز می‌شود پخش کننده را ببند";
"Controls button: backwards" = "دکمه‌های کنترل: عقب";
"I am lost" = "گم شده‌ام";
"Show only icons" = "فقط آیکن‌ها را نشان بده";
"Clear all" = "همه را پاک کن";
"Shuffle All" = "شافل کردن همه";
"Discord Server" = "سرور Discord";
"Subscribe" = "اشتراک";
"Loading..." = "درحال دریافت…";
"Edit Favorites…" = "ویرایش موردعلاقه‌ها…";
"Sections" = "بخش‌ها";
"Play Last" = "آخرین را پخش کن";
"Pages buttons" = "دکمه‌های صفحه‌ها";
"No comments" = "بدون نظر";
"Connected successfully (%@)" = "با موفقیت وصل شد (%@)";
"(watched hidden)" = "(تماشاشده‌ها مخفی)";
"Enable logging" = "فعال کردن ثبت log";
"Are you sure you want to delete playlist?" = "آیا از حذف فهرست پخش مطمئنید؟";
"Description preview" = "پیش‌نمایش شرح";
"Open Files" = "باز کردن فایل‌ها";
"Hide sidebar" = "نوار کناری را مخفی کن";
"Show anonymous accounts" = "نمایش حساب‌های ناشناس";
"Always show controls buttons" = "همیشه دکمه‌های کنترل را نشان بده";
"Mark all as watched" = "همه را به عنوان تماشاشده نشانه بگذار";
/* Player controls layout size */
"Smaller" = "کوچکتر";
"Search" = "جست و جو";
"Favorites" = "مورد علاقه‌ها";
"Address" = "نشانی";
"MPV Documentation" = "مستندات MPV";
"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "اگر ایرادی را گزارش می‌کنید، همهٔ جزییات مربوط (به ویژه نسخهٔ اپ، دستگاه مورد استفاده و نسخهٔ سیستم عامل و گام‌هایی که برای بازسازی ایراد لازم است) را ذکر کنید.";
"Only when signed in" = "تنها پس از ورود";
"Sign In Required" = "لازم است که وارد شوید";
/* SponsorBlock category name */
"Self-promotion" = "تبلیغ شخصی";
"Only for local files and URLs" = "فقط برای فایل‌های محلی و پیوندها";
/* SponsorBlock category name */
"Interaction" = "تعامل";
"Preferred Formats" = "فرمت‌های ترجیحی";
"Reset" = "بازنشانی";
"Badge" = "نشان";
"Error when accessing playlist" = "خطا هنگام دسترسی به فهرست پخش";
"Right" = "راست";
"Blue" = "آبی";
"Low quality" = "کیفیت پایین";
"Popular" = "محبوب";
"List" = "فهرست";
"Create Playlist" = "ساخت فهرست پخش";
"Show sidebar when space permits" = "اگر جا بود نوارکناری را نشان بده";
"Locations" = "سرویس دهندگان";
"Playlists" = "فهرست‌های پخش";
"Current Location" = "سرویس دهندهٔ فعلی";
"Could not open Files" = "فایل باز نشد";
"Regular Size" = "ابعاد معمولی";
"Could not refresh Popular" = "محبوبترین‌ها به روز نمی‌شود";
"Recent History" = "سابقهٔ اخیر";
"Clear History" = "پاک کردن سابقه";
"Play all unwatched" = "همهٔ دیده‌نشده‌ها را پخش کن";
"Show Home" = "نمایش صفحهٔ اصلی";
"More info can be found in:" = "اطلاعات بیشتر در:";
"Name" = "نام";
"History" = "سابقه";
/* Video date filter in search */
"Month" = "ماه";
"Matrix Channel" = "کانال Matrix";
"Round corners" = "گوشه‌های گرد";
"Pause when entering background" = "پس از ورود به پس‌زمینه مکث کن";
"Music" = "موسیقی";
"I like this app!" = "از این اپ خوشم می‌آید!";
"Upload date" = "تاریخ انتشار";
"Save history of played videos" = "ذخیرهٔ سابقهٔ ویدیوهای پخش شده";
"Add Account..." = "افزودن حساب کاربری…";
"Public account" = "حساب کاربری عمومی";
"Add %@" = "افزودن %@";
"Autoplaying Next" = "پخش خودکار بعدی";
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "فهرست پخش ندارید\n\nروی «فهرست جدید» ضربه بزنید و یکی بسازید";
"No chapters information available" = "اطلاعاتی در مورد فصل‌های ویدیو در دسترس نیست";
"Lock" = "قفل";
"Nothing" = "هیچ";
"Cellular" = "اینترنت همراه";
"Password" = "رمز عبور";
"Add to Playlist" = "افزودن به فهرست پخش";
"(shorts hidden)" = "(Shortها مخفی)";
"Are you sure you want to remove %@ location?" = "از حذف سرویس دهندهٔ \"%@\" مطمئنید؟";
"Current Playlist" = "فهرست پخش فعلی";
/* Selected video was played on given date */
"Watched %@" = "تماشا شده %@";
"Videos" = "ویدیوها";
"No locations available at the moment" = "در حال حاضر سرویس دهنده‌ای در دسترس نیست";
"Show history" = "نمایش سابقه";
"Default Profile" = "نمایهٔ پیش‌فرض";
"Red" = "قرمز";
"No preview" = "بدون پیش‌نمایش";
"Info" = "اطلاعات";
/* Loading stream OSD */
"Loading streams..." = "درحال دریافت استریم…";
"No rotation" = "بدون چرخش";
"Codec" = "کدک (Codec)";
"Startup section" = "بخش آغازین";
"Edit Quality Profile" = "ویرایش نمایهٔ کیفیت";
"Browse without account" = "استفاده بدون حساب کاربری";
/* Video sort order in search */
"Relevance" = "ارتباط";
"Help" = "کمک";
"Find Other" = "یافتن دیگری";
"Play Now" = "الان پخش کن";
"Close PiP when starting playing other video" = "هنگامی که ویدیوی دیگری آغاز به پخش می‌کند تصویر-در-تصویر را ببند";
"Show cache status" = "نمایش وضعیت حافظهٔ مخفی";
"Play Now in AVPlayer" = "الان در AVPlayer پخش کن";
"Medium quality" = "کیفیت متوسط";
"Stream & Player" = "استریم و پخش‌کننده";
"Contributing" = "مشارکت";
"Save" = "ذخیره";
"Buttons labels" = "برچسب دکمه‌ها";
"Close video and player on end" = "در پایان ویدیو و پخش‌کننده را ببند";
"Delete" = "حذف";
/* Player controls layout size for TV */
"TV" = "تلویزیون";
"Continue from %@" = "از %@ ادامه بده";
"I found a bug /" = "ایرادی پیدا کرده‌ام /";
"Recent Documents" = "مستندات تازه";
"Orientation" = "چرخش صفحه";
"Low" = "پایین";
"Restart" = "راه‌اندازی دوباره";
"Search..." = "جست و جو…";
"Open Video" = "ویدیو را باز کن";
"Sidebar" = "نوار کناری";
"Translations" = "ترجمه‌ها";
"Duration" = "مدت زمان";
/* Video sort order in search */
"Date" = "تاریخ";
"Disable filters" = "غیرفعال کردن صافی‌ها";
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "فهرست پخش \"%@\" حذف خواهد شد.\nقابل بازگردانی نیست.";
"Enter link to open" = "پیوند را وارد کنید تا باز شود";
"Restart/Play next" = "پخش دوباره/بعدی";
"Your Accounts" = "حساب کاربری شما";
"Open channel" = "کانال را باز کن";
"Queue" = "صف";
"Controls button: forwards" = "دکمه‌های کنترل: جلو";
"Normal" = "عادی";
"Next" = "بعدی";
"Home" = "صفحهٔ اصلی";
"Contact" = "تماس";
"Show Next in Queue" = "مورد بعدی صف را نشان بده";
"Browsing" = "مرور";
"Watched" = "تماشا شده";
"Highest" = "بالاترین";
"You can find information about using Yattee in the Wiki pages." = "اطلاعات در مورد چگونگی استفاده از Yattee را می‌توانید در صفحات ویکی پیدا کنید.";
"Captions" = "زیرنویس";
"Playlist" = "فهرست پخش";
/* SponsorBlock category name */
"Intro" = "مقدمه";
"Description" = "شرح";
"Instance of current account" = "سرویس دهندهٔ حساب کاربری فعلی";
"Advanced" = "پیشرفته";
"Welcome" = "خوش آمدید";
/* Selected video has just finished playing */
"Just watched" = "همین الان تماشا کردم";
"Close PiP when player is opened" = "هنگامی که پخش‌کننده باز می‌شود تصویر-در-تصویر را ببند";
"Lock portrait mode" = "قفل حالت عمودی";
/* Video date filter in search
Video duration filter in search */
"Any" = "هر";
"Mark watched videos with" = "نشانه گذاری ویدیوها به عنوان تماشا شده با";
"Not Playing" = "پخش نمی‌شود";
"Video Details" = "جزییات ویدیو";
"Live Streams" = "پخش زنده";

View File

@@ -600,3 +600,5 @@
"Podcasts" = "Podcasts";
"Releases" = "Sorties";
"Add %@" = "Ajouter %@";
"Description preview" = "Aperçu de la description";
"No preview" = "Aucun aperçu";

View File

@@ -1,19 +1,19 @@
"%@ Channel" = "%@ चैनल";
"%@ Playlist" = "%@ प्लेलिस्ट";
"%@ Playlist" = "%@ गीतमाला";
"%@ subscribers" = "%@ सदस्य";
"%lld videos" = "%lld वीडियो";
"%lld videos" = "%lld वीडियो";
" subscribers" = " सदस्य";
"10 seconds forwards/backwards" = "10 पल आगे/पीछे";
"Accounts" = "खाते";
"Accounts are not supported for the application of this instance" = "इस इन्सटेंस के लिए खातों उपलब्ध नहीं हैं";
"10 seconds forwards/backwards" = "10 सेकंड आगे/पीछे";
"Accounts" = "खाते";
"Accounts are not supported for the application of this instance" = "इस इन्सटेंस के लिए खात उपलब्ध नहीं हैं";
"Add to Playlist..." = "गीतमाला में जोड़ें…";
"Advanced" = "उन्नत";
/* Trending category, section containing all kinds of videos */
"All" = "सभी";
"Always use AVPlayer for live videos" = "लाइव वीडियो के लिए सदा ए.वी. प्लेयर का उपयोग करें";
"Always use AVPlayer for live videos" = "लाइव वीडियो के लिए सदा AVPlayer का उपयोग करें";
"Anonymous" = "गुप्त";
/* Video date filter in search
@@ -24,16 +24,16 @@
"Are you sure you want to clear search history?" = "क्या आप निश्चित रूप से खोज का इतिहास मिटाना चाहते हैं?";
"Close PiP and open player when application enters foreground" = "PiP बंद करें और प्लेयर खोलें जब ऐप्लिकेशन मुख्यभूमी में जाता है";
"Close PiP when player is opened" = "PiP बंद करें जब प्लेयर खुले";
"Close PiP when starting playing other video" = "PiP बंद करें जब दूसरा वीडियो प्ले हो";
"Close player when closing video" = "प्लेयर बंद करें जब वीडियो बंद हो";
"Close player when starting PiP" = "प्लेयर बंद करें जब PiP चालू हो";
"Close PiP when starting playing other video" = "PiP बंद करें जब दूसरा वीडियो चालू हो";
"Close player when closing video" = "जब वीडियो बंद हो तब प्लेयर बंद करें";
"Close player when starting PiP" = "जब PiP चालू हो रहा हो तब प्लेयर बंद करें";
"Close Video" = "वीडियो बंद करें";
"Close video after playing last in the queue" = "कतार में आख़िरी समाप्त होने के पश्चात वीडियो बंद करें";
"Close video after playing last in the queue" = "अंतिम पंक्तिबद्ध समाप्त होने के पश्चात वीडियो बंद करें";
"Comments" = "टिप्पणियाँ";
"Connected successfully (%@)" = "जुड़ाव सफल";
"Connected successfully (%@)" = "जुड़ाव सफल (%@)";
"Connection failed" = "जुड़ाव असफल";
"Contact" = "संपर्क";
"Continue" = "जारी";
"Continue" = "जारी रखें";
"Disabled" = "निर्योग्य";
"Discord Server" = "डिस्कॉर्ड सर्वर";
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "चर्चाएँ डिस्कॉर्ड एवं मेट्रिक्स पर होतीं हैं। यह सामान्य प्रश्नों के लिए अच्छा मंच है।";
@@ -154,18 +154,18 @@
"Play Now" = "अभी चलाएँ";
"Playback" = "प्लेबैक";
"Player" = "प्लेयर";
"Playlist" = "प्लेलिस्ट";
"Playlist" = "गीतमाला";
"Decreased opacity" = "पारदर्शिता घटी";
"Continue from %@" = "%@ से जारी रें";
"Continue from %@" = "%@ से जारी रें";
"Current: %@\n%@" = "वर्तमान: %@\n%@";
"Contributing" = "योगदान दें";
"Contributing" = "योगदान";
"Controls" = "नियंत्रक";
"Copy %@ link" = "%@ लिंक नक़ल करें";
"Copy %@ link" = "%@ लिंक कॉपी करें";
"Country" = "देश";
"Country Name or Code" = "देश नाम एवं कोड";
"Could not load locations manifest" = "लोकेशन मैनिफ़ेस्ट लोड नहीं हो पाई";
"Country Name or Code" = "देश का नाम एवं कोड";
"Could not load locations manifest" = "लोकेशन मैनिफ़ेस्ट लोड नहीं हो सका";
"Custom Locations" = "कस्टम स्थान";
"Copy %@ link with time" = "%@ लिंक समय के साथ नक़ल करें";
"Copy %@ link with time" = "%@ लिंक समय के साथ कॉपी करें";
"Add Account" = "खाता जोड़ें";
"Add Account..." = "खाता जोड़ें…";
"Add Location" = "स्थान जोड़ें";
@@ -177,35 +177,35 @@
"Add to %@" = "%@ में जोड़ें";
"Badge color" = "बिल्ले का रंग";
"Category" = "श्रेणी";
"Clear Search History..." = "खोज इतिहास साफ़ करें…";
"Clear Search History..." = "खोज इतिहास हटायें…";
"Are you sure you want to restore default quality profiles?" = "क्या आप निश्चित रूप से डीफ़ॉल्ट गुणवत्ता प्रोफ़ाइल को पुनः प्राप्त करना चाहते हैं?";
"Based on system color scheme" = "मूल तंत्र रंग प्रणाली पर निर्भर";
"Based on system color scheme" = "सिस्टम के रंग प्रणाली पर निर्भर";
"Categories to Skip" = "श्रेणियाँ जिन्हें छोड़ें";
"Chapters" = "अध्यायें";
"Chapters" = "अध्याय";
"Are you sure you want to delete playlist?" = "क्या आप निश्चित रूप से इस गीतमाला को मिटाना चाहते हैं?";
"Are you sure you want to unsubscribe from %@?" = "क्या आप निश्चित रूप से %@ की सदस्यता छोड़ना चाहते हैं?";
"Automatic" = "स्वत";
"Autoplaying Next" = "अगला ऑटोप्ले हो रहा";
"Automatic" = "स्वचालित";
"Autoplaying Next" = "अगला स्वतः चालू हो रहा";
"Badge" = "बिल्ला";
"Blue" = "नीला";
"Browsing" = "ब्राउज़ करना";
"Buffering stream..." = "स्ट्रीम बफ़र हो रहा…";
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "आप बग एवं फ़ीचर सुझाव गिटहब के इशु ट्रैकर पर भेज सकते हैं ";
"Cancel" = "रद्द";
"Captions" = "कैप्शन";
"Charging" = "चार्ज हो रहा";
"Clear" = "साफ़";
"Clear All" = "सभी साफ़";
"Clear All Recents" = "सभी हालिया साफ़ करें";
"Clear History" = "इतिहास साफ़ करें";
"Clear Search History" = "खोज इतिहास साफ़ करें";
"Clear the queue" = "क़तार साफ़ करें";
"Captions" = "अनुशीर्षक";
"Charging" = "चार्ज हो रहा है";
"Clear" = "हटायें";
"Clear All" = "सभी हटायें";
"Clear All Recents" = "सभी हालिया हटायें";
"Clear History" = "इतिहास हटायें";
"Clear Search History" = "खोज इतिहास हटायें";
"Clear the queue" = "पंक्तिबद्ध हटायें";
"Close" = "बंद";
"Backend" = "बैकऐंड";
"Backend" = "पृष्ठभाग";
"Badge & Decreased opacity" = "बिल्ला एवं पारदर्शिता में कमी";
"Battery" = "बैटरी";
"Button" = "बटन";
"Cellular" = "मोबाइल डाटा";
"Cellular" = "मोबाइल";
"Create Playlist" = "गीतमाला बनाएँ";
/* Player controls layout size */
@@ -267,7 +267,7 @@
"Statistics" = "आँकड़े";
"Hardware decoder" = "हार्डवेयर डीकोडर";
"Stream FPS" = "स्ट्रीम FPS";
"Playlists" = "प्लेलिस्ट";
"Playlists" = "गीतमाला";
"Popular" = "लोकप्रिय";
"Preferred Formats" = "पसंदीदा प्रारूप";
"Profiles" = "प्रोफ़ाइल";
@@ -415,7 +415,7 @@
"Locations Manifest" = "";
"Could not delete document" = "";
"Show Inspector" = "";
"Could not load streams" = "";
"Could not load streams" = "स्ट्रीम्स नहीं खोला जा सका";
"Address" = "";
"Playback Mode" = "";
"Left" = "";
@@ -447,17 +447,17 @@
"Verified" = "";
"No documents" = "";
"Show Open Videos toolbar button" = "";
"Could not refresh Subscriptions" = "";
"Could not refresh Subscriptions" = "सदस्यता पुनर्स्थापित नहीं किया जा सका";
"Remove Location" = "";
"Only for local files and URLs" = "";
"Codec" = "";
"File" = "";
"Could not extract playlist ID" = "";
"Paste" = "";
"Could not extract SID from received cookies: %@" = "";
"Could not extract SID from received cookies: %@" = "प्राप्त कुकीज़ से SID नहीं निकाला जा सका: %@";
"Files" = "";
"Show Home" = "";
"Could not extract channel information" = "";
"Could not extract channel information" = "चैनल की जानकारी नहीं निकाली जा सकी";
"Enter link to open" = "";
"Home" = "";
"No locations available at the moment" = "";
@@ -469,7 +469,7 @@
"Format" = "";
"Share files from Finder on a Mac\nor iTunes on Windows" = "";
"Share%@link" = "";
"Could not open video" = "";
"Could not open video" = "वीडियो नहीं खोला जा सका";
"Center" = "";
"Size" = "";
"Recent Documents" = "";
@@ -484,14 +484,14 @@
"Could not create share link" = "";
"Sample Rate" = "";
"Translations" = "";
"Open logs in Finder" = "";
"Open logs in Finder" = "लॉग को Finder में खोलें";
"Could not refresh Playlists" = "";
"Could not update your token." = "";
"Could not refresh Trending" = "";
"Could not update your token." = "आपका टोकन अपडेट नहीं हो सका।";
"Could not refresh Trending" = "ट्रेंडिंग को पुनर्स्थापित नहीं किया जा सका";
"Could not open playlist" = "";
"This URL could not be opened" = "";
"Could not open channel" = "";
"Channel could not be found" = "";
"This URL could not be opened" = "इस URL को नहीं खोला जा सका";
"Could not open channel" = "चैनल नहीं खुल सका";
"Channel could not be found" = "चैनल नहीं मिला";
"Could not refresh Popular" = "";
"Could not extract video ID" = "";
"Channel" = "";
@@ -501,4 +501,4 @@
"Pages toolbar position" = "";
"Default Profile" = "";
"Copy%@link" = "";
"Share Logs..." = "";
"Share Logs..." = "लॉग साझा करें…";

View File

@@ -105,7 +105,7 @@
"Not available" = "利用できません";
/* SponsorBlock category name */
"Offtopic in Music Videos" = "音楽動画の脱線した内容";
"Offtopic in Music Videos" = "音楽動画の非音楽部分";
"Only when signed in" = "ログイン時のみ";
"Orientation" = "向き";
"Opening audio stream..." = "音声ストリーム 開始中...";
@@ -487,13 +487,13 @@
"Category" = "分類";
/* SponsorBlock category name */
"Interaction" = "操作の要求";
"Interaction" = "操作の依頼";
/* SponsorBlock category name */
"Self-promotion" = "自己宣伝";
"Quality" = "品質";
"Are you sure you want to clear search history?" = "検索履歴を消去しますか?";
"For videos which feature music as the primary content." = "音楽主なコンテンツとする動画用です。";
"For videos which feature music as the primary content." = "音楽主な内容の動画が対象です。";
"Always use AVPlayer for live videos" = "ライブ配信には常に AVPlayer を使用";
"Clear Search History" = "検索履歴を消去";
"Disabled" = "無効化";
@@ -600,3 +600,5 @@
"Podcasts" = "ポッドキャスト";
"Releases" = "リリース";
"Add %@" = "追加 %@";
"Description preview" = "説明のプレビュー";
"No preview" = "プレビューなし";

View File

@@ -601,3 +601,7 @@
"Podcasts" = "Podkasty";
"Releases" = "Wydania";
"Add %@" = "Dodaj %@";
"Description preview" = "Podgląd opisu";
"No preview" = "Brak podglądu";
"Open vertical chapters expanded" = "Otwórz pionowe rozdziały rozwinięte";
"Chapters (if available)" = "Rozdziały (jeśli dostępne)";

View File

@@ -600,3 +600,5 @@
"Podcasts" = "Podcasts";
"Releases" = "Lançamentos";
"Add %@" = "Adicionar %@";
"Description preview" = "Descrição da prévia";
"No preview" = "Sem prévia";

View File

@@ -294,15 +294,15 @@
"Hide" = "";
"Playing Next" = "";
"Are you sure you want to remove this document?" = "";
"Show channel name" = "";
"Show channel name" = "Kanal adını göster";
"Unlisted" = "";
"Paste" = "";
"Rate & Captions" = "";
"Format" = "";
"Right" = "";
"Right" = "Sağ";
"Stream FPS" = "";
"Cached time" = "";
"Sign In Required" = "";
"Sign In Required" = "Giriş yapmanız gerekiyor";
"Could not create share link" = "";
"Locations Manifest" = "";
"When partially watched video is played" = "";
@@ -323,19 +323,19 @@
"Show Documents" = "";
"Press and hold remote button to open captions and quality menus" = "";
"No locations available at the moment" = "";
"Show account username" = "";
"Show account username" = "Hesabın kullanıcı adını göster";
"Used to create links from videos, channels and playlists" = "";
"Size" = "";
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "";
"Sort: %@" = "";
"Select location closest to you:" = "";
"Sort: %@" = "Sırala: %@";
"Select location closest to you:" = "Size en yakın konumu seçin:";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "";
/* Video duration filter in search */
"Short" = "";
"Short" = "Kısa";
"Home" = "";
"Remove Location" = "";
"Edit Favorites…" = "";
"Edit Favorites…" = "Favorileri düzenle…";
"Show Open Videos toolbar button" = "";
"Sample Rate" = "";
"Private" = "";
@@ -365,14 +365,14 @@
"Subscriptions" = "";
"Upload date" = "";
"This information will be processed only on your device and used to connect you to the server in the specified country." = "";
"Shuffle" = "";
"Shuffle" = "Karıştır";
"Buttons labels" = "";
"Share %@ link" = "";
"Share %@ link" = "%@ bağlantısını paylaş";
"Could not load streams" = "";
"Playback history is empty" = "";
"Show icons and text when space permits" = "";
"unknown" = "";
"Share..." = "";
"Share..." = "Paylaş...";
/* Video sort order in search */
"Views" = "";
@@ -382,7 +382,7 @@
"Could not refresh Playlists" = "";
"Actions buttons" = "";
"Any format" = "";
"Show playback statistics" = "";
"Show playback statistics" = "Oynatma istatistiklerini göster";
"Pages buttons" = "";
"Videos" = "";
"Codec" = "";
@@ -396,7 +396,7 @@
"Open" = "";
/* Loading stream OSD */
"Opening %@ stream..." = "";
"Opening %@ stream..." = "%@ akışıılıyor...";
"Clear Queue before opening" = "";
"Copy %@ link with time" = "Bağlantıyı %@ zaman ile kopyala";
"Show Inspector" = "";
@@ -412,15 +412,15 @@
/* Video date filter in search */
"Week" = "";
"Sidebar" = "";
"Sidebar" = "Kenar çubuğu";
"Show only icons" = "";
"Current: %@\n%@" = "Şuan: %@\n%@";
"Show anonymous accounts" = "";
"Show anonymous accounts" = "Anonim hesapları göster";
"Could not open playlist" = "";
"Round corners" = "";
"URL" = "";
"Recents" = "";
"Show sidebar when space permits" = "";
"Show sidebar when space permits" = "Alan olduğu sürece kenar çubuğunu göster";
"System controls buttons" = "";
"Could not extract channel information" = "";
"Public Locations" = "";
@@ -431,22 +431,22 @@
"Continue from %@" = "% devam et";
"Copy %@ link" = "Bağlantıyı %@ kopyala";
"Seek gesture sensitivity" = "";
"Show keywords" = "";
"Show keywords" = "Anahtar kelimeleri göster";
"Wiki" = "";
"Username" = "";
"Could not extract video ID" = "";
/* Player controls layout size */
"Smaller" = "";
"Sort" = "";
"Smaller" = "Küçült";
"Sort" = "Sırala";
"This cannot be reverted" = "";
"Public Manifest" = "";
"You have no Playlists" = "";
"Watched" = "";
"Could not open video" = "";
"Channel could not be found" = "";
"Show video length" = "";
"Source" = "";
"Show video length" = "Video uzunluğunu göster";
"Source" = "Kaynak";
"Welcome" = "";
"Wi-Fi" = "";
"Could not open channel" = "";
@@ -454,13 +454,13 @@
"Could not extract playlist ID" = "";
"Could not load video" = "";
"Decreased opacity" = "Düşük şeffaflık";
"Shuffle All" = "";
"Share %@ link with time" = "";
"Shuffle All" = "Tümünü karıştır";
"Share %@ link with time" = "%@ bağlantısını zaman bilgisiyle birlikte paylaş";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "";
"Unsubscribe" = "";
"Current Location" = "";
"Stream & Player" = "";
"Hardware decoder" = "";
"Hardware decoder" = "Donanımsal çözücü";
"Honor orientation lock" = "";
"Seek with horizontal swipe on video" = "";
"Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator." = "";
@@ -473,12 +473,12 @@
"Self-promotion" = "";
/* Player controls layout size */
"Small" = "";
"Small" = "Küçük";
/* SponsorBlock category name */
"Sponsor" = "";
"Sponsor" = "Sponsor";
"System controls show buttons for %@" = "";
"Show history" = "";
"Show history" = "Kullanım geçmişini göster";
"Could not extract SID from received cookies: %@" = "";
"This will remove all your custom profiles and return their default values. This cannot be reverted." = "";
"Switch to other public location" = "";
@@ -502,3 +502,6 @@
"Share" = "";
"File" = "";
"Share%@link" = "";
"Cache" = "Önbellek";
"Enter account credentials to connect..." = "Bağlanmak için hesap bilgilerini girin...";
"Show scroll to top button in comments" = "Yorumlarda yukarıya götür düğmesini göster";

View File

@@ -1183,6 +1183,10 @@
376578902685490700D4EA09 /* PlaylistsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistsView.swift; sourceTree = "<group>"; };
37658ED428E1C567004BF6A2 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
376787BA291C43CD00D356A4 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = "<group>"; };
3767F3312B2504F800F257BC /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = "<group>"; };
3767F3322B25053B00F257BC /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
3767F3332B25058300F257BC /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
3767F3342B2505EF00F257BC /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
3768122C28E8D0BC0036FC8D /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = "<group>"; };
3769C02D2779F18600DDB3EA /* PlaceholderProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaceholderProgressView.swift; sourceTree = "<group>"; };
376A33DF2720CAD6000C1D6B /* VideosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideosApp.swift; sourceTree = "<group>"; };
@@ -2606,6 +2610,10 @@
pt,
"pt-BR",
ja,
fa,
es,
tr,
ru,
);
mainGroup = 37D4B0BC2671614700C925CA;
packageReferences = (
@@ -3787,6 +3795,10 @@
37E868FE29AA402D003128D0 /* pt */,
37E868FF29AA407B003128D0 /* pt-BR */,
37ABD5FE29BE7FA800DDCAD7 /* ja */,
3767F3312B2504F800F257BC /* fa */,
3767F3322B25053B00F257BC /* es */,
3767F3332B25058300F257BC /* tr */,
3767F3342B2505EF00F257BC /* ru */,
);
name = Localizable.strings;
sourceTree = "<group>";
@@ -3801,7 +3813,7 @@
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
@@ -3832,7 +3844,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
@@ -3863,7 +3875,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0;
@@ -3883,7 +3895,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0;
@@ -4047,7 +4059,7 @@
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@@ -4100,7 +4112,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
@@ -4152,7 +4164,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
DEAD_CODE_STRIPPING = YES;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
@@ -4191,7 +4203,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
DEAD_CODE_STRIPPING = YES;
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
ENABLE_APP_SANDBOX = YES;
@@ -4226,7 +4238,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4250,7 +4262,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4276,7 +4288,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4301,7 +4313,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4327,7 +4339,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -4367,7 +4379,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
DEVELOPMENT_ASSET_PATHS = "";
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES;
@@ -4408,7 +4420,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -4432,7 +4444,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 168;
CURRENT_PROJECT_VERSION = 171;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -4742,8 +4754,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/cxfksword/MPVKit.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 0.35.1;
branch = main;
kind = branch;
};
};
/* End XCRemoteSwiftPackageReference section */

View File

@@ -14,8 +14,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/Alamofire/Alamofire.git",
"state" : {
"revision" : "b2fa556e4e48cbf06cf8c63def138c98f4b811fa",
"version" : "5.8.0"
"revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad",
"version" : "5.8.1"
}
},
{
@@ -42,7 +42,7 @@
"location" : "https://github.com/kishikawakatsumi/KeychainAccess.git",
"state" : {
"branch" : "master",
"revision" : "ecb18d8ce4d88277cc4fb103973352d91e18c535"
"revision" : "e0c7eebc5a4465a3c4680764f26b7a61f567cdaf"
}
},
{
@@ -59,8 +59,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/cxfksword/MPVKit.git",
"state" : {
"revision" : "96825b3dc2b38e5550268156148d47798ce6aa74",
"version" : "0.36.0"
"branch" : "main",
"revision" : "dca1e345a26d09a3d621d7656a94e6427f3f7b83"
}
},
{
@@ -105,7 +105,7 @@
"location" : "https://github.com/SDWebImage/SDWebImage",
"state" : {
"branch" : "master",
"revision" : "7550aa759c8d57800f7fdb3d17272a232b05e8cb"
"revision" : "fbe79221b146aa6647dceb5a5c75873a48b69519"
}
},
{
@@ -122,8 +122,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
"state" : {
"revision" : "5f025e54a03d3d33dff24d7a19331f446f00ed9d",
"version" : "2.2.4"
"revision" : "aee64ef39b570c44ccf0f884c440fc6494a23c76",
"version" : "2.2.5"
}
},
{
@@ -131,8 +131,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImageWebPCoder.git",
"state" : {
"revision" : "b442fafefeee8d3f489e33e69e0bb9407deb4757",
"version" : "0.14.0"
"revision" : "db4603921b31a6ce0f8c26d36d6a3fffc2dba481",
"version" : "0.14.2"
}
},
{

View File

@@ -86,9 +86,11 @@ public class OrientationTracker {
if accelerometerData.acceleration.y <= -threshold {
return .portrait
}
if accelerometerData.acceleration.y >= threshold {
if UIDevice.current.userInterfaceIdiom == .pad && accelerometerData.acceleration.y >= threshold {
return .portraitUpsideDown
}
return currentDeviceOrientation
}
}

View File

@@ -130,7 +130,7 @@ struct NowPlayingView: View {
} else {
Section(header: Text("Chapters")) {
ForEach(video.chapters) { chapter in
ChapterView(chapter: chapter)
ChapterViewTVOS(chapter: chapter)
.padding(.horizontal, 40)
}
}