Compare commits

...

66 Commits

Author SHA1 Message Date
Arkadiusz Fal
2a597ab3cb Add missing bundle platform 2025-03-23 15:08:04 +01:00
Arkadiusz Fal
4d662115e4 Update GitHub release workflow 2025-03-23 15:07:15 +01:00
Arkadiusz Fal
e068257f14 Bump build number to 200 2025-03-23 15:04:56 +01:00
Arkadiusz Fal
8b809fb0f1 Update GitHub release workflow 2025-03-23 15:04:16 +01:00
Arkadiusz Fal
d3e80f500e Update GitHub release workflow 2025-03-23 13:38:51 +01:00
Arkadiusz Fal
9343e9d023 Bump build number to 199 2025-03-23 13:35:52 +01:00
Arkadiusz Fal
e4b25b0f80 Update CHANGELOG 2025-03-23 13:35:52 +01:00
Arkadiusz Fal
09c2fb19a9 Fix swiftformat offenses 2025-03-23 13:32:46 +01:00
Arkadiusz Fal
043b07274e Update packages 2025-03-23 13:32:19 +01:00
Arkadiusz Fal
7f7e12d719
Merge pull request #851 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2025-03-23 13:27:47 +01:00
Arkadiusz Fal
d990c6630e
Merge pull request #863 from lifo9/add-support-for-invidious-companion
Add support for invidious companion
2025-03-23 13:27:33 +01:00
Jakub Filo
5239b36cfe Add support for invidious companion 2025-03-18 22:56:45 +01:00
Ghost of Sparta
addc13ebfb
Translated using Weblate (Hungarian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2025-03-01 17:01:56 +00:00
azazaazur
2a6f26ec68
Translated using Weblate (Turkish)
Currently translated at 97.3% (547 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/tr/
2025-02-15 17:01:58 +01:00
Mohammed Al Otaibi
2e2f502d97
Translated using Weblate (Arabic)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ar/
2025-01-30 15:02:02 +01:00
Sophia Park
59afc2f4c7
Translated using Weblate (Korean)
Currently translated at 14.2% (80 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ko/
2025-01-06 08:07:37 +01:00
Finn
2f902e74bb
Translated using Weblate (German)
Currently translated at 94.8% (533 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/de/
2025-01-03 12:01:20 +00:00
Ghost of Sparta
500b75da4f
Translated using Weblate (Hungarian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-12-28 13:00:32 +01:00
Arkadiusz Fal
3a17cc4dee Add missing bundle platform 2024-12-26 19:43:42 +01:00
Arkadiusz Fal
16897338e6 Bump build number to 198 2024-12-26 19:41:35 +01:00
Arkadiusz Fal
7c870b8e61 Update changelog 2024-12-26 19:41:26 +01:00
Arkadiusz Fal
75d9c5c747 Add Hungarian locale 2024-12-26 19:10:51 +01:00
Arkadiusz Fal
9e0f1a72ab Update packages 2024-12-26 19:09:28 +01:00
Arkadiusz Fal
7f3b3ac0ab
Merge pull request #849 from derspyy/0length
Stop making videos with unknown length shorts.
2024-12-26 18:57:13 +01:00
Arkadiusz Fal
84b70b794b
Merge pull request #845 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2024-12-26 18:56:34 +01:00
Ghost of Sparta
e6bae84162
Translated using Weblate (Hungarian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-12-25 21:00:36 +01:00
piuvas
9efbac3d15
make 0-length videos not shorts. 2024-12-21 12:55:44 -03:00
Blueberry
1289f57f60
Translated using Weblate (Russian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ru/
2024-12-13 23:00:53 +01:00
Ghost of Sparta
cc03ab059b
Translated using Weblate (Hungarian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-12-10 18:00:28 +00:00
Ghost of Sparta
17484f65fd
Translated using Weblate (Hungarian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-12-09 16:00:36 +01:00
Ghost of Sparta
65247227e7
Translated using Weblate (Hungarian)
Currently translated at 93.2% (524 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-12-08 11:00:44 +00:00
Ghost of Sparta
625c01aaac
Translated using Weblate (Hungarian)
Currently translated at 56.5% (318 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-12-06 20:00:30 +01:00
Twig
7465ff9c5c
Translated using Weblate (Turkish)
Currently translated at 96.0% (540 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/tr/
2024-11-24 18:00:26 +01:00
Arkadiusz Fal
41de28a698 Bump build number to 197 2024-11-08 16:29:59 +01:00
Arkadiusz Fal
7baab7a88a Update github actions checkout version 2024-11-08 15:26:55 +01:00
Arkadiusz Fal
43599632b2 Update changelog 2024-11-08 15:20:06 +01:00
Arkadiusz Fal
e4f413ed2d Update packages 2024-11-08 15:20:06 +01:00
Arkadiusz Fal
661b7547c5 Fix application groups 2024-11-08 15:09:59 +01:00
Arkadiusz Fal
d69f410d92 Add Tamil language 2024-11-08 15:07:29 +01:00
Arkadiusz Fal
db7abe31ea
Merge pull request #836 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2024-11-08 15:05:22 +01:00
ButterflyOfFire
fff36ece26
Translated using Weblate (Kabyle)
Currently translated at 17.0% (96 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/kab/
2024-11-08 14:04:18 +00:00
ButterflyOfFire
8a0e9ae75a
Added translation using Weblate (Kabyle) 2024-11-08 14:04:17 +00:00
trilame
d6e5b5ed76
Translated using Weblate (French)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/fr/
2024-11-08 14:04:16 +00:00
தமிழ்நேரம்
cef1a1caea
Translated using Weblate (Tamil)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ta/
2024-11-08 14:04:16 +00:00
தமிழ்நேரம்
6c6abe8c84
Added translation using Weblate (Tamil) 2024-11-08 14:04:15 +00:00
Istvan Tanczos
9732537602
Translated using Weblate (Hungarian)
Currently translated at 1.0% (6 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2024-11-08 14:04:15 +00:00
Istvan Tanczos
c0deeabaed
Added translation using Weblate (Hungarian) 2024-11-08 14:04:14 +00:00
Arkadiusz Fal
f29dbcbe36
Merge pull request #834 from mmaalo/norwegian100
Norwegian Language
2024-11-08 15:04:05 +01:00
Arkadiusz Fal
c7e1a50e56
Merge pull request #833 from blennster/main
Fix uneven playback when using MPV and not syncing refreshrate
2024-11-08 15:03:51 +01:00
Arkadiusz Fal
dd205db15f
Merge pull request #824 from yattee/mpvkit-0-39-0
update MPVKit to v0.39.0
2024-11-08 15:03:18 +01:00
Arkadiusz Fal
9ca5d292ec
Merge pull request #820 from yattee/video-details-gestures
add drag gestures to video details
2024-11-08 15:03:07 +01:00
Arkadiusz Fal
748bc16342
Merge pull request #818 from yattee/changes-to-opengl-view
improvements to MPVGLView
2024-11-08 15:02:15 +01:00
Arkadiusz Fal
798d2fc67f
Merge pull request #817 from yattee/fix-subtitles
improved subtitle handling
2024-11-08 15:01:56 +01:00
Arkadiusz Fal
a5a88f8890
Merge pull request #815 from yattee/refined-audio-ducking
proper audio interrupt and route change handling
2024-11-08 15:01:27 +01:00
Arkadiusz Fal
f69ccb6bd6
Merge pull request #814 from yattee/fullscreen-gesture-toggle
allow users to disable fullscreen swipe gesture
2024-11-08 15:01:06 +01:00
Arkadiusz Fal
892b3dea17
Merge pull request #813 from yattee/update-introspect
Update SwiftUI-Introspect
2024-11-08 15:00:35 +01:00
mmaalo
9a11e9f9f5 completed Localizable.strings for norwegian language 2024-10-07 21:23:12 +02:00
Emil Blennow
055d5575ba
fix uneven playback when using MPV and not syncing refreshrate 2024-10-06 17:32:02 +02:00
Toni Förster
28b6a517b6
update MPVKit to v0.39.0
Signed-off-by: Toni Förster <toni.foerster@gmail.com>
2024-09-24 10:41:02 +02:00
Toni Förster
b4bcd0c0a0
add drag gestures to video details 2024-09-15 20:56:04 +02:00
Toni Förster
e62010d5d5
improvements to MPVGLView
- add Pixel Buffer Object to (PBO)
- add some debug logging
- add scissor testing
- add dirty region checking

Signed-off-by: Toni Förster <toni.foerster@gmail.com>
2024-09-14 15:04:17 +02:00
Toni Förster
3339e8cb1f
improved subtitle handling
- fix subtitle disabling not working
- make subtitle adding/removing async
- make subtitle menu non blocking

Signed-off-by: Toni Förster <toni.foerster@gmail.com>
2024-09-14 11:33:12 +02:00
Toni Förster
4855f9bead
fix tvOS build
Signed-off-by: Toni Förster <toni.foerster@gmail.com>
2024-09-13 11:48:40 +02:00
Toni Förster
a65ed67751
proper audio interrupt and route change handling
- set AVAudioSession inactive on pause and stop
- handle audio route changes
2024-09-13 11:21:07 +02:00
Toni Förster
72dcbe4515
allow user to disable fullscreen swipe gesture
furthermore, some rewording

Signed-off-by: Toni Förster <toni.foerster@gmail.com>
2024-09-12 16:57:48 +02:00
Toni Förster
7e02b08933
update SwiftUI-Introspect 2024-09-11 20:55:00 +02:00
37 changed files with 2112 additions and 373 deletions

View File

@ -27,9 +27,9 @@ jobs:
# lane: ['mac beta', 'ios beta', 'tvos beta']
lane: ['ios beta', 'tvos beta']
name: Releasing ${{ matrix.lane }} version to TestFlight
runs-on: macos-13
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
@ -44,16 +44,16 @@ jobs:
- uses: maierj/fastlane-action@v3.0.0
with:
lane: ${{ matrix.lane }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.lane }} build
path: fastlane/builds/**/*.ipa
if-no-files-found: ignore
mac_notarized:
name: Build and notarize macOS app
runs-on: macos-13
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
@ -76,7 +76,7 @@ jobs:
echo "ZIP_PATH=fastlane/builds/${{ env.VERSION_NUMBER }}-${{ env.BUILD_NUMBER }}/macOS/Yattee-${{ env.VERSION_NUMBER }}-macOS.zip" >> $GITHUB_ENV
- name: ZIP build
run: /usr/bin/ditto -c -k --keepParent ${{ env.APP_PATH }} ${{ env.ZIP_PATH }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: mac notarized build
path: ${{ env.ZIP_PATH }}
@ -86,10 +86,10 @@ jobs:
name: Create GitHub release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- run: echo "BUILD_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 CURRENT_PROJECT_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
- run: echo "VERSION_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 MARKETING_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4
with:
path: artifacts
- uses: ncipollo/release-action@v1

View File

@ -1,10 +1,8 @@
## Build 196
* Orientation/Fullscreen fixes and cleanup by @stonerl in https://github.com/yattee/yattee/pull/806
* More robust resolution handling by @stonerl in https://github.com/yattee/yattee/pull/807
* MPV: improved A/V sync by @stonerl in https://github.com/yattee/yattee/pull/805
* Retry loading video before presenting error by @stonerl in https://github.com/yattee/yattee/pull/810
* Refactor Search by @stonerl in https://github.com/yattee/yattee/pull/809
* Updated dependencies
## Build 199
## What's Changed
* Add support for invidious companion by @lifo9 in https://github.com/yattee/yattee/pull/863
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/851
## Previous builds
* Add skip, play/pause, and fullscreen shortcuts to macOS player (by @rickykresslein)
@ -23,6 +21,21 @@
* Add import export of missing settings
* macOS: Fix settings windows layout
* Fix seek OSD layout on tvOS, revert OSD position
* Allow users to disable fullscreen swipe gesture by @stonerl in https://github.com/yattee/yattee/pull/814
* Proper audio interrupt and route change handling by @stonerl in https://github.com/yattee/yattee/pull/815
* Improved subtitle handling by @stonerl in https://github.com/yattee/yattee/pull/817
* Improvements to MPVGLView by @stonerl in https://github.com/yattee/yattee/pull/818
* Add drag gestures to video details by @stonerl in https://github.com/yattee/yattee/pull/820
* Fix uneven playback when using MPV and not syncing refreshrate by @blennster in https://github.com/yattee/yattee/pull/833
* Norwegian Language by @mmaalo in https://github.com/yattee/yattee/pull/834
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/836
* Update MPVKit to v0.39.0 by @stonerl in https://github.com/yattee/yattee/pull/824
* Update SwiftUI-Introspect by @stonerl in https://github.com/yattee/yattee/pull/813
* Orientation/Fullscreen fixes and cleanup by @stonerl in https://github.com/yattee/yattee/pull/806
* More robust resolution handling by @stonerl in https://github.com/yattee/yattee/pull/807
* MPV: improved A/V sync by @stonerl in https://github.com/yattee/yattee/pull/805
* Retry loading video before presenting error by @stonerl in https://github.com/yattee/yattee/pull/810
* Refactor Search by @stonerl in https://github.com/yattee/yattee/pull/809
* iOS: Simplified fullscreen and orientation by @stonerl in https://github.com/yattee/yattee/pull/786
* macOS: only apply player shortcuts when window is active by @stonerl in https://github.com/yattee/yattee/pull/802
* player controls: add background opacity selection by @stonerl in https://github.com/yattee/yattee/pull/799
@ -43,6 +56,8 @@
* Changes to defaults by @stonerl in https://github.com/yattee/yattee/pull/767
* Fixed fullscreen handling for backgrounding by @stonerl in https://github.com/yattee/yattee/pull/772
* Update now playing info when using system controls Partial fix for 503 by @stonerl in https://github.com/yattee/yattee/pull/765
* Stop making videos with unknown length shorts. by @derspyy in https://github.com/yattee/yattee/pull/849
* Add Hungarian to locales list
* Fix crash on HLS live playback by @stonerl in https://github.com/yattee/yattee/pull/775
* Fix mpv crashing on macOS by @stonerl in https://github.com/yattee/yattee/pull/754
* Refreshed icons for iOS and macOS by @stonerl in https://github.com/yattee/yattee/pull/752

View File

@ -9,21 +9,22 @@ GEM
public_suffix (>= 2.0.2, < 7.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
aws-partitions (1.973.0)
aws-sdk-core (3.204.0)
aws-eventstream (1.3.2)
aws-partitions (1.1072.0)
aws-sdk-core (3.220.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.90.0)
aws-sdk-core (~> 3, >= 3.203.0)
aws-sdk-kms (1.99.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.161.0)
aws-sdk-core (~> 3, >= 3.203.0)
aws-sdk-s3 (1.182.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.9.1)
aws-sigv4 (1.11.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
@ -33,13 +34,13 @@ GEM
commander (4.6.0)
highline (~> 2.0.0)
declarative (0.0.20)
digest-crc (0.6.5)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.111.0)
faraday (1.10.3)
excon (0.112.0)
faraday (1.10.4)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
@ -58,17 +59,17 @@ GEM
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-multipart (1.1.0)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.3.1)
fastlane (2.222.0)
fastimage (2.4.0)
fastlane (2.227.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@ -84,6 +85,7 @@ GEM
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
@ -107,8 +109,10 @@ GEM
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty (~> 0.4.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
@ -126,12 +130,12 @@ GEM
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.7.1)
google-cloud-core (1.8.0)
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-errors (1.4.0)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
@ -147,23 +151,25 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.7)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.7.2)
jwt (2.8.2)
json (2.10.2)
jwt (2.10.1)
base64
mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.4.1)
nanaimo (0.3.0)
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.2.1)
nkf (0.2.0)
optparse (0.5.0)
optparse (0.6.0)
os (1.1.4)
plist (3.7.1)
plist (3.7.2)
public_suffix (6.0.1)
rake (13.2.1)
representable (3.2.0)
@ -171,10 +177,10 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.3.7)
rouge (2.0.7)
rexml (3.4.1)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
rubyzip (2.4.1)
security (0.1.5)
signet (0.19.0)
addressable (~> 2.8)
@ -184,6 +190,7 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@ -193,24 +200,27 @@ GEM
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unicode-display_width (2.5.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
xcodeproj (1.25.0)
xcodeproj (1.27.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.3.0)
rexml (>= 3.3.2, < 4.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.0)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
arm64-darwin-21
arm64-darwin-23
arm64-darwin-24
x86_64-darwin-19
x86_64-darwin-20
x86_64-darwin-21
x86_64-linux
DEPENDENCIES

View File

@ -10,14 +10,16 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
let apiURLString: String
var frontendURL: String?
var proxiesVideos: Bool
var invidiousCompanion: Bool
init(app: VideosApp, id: String? = nil, name: String? = nil, apiURLString: String, frontendURL: String? = nil, proxiesVideos: Bool = false) {
init(app: VideosApp, id: String? = nil, name: String? = nil, apiURLString: String, frontendURL: String? = nil, proxiesVideos: Bool = false, invidiousCompanion: Bool = false) {
self.app = app
self.id = id ?? UUID().uuidString
self.name = name ?? app.rawValue
self.apiURLString = apiURLString
self.frontendURL = frontendURL
self.proxiesVideos = proxiesVideos
self.invidiousCompanion = invidiousCompanion
}
var apiURL: URL! {

View File

@ -16,7 +16,8 @@ struct InstancesBridge: Defaults.Bridge {
"name": value.name,
"apiURL": value.apiURLString,
"frontendURL": value.frontendURL ?? "",
"proxiesVideos": value.proxiesVideos ? "true" : "false"
"proxiesVideos": value.proxiesVideos ? "true" : "false",
"invidiousCompanion": value.invidiousCompanion ? "true" : "false"
]
}
@ -33,7 +34,8 @@ struct InstancesBridge: Defaults.Bridge {
let name = object["name"] ?? ""
let frontendURL: String? = object["frontendURL"]!.isEmpty ? nil : object["frontendURL"]
let proxiesVideos = object["proxiesVideos"] == "true"
let invidiousCompanion = object["invidiousCompanion"] == "true"
return Instance(app: app, id: id, name: name, apiURLString: apiURL, frontendURL: frontendURL, proxiesVideos: proxiesVideos)
return Instance(app: app, id: id, name: name, apiURLString: apiURL, frontendURL: frontendURL, proxiesVideos: proxiesVideos, invidiousCompanion: invidiousCompanion)
}
}

View File

@ -79,6 +79,17 @@ final class InstancesModel: ObservableObject {
Defaults[.instances][index] = instance
}
func setInvidiousCompanion(_ instance: Instance, _ invidiousCompanion: Bool) {
guard let index = Defaults[.instances].firstIndex(where: { $0.id == instance.id }) else {
return
}
var instance = Defaults[.instances][index]
instance.invidiousCompanion = invidiousCompanion
Defaults[.instances][index] = instance
}
func remove(_ instance: Instance) {
let accounts = accounts(instance.id)
if let index = Defaults[.instances].firstIndex(where: { $0.id == instance.id }) {

View File

@ -498,7 +498,7 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
indexID: indexID,
live: json["liveNow"].boolValue,
upcoming: json["isUpcoming"].boolValue,
short: length <= Video.shortLength,
short: length <= Video.shortLength && length != 0.0,
publishedAt: publishedAt,
likes: json["likeCount"].int,
dislikes: json["dislikeCount"].int,
@ -655,21 +655,29 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
if json["liveNow"].boolValue {
return hls
}
let videoId = json["videoId"].stringValue
return extractFormatStreams(from: json["formatStreams"].arrayValue) +
extractAdaptiveFormats(from: json["adaptiveFormats"].arrayValue) +
return extractFormatStreams(from: json["formatStreams"].arrayValue, videoId: videoId) +
extractAdaptiveFormats(from: json["adaptiveFormats"].arrayValue, videoId: videoId) +
hls
}
private func extractFormatStreams(from streams: [JSON]) -> [Stream] {
private func extractFormatStreams(from streams: [JSON], videoId: String?) -> [Stream] {
streams.compactMap { stream in
guard let streamURL = stream["url"].url else {
return nil
}
let finalURL: URL
if let videoId, let itag = stream["itag"].string, account.instance.invidiousCompanion {
let companionURLString = "\(account.instance.apiURLString)/latest_version?id=\(videoId)&itag=\(itag)"
finalURL = URL(string: companionURLString) ?? streamURL
} else {
finalURL = streamURL
}
return SingleAssetStream(
instance: account.instance,
avAsset: AVURLAsset(url: streamURL),
avAsset: AVURLAsset(url: finalURL),
resolution: Stream.Resolution.from(resolution: stream["resolution"].string ?? ""),
kind: .stream,
encoding: stream["encoding"].string ?? ""
@ -677,7 +685,7 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
}
}
private func extractAdaptiveFormats(from streams: [JSON]) -> [Stream] {
private func extractAdaptiveFormats(from streams: [JSON], videoId: String?) -> [Stream] {
let audioStreams = streams
.filter { $0["type"].stringValue.starts(with: "audio/mp4") }
.sorted {
@ -692,15 +700,29 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
return videoStreams.compactMap { videoStream in
guard let audioAssetURL = audioStream["url"].url,
let videoAssetURL = videoStream["url"].url
let videoAssetURL = videoStream["url"].url,
let audioItag = audioStream["itag"].string,
let videoItag = videoStream["itag"].string
else {
return nil
}
let finalAudioURL: URL
let finalVideoURL: URL
if let videoId, account.instance.invidiousCompanion {
let audioCompanionURLString = "\(account.instance.apiURLString)/latest_version?id=\(videoId)&itag=\(audioItag)"
let videoCompanionURLString = "\(account.instance.apiURLString)/latest_version?id=\(videoId)&itag=\(videoItag)"
finalAudioURL = URL(string: audioCompanionURLString) ?? audioAssetURL
finalVideoURL = URL(string: videoCompanionURLString) ?? videoAssetURL
} else {
finalAudioURL = audioAssetURL
finalVideoURL = videoAssetURL
}
return Stream(
instance: account.instance,
audioAsset: AVURLAsset(url: audioAssetURL),
videoAsset: AVURLAsset(url: videoAssetURL),
audioAsset: AVURLAsset(url: finalAudioURL),
videoAsset: AVURLAsset(url: finalVideoURL),
resolution: Stream.Resolution.from(resolution: videoStream["resolution"].stringValue),
kind: .adaptive,
encoding: videoStream["encoding"].string,

View File

@ -5,6 +5,7 @@ final class ConstrolsSettingsGroupExporter: SettingsGroupExporter {
override var globalJSON: JSON {
[
"avPlayerUsesSystemControls": Defaults[.avPlayerUsesSystemControls],
"fullscreenPlayerGestureEnabled": Defaults[.fullscreenPlayerGestureEnabled],
"horizontalPlayerGestureEnabled": Defaults[.horizontalPlayerGestureEnabled],
"seekGestureSensitivity": Defaults[.seekGestureSensitivity],
"seekGestureSpeed": Defaults[.seekGestureSpeed],

View File

@ -9,6 +9,10 @@ struct ConstrolsSettingsGroupImporter {
Defaults[.avPlayerUsesSystemControls] = avPlayerUsesSystemControls
}
if let fullscreenPlayerGestureEnabled = json["fullscreenPlayerGestureEnabled"].bool {
Defaults[.fullscreenPlayerGestureEnabled] = fullscreenPlayerGestureEnabled
}
if let horizontalPlayerGestureEnabled = json["horizontalPlayerGestureEnabled"].bool {
Defaults[.horizontalPlayerGestureEnabled] = horizontalPlayerGestureEnabled
}

View File

@ -181,7 +181,9 @@ final class AVPlayerBackend: PlayerBackend {
{
seek(to: 0, seekType: .loopRestart)
}
#if !os(macOS)
model.setAudioSessionActive(true)
#endif
avPlayer.play()
// Setting hasStarted to true the first time player started
@ -196,7 +198,9 @@ final class AVPlayerBackend: PlayerBackend {
guard avPlayer.timeControlStatus != .paused else {
return
}
#if !os(macOS)
model.setAudioSessionActive(false)
#endif
avPlayer.pause()
model.objectWillChange.send()
}
@ -210,6 +214,9 @@ final class AVPlayerBackend: PlayerBackend {
}
func stop() {
#if !os(macOS)
model.setAudioSessionActive(false)
#endif
avPlayer.replaceCurrentItem(with: nil)
hasStarted = false
}
@ -364,11 +371,7 @@ final class AVPlayerBackend: PlayerBackend {
let startPlaying = {
#if !os(macOS)
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch {
self.logger.error("Error setting up audio session: \(error)")
}
self.model.setAudioSessionActive(true)
#endif
self.setRate(self.model.currentRate)

View File

@ -23,15 +23,14 @@ final class MPVBackend: PlayerBackend {
var stream: Stream?
var video: Video?
var captions: Captions? { didSet {
guard let captions else {
if client?.areSubtitlesAdded == true {
client?.removeSubs()
var captions: Captions? {
didSet {
Task {
await handleCaptionsChange()
}
return
}
addSubTrack(captions.url)
}}
}
var currentTime: CMTime?
var loadedVideo = false
@ -253,11 +252,7 @@ final class MPVBackend: PlayerBackend {
let startPlaying = {
#if !os(macOS)
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch {
self.logger.error("Error setting up audio session: \(error)")
}
self.model.setAudioSessionActive(true)
#endif
DispatchQueue.main.async { [weak self] in
@ -359,6 +354,9 @@ final class MPVBackend: PlayerBackend {
}
func play() {
#if !os(macOS)
model.setAudioSessionActive(true)
#endif
startClientUpdates()
startRefreshRateUpdates()
@ -387,6 +385,9 @@ final class MPVBackend: PlayerBackend {
}
func pause() {
#if !os(macOS)
model.setAudioSessionActive(false)
#endif
stopClientUpdates()
stopRefreshRateUpdates()
@ -408,6 +409,9 @@ final class MPVBackend: PlayerBackend {
}
func stop() {
#if !os(macOS)
model.setAudioSessionActive(false)
#endif
stopClientUpdates()
stopRefreshRateUpdates()
client?.stop()
@ -617,10 +621,14 @@ final class MPVBackend: PlayerBackend {
}
func addSubTrack(_ url: URL) {
if client?.areSubtitlesAdded == true {
client?.removeSubs()
Task {
if let areSubtitlesAdded = client?.areSubtitlesAdded {
if await areSubtitlesAdded() {
await client?.removeSubs()
}
}
await client?.addSubTrack(url)
}
client?.addSubTrack(url)
}
func setVideoToAuto() {
@ -684,6 +692,17 @@ final class MPVBackend: PlayerBackend {
}
}
private func handleCaptionsChange() async {
guard let captions else {
if let isSubtitlesAdded = client?.areSubtitlesAdded, await isSubtitlesAdded() {
await client?.removeSubs()
}
return
}
addSubTrack(captions.url)
}
private func handlePropertyChange(_ name: String, _ property: mpv_event_property) {
switch name {
case "pause":

View File

@ -80,13 +80,15 @@ final class MPVClient: ObservableObject {
checkError(mpv_set_option_string(mpv, "initial-audio-sync", Defaults[.mpvInitialAudioSync] ? "yes" : "no"))
// Enable VSYNC needed for `video-sync`
checkError(mpv_set_option_string(mpv, "opengl-swapinterval", "1"))
checkError(mpv_set_option_string(mpv, "video-sync", "display-resample"))
checkError(mpv_set_option_string(mpv, "interpolation", "yes"))
checkError(mpv_set_option_string(mpv, "tscale", "mitchell"))
checkError(mpv_set_option_string(mpv, "tscale-window", "blackman"))
checkError(mpv_set_option_string(mpv, "vd-lavc-framedrop", "nonref"))
checkError(mpv_set_option_string(mpv, "display-fps-override", "\(String(getScreenRefreshRate()))"))
if Defaults[.mpvSetRefreshToContentFPS] {
checkError(mpv_set_option_string(mpv, "opengl-swapinterval", "1"))
checkError(mpv_set_option_string(mpv, "video-sync", "display-resample"))
checkError(mpv_set_option_string(mpv, "interpolation", "yes"))
checkError(mpv_set_option_string(mpv, "tscale", "mitchell"))
checkError(mpv_set_option_string(mpv, "tscale-window", "blackman"))
checkError(mpv_set_option_string(mpv, "vd-lavc-framedrop", "nonref"))
checkError(mpv_set_option_string(mpv, "display-fps-override", "\(String(getScreenRefreshRate()))"))
}
// CPU //
@ -349,21 +351,15 @@ final class MPVClient: ObservableObject {
return Int(fps.rounded())
}
var areSubtitlesAdded: Bool {
func areSubtitlesAdded() async -> Bool {
guard !mpv.isNil else { return false }
// Retrieve the number of tracks
let trackCount = getInt("track-list/count")
let trackCount = await Task(operation: { getInt("track-list/count") }).value
guard trackCount > 0 else { return false }
for index in 0 ..< trackCount {
// Get the type of each track
if let trackType = getString("track-list/\(index)/type"), trackType == "sub" {
// Check if the subtitle track is currently selected
let selected = getInt("track-list/\(index)/selected")
if selected == 1 {
return true
}
if let trackType = await Task(operation: { getString("track-list/\(index)/type") }).value, trackType == "sub" {
return true
}
}
return false
@ -539,12 +535,16 @@ final class MPVClient: ObservableObject {
command("video-add", args: [url.absoluteString])
}
func addSubTrack(_ url: URL) {
command("sub-add", args: [url.absoluteString])
func addSubTrack(_ url: URL) async {
await Task {
command("sub-add", args: [url.absoluteString])
}.value
}
func removeSubs() {
command("sub-remove")
func removeSubs() async {
await Task {
command("sub-remove")
}.value
}
func setVideoToAuto() {

View File

@ -232,6 +232,14 @@ final class PlayerModel: ObservableObject {
name: AVAudioSession.interruptionNotification,
object: nil
)
// Register for audio session route change notifications
NotificationCenter.default.addObserver(
self,
selector: #selector(handleRouteChange(_:)),
name: AVAudioSession.routeChangeNotification,
object: AVAudioSession.sharedInstance()
)
#endif
playbackMode = Defaults[.playbackMode]
@ -250,7 +258,15 @@ final class PlayerModel: ObservableObject {
#if !os(macOS)
deinit {
NotificationCenter.default.removeObserver(self, name: AVAudioSession.interruptionNotification, object: nil)
NotificationCenter.default.removeObserver(
self, name: AVAudioSession.interruptionNotification, object: nil
)
NotificationCenter.default.removeObserver(
self,
name: AVAudioSession.routeChangeNotification,
object: AVAudioSession.sharedInstance()
)
}
#endif
@ -1276,12 +1292,27 @@ final class PlayerModel: ObservableObject {
}
#if !os(macOS)
func setAudioSessionActive(_ setActive: Bool) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
do {
try AVAudioSession.sharedInstance().setActive(setActive)
} catch {
self.logger.error("Error setting up audio session: \(error)")
}
}
}
@objc func handleAudioSessionInterruption(_ notification: Notification) {
logger.info("Audio session interruption received.")
logger.info("Notification received: \(notification)")
logger.info("Notification object: \(String(describing: notification.object))")
guard let info = notification.userInfo,
let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
guard let info = notification.userInfo else {
logger.info("userInfo is missing in the notification.")
return
}
// Extract the interruption type
guard let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
let type = AVAudioSession.InterruptionType(rawValue: typeValue)
else {
logger.info("AVAudioSessionInterruptionTypeKey is missing or not a UInt in userInfo.")
@ -1290,23 +1321,103 @@ final class PlayerModel: ObservableObject {
logger.info("Interruption type received: \(type)")
// Check availability for iOS 14.5 or newer to handle interruption reason
// Currently only for debugging purpose
#if os(iOS)
if #available(iOS 14.5, *) {
// Extract the interruption reason, if available
if let reasonValue = info[AVAudioSessionInterruptionReasonKey] as? UInt,
let reason = AVAudioSession.InterruptionReason(rawValue: reasonValue)
{
logger.info("Interruption reason received: \(reason)")
switch reason {
case .default:
logger.info("Interruption reason: Default or unspecified interruption occurred.")
case .appWasSuspended:
logger.info("Interruption reason: The app was suspended during the interruption.")
@unknown default:
logger.info("Unknown interruption reason received.")
}
} else {
logger.info("AVAudioSessionInterruptionReasonKey is missing or not a UInt in userInfo.")
}
} else {
logger.info("Interruption reason handling is not available on this iOS version.")
}
#endif
// Handle the specific interruption type
switch type {
case .began:
logger.info("Audio session interrupted.")
// We need to call pause() to set all variables correctly, and play()
// directly afterwards, because the .began interrupt is sent after audio
// ducking ended and playback would pause. Audio ducking usually happens
// when using headphones.
pause()
play()
logger.info("Audio session interrupted (began).")
case .ended:
// Extract any interruption options, if available
if let optionsValue = info[AVAudioSessionInterruptionOptionKey] as? UInt {
logger.info("Interruption options received: \(optionsValue)")
if optionsValue & AVAudioSession.InterruptionOptions.shouldResume.rawValue != 0 {
play()
logger.info("Interruption option indicates playback should resume automatically.")
} else {
logger.info("Interruption option indicates playback should not resume automatically.")
}
} else {
logger.info("AVAudioSessionInterruptionOptionKey is missing or not a UInt in userInfo.")
}
logger.info("Audio session interruption ended.")
// We need to call pause() to set all variables correctly.
// Otherwise, playback does not resume when the interruption ends.
pause()
play()
// Check if audio was resumed or if there's any indication of ducking
let currentVolume = AVAudioSession.sharedInstance().outputVolume
logger.info("Current output volume: \(currentVolume)")
default:
break
logger.info("Unknown interruption type received.")
}
}
@objc func handleRouteChange(_ notification: Notification) {
logger.info("Audio route change received.")
guard let info = notification.userInfo else {
logger.info("userInfo is missing in the notification.")
return
}
guard let reasonValue = info[AVAudioSessionRouteChangeReasonKey] as? UInt,
let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue)
else {
logger.info("AVAudioSessionRouteChangeReasonKey is missing or not a UInt in userInfo.")
return
}
logger.info("Route change reason received: \(reason)")
let currentCategory = AVAudioSession.sharedInstance().category
logger.info("Current audio session category before change: \(currentCategory)")
switch reason {
case .categoryChange:
logger.info("Audio session category changed.")
let newCategory = AVAudioSession.sharedInstance().category
logger.info("New audio session category: \(newCategory)")
case .oldDeviceUnavailable, .newDeviceAvailable:
logger.info("Audio route change may indicate ducking or device change.")
let currentRoute = AVAudioSession.sharedInstance().currentRoute
logger.info("Current audio route: \(currentRoute)")
for output in currentRoute.outputs {
logger.info("Output port type: \(output.portType), UID: \(output.uid)")
switch output.portType {
case .headphones, .bluetoothA2DP:
logger.info("Detected port type \(output.portType). Executing play().")
play()
default:
logger.info("Detected port type \(output.portType). Executing pause().")
pause()
}
}
case .noSuitableRouteForCategory:
logger.info("No suitable route for the current category.")
default:
logger.info("Unhandled route change reason: \(reason)")
}
}
#endif

View File

@ -116,6 +116,7 @@ extension Defaults.Keys {
static let avPlayerUsesSystemControls = Key<Bool>("avPlayerUsesSystemControls", default: Constants.isTvOS)
static let horizontalPlayerGestureEnabled = Key<Bool>("horizontalPlayerGestureEnabled", default: true)
static let fullscreenPlayerGestureEnabled = Key<Bool>("fullscreenPlayerGestureEnabled", default: true)
static let seekGestureSensitivity = Key<Double>("seekGestureSensitivity", default: 30.0)
static let seekGestureSpeed = Key<Double>("seekGestureSpeed", default: 0.5)

View File

@ -15,7 +15,7 @@ struct AppSidebarNavigation: View {
var body: some View {
#if os(iOS)
content.introspect(.viewController, on: .iOS(.v15, .v16, .v17)) { viewController in
content.introspect(.viewController, on: .iOS(.v15, .v16, .v17, .v18)) { viewController in
// workaround for an empty supplementary view on launch
// the supplementary view is determined by the default selection inside the
// primary view, but the primary view is not loaded so its selection is not read

View File

@ -5,6 +5,8 @@ struct ControlsOverlay: View {
@ObservedObject private var player = PlayerModel.shared
private var model = PlayerControlsModel.shared
@State private var availableCaptions: [Captions] = []
@State private var isLoadingCaptions = true
@State private var contentSize: CGSize = .zero
@Default(.showMPVPlaybackStats) private var showMPVPlaybackStats
@ -335,7 +337,6 @@ struct ControlsOverlay: View {
Image(systemName: "text.bubble")
if let captions = captionsBinding.wrappedValue,
let language = LanguageCodes(rawValue: captions.code)
{
Text("\(language.description.capitalized) (\(language.rawValue))")
.foregroundColor(.accentColor)
@ -380,17 +381,16 @@ struct ControlsOverlay: View {
.contextMenu {
Button("Disabled") { captionsBinding.wrappedValue = nil }
ForEach(player.currentVideo?.captions ?? []) { caption in
ForEach(availableCaptions) { caption in
Button(caption.description) { captionsBinding.wrappedValue = caption }
}
Button("Cancel", role: .cancel) {}
}
#endif
}
@ViewBuilder private var captionsPicker: some View {
let captions = player.currentVideo?.captions ?? []
let captions = availableCaptions
Picker("Captions", selection: captionsBinding) {
if captions.isEmpty {
Text("Not available").tag(Captions?.none)
@ -402,6 +402,31 @@ struct ControlsOverlay: View {
}
}
.disabled(captions.isEmpty)
.onAppear {
loadCaptions()
}
}
private func loadCaptions() {
isLoadingCaptions = true
// Fetch captions asynchronously
Task {
let fetchedCaptions = await fetchCaptions()
await MainActor.run {
// Update state on the main thread
self.availableCaptions = fetchedCaptions
self.isLoadingCaptions = false
}
}
}
private func fetchCaptions() async -> [Captions] {
// Access currentVideo from the main actor context
await MainActor.run {
// Safely access the main actor-isolated currentVideo property
player.currentVideo?.captions ?? []
}
}
private var captionsBinding: Binding<Captions?> {

View File

@ -11,6 +11,7 @@ final class MPVOGLView: GLKView {
var mpvGL: UnsafeMutableRawPointer?
var queue = DispatchQueue(label: "stream.yattee.opengl", qos: .userInteractive)
var needsDrawing = true
private var dirtyRegion: CGRect?
override init(frame: CGRect) {
guard let context = EAGLContext(api: .openGLES2) else {
@ -85,6 +86,7 @@ final class MPVOGLView: GLKView {
@objc private func updateFrame() {
// Trigger the drawing process if needed
if needsDrawing {
markRegionAsDirty(bounds)
setNeedsDisplay()
}
}
@ -100,16 +102,60 @@ final class MPVOGLView: GLKView {
glClear(UInt32(GL_COLOR_BUFFER_BIT))
}
// Function to set a dirty region when a part of the screen changes
func markRegionAsDirty(_ region: CGRect) {
if dirtyRegion == nil {
dirtyRegion = region
} else {
// Expand the dirty region to include the new region
dirtyRegion = dirtyRegion!.union(region)
}
}
// Logic to decide if only part of the screen needs updating
private func needsPartialUpdate() -> Bool {
// Check if there is a defined dirty region that needs updating
if let dirtyRegion, !dirtyRegion.isEmpty {
// Set up glScissor based on dirtyRegion coordinates
glScissor(GLint(dirtyRegion.origin.x), GLint(dirtyRegion.origin.y), GLsizei(dirtyRegion.width), GLsizei(dirtyRegion.height))
return true
}
return false
}
// Call this function when you know the entire screen needs updating
private func clearDirtyRegion() {
dirtyRegion = nil
}
override func draw(_: CGRect) {
guard needsDrawing, let mpvGL else { return }
// Ensure the correct context is set
guard EAGLContext.setCurrent(context) else {
logger.error("Failed to set current OpenGL context.")
return
}
// Bind the default framebuffer
glGetIntegerv(UInt32(GL_FRAMEBUFFER_BINDING), &defaultFBO!)
// Ensure the framebuffer is valid
guard defaultFBO != nil && defaultFBO! != 0 else {
logger.error("Invalid framebuffer ID.")
return
}
// Get the current viewport dimensions
var dims: [GLint] = [0, 0, 0, 0]
glGetIntegerv(GLenum(GL_VIEWPORT), &dims)
// Check if we need partial updates
if needsPartialUpdate() {
logger.info("Performing partial update with scissor test.")
glEnable(GLenum(GL_SCISSOR_TEST))
}
// Set up the OpenGL FBO data
var data = mpv_opengl_fbo(
fbo: Int32(defaultFBO!),
@ -129,9 +175,23 @@ final class MPVOGLView: GLKView {
mpv_render_param(type: MPV_RENDER_PARAM_FLIP_Y, data: flipPtr),
mpv_render_param()
]
mpv_render_context_render(OpaquePointer(mpvGL), &params)
// Call the render function and check for errors
let result = mpv_render_context_render(OpaquePointer(mpvGL), &params)
if result < 0 {
logger.error("mpv_render_context_render() failed with error code: \(result)")
} else {
logger.info("mpv_render_context_render() called successfully.")
}
}
}
// Disable the scissor test after rendering if it was enabled
if needsPartialUpdate() {
glDisable(GLenum(GL_SCISSOR_TEST))
}
// Clear dirty region after drawing
clearDirtyRegion()
}
}

View File

@ -43,7 +43,7 @@ struct PlayerBackendView: View {
Color.clear
.onAppear { player.playerSize = proxy.size }
.onChange(of: proxy.size) { _ in player.playerSize = proxy.size }
.onChange(of: player.controls.presentingOverlays) { _ in player.playerSize = proxy.size }
.onChange(of: player.currentItem?.id) { _ in player.playerSize = proxy.size }
})
#if !os(tvOS)

View File

@ -56,14 +56,13 @@ extension VideoPlayerView {
player.seek.gestureStart = time
}
let timeSeek = (time / player.playerSize.width) * horizontalDrag * seekGestureSpeed
player.seek.gestureSeek = timeSeek
}
return
}
// Toggle fullscreen on upward drag only when not disabled
if verticalDrag < -50 {
if fullscreenPlayerGestureEnabled, verticalDrag < -50 {
player.toggleFullScreenAction()
disableGestureTemporarily()
return
@ -80,6 +79,54 @@ extension VideoPlayerView {
}
}
var detailsDragGesture: some Gesture {
DragGesture(minimumDistance: 30)
.onChanged { value in
handleDetailsDragChange(value)
}
.onEnded { value in
handleDetailsDragEnd(value)
}
}
private func handleDetailsDragChange(_ value: DragGesture.Value) {
let maxOffset = -player.playerSize.height
// Continuous drag update for smooth movement of VideoDetails
if fullScreenDetails {
// Allow only downward dragging when in fullscreen
if value.translation.height > 0 {
detailViewDragOffset = min(value.translation.height, abs(maxOffset))
}
} else {
// Allow only upward dragging when not in fullscreen
if value.translation.height < 0 {
detailViewDragOffset = max(value.translation.height, maxOffset)
}
}
}
private func handleDetailsDragEnd(_ value: DragGesture.Value) {
if value.translation.height < -50, !fullScreenDetails {
// Swipe up to enter fullscreen
withAnimation(Constants.overlayAnimation) {
fullScreenDetails = true
detailViewDragOffset = 0
}
} else if value.translation.height > 50, fullScreenDetails {
// Swipe down to exit fullscreen
withAnimation(Constants.overlayAnimation) {
fullScreenDetails = false
detailViewDragOffset = 0
}
} else {
// Reset offset if drag was not significant
withAnimation(Constants.overlayAnimation) {
detailViewDragOffset = 0
}
}
}
func onPlayerDragGestureEnded() {
if horizontalPlayerGestureEnabled, isHorizontalDrag {
isHorizontalDrag = false
@ -108,7 +155,6 @@ extension VideoPlayerView {
}
}
// Function to temporarily disable the toggle gesture after a fullscreen change
private func disableGestureTemporarily() {
disableToggleGesture = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {

View File

@ -223,7 +223,7 @@ struct VideoDetails: View {
.frame(maxWidth: .infinity, alignment: .leading)
.contentShape(Rectangle())
.padding(.horizontal, 16)
// swiftlint:disable trailing_closure
// TODO: when setting tvOS minimum to 16, the platform modifier can be removed
#if !os(tvOS)
.simultaneousGesture( // Simultaneous gesture to prioritize button tap
@ -234,7 +234,7 @@ struct VideoDetails: View {
}
)
#endif
// swiftlint:enable trailing_closure
if VideoActions().isAnyActionVisible() {
VideoActions(video: player.videoForDisplay)
.padding(.vertical, 5)

View File

@ -24,13 +24,12 @@ struct VideoPlayerView: View {
#if os(macOS)
335
#else
200
140
#endif
}
@State private var playerSize: CGSize = .zero { didSet { updateSidebarQueue() } }
@State private var hoveringPlayer = false
@State private var fullScreenDetails = false
@State private var sidebarQueue = defaultSidebarQueueValue
@Environment(\.colorScheme) private var colorScheme
@ -51,12 +50,14 @@ struct VideoPlayerView: View {
@State var isHorizontalDrag = false
@State var isVerticalDrag = false
@State var viewDragOffset = Self.hiddenOffset
@State var detailViewDragOffset: Double = 0
// swiftlint:enable private_swiftui_state
#endif
// swiftlint:disable private_swiftui_state
@State var disableToggleGesture = false
@State var fullScreenDetails = false
// swiftlint:enable private_swiftui_state
@ObservedObject var player = PlayerModel.shared // swiftlint:disable:this swiftui_state_private
@ -66,6 +67,7 @@ struct VideoPlayerView: View {
#endif
@Default(.horizontalPlayerGestureEnabled) var horizontalPlayerGestureEnabled
@Default(.fullscreenPlayerGestureEnabled) var fullscreenPlayerGestureEnabled
@Default(.seekGestureSpeed) var seekGestureSpeed
@Default(.seekGestureSensitivity) var seekGestureSensitivity
@Default(.playerSidebar) var playerSidebar
@ -307,6 +309,8 @@ struct VideoPlayerView: View {
#endif
.id(player.currentVideo?.cacheKey)
.transition(.opacity)
.offset(y: detailViewDragOffset)
.gesture(detailsDragGesture)
} else {
VStack {}
}

View File

@ -9,7 +9,7 @@ struct FocusableSearchTextField: View {
var body: some View {
SearchTextField()
#if os(macOS)
.introspect(.textField, on: .macOS(.v12, .v13, .v14)) { textField in
.introspect(.textField, on: .macOS(.v12, .v13, .v14, .v15)) { textField in
state.textField = textField
}
.onAppear {
@ -18,7 +18,7 @@ struct FocusableSearchTextField: View {
}
}
#elseif os(iOS)
.introspect(.textField, on: .iOS(.v15, .v16, .v17)) { textField in
.introspect(.textField, on: .iOS(.v15, .v16, .v17, .v18)) { textField in
state.textField = textField
}
.onChange(of: state.focused) { newValue in

View File

@ -8,6 +8,7 @@ struct InstanceSettings: View {
@State private var frontendURL = ""
@State private var proxiesVideos = false
@State private var invidiousCompanion = false
var body: some View {
List {
@ -87,6 +88,16 @@ struct InstanceSettings: View {
InstancesModel.shared.setProxiesVideos(instance, newValue)
}
}
if instance.app == .invidious {
invidiousCompanionToggle
.onAppear {
invidiousCompanion = instance.invidiousCompanion
}
.onChange(of: invidiousCompanion) { newValue in
InstancesModel.shared.setInvidiousCompanion(instance, newValue)
}
}
}
#if os(tvOS)
.frame(maxWidth: 1000)
@ -101,6 +112,10 @@ struct InstanceSettings: View {
Toggle("Proxy videos", isOn: $proxiesVideos)
}
private var invidiousCompanionToggle: some View {
Toggle("Invidious companion", isOn: $invidiousCompanion)
}
private func removeAccount(_ account: Account) {
AccountsModel.remove(account)
accountsChanged.toggle()

View File

@ -8,6 +8,7 @@ struct PlayerControlsSettings: View {
@Default(.playerControlsLayout) private var playerControlsLayout
@Default(.fullScreenPlayerControlsLayout) private var fullScreenPlayerControlsLayout
@Default(.horizontalPlayerGestureEnabled) private var horizontalPlayerGestureEnabled
@Default(.fullscreenPlayerGestureEnabled) private var fullscreenPlayerGestureEnabled
@Default(.seekGestureSpeed) private var seekGestureSpeed
@Default(.seekGestureSensitivity) private var seekGestureSensitivity
@Default(.buttonBackwardSeekDuration) private var buttonBackwardSeekDuration
@ -64,9 +65,10 @@ struct PlayerControlsSettings: View {
@ViewBuilder var sections: some View {
#if !os(tvOS)
Section(header: SettingsHeader(text: "Controls".localized()), footer: controlsLayoutFooter) {
#if !os(tvOS)
avPlayerUsesSystemControlsToggle
Section(header: SettingsHeader(text: "Player Controls".localized()), footer: controlsLayoutFooter) {
avPlayerUsesSystemControlsToggle
#if os(iOS)
fullscreenPlayerGestureEnabledToggle
#endif
horizontalPlayerGestureEnabledToggle
SettingsHeader(text: "Seek gesture sensitivity".localized(), secondary: true)
@ -112,7 +114,7 @@ struct PlayerControlsSettings: View {
}
var controlsButtonsSection: some View {
Section(header: SettingsHeader(text: "Controls Buttons".localized())) {
Section(header: SettingsHeader(text: "Player Control Buttons".localized())) {
controlButtonToggles
}
}
@ -157,8 +159,12 @@ struct PlayerControlsSettings: View {
#endif
}
private var fullscreenPlayerGestureEnabledToggle: some View {
Toggle("Swipe up toggles fullscreen", isOn: $fullscreenPlayerGestureEnabled)
}
private var horizontalPlayerGestureEnabledToggle: some View {
Toggle("Seek with horizontal swipe on video", isOn: $horizontalPlayerGestureEnabled)
Toggle("Seek with horizontal swipe", isOn: $horizontalPlayerGestureEnabled)
}
private var avPlayerUsesSystemControlsToggle: some View {

View File

@ -54,7 +54,7 @@
"Connected successfully (%@)" = "تم الاتصال بنجاح (%@)";
"Country" = "البلد";
"Country Name or Code" = "اسم الدولة أو الرمز";
"Copy %@ link" = "نسخ رابط %@";
"Copy %@ link" = "نسخ رابط%@";
"Contributing" = "المساهمة";
"Contact" = "التواصل";
"Continue from %@" = "الإستمرار من %@";

View File

@ -4,7 +4,7 @@
"Accounts" = "Konten";
"Add Account" = "Konto hinzufügen";
"Add Location" = "Ort hinzufügen";
"Add Location..." = "Ort hinzufügen …";
"Add Location..." = "Standort hinzufügen …";
"Add to Playlist" = "Zu Wiedergabeliste hinzufügen";
"Backend" = "Backend";
"Badge color" = "Markierungsfarbe";

View File

@ -398,7 +398,7 @@
"Hardware decoder" = "Décodeur matériel";
"Stream FPS" = "IPS du flux";
"Cached time" = "Temps mis en cache";
"Dropped frames" = "Images perdus";
"Dropped frames" = "Images perdues";
"Any format" = "Tout formats";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "La liste de lecture est vide\n\nAppuyez longuement sur une vidéo, puis sur\n\"Ajouter à la liste de lecture\"";
"Comments are disabled" = "Les commentaires sont désactivés";

View File

@ -0,0 +1,564 @@
" subscribers" = " feliratkozók";
"%@ Channel" = "%@ Csatorna";
"%@ Playlist" = "%@ Lejátszási lista";
"10 seconds forwards/backwards" = "10 másodperc előre/vissza";
"%@ subscribers" = "%@ feliratkozók";
"%lld videos" = "%lld videók";
"No results" = "Nincsenek találatok";
"No Playlists" = "Nincsenek lejátszási listák";
"Mark video as watched after playing" = "Jelölje meg a videót megtekintettként lejátszás után";
"Mark watched videos with" = "Megtekintett videók megjelölése a következővel";
"Matrix Channel" = "Matrix csatorna";
"Find Other" = "Egyebek keresése";
"Hour" = "Óra";
"Month" = "Hónap";
"Save history of played videos" = "Lejátszott videókelőzmények mentése";
"Playlists" = "Lejátszási listák";
"Reset search filters" = "Keresési szűrők visszaállítása";
"Promoting a product or service that is directly related to the creator themselves. This usually includes merchandise or promotion of monetized platforms." = "Olyan termék vagy szolgáltatás népszerűsítése, amely közvetlenül kapcsolódik az alkotóhoz. Ez általában magában foglalja az árucikkeket vagy a pénzzel fizetett platformok reklámozását.";
"Orientation" = "Tájolás";
"Clear Queue before opening" = "Várólista kiürítése megnyitás előtt";
"Remove from the queue" = "Eltávolítás a várólistáról";
"Part of a video promoting a product or service not directly related to the creator. The creator will receive payment or compensation in the form of money or free products." = "A videó egy olyan termék vagy szolgáltatás népszerűsítésére szolgáló része, amely nem kapcsolódik közvetlenül az alkotóhoz. Az alkotó fizetést vagy kompenzációt kap pénz vagy ingyenes termékek formájában.";
"Rotate to portrait when exiting fullscreen" = "Forduljon fekvő módba a teljes képernyőből való kilépéskor";
"Pause" = "Szünet";
"Profiles" = "Profilok";
"Resolution" = "Felbontás";
"Round corners" = "Kerekített sarkok";
"Sign In Required" = "Bejelentkezés szükséges";
"When partially watched video is played" = "Részlegesen megtekintett videó lejátszásakor";
"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." = "Olyan szegmensek, amelyek jellemzően egy videó elején találhatók, és olyan animációt, állóképet vagy klipet tartalmaznak, amelyek ugyanazon alkotó más videóiban is láthatók.";
"Sort" = "Rendezés";
"Shuffle" = "Keverés";
"Seek gesture speed" = "Keresési gesztus sebessége";
"You can use automatic profile selection based on current device status or switch it in video playback settings controls." = "Használhatja az automatikus profilválasztást az eszköz aktuális állapota alapján, vagy átkapcsolhatja a videólejátszás beállításainak vezérlőelemein.";
"Seek with horizontal swipe on video" = "Keresés vízszintes húzással videón";
"Short" = "Rövid";
"Show keywords" = "Kulcsszavak megjelenítése";
"Welcome" = "Üdvözöljük";
"Sort: %@" = "Rendezés: %@";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Ezt nem lehet visszaállítani. Előfordulhat, hogy váltania kell a nézetek között, vagy újra kell indítania az alkalmazást, hogy láthassa a változásokat.";
"That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development." = "Ezt jó hallani. Jó móka olyan alkalmazásokat kézbesíteni, amelyeket mások is használni akarnak. Fontolja meg, hogy adományoz a projektnek, vagy közreműködhet az új funkciók fejlesztéséhez való hozzájárulással.";
"Wi-Fi" = "Wi-Fi";
"Accounts" = "Fiókok";
"Accounts are not supported for the application of this instance" = "A fiókok nem támogatottak ennek a példánynak az alkalmazása során";
"Add Account" = "Fiók hozzáadása";
"Add Account..." = "Fiók hozzáadása...";
"Add Location" = "Hely hozzáadása";
"Add Location..." = "Hely hozzáadása..";
"Add profile..." = "Profil hozzáadása...";
"Add Quality Profile" = "Minőségi profil hozzáadása";
"Add to %@" = "Hozzáadás a következőhöz: %@";
"Add to Favorites" = "Hozzáadás a kedvencekhez";
"Add to Playlist" = "Hozzáadás a lejátszási listához";
"Add to Playlist..." = "Hozzáadás a lejátszási listához...";
"Advanced" = "Speciális";
"All" = "Összes";
"Always use AVPlayer for live videos" = "Mindig az a AVPlayer-t használja az élő videókhoz";
"Anonymous" = "Névtelen";
"Any" = "Bármely";
"Apply to all" = "Alkalmazás az összesre";
"Are you sure you want to clear history of watched videos?" = "Biztosan törölni szeretné a megtekintett videók előzményeit?";
"Are you sure you want to clear search history?" = "Biztosan törölni szeretné a keresési előzményeket?";
"Are you sure you want to delete playlist?" = "Biztosan törölni szeretné a lejátszási listát?";
"Are you sure you want to restore default quality profiles?" = "Biztosan vissza szeretné állítani az alapértelmezett minőségi profilokat?";
"Are you sure you want to unsubscribe from %@?" = "Biztosan le szeretne iratkozni a(z) %@ szolgáltatásról?";
"Automatic" = "Automatikus";
"Autoplaying Next" = "Következő videó automatikus lejátszása";
"Backend" = "Háttérszolgáltatás";
"Badge" = "Címke";
"Badge & Decreased opacity" = "Címke és csökkentett átlátszóság";
"Badge color" = "Címke színe";
"Based on system color scheme" = "Rendszer színséma alapján";
"Battery" = "Akkumulátor";
"Blue" = "Kék";
"Browsing" = "Böngészés";
"Buffering stream..." = "Adatfolyam pufferelése...";
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "A hibákat és nagyszerű funkcióötleteket a GitHub hibakövető rendszerébe beküldheti. ";
"Button" = "Gomb";
"Cancel" = "Mégse";
"Captions" = "Feliratok";
"Categories to Skip" = "Kihagyni kívánt kategóriák";
"Category" = "Kategória";
"Cellular" = "Mobil";
"Chapters" = "Fejezetek";
"Charging" = "Töltés";
"Clear" = "Kiürítés";
"Clear All" = "Összes kiürítése";
"Clear All Recents" = "Összes legutóbbi törlése";
"Clear History" = "Előzmények törlése";
"Clear Search History" = "Keresési előzmények törlése";
"Clear Search History..." = "Keresési előzmények törlése...";
"Clear the queue" = "Várólista törlése";
"Close" = "Bezárás";
"Close PiP and open player when application enters foreground" = "PiP bezárása és a lejátszó megnyitása, amikor az alkalmazás előtérbe kerül";
"Close PiP when player is opened" = "PiP bezárása a lejátszó megnyitásakor";
"Close PiP when starting playing other video" = "PiP bezárása más videó lejátszásának megkezdésekor";
"Close player when closing video" = "Lejátszó bezárása a videó bezárásakor";
"Close player when starting PiP" = "Lejátszó bezárása PiP indításakor";
"Close Video" = "Videó bezárása";
"Comments" = "Hozzászólások";
"Connected successfully (%@)" = "Sikeres csatlakozás (%@)";
"Connection failed" = "A kapcsolat sikertelen";
"Contact" = "Névjegy";
"Continue" = "Folytatás";
"Close video after playing last in the queue" = "Videó bezárása a várólistában lévő utolsó lejátszás után";
"Continue from %@" = "Folytatás ettől: %@";
"Contributing" = "Közreműködés";
"Controls" = "Vezérlők";
"Copy %@ link" = "%@ hivatkozás másolása";
"Copy %@ link with time" = "%@ hivatkozás másolása idővel";
"Country" = "Ország";
"Country Name or Code" = "Országnév vagy országkód";
"Create Playlist" = "Lejátszási lista létrehozása";
"Current: %@\n%@" = "Jelenlegi: %@\n%@";
"Custom" = "Egyéni";
"Custom Locations" = "Egyéni helyek";
"Date" = "Dátum";
"Decrease rate" = "Arány csökkentése";
"Decreased opacity" = "Csökkentett átlátszatlanság";
"Delete" = "Törlés";
"Disabled" = "Letiltva";
"Discord Server" = "Discord-kiszolgáló";
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "A beszélgetések a Discordon és a Matrixon zajlanak. Ez egy jó hely az általános kérdésekre.";
"Could not load locations manifest" = "Nem sikerült betölteni a helyek listáját";
"Don't use public locations" = "Ne használjon nyilvános helyeket";
"Donations" = "Adományok";
"Done" = "Kész";
"Duration" = "Időtartam";
"Edit" = "Szerkesztés";
"Edit Playlist" = "Lejátszási lista szerkesztése";
"Edit Quality Profile" = "Minőségi profil szerkesztése";
"Edit..." = "Szerkesztés...";
"Enable logging" = "Naplózás engedélyezése";
"Enable Return YouTube Dislike" = "Youtube Dislike visszahozásának engedélyezése";
"Enter fullscreen in landscape" = "Teljes képernyőre váltás fekvőben";
"Error" = "Hiba";
"Error when accessing playlist" = "Hiba a lejátszási lista elérésekor";
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Kifejezett emlékeztetők arra, hogy lájkolják, feliratkozzanak vagy interakcióba lépjenek velük bármely fizetős vagy ingyenes platform(ok)on (pl. kattintsanak egy videóra).";
"Favorites" = "Kedvencek";
"Filter" = "Szűrő";
"Filter: active" = "Szűrő: aktív";
"Finding something to play..." = "Valami lejátszható keresése...";
"For videos which feature music as the primary content." = "Olyan videók esetében, amelyek elsődleges tartalma a zene.";
"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "A formátumok a felsorolt sorrendben kerülnek kiválasztásra.\nA HLS adaptív formátum (a felbontás beállítására nem érvényes).";
"Frontend URL" = "Előtétprogram webcíme";
"Fullscreen size" = "Teljes képernyő mérete";
"Gaming" = "Játék";
"Help" = "Súgó";
"Hide sidebar" = "Oldalsáv elrejtése";
"High" = "Magas";
"Highest" = "Legmagasabb";
"Highest quality" = "Legmagasabb minőség";
"History" = "Előzmények";
"Honor orientation lock" = "Tájolás zárolása";
"I am lost" = "Elvesztem";
"I found a bug /" = "Találtam egy hibát /";
"I have a feature request" = "Van egy funkció kérésem";
"I like this app!" = "Tetszik ez az alkalmazás!";
"I want to ask a question" = "Szeretnék feltenni egy kérdést";
"If you are interested what's coming in future updates, you can track project Milestones." = "Ha érdekli Önt, hogy mi várható a jövőbeni frissítésekben, akkor nyomon követheti a projekt mérföldköveit.";
"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "Ha egy hibát jelent, írjon bele minden lényeges adatot (különösen: az alkalmazás verzióját, a használt eszköz és rendszer verzióját, a reprodukálás lépéseit).";
"Increase rate" = "Arány növelése";
"Info" = "Információ";
"Instance of current account" = "Jelenlegi fiók példánya";
"Interaction" = "Interakció";
"Interface" = "Kezelőfelület";
"Intro" = "Intro";
"Issues Tracker" = "Hibakövető";
"Just watched" = "Megtekintettek";
"Large" = "Nagy";
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "A nagyméretű elrendezés nem minden eszközön használható, és használatakor előfordulhat, hogy a vezérlőelemek nem férnek el a képernyőn.";
"LIVE" = "ÉLŐ";
"Loading streams…" = "Közvetítések betöltése…";
"Loading..." = "Betöltés...";
"Locations" = "Helyek";
"Lock portrait mode" = "Álló mód rögzítése";
"Long" = "Hosszú";
"Low" = "Alacsony";
"Low quality" = "Alacsony minőség";
"Lowest" = "Legalacsonyabb";
"Mark as watched" = "Jelölés megtekintettnek";
"Matrix Chat" = "Matrix csevegés";
"Medium" = "Közepes";
"Medium quality" = "Közepes minőség";
"Milestones" = "Mérföldkövek";
"More info can be found in:" = "További információ a következő oldalon található:";
"Movies" = "Filmek";
"MPV Documentation" = "MPV dokumentáció";
"Music" = "Zene";
"Name" = "Név";
"New Playlist" = "Új lejátszási lista";
"Next" = "Következő";
"No description" = "Nincs leírás";
"Normal" = "Normál";
"Not available" = "Nem elérhető";
"Not Playing" = "Nincs lejátszás";
"Nothing" = "Semmi";
"Offtopic in Music Videos" = "Nem kapcsolódó tartalom a Zene videókban";
"Only when signed in" = "Csak bejelentkezés esetén";
"Open \"Playlists\" tab to create new one" = "Új lejátszási listák létrehozásához nyissa meg a „Lejátszási listák” lapot";
"Open Settings" = "Beállítások megnyitása";
"Opening %@ stream…" = "%@ közvetítés megnyitása…";
"Opening audio stream…" = "Hangfolyam megnyitása…";
"Outro" = "Outro";
"Password" = "Jelszó";
"Pause when entering background" = "Szünet háttérbe lépéskor";
"Pause when player is closed" = "Szünet a lejátszó bezárásakor";
"Picture in Picture" = "Kép a képben";
"Play" = "Lejátszás";
"Play All" = "Összes lejátszása";
"Play in PiP" = "Lejátszás PiP-ben";
"Play Last" = "Legutóbbi lejátszása";
"Play Music" = "Zene lejátszása";
"Play Next" = "Következő lejátszása";
"Play Now" = "Lejátszás most";
"Playback" = "Visszajátszás";
"Player" = "Lejátszó";
"Playlist" = "Lejátszási lista";
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "A(z) „%@” lejátszási lista törlésre kerül.\nEzt nem lehet visszaállítani.";
"Popular" = "Népszerű";
"Preferred Formats" = "Előnyben részesített formátumok";
"Proxy videos" = "Proxyzott videók";
"Public Locations" = "Nyilvános helyek";
"Public Manifest" = "Nyilvános lista";
"Quality" = "Minőség";
"Quality Profile" = "Minőségi profil";
"Queue" = "Várólista";
"Queue is empty" = "A várólista üres";
"Rate" = "Értékelés";
"Rating" = "Értékelések";
"Recents" = "Újdonságok";
"Red" = "Piros";
"Refresh" = "Frissítés";
"Regular size" = "Szabályos méret";
"Regular Size" = "Szabályos méret";
"Related" = "Kapcsolódó";
"Relevance" = "Releváns";
"Remove" = "Eltávolítás";
"Remove from Favorites" = "Eltávolítás a kedvencekből";
"Remove from history" = "Eltávolítás az előzményekből";
"Remove from Playlist" = "Eltávolítás a lejátszási listáról";
"Replies" = "Válaszok";
"Reset" = "Visszaállítás";
"Reset watched status when playing again" = "Megfigyelt állapot visszaállítása újbóli lejátszáskor";
"Restart" = "Újraindítás";
"Restart the app to apply the settings above." = "A fenti beállítások alkalmazásához indítsa újra az alkalmazást.";
"Restart/Play next" = "Újraindítás/Következő lejátszása";
"Restore default profiles..." = "Alapértelmezett profilok helyreállítása...";
"Save" = "Mentés";
"Save history of searches, channels and playlists" = "Keresések, csatornák és lejátszási listák előzményeinek mentése";
"Search" = "Keresés";
"Search history is empty" = "A keresési előzmények üresek";
"Search..." = "Keresés...";
"Sections" = "Szakaszok";
"Seek gesture sensitivity" = "Keresési gesztus érzékenysége";
"Select location closest to you:" = "Válassza ki az Önhöz legközelebbi helyet:";
"Self-promotion" = "Önreklámozás";
"Settings" = "Beállítások";
"Share %@ link" = "%@ hivatkozás megosztása";
"Share %@ link with time" = "%@ hivatkozás megosztása idővel";
"Share..." = "Megosztás...";
"Show account username" = "Fiók felhasználónév megjelenítése";
"Show anonymous accounts" = "Névtelen fiókok megjelenítése";
"Show channel name" = "Csatorna nevének megjelenítése";
"Show history" = "Előzmények megjelenítése";
"Show playback statistics" = "Lejátszási statisztikák megjelenítése";
"Show progress of watching on thumbnails" = "Megtekintés előrehaladásának megjelenítése a miniatűrökön";
"Show sidebar when space permits" = "Oldalsáv megjelenítése, ha van elengendő hely";
"Show video length" = "Videó hosszának megjelenítése";
"Shuffle All" = "Összes keverése";
"Sidebar" = "Oldalsáv";
"Small" = "Kicsi";
"Smaller" = "Kisebb";
"Source" = "Forrás";
"Sponsor" = "Szponzor";
"SponsorBlock" = "SponsorBlock";
"SponsorBlock API Instance" = "SponsorBlock API példány";
"Subscribe" = "Feliratkozás";
"Subscriptions" = "Feliratkozások";
"Switch to other public location" = "Váltás más nyilvános helyre";
"Switch to public locations" = "Váltás nyilvános helyekre";
"System controls buttons" = "Rendszervezérlő gombok";
"System controls show buttons for %@" = "A rendszervezérlők gombokat jelenítenek meg a következőhöz: %@";
"This cannot be reverted" = "Ezt nem lehet visszaállítani";
"This information will be processed only on your device and used to connect you to the server in the specified country." = "Ez az információ csak az Ön eszközén kerül feldolgozásra, és arra használjuk, hogy Önt a megadott országban lévő kiszolgálóhoz kapcsoljuk.";
"This will remove all your custom profiles and return their default values. This cannot be reverted." = "Ez eltávolítja az összes egyéni profilját, és visszaállítja azok alapértelmezett értékeit. Ezt nem lehet visszaállítani.";
"Thumbnails" = "Miniatűrök";
"Today" = "Ma";
"Trending" = "Felkapott";
"TV" = "TV";
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Általában a videó közelében vagy a végén, amikor a köszönetnyilvánítás felugrik/vagy a végkártyák megjelennek.";
"unknown" = "ismeretlen";
"Unsubscribe" = "Leiratkozás";
"Upload date" = "Feltöltés dátuma";
"URL" = "Webcím";
"Used to create links from videos, channels and playlists" = "Videók, csatornák és lejátszási listák hivatkozásainak létrehozásához használható";
"Username" = "Felhasználónév";
"Very Large" = "Nagyon nagy";
"Videos" = "Videók";
"Views" = "Megtekintések";
"Watched" = "Megtekintett";
"Watched %@" = "Megtekintve ekkor: %@";
"Watching now" = "Megtekintés most";
"Week" = "Hét";
"Wiki" = "Wiki";
"Yattee" = "Yattee";
"Yattee %@ (build %@)" = "Yattee %@ (összeállítási szám: %@)";
"Year" = "Év";
"You can find information about using Yattee in the Wiki pages." = "A Yattee használatával kapcsolatos információkat a Wiki oldalon találhat.";
"You have no Playlists" = "Nincsenek lejátszási listái";
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "Nincsenek lejátszási listái\n\nKoppintson az „Új lejátszási lista” gombra a létrehozásához";
"Playback queue is empty" = "A lejátszási várólista üres";
"Keep last played video in the queue after restart" = "Utoljára lejátszott videó megtartása a várólistában újraindítás után";
"Reload manifest" = "Lista újratöltése";
"Locations Manifest" = "Helyek listája";
"Next in Queue" = "Következő a várólistán";
"Show Next in Queue" = "Következő megjelenítése a várólistán";
"Queue - shuffled" = "Várólista - kevert";
"Unlisted" = "Felsorolatlan";
"Current Location" = "Jelenlegi hely";
"Private" = "Privát";
"Playing Next" = "Következő lejátszása";
"Add Channels, Playlists and Searches to Favorites using" = "Csatornák, lejátszási listák és keresések hozzáadása a kedvencekhez a következő használatával";
"Make default" = "Legyen alapértelmezett";
"Visibility" = "Láthatóság";
"Current Playlist" = "Jelenlegi lejátszási lista";
"Stream & Player" = "Közvetítő és lejátszó";
"Statistics" = "Statisztika";
"Hardware decoder" = "Hardveres dekódoló";
"Stream FPS" = "FPS folyam";
"Rate & Captions" = "Értékelés és feliratok";
"Dropped frames" = "Eldobott keretek";
"Any format" = "Bármilyen formátum";
"It can be changed later in settings. You can use your own locations too." = "Ez később a beállításokban módosítható. Saját helyeket is használhat.";
"Comments are disabled" = "Hozzászólások letiltva";
"No comments" = "Nincsenek hozzászólások";
"No chapters information available" = "Nincsenek elérhető fejezetinformációk";
"Could not refresh Subscriptions" = "Nem sikerült frissíteni a feliratkozásokat";
"Could not load streams" = "Nem sikerült betölteni a közvetítéseket";
"Could not open video" = "Nem sikerült megnyitni a videót";
"Channel could not be found" = "A csatorna nem található";
"Could not extract SID from received cookies: %@" = "Nem sikerült kinyerni az SID-t a kapott sütikből: %@";
"Could not update your token." = "Nem sikerült a token frissítése.";
"Could not refresh Trending" = "Nem sikerült a felkapottak frissítése";
"This URL could not be opened" = "Ez a webcím nem nyitható meg";
"Could not open channel" = "Nem sikerült megnyitni a csatornát";
"Could not refresh Popular" = "Nem sikerült a népszerűek frissítése";
"Could not extract video ID" = "Nem sikerült kinyerni a videó azonosítóját";
"This video could not be opened" = "Ez a videó nem nyitható meg";
"Could not extract playlist ID" = "Nem sikerült kinyerni a lejátszási lista azonosítóját";
"Could not load video" = "Nem sikerült a videót betölteni";
"Translations" = "Fordítások";
"No documents" = "Nincsenek dokumentumok";
"Recent Documents" = "Legutóbbi dokumentumok";
"Home" = "Kezdőlap";
"Show Home" = "Kezdőlap megjelenítése";
"Show Open Videos quick actions" = "Nyitott videók gyors műveleteinek megjelenítése";
"Show Favorites" = "Kedvencek megjelenítése";
"Inspector visibility" = "Felügyelő láthatósága";
"Edit Favorites…" = "Kedvencek szerkesztése…";
"Buttons labels" = "Gombok feliratai";
"Files" = "Fájlok";
"Show Documents" = "Dokumentumok megjelenítése";
"Pages toolbar position" = "Oldalak eszköztár helyzete";
"Video Details" = "Videó részletek";
"Show Inspector" = "Felügyelő megjelenítése";
"Open" = "Megnyitás";
"Video actions buttons" = "Videó műveleti gombok";
"Enter link to open" = "Írja be a megnyitni kívánt hivatkozást";
"URL to Open" = "Megnyitni kívánt webcím";
"Enter links to open, one per line" = "Írja be a megnyitni kívánt hivatkozásokat, soronként egyet";
"Add" = "Hozzáadás";
"Hide" = "Elrejtés";
"Always" = "Mindig";
"Playback Mode" = "Lejátszási mód";
"Left" = "Bal";
"Format" = "Formátum";
"Driver" = "Illesztőprogram";
"Show only icons" = "Csak az ikonok megjelenítése";
"Center" = "Középen";
"Documents" = "Dokumentumok";
"Audio" = "Hang";
"Codec" = "Kodek";
"Size" = "Méret";
"FPS" = "FPS";
"Sample Rate" = "Mintavételi sebesség";
"Could not find any links to open in your clipboard" = "A vágólapon nem találhatók megnyitni kívánt hivatkozások";
"Address" = "Cím";
"Remove…" = "Eltávolítás…";
"Actions buttons" = "Műveleti gombok";
"Show sidebar" = "Oldalsáv megjelenítése";
"Remove Location" = "Hely eltávolítása";
"Open Video" = "Videó megnyitása";
"Default Profile" = "Alapértelmezett profil";
"Share%@link" = "%@ hivatkozás megosztása";
"\"%@\" will be irreversibly removed from this device." = "A(z) „%@” visszavonhatatlanul eltávolításra kerül erről az eszközről.";
"Could not delete document" = "A dokumentum törlése nem sikerült";
"Are you sure you want to remove %@ location?" = "Biztosan törölni szeretné a(z) %@ helyet?";
"Live Streams" = "Élő közvetítések";
"Verified" = "Ellenőrzött";
"Channel" = "Csatorna";
"Open expanded" = "Megnyitás kibontva";
"Mark channel feed as watched" = "Jelölje meg a csatorna hírfolyamot megtekintettként";
"Short videos: visible" = "Rövid videók: láthatóak";
"Player Bar" = "Lejátszó sáv";
"Short videos: hidden" = "Rövid videók: rejtett";
"Double tap gesture" = "Dupla koppintás gesztus";
"Always show controls buttons" = "Mindig jelenítse meg a vezérlőgombokat";
"Single tap gesture" = "Egyszeri koppintás gesztus";
"Maximum width expanded" = "Maximális szélesség kiterjesztve";
"Clear all" = "Összes kiürítése";
"Right click channel thumbnail to open context menu with more actions" = "Jobb kattintás a csatorna miniatűrjére a további műveletekhez tartozó kontextusmenü megnyitásához";
"Show unwatched feed badges" = "Nem megtekintett hírfolyam jelvények megjelenítése";
"Seeking" = "Keresés";
"Controls Buttons" = "Vezérlőgombok";
"System controls" = "Rendszervezérlők";
"Controls button: forwards" = "Vezérlőgomb: előre";
"Gesture: backwards" = "Gesztus: hátra";
"Hide player" = "Lejátszó elrejtése";
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a kihagyási időközt a távirányítón található nyíl gombok számára (a 2. generációs Siri Remote vagy újabb modellek esetén). A rendszervezérlők beállításainak módosítása újraindítást igényel.";
"Actions Buttons" = "Műveleti gombok";
"Play next item" = "Következő elem lejátszása";
"Lock orientation" = "Tájolás zárolása";
"Music Mode" = "Zenemód";
"Close video" = "Videó bezárása";
"Total size: %@" = "Teljes méret: %@";
"Open channels with description expanded" = "Csatornák megnyitása bővített leírással";
"Cache" = "Gyorsítótár";
"Subscribe/Unsubscribe" = "Feliratkozás/Leiratkozás";
"Show cache status" = "Gyorsítótár állapotának megjelenítése";
"Maximum feed items" = "Maximális hírfolyam elemek";
"Are you sure you want to clear cache?" = "Biztosan törölni szeretné a gyorsítótárat?";
"Show toggle watch status button" = "Figyelési állapot váltó gomb megjelenítése";
"List" = "Lista";
"Cells" = "Cellák";
"Toggle size" = "Méret váltása";
"Toggle player" = "Lejátszó váltása";
"Do nothing" = "Ne tegyen semmit";
"Feed" = "Hírfolyam";
"Mark all as unwatched" = "Jelölje meg az összeset nem megtekintettnek";
"Playback Settings" = "Lejátszási beállítások";
"Mark all as watched" = "Jelölje meg az összeset megtekintettnek";
"Replay" = "Újrajátszás";
"Fullscreen" = "Teljes képernyő";
"Lock" = "Zárolás";
"Description" = "Leírás";
"Loop one" = "Ismétlés egyesével";
"Autoplay next" = "Következő automatikus lejátszása";
"Stream" = "Közvetítés";
"Enter location address to connect..." = "Adja meg a hely címét a kapcsolódáshoz...";
"Seek" = "Keresés";
"Opened File" = "Megnyitott fájl";
"File Extension" = "Fájl kiterjesztése";
"Opening file…" = "Fájl megnyitása…";
"Public account" = "Nyilvános fiók";
"Your Accounts" = "Saját fiókok";
"Close video and player on end" = "A videó és a lejátszó bezárása a lejátszás befejeztével";
"Use system controls with AVPlayer" = "A rendszervezérlők használata az AVPlayer-rel";
"Landscape left" = "Fekvő balra";
"Landscape right" = "Fekvő jobbra";
"No rotation" = "Nincs forgatás";
"Startup section" = "Indítási szakasz";
"Home Settings" = "Kezdőlap beállítások";
"(watched and shorts hidden)" = "(megtekintettek és rövidek elrejtve)";
"Watched: hidden" = "Megtekintettek: rejtett";
"No videos to show" = "Nincs megjeleníthető videó";
"(watched hidden)" = "(megtekintettek rejtve)";
"(shorts hidden)" = "(rövidek rejtve)";
"Disable filters" = "Szűrők kikapcsolása";
"You need to create an instance and accounts\nto access %@ section" = "Létre kell hoznia egy példányt és fiókokat\na(z) %@ szakasz eléréséhez";
"You can switch between profiles in playback settings controls." = "A lejátszási beállítások vezérlőiben válthat a profilok között.";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Fájlok megosztása a Finderből Macen\nvagy iTunes használatával Windowson";
"Open logs in Finder" = "Naplók megnyitása a Finderben";
"Could not open playlist" = "Nem sikerült megnyitni a lejátszási listát";
"Now Playing" = "Jelenleg lejátszás alatt";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "A lejátszási lista üres\n\nKoppintson és tartsa lenyomva egy videóra, majd\n„Hozzáadás a lejátszási listához”";
"Could not create share link" = "Nem sikerült létrehozni a megosztási hivatkozást";
"If you want this app to be available in your language, join translation project." = "Ha azt szeretné, hogy ez az alkalmazás a saját nyelvén is elérhető legyen, csatlakozzon a fordítási projekthez.";
"You need to select an account\nto access %@ section" = "Ki kell választania egy fiókot\na(z) %@ szakasz eléréséhez";
"Public" = "Nyilvános";
"%@ formats" = "%@ formátumok";
"Press and hold remote button to open captions and quality menus" = "Nyomja meg és tartsa lenyomva a távvezérlő gombot a feliratok és a minőségi menük megnyitásához";
"Could not extract channel information" = "Nem sikerült csatornainformációkat kinyerni";
"Could not refresh Playlists" = "Nem sikerült frissíteni a lejátszási listákat";
"Cached time" = "Gyorsítótárazott idő";
"No locations available at the moment" = "Jelenleg nincsenek elérhető helyek";
"Share Logs..." = "Naplók megosztása…";
"For custom locations you can configure Frontend URL in Locations settings" = "Egyéni helyekhez az előtétprogram webcímét a Helyek menüpontban konfigurálhatja";
"Shorts" = "Rövidek";
"Mark channel feed as unwatched" = "Jelölje meg a csatorna hírfolyamot nem megtekintettként";
"Tap and hold channel thumbnail to open context menu with more actions" = "Koppintson és tartsa lenyomva a csatorna miniatűrjét a további műveletekhez tartozó kontextusmenü megnyitásához";
"Controls button: backwards" = "Vezérlőgomb: hátra";
"Enter account credentials to connect..." = "Adja meg a fiók hitelesítő adatait a kapcsolódáshoz...";
"Show scroll to top button in comments" = "Görgetés a tetejére gomb megjelenítése a hozzászólásokban";
"Browse without account" = "Böngészés fiók nélkül";
"Watched: visible" = "Megtekintettek: láthatóak";
"Paste" = "Beillesztés";
"Playback history is empty" = "A lejátszási előzmények üresek";
"Right" = "Jobb";
"Gesture: fowards" = "Gesztus: előre";
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a kihagyási időközt a lejátszó bal/jobb oldalán történő dupla kattintás esetén. A rendszervezérlők beállításainak módosítása újraindítást igényel.";
"Open channel" = "Csatorna megnyitása";
"Inspector" = "Felügyelő";
"Copy%@link" = "%@ hivatkozás másolása";
"Recent History" = "Legutóbbi előzmények";
"Show icons and text when space permits" = "Ikonok és szöveg megjelenítése, ha van elegendő hely";
"Show Open Videos toolbar button" = "Nyitott videók eszköztár gombjának megjelenítése";
"Channels" = "Csatornák";
"Video" = "Videó";
"Open video description expanded" = "Videó leírásának bővített megjelenítése";
"Other data include last used playback preferences and listing options" = "Egyéb adatok közé tartoznak az utoljára használt lejátszási beállítások és listázási lehetőségek";
"Could not open Files" = "Nem sikerült a fájlokat megnyitni";
"Open Files" = "Fájlok megnyitása";
"File" = "Fájl";
"Open Videos" = "Videók megnyitása";
"Share" = "Megosztás";
"Play all unwatched" = "Összes nem megtekintettek lejátszása";
"Available" = "Elérhető";
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a kihagyási időközt a lejátszó bal/jobb oldalán végzett kétszeri érintéses gesztus számára. A rendszervezérlők beállításainak módosítása újraindítást igényel.";
"Pages buttons" = "Oldalak gombjai";
"Only for local files and URLs" = "Csak helyi fájlok és webcímek esetén";
"Are you sure you want to remove this document?" = "Biztosan törölni szeretné ezt a dokumentumot?";
"Rotate when entering fullscreen on landscape video" = "Forduljon el fekvő módba teljes képernyőre váltáskor";
"Limit" = "Limit";
"Are you sure you want to remove %@ from Favorites?" = "Biztosan törölni szeretné a(z) %@-t a „Kedvencek” közül?";
"Keep channels with unwatched videos on top of subscriptions list" = "A nem megtekintett videókkal rendelkező csatornák a feliratkozási lista tetején maradnak";
"Show video context menu options to force selected backend" = "Videó kontextusmenü beállításainak megjelenítése a kiválasztott háttérprogram kikényszerítéséhez";
"Play Now in AVPlayer" = "Lejátszás az AVPlayer-ben";
"Play Now in MPV" = "Lejátszás az MPV-ben";
"Show channel avatars in videos lists" = "Csatorna profilképek megjelenítése a videók listájában";
"Export" = "Exportálás";
"File information" = "Fájlinformáció";
"Import" = "Importálás";
"Platform" = "Platform";
"Action button labels" = "Művelet gombok feliratai";
"Build" = "Összeállítási szám";
"Icon and text" = "Ikon és szöveg";
"Custom Location already exists" = "Az egyéni hely már létezik";
"Account already exists" = "A fiók már létezik";
"Export in progress..." = "Exportálás folyamatban...";
"In progress..." = "Folyamatban…";
"Open vertical chapters expanded" = "Függőleges fejezetek megnyitása kibővítve";
"Icon only" = "Csak ikon";
"Podcasts" = "Podcastok";
"Releases" = "Kiadások";
"Description preview" = "Leírás előnézete";
"Chapters (if available)" = "Fejezetek (ha elérhetőek)";
"Are you sure you want to export unencrypted passwords?" = "Biztosan titkosítatlan jelszavakat szeretne exportálni?";
"No preview" = "Nincs előnézet";
"Accounts passwords (unencrypted)" = "Fiókok jelszavai (titkosítatlanul)";
"Other" = "Egyéb";
"Other data" = "Egyéb adat";
"Do not share this file with anyone or you can lose access to your accounts. If you don't select to export passwords you will be asked to provide them during import" = "Ne ossza meg ezt a fájlt senkivel, különben elveszítheti hozzáférését a fiókjaihoz. Ha nem választja a jelszavak exportálását, akkor az importálás során meg kell adnia azokat";
"Password required to import" = "Jelszó szükséges az importáláshoz";
"Custom Location selected for import" = "Az importáláshoz kiválasztott egyéni hely";
"Password saved in import file" = "Az importfájlba mentett jelszó";
"Export..." = "Exportálás…";
"Show channel avatars in channels lists" = "Csatorna profilképek megjelenítése a csatornák listájában";
"Import Settings..." = "Beállítások importálása...";
"Custom Location not selected for import" = "Nincs kiválasztva egyéni hely az importáláshoz";
"Export Settings" = "Beállítások exportálása";
"Add %@" = "%@ hozzáadása";

View File

@ -0,0 +1,98 @@
"Accounts" = "Imiḍanen";
"Chapters" = "Ixfawen";
"Clear" = "Sfeḍ";
"Close Video" = "Mdel tavidyutt";
"Donations" = "Mudd tawsa";
"Error" = "Tuccḍa";
"Help" = "Tallalt";
"Movies" = "Isura";
"Music" = "Aẓawan";
"Profiles" = "Imaɣnuyen";
"Search" = "Nadi";
"Search..." = "Nadi...";
"Settings" = "Iɣewwaṛen";
"TV" = "Tiliẓri";
"Year" = "Aseggas";
"Size" = "Tiddi";
"Address" = "Tansa";
"Channel" = "Abadu";
"Export..." = "Sifeḍ…";
"Advanced" = "Talqayt";
"All" = "Akk";
"Anonymous" = "Udrig";
"Any" = "Menwala";
"Automatic" = "S wudem awurman";
"Battery" = "Aẓru";
"Blue" = "Azegzaw";
"Button" = "Taqeffalt";
"Cancel" = "Sefsex";
"Category" = "Taggayt";
"Close" = "Mdel";
"Contact" = "Anermes";
"Comments" = "Iwenniten";
"Country" = "Tamurt";
"Continue" = "Ddu";
"Date" = "Azemz";
"Duration" = "Tanzagt";
"Delete" = "Kkes";
"Done" = "Immed";
"Edit" = "Ẓreg";
"Favorites" = "Imenyafen";
"Filter" = "Imzizdig";
"History" = "Amazray";
"Hour" = "Asrag";
"Info" = "Talɣut";
"Interface" = "Agrudem";
"Month" = "Ayyur";
"Name" = "Isem";
"Password" = "Awal n uεeddi";
"Edit..." = "Ẓreg...";
"Quality" = "Taɣara";
"Red" = "Azeggaɣ";
"Remove" = "Kkes";
"Replies" = "Tiririyin";
"Reset" = "Wennez";
"Restart" = "Ales asenker";
"Save" = "Sekles";
"Share..." = "Bḍu…";
"Source" = "Aɣbalu";
"unknown" = "arussin";
"URL" = "URL";
"Username" = "Isem n useqdac";
"Today" = "Ass-a";
"Videos" = "Tividyutin";
"Views" = "Timezriyin";
"Week" = "Amalas";
"Wiki" = "Wiki";
"Wi-Fi" = "Wi-Fi";
"Welcome" = "Ansuf";
"Yattee" = "Yattee";
"Statistics" = "Tidaddanin";
"Home" = "Tazwara";
"Hide" = "Ffer-it";
"Translations" = "Tisuqilin";
"Files" = "Ifuyla";
"Open" = "Ldi";
"Add" = "Rnu";
"Paste" = "Senṭeḍ";
"Channels" = "Ibuda";
"Share" = "Bḍu";
"Video" = "Tavidyutt";
"Documents" = "Isemliyen";
"Codec" = "Akudak";
"Audio" = "Imesli";
"File" = "Afaylu";
"FPS" = "FPS";
"Description" = "Aglam";
"Remove…" = "Kkes…";
"List" = "Tabdart";
"Export" = "Sifeḍ";
"Import" = "Kter";
"Platform" = "Tiɣerɣert";
"Add Account" = "Rnu amiḍan";
"Add Account..." = "Rnu amiḍan…";
"Add profile..." = "Rnu amaɣnu…";
"Clear History" = "Sfeḍ amazray";
"Discord Server" = "Aqeddac Discord";

View File

@ -68,3 +68,20 @@
"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 닫기";
"Error when accessing playlist" = "플레이리스트 연결 도중 오류 발생";
"Hide sidebar" = "사이드바 숨기기";
"Close video after playing last in the queue" = "마지막 동영상 재생 후 , 영상 닫기";
"Comments" = "댓글";
"Connection failed" = "연결 실패";
"Contact" = "연락처";
"Create Playlist" = "재생목록 생성";
"Donations" = "후원";
"Done" = "완료";
"Don't use public locations" = "공공장소에서 사용하지 마십시오";
"I have a feature request" = "기능 제안하기";
"I like this app!" = "저는 이 앱이 좋습니다!";
"I want to ask a question" = "질문하기";
"Just watched" = "방금 시청한 동영상";
"Mark as watched" = "시청 완료로 표시하기";
"Mark video as watched after playing" = "동영상 시청 후에 시청 완료 표시하기";
"Continue" = "다음";

View File

@ -405,75 +405,75 @@
"No chapters information available" = "Ingen tilgjengelig kapittelinfo";
"Comments are disabled" = "Kommentarer er avskrudd";
"Press and hold remote button to open captions and quality menus" = "Trykk og hold fjernknappen for å åpne meny for undertekster og kvalitet";
"Paste" = "";
"Codec" = "";
"Open Videos" = "";
"Files" = "";
"Open Video" = "";
"Show only icons" = "";
"Show Open Videos toolbar button" = "";
"Channels" = "";
"Buttons labels" = "";
"Could not open Files" = "";
"Reload manifest" = "";
"Right" = "";
"Show Favorites" = "";
"Only for local files and URLs" = "";
"Enter link to open" = "";
"Left" = "";
"Are you sure you want to remove this document?" = "";
"Recent Documents" = "";
"Share files from Finder on a Mac\nor iTunes on Windows" = "";
"Address" = "";
"File" = "";
"Share" = "";
"Could not delete document" = "";
"Are you sure you want to remove %@ location?" = "";
"Size" = "";
"Always" = "";
"Video actions buttons" = "";
"Edit Favorites…" = "";
"Sample Rate" = "";
"Show Inspector" = "";
"Remove Location" = "";
"Format" = "";
"Verified" = "";
"Show icons and text when space permits" = "";
"Paste" = "Lim";
"Codec" = "Kodeks";
"Open Videos" = "Åpne Videoer";
"Files" = "Filer";
"Open Video" = "Åpne Video";
"Show only icons" = "Vis kun ikoner";
"Show Open Videos toolbar button" = "Vis Åpne Videoer verktøylinje knapp";
"Channels" = "Kanaler";
"Buttons labels" = "Knappe ettiketter";
"Could not open Files" = "Kunne ikke åpne fil";
"Reload manifest" = "Last manifest på nytt";
"Right" = "Høyre";
"Show Favorites" = "Vis Favoritter";
"Only for local files and URLs" = "Kun for lokale filer og URLer";
"Enter link to open" = "Gå inn i link for å åpne";
"Left" = "Venstre";
"Are you sure you want to remove this document?" = "Ønsker du virkelig å fjerne dette dokumentet";
"Recent Documents" = "Nylige Dokumenter";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Del filer fra Finder på Mac\neller iTunes på Windows";
"Address" = "Addresse";
"File" = "Fil";
"Share" = "Del";
"Could not delete document" = "Klarte ikke å slette dokumentet";
"Are you sure you want to remove %@ location?" = "Er du sikker på at du ønsker å fjerne %@ lokalisjon?";
"Size" = "Størrelse";
"Always" = "Alltid";
"Video actions buttons" = "Knapper for video valg";
"Edit Favorites…" = "Rediger Favoritter...";
"Sample Rate" = "Stikkprøve rate";
"Show Inspector" = "Vis inspektør";
"Remove Location" = "Fjern lokasjon";
"Format" = "Format";
"Verified" = "Verifisert";
"Show icons and text when space permits" = "Vis ikoner og tekst når det er plass";
"Could not extract video ID" = "Kunne ikke pakke ut video-ID";
"Open Files" = "";
"Driver" = "";
"Show Open Videos quick actions" = "";
"Enter links to open, one per line" = "";
"No locations available at the moment" = "";
"Video Details" = "";
"Add" = "";
"Show Home" = "";
"Pages buttons" = "";
"Center" = "";
"Shorts" = "";
"Open" = "";
"Locations Manifest" = "";
"FPS" = "";
"Inspector visibility" = "";
"Show Documents" = "";
"Open Files" = "Åpne Filer";
"Driver" = "Driver";
"Show Open Videos quick actions" = "Vis hurtigvalg for åpning av Videoer";
"Enter links to open, one per line" = "Legg til lenker som skal åpnes, en per linje";
"No locations available at the moment" = "Ingen lokasjoner tilgjengelig for øyeblikket";
"Video Details" = "Video detaljer";
"Add" = "Legg til";
"Show Home" = "Vis Hjem";
"Pages buttons" = "Side knapper";
"Center" = "Senter";
"Shorts" = "Shorts";
"Open" = "Åpne";
"Locations Manifest" = "Lokasjonsmanifest";
"FPS" = "FPS";
"Inspector visibility" = "Inspektør synlighet";
"Show Documents" = "Vis Dokumenter";
"Open logs in Finder" = "Åpne loggføring i Finder";
"Documents" = "";
"Documents" = "Dokumenter";
"Could not update your token." = "Kunne ikke oppdatere symbolet ditt.";
"Remove…" = "";
"Hide" = "";
"Actions buttons" = "";
"Audio" = "";
"Remove…" = "Fjern";
"Hide" = "Gjem";
"Actions buttons" = "Handlings knapper";
"Audio" = "Lyd";
"Could not extract SID from received cookies: %@" = "Kunne ikke hente ut SID fra mottatte informasjonskapsler: %@";
"Playback Mode" = "";
"Clear Queue before opening" = "";
"Playback Mode" = "Avspilling Modus";
"Clear Queue before opening" = "Tøm kø før åpning";
"Could not create share link" = "Kunne ikke opprette delingslenke";
"Could not refresh Playlists" = "";
"Could not refresh Playlists" = "Kunne ikke gjenoppfriske spillelister";
"Could not refresh Subscriptions" = "Kunne ikke gjenoppfriske abonnementer";
"Translations" = "";
"This URL could not be opened" = "";
"For custom locations you can configure Frontend URL in Locations settings" = "";
"Could not refresh Trending" = "";
"If you want this app to be available in your language, join translation project." = "";
"Translations" = "Oversettelser";
"This URL could not be opened" = "Denne URL kunne ikke åpnes";
"For custom locations you can configure Frontend URL in Locations settings" = "For tilpassede lokasjoner kan du konfigurere Frontend URL i lokasjons instillinger";
"Could not refresh Trending" = "Kunne ikke gjenoppfriske trendende";
"If you want this app to be available in your language, join translation project." = "Hvis du ønsker denne appen tilgjengelig på ditt språk, bli med i oversettelses prosjektet";
"This video could not be opened" = "Kunne ikke åpne videoen";
"Could not open channel" = "Kunne ikke åpne kanal";
"Could not open playlist" = "Kunne ikke åpne spilleliste";
@ -482,21 +482,21 @@
"Could not extract channel information" = "Kunne ikke hente kanalinfo";
"Could not load video" = "Kunne ikke laste inn video";
"Could not extract playlist ID" = "Kunne ikke hente ut spilleliste-ID";
"Could not refresh Popular" = "";
"Could not refresh Popular" = "Kunne ikke gjenoppfriske populært";
"Channel could not be found" = "Fant ikke kanalen";
"Live Streams" = "";
"Channel" = "";
"No documents" = "";
"\"%@\" will be irreversibly removed from this device." = "";
"Recent History" = "";
"Home" = "";
"Pages toolbar position" = "";
"URL to Open" = "";
"Video" = "";
"Could not find any links to open in your clipboard" = "";
"Show sidebar" = "";
"Default Profile" = "";
"Playback history is empty" = "";
"Copy%@link" = "";
"Share%@link" = "";
"Live Streams" = "Direkte strømmer";
"Channel" = "Kanal";
"No documents" = "Ingen dokumenter";
"\"%@\" will be irreversibly removed from this device." = "\"%@\" vil irreversibelt bli fjernet fra denne enheten";
"Recent History" = "Nylig Historie";
"Home" = "Hjem";
"Pages toolbar position" = "Verktøylinjeposisjon for sider";
"URL to Open" = "Åpne URL";
"Video" = "Video";
"Could not find any links to open in your clipboard" = "Kunne ikke finnen noen linker å åpne i utklippstavlen";
"Show sidebar" = "Vis sidebar";
"Default Profile" = "Standard profil";
"Playback history is empty" = "Avspillingshisotrikk er tom";
"Copy%@link" = "Kopier%@lenke";
"Share%@link" = "Del%@lenke";
"Share Logs..." = "Del logger …";

View File

@ -9,7 +9,7 @@
"Add Account..." = "Добавить аккаунт...";
"Add Location" = "Добавить локацию";
"Add profile..." = "Добавить профиль...";
"Add to %@" = "Добавить к %@";
"Add to %@" = "Добавить к «%@»";
"Add to Favorites" = "Добавить в избранное";
"Add to Playlist" = "Добавить в плейлист";
"Anonymous" = "Анонимный";

View File

@ -0,0 +1,564 @@
"%@ Channel" = "%@ சேனல்";
"%@ Playlist" = "%@ பிளேலிச்ட்";
"%@ subscribers" = "%@ சந்தாதாரர்கள்";
"Accounts" = "கணக்குகள்";
"Accounts are not supported for the application of this instance" = "இந்த நிகழ்வின் பயன்பாட்டிற்கு கணக்குகள் ஆதரிக்கப்படவில்லை";
"Add Account" = "கணக்கைச் சேர்க்கவும்";
"Add Location" = "இருப்பிடத்தைச் சேர்க்கவும்";
"Add Location..." = "இருப்பிடத்தைச் சேர்க்கவும் ..";
"Add profile..." = "சுயவிவரத்தைச் சேர்க்கவும் ...";
"Add Quality Profile" = "தரமான சுயவிவரத்தைச் சேர்க்கவும்";
"Add to %@" = "%@ இல் சேர்க்கவும்";
"Add to Favorites" = "பிடித்தவைகளில் சேர்க்கவும்";
"Add to Playlist" = "பிளேலிச்ட்டில் சேர்க்கவும்";
"Add to Playlist..." = "பிளேலிச்ட்டில் சேர்க்கவும் ...";
"Advanced" = "மேம்பட்ட";
"All" = "அனைத்தும்";
"Always use AVPlayer for live videos" = "நேரடி வீடியோக்களுக்கு எப்போதும் AVPlayer ஐப் பயன்படுத்துங்கள்";
"Any" = "ஏதேனும்";
"Apply to all" = "அனைவருக்கும் பொருந்தும்";
"Create Playlist" = "பிளேலிச்ட்டை உருவாக்கவும்";
"Current: %@\n%@" = "நடப்பு: %@\n %@";
"Custom" = "தனிப்பயன்";
"Custom Locations" = "தனிப்பயன் இடங்கள்";
"Date" = "திகதி";
"Decrease rate" = "வீதத்தைக் குறைக்கவும்";
"Delete" = "அழி";
"Disabled" = "முடக்கப்பட்டது";
"Discord Server" = "முரண்பாடு சேவையகம்";
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "டிச்கார்ட் மற்றும் மேட்ரிக்சில் விவாதங்கள் நடைபெறுகின்றன. பொதுவான கேள்விகளுக்கு இது ஒரு நல்ல இடம்.";
"Don't use public locations" = "பொது இடங்களைப் பயன்படுத்த வேண்டாம்";
"Edit" = "தொகு";
"Edit Playlist" = "பிளேலிச்ட்டைத் திருத்து";
"Edit Quality Profile" = "தரமான சுயவிவரத்தைத் திருத்தவும்";
"Enable logging" = "பதிவை இயக்கவும்";
"Enable Return YouTube Dislike" = "YouTube வெறுப்பைத் திரும்பவும்";
"Error" = "பிழை";
"Error when accessing playlist" = "பிளேலிச்ட்டை அணுகும்போது பிழை";
"Save history of searches, channels and playlists" = "தேடல்கள், சேனல்கள் மற்றும் பிளேலிச்ட்களின் வரலாற்றைச் சேமிக்கவும்";
"Search" = "தேடல்";
"Search history is empty" = "தேடல் வரலாறு காலியாக உள்ளது";
"Sections" = "பிரிவுகள்";
"Seek with horizontal swipe on video" = "வீடியோவில் கிடைமட்ட ச்வைப் கொண்டு தேடுங்கள்";
"Matrix Channel" = "அணி சேனல்";
"Matrix Chat" = "அணி அரட்டை";
"Lock portrait mode" = "பூட்டு உருவப்படம் பயன்முறை";
"Long" = "நீண்ட";
"Low" = "குறைந்த";
"Low quality" = "குறைந்த தகுதி";
"Lowest" = "மிகக் குறைந்த";
"Mark as watched" = "பார்த்தபடி குறி";
"Mark video as watched after playing" = "விளையாடிய பிறகு பார்த்தபடி வீடியோவை குறிக்கவும்";
"Medium" = "சராசரி";
"Medium quality" = "நடுத்தர தகுதி";
"More info can be found in:" = "மேலும் தகவலைக் காணலாம்:";
"MPV Documentation" = "எம்.பி.வி ஆவணம்";
"Open \"Playlists\" tab to create new one" = "புதிய ஒன்றை உருவாக்க \"பிளேலிச்ட்கள்\" தாவலைத் திறக்கவும்";
"Open Settings" = "திறந்த அமைப்புகள்";
"Music" = "இசை";
"Name" = "பெயர்";
"Next" = "அடுத்தது";
"No Playlists" = "பிளேலிச்ட்கள் இல்லை";
"No results" = "முடிவுகள் இல்லை";
"Normal" = "சாதாரண";
"Not available" = "கிடைக்கவில்லை";
"Not Playing" = "விளையாடுவதில்லை";
"Nothing" = "எதுவும்";
"Offtopic in Music Videos" = "மியூசிக் வீடியோக்களில் ஓப்டோபிக்";
"Opening %@ stream…" = "திறத்தல் %@ ச்ட்ரீம்…";
"Outro" = "மற்றொன்று";
"Reset" = "மீட்டமை";
"Reset watched status when playing again" = "மீண்டும் விளையாடும்போது மீட்டெடுக்கப்பட்ட நிலையை மீட்டமை";
"Restart" = "மறுதொடக்கம்";
"Restart the app to apply the settings above." = "மேலே உள்ள அமைப்புகளைப் பயன்படுத்த பயன்பாட்டை மறுதொடக்கம் செய்யுங்கள்.";
"Restart/Play next" = "அடுத்து மறுதொடக்கம்/விளையாடுங்கள்";
"Restore default profiles..." = "இயல்புநிலை சுயவிவரங்களை மீட்டெடுங்கள் ...";
"Add Channels, Playlists and Searches to Favorites using" = "பயன்படுத்தப்பட்ட பிடித்தவைகளில் சேனல்கள், பிளேலிச்ட்கள் மற்றும் தேடல்களைச் சேர்க்கவும்";
"Playing Next" = "அடுத்து விளையாடுவது";
"You can switch between profiles in playback settings controls." = "பிளேபேக் அமைப்புகள் கட்டுப்பாடுகளில் சுயவிவரங்களுக்கு இடையில் நீங்கள் மாறலாம்.";
"Current Playlist" = "தற்போதைய பிளேலிச்ட்";
"Statistics" = "புள்ளிவிவரங்கள்";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "பிளேலிச்ட் காலியாக உள்ளது\n\n ஒரு வீடியோவைத் தட்டவும் பிடிக்கவும்\n \"பிளேலிச்ட்டில் சேர்\"";
"It can be changed later in settings. You can use your own locations too." = "அதை பின்னர் அமைப்புகளில் மாற்றலாம். உங்கள் சொந்த இடங்களையும் பயன்படுத்தலாம்.";
"Hardware decoder" = "வன்பொருள் டிகோடர்";
"Stream FPS" = "ச்ட்ரீம் எஃப்.பி.எச்";
"Rate & Captions" = "விகிதம் மற்றும் தலைப்புகள்";
"Dropped frames" = "கைவிடப்பட்ட பிரேம்கள்";
"Any format" = "எந்த வடிவமும்";
"%@ formats" = "%@ வடிவங்கள்";
"Keep last played video in the queue after restart" = "மறுதொடக்கம் செய்த பிறகு வரிசையில் கடைசியாக விளையாடிய வீடியோவை வைத்திருங்கள்";
"Press and hold remote button to open captions and quality menus" = "தலைப்புகள் மற்றும் தர மெனுக்களைத் திறக்க தொலை பொத்தானை அழுத்திப் பிடிக்கவும்";
"Comments are disabled" = "கருத்துகள் முடக்கப்பட்டுள்ளன";
"No comments" = "கருத்துகள் இல்லை";
"Share Logs..." = "பதிவுகளைப் பகிரவும்…";
"Open logs in Finder" = "கண்டுபிடிப்பாளரில் திறந்த பதிவுகள்";
"Rotate to portrait when exiting fullscreen" = "முழுத்திரை வெளியேறும்போது உருவப்படத்திற்கு சுழல்க";
"Round corners" = "சுற்று மூலைகள்";
"Save history of played videos" = "விளையாடிய வீடியோக்களின் வரலாற்றைச் சேமிக்கவும்";
"Could not refresh Subscriptions" = "சந்தாக்களை புதுப்பிக்க முடியவில்லை";
"Could not load streams" = "ச்ட்ரீம்களை ஏற்ற முடியவில்லை";
"Could not open video" = "வீடியோவை திறக்க முடியவில்லை";
"Channel could not be found" = "சேனலைக் கண்டுபிடிக்க முடியவில்லை";
"Could not extract channel information" = "சேனல் தகவல்களைப் பிரித்தெடுக்க முடியவில்லை";
"Could not extract SID from received cookies: %@" = "பெறப்பட்ட குக்கீகளிலிருந்து SID ஐ பிரித்தெடுக்க முடியவில்லை: %@";
"Could not update your token." = "உங்கள் கிள்ளாக்கைப் புதுப்பிக்க முடியவில்லை.";
"Enter links to open, one per line" = "திறக்க இணைப்புகளை உள்ளிடவும், ஒரு வரிக்கு ஒன்று";
"Playback Mode" = "பிளேபேக் பயன்முறை";
"Hide" = "மறை";
"Always" = "எப்போதும்";
"Format" = "வடிவம்";
"Driver" = "இயக்கி";
"Only for local files and URLs" = "உள்ளக கோப்புகள் மற்றும் முகவரி களுக்கு மட்டுமே";
"Right" = "வலது";
"Channels" = "சேனல்கள்";
"Show icons and text when space permits" = "விண்வெளி அனுமதிக்கும்போது சின்னங்களையும் உரையையும் காட்டுங்கள்";
"Show only icons" = "ஐகான்களை மட்டும் காட்டு";
"Audio" = "ஆடியோ";
"File" = "கோப்பு";
"Video" = "ஒளிதோற்றம்";
"Codec" = "புரிப்பு";
"Size" = "அளவு";
"FPS" = "Fps";
"Sample Rate" = "மாதிரி வீதம்";
"Could not find any links to open in your clipboard" = "உங்கள் கிளிப்போர்டில் திறக்க எந்த இணைப்புகளையும் கண்டுபிடிக்க முடியவில்லை";
"Address" = "முகவரி";
"Remove…" = "அகற்று…";
"Actions buttons" = "செயல்கள் பொத்தான்கள்";
"Show sidebar" = "பக்கப்பட்டியைக் காட்டு";
"Locations Manifest" = "இருப்பிடங்கள் வெளிப்படுகின்றன";
"Remove Location" = "இருப்பிடத்தை அகற்று";
"Default Profile" = "இயல்புநிலை சுயவிவரம்";
"Playback history is empty" = "பின்னணி வரலாறு காலியாக உள்ளது";
"Copy%@link" = "நகலெடு%@இணைப்பு";
"Are you sure you want to remove this document?" = "இந்த ஆவணத்தை அகற்ற விரும்புகிறீர்களா?";
"\"%@\" will be irreversibly removed from this device." = "\"%@\" இந்த சாதனத்திலிருந்து மாற்றமுடியாமல் அகற்றப்படும்.";
"Are you sure you want to remove %@ location?" = "%@ இருப்பிடத்தை அகற்ற விரும்புகிறீர்களா?";
"Shorts" = "குறுக்குகள்";
"Verified" = "சரிபார்க்கப்பட்டது";
"Channel" = "வாய்க்கால்";
"Open expanded" = "திறந்த விரிவாக்கப்பட்டது";
"Mark channel feed as unwatched" = "சேனல் தீவனத்தை கவனக்குறைவாகக் குறிக்கவும்";
"Mark channel feed as watched" = "பார்த்தபடி சேனல் ஊட்டத்தைக் குறிக்கவும்";
"Short videos: visible" = "குறுகிய வீடியோக்கள்: தெரியும்";
"Short videos: hidden" = "குறுகிய வீடியோக்கள்: மறைக்கப்பட்டுள்ளன";
"Play all unwatched" = "எல்லாவற்றையும் கவனிக்காமல் விளையாடுங்கள்";
"Double tap gesture" = "இரட்டை குழாய் சைகை";
"Tap and hold channel thumbnail to open context menu with more actions" = "மேலும் செயல்களுடன் சூழல் மெனுவைத் திறக்க சேனல் சிறுபடத்தைத் தட்டி வைத்திருங்கள்";
"Single tap gesture" = "ஒற்றை குழாய் சைகை";
"Mark all as unwatched" = "அனைத்தையும் கவனக்குறைவாகக் குறிக்கவும்";
"Queue - shuffled" = "வரிசை - மாற்றப்பட்டது";
"Playback Settings" = "பின்னணி அமைப்புகள்";
"Replay" = "மீண்டும்";
"Fullscreen" = "முழு திரை";
"Description" = "விவரம்";
"Loop one" = "லூப் ஒன்";
"Autoplay next" = "ஆட்டோ பிளே அடுத்து";
"Stream" = "ச்ட்ரீம்";
"Enter account credentials to connect..." = "இணைக்க கணக்கு நற்சான்றிதழ்களை உள்ளிடவும் ...";
"Enter location address to connect..." = "இணைக்க இருப்பிட முகவரியை உள்ளிடவும் ...";
"Seek" = "தேடுங்கள்";
"Opened File" = "திறந்த கோப்பு";
"File Extension" = "கோப்பு நீட்டிப்பு";
"Opening file…" = "கோப்பைத் திறக்கும்…";
"Public account" = "பொது கணக்கு";
"Your Accounts" = "உங்கள் கணக்குகள்";
"Browse without account" = "கணக்கு இல்லாமல் உலாவுக";
"Close video and player on end" = "முடிவில் வீடியோ மற்றும் பிளேயரை மூடு";
"Use system controls with AVPlayer" = "AVPlayer உடன் கணினி கட்டுப்பாடுகளைப் பயன்படுத்தவும்";
"Rotate when entering fullscreen on landscape video" = "நிலப்பரப்பு வீடியோவில் முழுத்திரை நுழையும்போது சுழற்றுங்கள்";
"Landscape right" = "இயற்கை சரியானது";
"No rotation" = "சுழற்சி இல்லை";
"Available" = "கிடைக்கிறது";
"Startup section" = "தொடக்க பிரிவு";
"Home Settings" = "வீட்டு அமைப்புகள்";
"Watched: hidden" = "பார்த்தது: மறைக்கப்பட்டுள்ளது";
"(watched and shorts hidden)" = "(பார்த்த மற்றும் குறும்படங்கள் மறைக்கப்பட்டுள்ளன)";
"No videos to show" = "காட்ட வீடியோக்கள் இல்லை";
"(watched hidden)" = "(மறைக்கப்பட்டிருப்பதைப் பார்த்தேன்)";
"(shorts hidden)" = "(சார்ட்ச் மறைக்கப்பட்டுள்ளது)";
"Disable filters" = "வடிப்பான்களை முடக்கு";
"Limit" = "வரம்பு";
"Are you sure you want to remove %@ from Favorites?" = "பிடித்தவைகளிலிருந்து %@ ஐ அகற்ற விரும்புகிறீர்களா?";
"Smaller" = "மிகசிறிய";
"Clear all" = "அனைத்தையும் அழி";
"URL" = "இணையமுகவரி";
"Badge" = "பதக்கம்";
"Badge & Decreased opacity" = "பதக்கம் மற்றும் ஒளிபுகாநிலை குறைவு";
"Show unwatched feed badges" = "எடுக்கப்படாத தீவன பதக்ங்களைக் காட்டு";
" subscribers" = " சந்தாதாரர்கள்";
"%lld videos" = "%எல்.எல்.டி வீடியோக்கள்";
"10 seconds forwards/backwards" = "10 வினாடிகள் முன்னோக்கி/பின்தங்கிய";
"Add Account..." = "கணக்கைச் சேர்க்கவும் ...";
"Anonymous" = "அநாமதேய";
"Autoplaying Next" = "அடுத்ததாக ஆட்டோபிளேயிங்";
"Based on system color scheme" = "கணினி வண்ணத் திட்டத்தின் அடிப்படையில்";
"Battery" = "மின்கலம்";
"Button" = "பொத்தான்";
"Clear" = "தெளிவான";
"Clear Search History..." = "தேடல் வரலாற்றை அழிக்கவும் ...";
"Close" = "மூடு";
"Close player when starting PiP" = "PIP ஐத் தொடங்கும்போது வீரர்";
"Close Video" = "வீடியோவை மூடு";
"Connection failed" = "இணைப்பு தோல்வியடைந்தது";
"Contributing" = "பங்களிப்பு";
"Country" = "நாடு";
"Country Name or Code" = "நாட்டின் பெயர் அல்லது குறியீடு";
"Decreased opacity" = "ஒளிபுகாநிலை குறைந்தது";
"Donations" = "நன்கொடைகள்";
"Done" = "முடிந்தது";
"Duration" = "காலம்";
"Edit..." = "திருத்து ...";
"Enter fullscreen in landscape" = "நிலப்பரப்பில் முழுத்திரை உள்ளிடவும்";
"Favorites" = "பிடித்தவை";
"Filter" = "வடிப்பி";
"For videos which feature music as the primary content." = "இசையை முதன்மை உள்ளடக்கமாக இடம்பெறும் வீடியோக்களுக்கு.";
"Frontend URL" = "ஃபிரான்டென்ட் முகவரி";
"Fullscreen size" = "முழுத்திரை அளவு";
"Help" = "உதவி";
"I like this app!" = "இந்த பயன்பாட்டை நான் விரும்புகிறேன்!";
"Increase rate" = "வீதத்தை அதிகரிக்கவும்";
"Info" = "தகவல்";
"Interaction" = "உள்வினை";
"Issues Tracker" = "டிராக்கரை வெளியிடுகிறது";
"Just watched" = "இப்போது பார்த்தேன்";
"LIVE" = "வாழ";
"Loading streams…" = "ச்ட்ரீம்களை ஏற்றுகிறது…";
"Mark watched videos with" = "மார்க் பார்த்த வீடியோக்கள்";
"Milestones" = "மைல்கற்கள்";
"Month" = "மாதம்";
"Movies" = "திரைப்படங்கள்";
"New Playlist" = "புதிய பிளேலிச்ட்";
"No description" = "விளக்கம் இல்லை";
"Only when signed in" = "கையொப்பமிடும்போது மட்டுமே";
"Opening audio stream…" = "ஆடியோ ச்ட்ரீமைத் திறக்கிறது…";
"Orientation" = "நோக்குநிலை";
"Password" = "கடவுச்சொல்";
"Playback" = "பின்னணி";
"Preferred Formats" = "விருப்பமான வடிவங்கள்";
"Profiles" = "சுயவிவரங்கள்";
"Rate" = "விகிதம்";
"Recents" = "அண்மைக் கால";
"Regular Size" = "வழக்கமான அளவு";
"Related" = "தொடர்புடைய";
"Relevance" = "பொருத்தமானது";
"Remove from history" = "வரலாற்றிலிருந்து அகற்று";
"Reset search filters" = "தேடல் வடிப்பான்களை மீட்டமைக்கவும்";
"Resolution" = "பகுத்தல்";
"Save" = "சேமி";
"Search..." = "தேடுங்கள் ...";
"Seek gesture sensitivity" = "சைகை உணர்திறனைத் தேடுங்கள்";
"Seek gesture speed" = "சைகை வேகத்தைத் தேடுங்கள்";
"Self-promotion" = "தன்வய ஊக்குவிப்பு";
"Share %@ link" = "பகிர்வு %@ இணைப்பு";
"Share %@ link with time" = "நேரத்துடன் %@ இணைப்பைப் பகிரவும்";
"Show history" = "வரலாற்றைக் காட்டு";
"Show playback statistics" = "பிளேபேக் புள்ளிவிவரங்களைக் காட்டு";
"Shuffle" = "கலக்கு";
"Sign In Required" = "தேவையான உள்நுழைவு";
"Sort" = "வரிசைப்படுத்து";
"Subscribe" = "குழுசேர்";
"Subscriptions" = "சந்தாக்கள்";
"Switch to other public location" = "பிற பொது இருப்பிடத்திற்கு மாறவும்";
"This cannot be reverted" = "இதை மாற்ற முடியாது";
"Thumbnails" = "சிறு உருவங்கள்";
"unknown" = "தெரியவில்லை";
"Unsubscribe" = "குழுவிலகவும்";
"Used to create links from videos, channels and playlists" = "வீடியோக்கள், சேனல்கள் மற்றும் பிளேலிச்ட்களிலிருந்து இணைப்புகளை உருவாக்க பயன்படுகிறது";
"Watched %@" = "பார்த்தது %@";
"Week" = "வாரம்";
"Yattee" = "யாட்டீ";
"Yattee %@ (build %@)" = "Yattee %@ (உருவாக்க %@)";
"You have no Playlists" = "உங்களிடம் பிளேலிச்ட்கள் இல்லை";
"Playback queue is empty" = "பிளேபேக் வரிசை காலியாக உள்ளது";
"Make default" = "இயல்புநிலை செய்யுங்கள்";
"Visibility" = "விழிமை";
"Stream & Player" = "ச்ட்ரீம் & பிளேயர்";
"Cached time" = "தற்காலிக சேமிப்பு நேரம்";
"No chapters information available" = "அத்தியாயங்கள் செய்தி எதுவும் கிடைக்கவில்லை";
"Could not refresh Trending" = "போக்கைப் புதுப்பிக்க முடியவில்லை";
"This URL could not be opened" = "இந்த முகவரி ஐ திறக்க முடியவில்லை";
"Could not open channel" = "சேனலைத் திறக்க முடியவில்லை";
"Could not extract playlist ID" = "பிளேலிச்ட் ஐடியை பிரித்தெடுக்க முடியவில்லை";
"Could not load video" = "வீடியோவை ஏற்ற முடியவில்லை";
"Could not refresh Playlists" = "பிளேலிச்ட்களைப் புதுப்பிக்க முடியவில்லை";
"Home" = "வீடு";
"Show Home" = "வீட்டைக் காட்டு";
"Recent History" = "அண்மைக் கால வரலாறு";
"Reload manifest" = "மீண்டும் ஏற்றவும்";
"Enter link to open" = "திறக்க இணைப்பை உள்ளிடவும்";
"Add" = "கூட்டு";
"Open Files" = "கோப்புகளைத் திறக்கவும்";
"Share" = "பங்கு";
"Left" = "இடது";
"Center" = "நடுவண்";
"Documents" = "ஆவணங்கள்";
"Open Video" = "வீடியோ திறந்த வீடியோ";
"Share%@link" = "பகிர்வு%@இணைப்பு";
"Could not delete document" = "ஆவணத்தை நீக்க முடியவில்லை";
"Live Streams" = "நேரடி நீரோடைகள்";
"Player Bar" = "பிளேயர் பார்";
"Always show controls buttons" = "எப்போதும் கட்டுப்பாட்டு பொத்தான்களைக் காட்டு";
"Maximum width expanded" = "அதிகபட்ச அகலம் விரிவடைந்தது";
"Seeking" = "தேடுவது";
"Controls Buttons" = "பொத்தான்களைக் கட்டுப்படுத்துகிறது";
"Controls button: backwards" = "கட்டுப்பாடுகள் பொத்தான்: பின்னோக்கி";
"Controls button: forwards" = "கட்டுப்பாடுகள் பொத்தான்: முன்னோக்கி";
"Hide player" = "பிளேயரை மறைக்க";
"Actions Buttons" = "செயல்கள் பொத்தான்கள்";
"Music Mode" = "இசை முறை";
"Subscribe/Unsubscribe" = "குழுசேரவும்/குழுவிலகவும்";
"Toggle player" = "பிளேயரை மாற்றவும்";
"Feed" = "தீவனம்";
"Inspector" = "இன்ச்பெக்டர்";
"Mark all as watched" = "பார்த்தபடி அனைவரையும் குறிக்கவும்";
"Lock" = "பூட்டு";
"Show scroll to top button in comments" = "கருத்துகளில் மேல் பொத்தானைக் காட்டுங்கள்";
"Landscape left" = "இயற்கை இடது";
"Watched: visible" = "பார்த்தது: தெரியும்";
"Play Now in AVPlayer" = "AVPlayer இல் இப்போது விளையாடுங்கள்";
"Show channel avatars in videos lists" = "வீடியோ பட்டியலில் சேனல் அவதாரங்களைக் காட்டு";
"Description preview" = "விளக்கம் முன்னோட்டம்";
"No preview" = "முன்னோட்டம் இல்லை";
"Other" = "மற்ற";
"Are you sure you want to export unencrypted passwords?" = "மறைகுறியாக்கப்பட்ட கடவுச்சொற்களை ஏற்றுமதி செய்ய விரும்புகிறீர்களா?";
"Icon only" = "படவுரு மட்டும்";
"Platform" = "இயங்குதளம்";
"Action button labels" = "செயல் பொத்தான் லேபிள்கள்";
"Export in progress..." = "முன்னேற்றத்தில் ஏற்றுமதி ...";
"In progress..." = "செயலில் உள்ளது…";
"Contact" = "தொடர்பு";
"Continue" = "தொடரவும்";
"Continue from %@" = "%@ இலிருந்து தொடரவும்";
"Controls" = "கட்டுப்பாடுகள்";
"Copy %@ link" = "நகலெடு %@ இணைப்பு";
"Copy %@ link with time" = "நேரத்துடன் %@ இணைப்பை நகலெடுக்கவும்";
"Could not load locations manifest" = "இருப்பிடங்களை வெளிப்படையாக ஏற்ற முடியவில்லை";
"Are you sure you want to clear history of watched videos?" = "பார்த்த வீடியோக்களின் வரலாற்றை அழிக்க விரும்புகிறீர்களா?";
"Are you sure you want to clear search history?" = "தேடல் வரலாற்றை அழிக்க விரும்புகிறீர்களா?";
"Are you sure you want to delete playlist?" = "பிளேலிச்ட்டை நீக்க விரும்புகிறீர்களா?";
"Are you sure you want to restore default quality profiles?" = "இயல்புநிலை தர சுயவிவரங்களை மீட்டெடுக்க விரும்புகிறீர்களா?";
"Are you sure you want to unsubscribe from %@?" = "%@இலிருந்து குழுவிலக விரும்புகிறீர்களா?";
"Automatic" = "தானியங்கி";
"Backend" = "பின்தளத்தில்";
"Blue" = "நீலம்";
"Browsing" = "உலாவுதல்";
"Buffering stream..." = "இடையக ச்ட்ரீம் ...";
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "பிழைகள் மற்றும் சிறந்த அம்ச யோசனைகளை அறிவிலிமையம் சிக்கல்கள் டிராக்கருக்கு அனுப்பலாம். ";
"Cancel" = "ரத்துசெய்";
"Captions" = "தலைப்புகள்";
"Categories to Skip" = "தவிர்க்க வகைகள்";
"Category" = "வகை";
"Cellular" = "செல்லுலார்";
"Chapters" = "பாடங்கள்";
"Charging" = "சார்சிங்";
"Clear All" = "அனைத்தையும் அழிக்கவும்";
"Clear All Recents" = "எல்லா நெறிமுறைகளையும் அழிக்கவும்";
"Clear History" = "வரலாற்றை அழிக்கவும்";
"Clear Search History" = "தேடல் வரலாற்றை அழிக்கவும்";
"Clear the queue" = "வரிசையை அழிக்கவும்";
"Close PiP and open player when application enters foreground" = "பயன்பாடு முன்புறத்தில் நுழையும்போது மூடிய குழாய் மற்றும் திறந்த பிளேயர்";
"Close PiP when player is opened" = "பிளேயர் திறக்கப்படும்போது பிப் மூடு";
"Close PiP when starting playing other video" = "மற்ற வீடியோவை இயக்கத் தொடங்கும் போது PIP ஐ மூடு";
"Close player when closing video" = "வீடியோவை மூடும்போது பிளேயரை மூடு";
"Close video after playing last in the queue" = "வரிசையில் கடைசியாக விளையாடிய பிறகு வீடியோவை மூடு";
"Comments" = "கருத்துகள்";
"Connected successfully (%@)" = "வெற்றிகரமாக இணைக்கப்பட்டுள்ளது (%@)";
"Badge color" = "பதக்க நிறம்";
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "எந்தவொரு கட்டண அல்லது இலவச தளத்திலும் (கள்) (எ.கா. ஒரு வீடியோவில் சொடுக்கு செய்க) அவர்களுடன் விரும்புவது, குழுசேர அல்லது தொடர்பு கொள்ள வெளிப்படையான நினைவூட்டல்கள்.";
"Filter: active" = "வடிகட்டி: செயலில்";
"Find Other" = "மற்றவர்களைக் கண்டுபிடி";
"Finding something to play..." = "விளையாட ஏதாவது கண்டுபிடிப்பது ...";
"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "பட்டியலிடப்பட்டபடி வடிவங்கள் வரிசையில் தேர்ந்தெடுக்கப்படும்.\n எச்.எல்.எச் என்பது ஒரு தகவமைப்பு வடிவமாகும் (தீர்மான அமைப்பு பொருந்தாது).";
"Gaming" = "கேமிங்";
"Hide sidebar" = "பக்கப்பட்டியை மறைக்கவும்";
"High" = "உயர்ந்த";
"Highest" = "அதிகபட்சம்";
"Highest quality" = "மிக உயர்ந்த தகுதி";
"History" = "வரலாறு";
"Honor orientation lock" = "மரியாதை நோக்குநிலை பூட்டு";
"Hour" = "மணி";
"I am lost" = "நான் தொலைந்துவிட்டேன்";
"I found a bug /" = "நான் ஒரு பிழையைக் கண்டேன் /";
"I have a feature request" = "எனக்கு ஒரு அம்ச கோரிக்கை உள்ளது";
"I want to ask a question" = "நான் ஒரு கேள்வி கேட்க விரும்புகிறேன்";
"If you are interested what's coming in future updates, you can track project Milestones." = "எதிர்கால புதுப்பிப்புகளில் என்ன வரப்போகிறது என்பதை நீங்கள் ஆர்வமாக இருந்தால், திட்ட மைல்கற்களைக் கண்காணிக்கலாம்.";
"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "நீங்கள் ஒரு பிழையைப் புகாரளிக்கிறீர்கள் என்றால், தொடர்புடைய அனைத்து விவரங்களையும் சேர்க்கவும் (குறிப்பாக: பயன்பாட்டு பதிப்பு, பயன்படுத்தப்பட்ட சாதனம் மற்றும் கணினி பதிப்பு, இனப்பெருக்கம் செய்வதற்கான படிகள்).";
"Instance of current account" = "நடப்பு கணக்கின் நிகழ்வு";
"Interface" = "இடைமுகம்";
"Intro" = "அறிமுகம்";
"Large" = "பெரிய";
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "பெரிய தளவமைப்பு எல்லா சாதனங்களுக்கும் பொருத்தமானதல்ல, அதைப் பயன்படுத்துவது கட்டுப்பாடுகள் திரையில் பொருந்தாது.";
"Loading..." = "ஏற்றுகிறது ...";
"Locations" = "இருப்பிடங்கள்";
"Replies" = "பதில்கள்";
"Part of a video promoting a product or service not directly related to the creator. The creator will receive payment or compensation in the form of money or free products." = "படைப்பாளருடன் நேரடியாக தொடர்புடைய ஒரு தயாரிப்பு அல்லது சேவையை ஊக்குவிக்கும் வீடியோவின் ஒரு பகுதி. படைப்பாளி பணம் அல்லது இலவச தயாரிப்புகளின் வடிவத்தில் கட்டணம் அல்லது இழப்பீட்டைப் பெறுவார்.";
"Pause" = "இடைநிறுத்தம்";
"Pause when entering background" = "பின்னணியில் நுழையும்போது இடைநிறுத்தம்";
"Pause when player is closed" = "வீரர் மூடப்படும் போது இடைநிறுத்தம்";
"Picture in Picture" = "படத்தில் படம்";
"Play" = "விளையாடுங்கள்";
"Play All" = "அனைத்தையும் விளையாடுங்கள்";
"Play in PiP" = "பைப்பில் விளையாடுங்கள்";
"Play Last" = "கடைசியாக விளையாடுங்கள்";
"Play Music" = "இசை வாசிக்கவும்";
"Play Next" = "அடுத்து விளையாடுங்கள்";
"Play Now" = "இப்போது விளையாடுங்கள்";
"Player" = "வீரர்";
"Playlist" = "பிளேலிச்ட்";
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "பிளேலிச்ட் \"%@\" நீக்கப்படும்.\n அதை மாற்ற முடியாது.";
"Playlists" = "பிளேலிச்ட்கள்";
"Popular" = "மக்கள்";
"Promoting a product or service that is directly related to the creator themselves. This usually includes merchandise or promotion of monetized platforms." = "படைப்பாளருடன் நேரடியாக தொடர்புடைய ஒரு தயாரிப்பு அல்லது சேவையை ஊக்குவித்தல். இது வழக்கமாக பணமாக்கப்பட்ட தளங்களின் வணிக அல்லது விளம்பரத்தை உள்ளடக்கியது.";
"Proxy videos" = "பதிலாள் வீடியோக்கள்";
"Public Locations" = "பொது இடங்கள்";
"Public Manifest" = "பொது மேனிஃபெச்ட்";
"Quality" = "தகுதி";
"Quality Profile" = "தரமான சுயவிவரம்";
"Queue" = "வரிசை";
"Queue is empty" = "வரிசை காலியாக உள்ளது";
"Rating" = "செயல்வரம்பு";
"Red" = "சிவப்பு";
"Refresh" = "புதுப்பிப்பு";
"Regular size" = "வழக்கமான அளவு";
"Remove" = "அகற்று";
"Remove from Favorites" = "பிடித்தவைகளிலிருந்து அகற்று";
"Remove from Playlist" = "பிளேலிச்ட்டிலிருந்து அகற்று";
"Remove from the queue" = "வரிசையிலிருந்து அகற்று";
"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." = "அனிமேசன், இன்னும் சட்டகம் அல்லது கிளிப் ஆகியவற்றை உள்ளடக்கிய வீடியோவின் தொடக்கத்தில் பொதுவாகக் காணப்படும் பிரிவுகள், அதே படைப்பாளரால் மற்ற வீடியோக்களிலும் காணப்படுகின்றன.";
"Select location closest to you:" = "உங்களுக்கு மிக நெருக்கமான இருப்பிடத்தைத் தேர்ந்தெடுக்கவும்:";
"Settings" = "அமைப்புகள்";
"Share..." = "பங்கு ...";
"Short" = "குறுக்கு";
"Show account username" = "கணக்கு பயனர்பெயரைக் காட்டு";
"Show anonymous accounts" = "அநாமதேய கணக்குகளைக் காட்டு";
"Show channel name" = "சேனல் பெயரைக் காட்டு";
"Show keywords" = "முக்கிய வார்த்தைகளைக் காட்டு";
"Show progress of watching on thumbnails" = "சிறுபடங்களில் பார்க்கும் முன்னேற்றத்தைக் காட்டுங்கள்";
"Show sidebar when space permits" = "விண்வெளி அனுமதிக்கும் போது பக்கப்பட்டியைக் காட்டு";
"Show video length" = "வீடியோ நீளத்தைக் காட்டு";
"Shuffle All" = "அனைத்தையும் மாற்றவும்";
"Sidebar" = "பக்கப்பட்டி";
"Small" = "சிறிய";
"Sort: %@" = "வரிசைப்படுத்துதல்: %@";
"Source" = "மூலம்";
"Sponsor" = "ஒப்புரவாளர்";
"SponsorBlock" = "ஒப்புரவாளர் தொகுதி";
"SponsorBlock API Instance" = "ஒப்புரவாளர் பிளாக் பநிஇ நிகழ்வு";
"Switch to public locations" = "பொது இடங்களுக்கு மாறவும்";
"System controls buttons" = "கணினி பொத்தான்களைக் கட்டுப்படுத்துகிறது";
"System controls show buttons for %@" = "கணினி கட்டுப்பாடுகள் %@ க்கான பொத்தான்களைக் காட்டுகின்றன";
"That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development." = "அதைக் கேட்பது நல்லது. மற்றவர்கள் பயன்படுத்த விரும்பும் பயன்பாடுகளை வழங்குவது வேடிக்கையாக உள்ளது. புதிய நற்பொருத்தங்கள் மேம்பாட்டுக்கு பங்களிப்பதன் மூலம் திட்டத்திற்கு நன்கொடை அளிப்பதை நீங்கள் பரிசீலிக்கலாம்.";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "இதை மாற்ற முடியாது. மாற்றங்களைக் காண நீங்கள் காட்சிகளுக்கு இடையில் மாற வேண்டும் அல்லது பயன்பாட்டை மறுதொடக்கம் செய்ய வேண்டும்.";
"Private" = "தனிப்பட்ட";
"This information will be processed only on your device and used to connect you to the server in the specified country." = "இந்த செய்தி உங்கள் சாதனத்தில் மட்டுமே செயலாக்கப்படும் மற்றும் குறிப்பிட்ட நாட்டில் உள்ள சேவையகத்துடன் உங்களை இணைக்கப் பயன்படுகிறது.";
"This will remove all your custom profiles and return their default values. This cannot be reverted." = "இது உங்கள் தனிப்பயன் சுயவிவரங்கள் அனைத்தையும் அகற்றி அவற்றின் இயல்புநிலை மதிப்புகளைத் தரும். இதை மாற்ற முடியாது.";
"Today" = "இன்று";
"Trending" = "டிரெண்டிங்";
"TV" = "டிவி";
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "பொதுவாக வீடியோவின் அருகில் அல்லது வரவுகளை பாப் அப் மற்றும்/அல்லது எண்ட்கார்டுகள் காண்பிக்கும் போது.";
"Upload date" = "பதிவேற்ற தேதி";
"Username" = "பயனர்பெயர்";
"Very Large" = "மிகப் பெரியது";
"Videos" = "வீடியோக்கள்";
"Views" = "காட்சிகள்";
"Watched" = "பார்த்தேன்";
"Watching now" = "இப்போது பார்க்கிறது";
"Welcome" = "வரவேற்கிறோம்";
"When partially watched video is played" = "ஓரளவு பார்த்த வீடியோ இசைக்கப்படும் போது";
"Wi-Fi" = "இல்";
"Wiki" = "விக்கி";
"Year" = "ஆண்டு";
"You can find information about using Yattee in the Wiki pages." = "விக்கி பக்கங்களில் யாட்டியைப் பயன்படுத்துவது பற்றிய தகவல்களை நீங்கள் காணலாம்.";
"You can use automatic profile selection based on current device status or switch it in video playback settings controls." = "தற்போதைய சாதன நிலையின் அடிப்படையில் தானியங்கி சுயவிவரத் தேர்வைப் பயன்படுத்தலாம் அல்லது வீடியோ பிளேபேக் அமைப்புகள் கட்டுப்பாடுகளில் அதை மாற்றலாம்.";
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "உங்களிடம் பிளேலிச்ட்கள் இல்லை\n\n ஒன்றை உருவாக்க \"புதிய பிளேலிச்ட்டை\" தட்டவும்";
"You need to create an instance and accounts\nto access %@ section" = "நீங்கள் ஒரு நிகழ்வு மற்றும் கணக்குகளை உருவாக்க வேண்டும்\n %@ பிரிவை அணுக";
"You need to select an account\nto access %@ section" = "நீங்கள் ஒரு கணக்கைத் தேர்ந்தெடுக்க வேண்டும்\n %@ பிரிவை அணுக";
"Public" = "பொது";
"Unlisted" = "பட்டியலிடப்படாதது";
"Now Playing" = "இப்போது விளையாடுகிறது";
"Current Location" = "தற்போதைய இடம்";
"For custom locations you can configure Frontend URL in Locations settings" = "தனிப்பயன் இடங்களுக்கு நீங்கள் இருப்பிட அமைப்புகளில் முன்பக்க முகவரி ஐ உள்ளமைக்கலாம்";
"Could not refresh Popular" = "பிரபலமாக புதுப்பிக்க முடியவில்லை";
"Could not create share link" = "பங்கு இணைப்பை உருவாக்க முடியவில்லை";
"Could not open playlist" = "பிளேலிச்ட்டைத் திறக்க முடியவில்லை";
"Could not extract video ID" = "வீடியோ ஐடியை பிரித்தெடுக்க முடியவில்லை";
"This video could not be opened" = "இந்த வீடியோவை திறக்க முடியவில்லை";
"No locations available at the moment" = "இந்த நேரத்தில் இடங்கள் எதுவும் கிடைக்கவில்லை";
"If you want this app to be available in your language, join translation project." = "இந்த பயன்பாடு உங்கள் மொழியில் கிடைக்க விரும்பினால், மொழிபெயர்ப்பு திட்டத்தில் சேரவும்.";
"Translations" = "மொழிபெயர்ப்புகள்";
"No documents" = "ஆவணங்கள் இல்லை";
"Recent Documents" = "சமீபத்திய ஆவணங்கள்";
"Share files from Finder on a Mac\nor iTunes on Windows" = "மேக்கில் கண்டுபிடிப்பாளரிடமிருந்து கோப்புகளைப் பகிரவும்\n அல்லது சன்னல்களில் ஐடியூன்ச்";
"Show Open Videos quick actions" = "திறந்த வீடியோக்களை விரைவான செயல்களைக் காட்டு";
"Show Favorites" = "பிடித்தவைகளைக் காட்டு";
"Inspector visibility" = "இன்ச்பெக்டர் தெரிவுநிலை";
"Edit Favorites…" = "பிடித்தவைகளைத் திருத்து…";
"Show Open Videos toolbar button" = "திறந்த வீடியோக்கள் கருவிப்பட்டி பொத்தானைக் காட்டு";
"Buttons labels" = "பொத்தான்கள் லேபிள்கள்";
"Files" = "கோப்புகள்";
"Show Documents" = "ஆவணங்களைக் காட்டு";
"Pages toolbar position" = "பக்கங்கள் கருவிப்பட்டி நிலை";
"Video Details" = "வீடியோ விவரங்கள்";
"Show Inspector" = "காட்டு இன்ச்பெக்டர்";
"Clear Queue before opening" = "திறப்பதற்கு முன் வரிசையை அழிக்கவும்";
"Open" = "திற";
"Video actions buttons" = "வீடியோ செயல்கள் பொத்தான்கள்";
"Pages buttons" = "பக்கங்கள் பொத்தான்கள்";
"URL to Open" = "திறக்க முகவரி";
"Could not open Files" = "கோப்புகளைத் திறக்க முடியவில்லை";
"Paste" = "ஒட்டு";
"Open Videos" = "வீடியோக்களைத் திறக்கவும்";
"Right click channel thumbnail to open context menu with more actions" = "மேலும் செயல்களுடன் சூழல் மெனுவைத் திறக்க சேனல் சிறு உருவத்தை வலது சொடுக்கு செய்யவும்";
"Gesture: fowards" = "சைகை: நோக்கி";
"System controls" = "கணினி கட்டுப்பாடுகள்";
"Gesture: backwards" = "சைகை: பின்னோக்கி";
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "சைகை அமைப்புகள் பிளேயரின் இடது/வலது பக்கத்தில் இரட்டை குழாய் சைகைக்கான இடைவெளியைத் தவிர்க்கும் இடைவெளியைக் கட்டுப்படுத்துகின்றன. கணினி கட்டுப்பாடுகள் அமைப்புகளை மாற்ற மறுதொடக்கம் தேவை.";
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "சைகை அமைப்புகள் கட்டுப்பாட்டு வீரரின் இடது/வலது பக்கத்தில் இரட்டை சொடுக்கு செய்வதற்கான இடைவெளியைத் தவிர்க்கவும். கணினி கட்டுப்பாடுகள் அமைப்புகளை மாற்ற மறுதொடக்கம் தேவை.";
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "சைகை அமைப்புகள் தொலை அம்பு பொத்தான்களுக்கான இடைவெளியைத் தவிர்க்கின்றன (2 வது தலைமுறை சிரி ரிமோட் அல்லது புதியது). கணினி கட்டுப்பாடுகள் அமைப்புகளை மாற்ற மறுதொடக்கம் தேவை.";
"Play next item" = "அடுத்த உருப்படியை விளையாடுங்கள்";
"Lock orientation" = "பூட்டு நோக்குநிலை";
"Close video" = "வீடியோவை மூடு";
"Total size: %@" = "மொத்த அளவு: %@";
"Open channels with description expanded" = "விளக்கத்துடன் திறந்த சேனல்கள் விரிவாக்கப்பட்டன";
"Cache" = "கேச்";
"Show cache status" = "கேச் நிலையைக் காட்டு";
"Maximum feed items" = "அதிகபட்ச தீவன உருப்படிகள்";
"Are you sure you want to clear cache?" = "நீங்கள் நிச்சயமாக கேச் அழிக்க விரும்புகிறீர்களா?";
"Show Next in Queue" = "அடுத்த வரிசையில் காண்பி";
"Show toggle watch status button" = "வாட்ச் நிலை பொத்தானை மாற்றிக் கொள்ளுங்கள்";
"Next in Queue" = "அடுத்த வரிசையில்";
"List" = "பட்டியல்";
"Cells" = "செல்கள்";
"Toggle size" = "அளவை மாற்றவும்";
"Do nothing" = "எதுவும் செய்ய வேண்டாம்";
"Open channel" = "திறந்த சேனல்";
"Open video description expanded" = "திறந்த வீடியோ விளக்கம் விரிவாக்கப்பட்டது";
"Keep channels with unwatched videos on top of subscriptions list" = "சந்தாக்கள் பட்டியலில் மேலே உள்ள வீடியோக்களுடன் சேனல்களை வைத்திருங்கள்";
"Show video context menu options to force selected backend" = "தேர்ந்தெடுக்கப்பட்ட பின்தளத்தில் கட்டாயப்படுத்த வீடியோ சூழல் பட்டியல் விருப்பங்களைக் காட்டுங்கள்";
"Play Now in MPV" = "MPV இல் இப்போது விளையாடுங்கள்";
"Show channel avatars in channels lists" = "சேனல்கள் பட்டியல்களில் சேனல் அவதாரங்களைக் காட்டு";
"Podcasts" = "பாட்காச்ட்கள்";
"Releases" = "வெளியீடுகள்";
"Add %@" = "%@ சேர்க்கவும்";
"Open vertical chapters expanded" = "திறந்த செங்குத்து அத்தியாயங்கள் விரிவடைந்தன";
"Chapters (if available)" = "அத்தியாயங்கள் (கிடைத்தால்)";
"Import Settings..." = "இறக்குமதி அமைப்புகள் ...";
"Export Settings" = "ஏற்றுமதி அமைப்புகள்";
"Accounts passwords (unencrypted)" = "கணக்குகள் கடவுச்சொற்கள் (மறைகுறியாக்கப்படாதவை)";
"Other data" = "பிற தரவு";
"Export..." = "ஏற்றுமதி…";
"Other data include last used playback preferences and listing options" = "மற்ற தரவுகளில் கடைசியாக பயன்படுத்தப்பட்ட பின்னணி விருப்பத்தேர்வுகள் மற்றும் பட்டியல் விருப்பங்கள் அடங்கும்";
"Do not share this file with anyone or you can lose access to your accounts. If you don't select to export passwords you will be asked to provide them during import" = "இந்த கோப்பை யாருடனும் பகிர வேண்டாம் அல்லது உங்கள் கணக்குகளுக்கான அணுகலை இழக்கலாம். கடவுச்சொற்களை ஏற்றுமதி செய்ய நீங்கள் தேர்ந்தெடுக்கவில்லை என்றால், இறக்குமதியின் போது அவற்றை வழங்குமாறு கேட்கப்படுவீர்கள்";
"Export" = "ஏற்றுமதி";
"File information" = "கோப்பு செய்தி";
"Build" = "உருவாக்கு";
"Import" = "இறக்குமதி";
"Icon and text" = "படவுரு மற்றும் உரை";
"Password required to import" = "இறக்குமதி செய்ய கடவுச்சொல் தேவை";
"Custom Location already exists" = "தனிப்பயன் இடம் ஏற்கனவே உள்ளது";
"Custom Location selected for import" = "இறக்குமதிக்கு தேர்ந்தெடுக்கப்பட்ட தனிப்பயன் இடம்";
"Custom Location not selected for import" = "இறக்குமதிக்கு தனிப்பயன் இடம் தேர்ந்தெடுக்கப்படவில்லை";
"Account already exists" = "கணக்கு ஏற்கனவே உள்ளது";
"Password saved in import file" = "இறக்குமதி கோப்பில் கடவுச்சொல் சேமிக்கப்பட்டது";

View File

@ -266,11 +266,11 @@
"Sections" = "Bölümler";
"Save history of searches, channels and playlists" = "Arama, kanal ve çalma listelerinin geçmişini kaydet";
"Restore default profiles..." = "Varsayılan profilleri geri yükle...";
"Visibility" = "";
"Visibility" = "Görünürlük";
"Translations" = "Çeviriler";
"Enter links to open, one per line" = "";
"Open Videos" = "";
"Playback Mode" = "";
"Enter links to open, one per line" = "Açmak için bağlantıları girin, satır başı bir tane";
"Open Videos" = "Videolar aç";
"Playback Mode" = "Oynatma Modu";
/* Selected video was played on given date */
"Watched %@" = "İzlendi %@";
@ -278,58 +278,58 @@
"That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development." = "Bunu duymak çok güzel. Başkalarının kullanmak isteyeceği uygulamalar sunmak eğlenceli. Projeye bağış yapmayı düşünebilir veya yeni özelliklerin geliştirilmesine katkıda bulunarak yardımcı olabilirsiniz.";
"Thumbnails" = "Küçük Resimler";
"Dropped frames" = "";
"SponsorBlock API Instance" = "";
"SponsorBlock API Instance" = "SponsorBlock API Oluşumu";
/* Selected video is being played */
"Watching now" = "Şu an izlenen";
"Video Details" = "Video Bilgileri";
"Live Streams" = "";
"Live Streams" = "Canlı yayınlar";
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Genellikle videonun sonunda veya sonuna yakın özet açılır ve/veya bitiş arayüzü gösterilir.";
"Default Profile" = "";
"Default Profile" = "Varsayılan profil";
/* Player controls layout size for TV */
"TV" = "TV";
"Add" = "";
"This URL could not be opened" = "";
"Hide" = "";
"Playing Next" = "";
"Are you sure you want to remove this document?" = "";
"Add" = "Ekle";
"This URL could not be opened" = "Bu URL açılamadı";
"Hide" = "Sakla";
"Playing Next" = "Sonra Oynatılacak";
"Are you sure you want to remove this document?" = "Bu belgeyi kaldırmak istediğinizden emin misiniz?";
"Show channel name" = "Kanal adını göster";
"Unlisted" = "";
"Paste" = "";
"Rate & Captions" = "";
"Format" = "";
"Unlisted" = "Liste dışı";
"Paste" = "Yapıştır";
"Rate & Captions" = "Puan ve Altyazılar";
"Format" = "Format";
"Right" = "Sağ";
"Stream FPS" = "";
"Cached time" = "";
"Stream FPS" = "Yayın FPSi";
"Cached time" = "Önbelleğe alınan zaman";
"Sign In Required" = "Giriş yapmanız gerekiyor";
"Could not create share link" = "";
"Could not create share link" = "Paylaş linki oluşturulamadı";
"Locations Manifest" = "";
"When partially watched video is played" = "Video kısmi olarak izlendiyse";
"Open Video" = "";
"Add Channels, Playlists and Searches to Favorites using" = "";
"Always" = "";
"Open Video" = "Video aç";
"Add Channels, Playlists and Searches to Favorites using" = "Kanallar, oynatma listeleri ve favorileri aramayı ekleyin";
"Always" = "Her zaman";
/* Video date filter in search */
"Year" = "Yıl";
"Playback queue is empty" = "";
"Playback queue is empty" = "Oynatma kuyruğu boş";
"Show Favorites" = "Favorileri Göster";
"Driver" = "";
"Driver" = "Sürücü";
"Show progress of watching on thumbnails" = "İzlenme durumu görsellerde görünsün";
"Left" = "";
"URL to Open" = "";
"Left" = "Sol";
"URL to Open" = "ılıcak URL";
"Subscribe" = "Üye ol";
"Yattee" = "Yattee";
"Show Documents" = "Belgeleri Göster";
"Press and hold remote button to open captions and quality menus" = "";
"Press and hold remote button to open captions and quality menus" = "Altyazılar ve kalite menülerini açmak için uzaktan kumanda tuşuna basılı tutun";
"No locations available at the moment" = "";
"Show account username" = "Hesabın kullanıcı adını göster";
"Used to create links from videos, channels and playlists" = "Videolardan, kanallardan ve oynatma listelerinden bağlantılar oluşturmak için kullanılır";
"Size" = "";
"Size" = "Boyut";
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "Çalma listeniz yok\n\nBir çalma listesi oluşturmak için \"Yeni Çalma Listesi\" üzerine dokunun";
"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\"" = "";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "Çalma Listesi Boş\n\nBir videoya dokunun ve basılı tutun, ardından\n\"Çalma Listesine Ekle\"";
/* Video duration filter in search */
"Short" = "Kısa";
@ -337,29 +337,29 @@
"Remove Location" = "";
"Edit Favorites…" = "Favorileri düzenle…";
"Show Open Videos toolbar button" = "Video Aç arayüzünü göster";
"Sample Rate" = "";
"Private" = "";
"Sample Rate" = "Örnek hızı";
"Private" = "Gizli";
"Browsing" = "Gezinti";
"Documents" = "";
"FPS" = "";
"Only for local files and URLs" = "";
"Show sidebar" = "";
"Current Playlist" = "";
"Center" = "";
"Address" = "";
"Documents" = "Belgeler";
"FPS" = "FPS";
"Only for local files and URLs" = "Yalnızca yerel dosyalar ve URL'ler için";
"Show sidebar" = "Kenar çubuğunu göster";
"Current Playlist" = "Şuanki oynatma listesi";
"Center" = "Orta";
"Address" = "Adres";
"Video actions buttons" = "Video eylem butonları";
"Keep last played video in the queue after restart" = "";
"Remove…" = "";
"Keep last played video in the queue after restart" = "Yeniden başlatıldığında son izlenen videoyu sırada bırak";
"Remove…" = "Kaldır…";
"Trending" = "Trendler";
"Statistics" = "";
"Copy%@link" = "";
"Now Playing" = "";
"Could not delete document" = "";
"No comments" = "";
"Could not open Files" = "";
"You need to select an account\nto access %@ section" = "";
"Statistics" = "İstatistikler";
"Copy%@link" = "%@bağlantıyı kopyala";
"Now Playing" = "Şuanda çalıyor";
"Could not delete document" = "Belge silinemedi";
"No comments" = "Yorum yok";
"Could not open Files" = "Dosyalar açılamadı";
"You need to select an account\nto access %@ section" = "%@ kesitine erişebilmek için \nbir hesap seçmeniz gerekiyor";
"Reload manifest" = "Yeniden Yükle";
"Could not refresh Subscriptions" = "";
"Could not refresh Subscriptions" = "Abonelikler yenilenemedi";
/* Subscriptions title */
"Subscriptions" = "Üyelik";
@ -368,29 +368,29 @@
"Shuffle" = "Karıştır";
"Buttons labels" = "Eylem düğmeleri etiketi";
"Share %@ link" = "%@ bağlantısını paylaş";
"Could not load streams" = "";
"Playback history is empty" = "";
"Show icons and text when space permits" = "";
"Could not load streams" = "Akışlar yüklenemedi";
"Playback history is empty" = "Oynatma geçmişi boş";
"Show icons and text when space permits" = "Alan yeterliyse simgeleri ve metni göster";
"unknown" = "Bilinmeyen";
"Share..." = "Paylaş...";
/* Video sort order in search */
"Views" = "İzlenme";
"You need to create an instance and accounts\nto access %@ section" = "";
"Verified" = "";
"Open Files" = "";
"You need to create an instance and accounts\nto access %@ section" = "%@ bölümüne erişmek için bir örnek ve hesap oluşturmanız gerekmektedir.";
"Verified" = "Doğrulanmış";
"Open Files" = "Dosyaları";
"Could not refresh Playlists" = "Çalma listesi güncellenemedi";
"Actions buttons" = "";
"Any format" = "";
"Actions buttons" = "Eylem düğmeleri";
"Any format" = "Herhangi bir format";
"Show playback statistics" = "Oynatma istatistiklerini göster";
"Pages buttons" = "Sayfa butonları";
"Videos" = "Videolar";
"Codec" = "";
"Comments are disabled" = "";
"Audio" = "";
"Codec" = "Kodek";
"Comments are disabled" = "Yorumlar devre dışı";
"Audio" = "Ses";
"Public" = "";
"Public" = "Halka açık";
"Files" = "Dosyalar";
"Show Home" = "Ana Sayfayı Göster";
"Open" = "Aç";
@ -400,30 +400,30 @@
"Clear Queue before opening" = "Açmadan önce Bekleme Listesini temizle";
"Copy %@ link with time" = "Bağlantıyı %@ zaman ile kopyala";
"Show Inspector" = "Denetleyiciyi Göster";
"Make default" = "";
"Are you sure you want to remove %@ location?" = "";
"No chapters information available" = "";
"Share Logs..." = "";
"Enter link to open" = "";
"Make default" = "Varsayılan yap";
"Are you sure you want to remove %@ location?" = "%@ konumunu kaldırmak istediğinizden emin misiniz?";
"No chapters information available" = "Bölüm bilgisi mevcut değil";
"Share Logs..." = "Hata kayıtlarını paylaş…";
"Enter link to open" = "ılıcak bağlantıyı girin";
"No documents" = "Belge yok";
"Inspector visibility" = "Denetleyici görünümü";
"Could not update your token." = "";
"Could not find any links to open in your clipboard" = "";
"Could not find any links to open in your clipboard" = "Panonuzda açılacak hiçbir bağlantı bulunamadı";
/* Video date filter in search */
"Week" = "Hafta";
"Sidebar" = "Kenar çubuğu";
"Show only icons" = "";
"Show only icons" = "Sadece ikonları göster";
"Current: %@\n%@" = "Şuan: %@\n%@";
"Show anonymous accounts" = "Anonim hesapları göster";
"Could not open playlist" = "Çalma listesi açılamadı";
"Round corners" = "";
"Round corners" = "Yuvarlak köşeler";
"URL" = "URL";
"Recents" = "";
"Recents" = "Yakın Zamandakiler";
"Show sidebar when space permits" = "Alan olduğu sürece kenar çubuğunu göster";
"System controls buttons" = "Sistem kontrol butonları";
"Could not extract channel information" = "";
"Public Locations" = "";
"Could not extract channel information" = "Kanal bilgisi çıkarılamadı";
"Public Locations" = "Herkese Açık Alanlar";
"You can find information about using Yattee in the Wiki pages." = "Wiki sayfalarında Yattee kullanımı hakkında bilgilere erişebilirsiniz.";
/* Player controls layout size */
@ -440,16 +440,16 @@
"Smaller" = "Küçült";
"Sort" = "Sırala";
"This cannot be reverted" = "Geriye alınamaz";
"Public Manifest" = "";
"Public Manifest" = "Herkese Açık Bildiri";
"You have no Playlists" = "Çalma listeniz bulunmamaktadır";
"Watched" = "İzlendi";
"Could not open video" = "";
"Channel could not be found" = "";
"Could not open video" = "Video açılamadı";
"Channel could not be found" = "Kanal bulunamadı";
"Show video length" = "Video uzunluğunu göster";
"Source" = "Kaynak";
"Welcome" = "Hoşgeldiniz";
"Wi-Fi" = "Wi-Fi";
"Could not open channel" = "";
"Could not open channel" = "Kanal açılamadı";
"This video could not be opened" = "Bu video oynatılamadı";
"Could not extract playlist ID" = "Çalma listesi ID bilgisi alınamadı";
"Could not load video" = "Video yüklenemedi";
@ -458,50 +458,168 @@
"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." = "Bu geri döndürülemez. Değişiklikleri görmek için görünümler arasında geçiş yapmanız veya uygulamayı yeniden başlatmanız gerekebilir.";
"Unsubscribe" = "Abonelikten çık";
"Current Location" = "";
"Stream & Player" = "";
"Current Location" = "Şuanki konum";
"Stream & Player" = "Yayın ve Oynatıcı";
"Hardware decoder" = "Donanımsal çözücü";
"Honor orientation lock" = "";
"Honor orientation lock" = "Yön kilidine sadık kal";
"Seek with horizontal swipe on video" = "Video üzerinde yatay kaydırma";
"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." = "";
"Switch to public locations" = "";
"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." = "Genellikle bir videonun başlangıcında bulunan ve aynı içerik oluşturucunun diğer videolarında da görülen bir animasyon, sabit kare veya klip içeren kısımlar.";
"Switch to public locations" = "Herkese açık konumlara geç";
"%@ formats" = "";
"Open logs in Finder" = "";
"Could not refresh Popular" = "";
"Open logs in Finder" = "Hata kayıtlarını Finder'da aç";
"Could not refresh Popular" = "Popüler yenilenemedi";
/* SponsorBlock category name */
"Self-promotion" = "";
"Self-promotion" = "Kendi reklamını yapma";
/* Player controls layout size */
"Small" = "Küçük";
/* SponsorBlock category name */
"Sponsor" = "Sponsor";
"System controls show buttons for %@" = "";
"System controls show buttons for %@" = "%@ için sistem denetleme tuşlarını göster";
"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." = "Bu eylem tüm kişiselleştirilmiş ayarlarınızı kaldıracak ve varsayılan ayarları geri getirecektir. Bu işlem geri döndürülemez.";
"Switch to other public location" = "";
"SponsorBlock" = "";
"Switch to other public location" = "Başka herkese açık konuma geç";
"SponsorBlock" = "SponsorBlock";
"Seek gesture speed" = "Kaydırma hızı";
"If you want this app to be available in your language, join translation project." = "Uygulamanın kendi dilinize çevrilmesini istiyorsanız, çeviri projesine katılın.";
"Could not refresh Trending" = "";
"Could not refresh Trending" = "Trendde olanlar yenilenemedi";
/* Video date filter in search */
"Today" = "Bugün";
"Shorts" = "";
"Channel" = "";
"Channel" = "Kanal";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Finder üzerinden Mac ile belge paylaşın\nveya iTunes üzerinden Windows ile";
"\"%@\" will be irreversibly removed from this device." = "";
"\"%@\" will be irreversibly removed from this device." = "\"%@\" bu cihazdan geri alınamaz şekilde silinecektir.";
"Recent Documents" = "Son kullanılan belgeler";
"Recent History" = "Yakın zamanda izlenilenler";
"Show Open Videos quick actions" = "Video Aç hızlı eylemlerini göster";
"Pages toolbar position" = "";
"Video" = "";
"Channels" = "";
"Share" = "";
"File" = "";
"Share%@link" = "";
"Video" = "Video";
"Channels" = "Kanallar";
"Share" = "Paylaş";
"File" = "Dosya";
"Share%@link" = "%@bağlantıyı paylaş";
"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";
"Import Settings..." = "Ayarları içe aktar...";
"Export Settings" = "Ayarları dışa aktar";
"Accounts passwords (unencrypted)" = "Hesap parolaları (şifrelenmemiş)";
"Other" = "Diğer";
"Other data" = "Diğer veri";
"Export..." = "Dışa aktar…";
"Other data include last used playback preferences and listing options" = "Diğer veriler, son kullanılan oynatma tercihleri ve listeleme seçeneklerini içerir";
"Are you sure you want to export unencrypted passwords?" = "Şifrelenmemiş parolaları dışa aktarmak istediğinizden emin misiniz?";
"Icon only" = "Sadece ikon";
"Export" = "Dışa aktar";
"Build" = "Derleme";
"Platform" = "Platform";
"Import" = "İçe aktar";
"Action button labels" = "İşlem düğmesi etiketleri";
"Icon and text" = "İkon ve metin";
"File information" = "Dosya detayları";
"Password required to import" = "İçe aktarma için parola gerekli";
"Custom Location already exists" = "Özel konum zaten mevcut\"";
"Custom Location selected for import" = "İçe aktarma için özel konum seçildi";
"Custom Location not selected for import" = "İçe aktarma için özel konum seçilmedi";
"Account already exists" = "Hesap zaten var";
"Password saved in import file" = "Parola içe aktarma dosyasına kaydedildi";
"Export in progress..." = "Dışa aktarım devam etmekte...";
"In progress..." = "Devam ediyor…";
"Play Now in AVPlayer" = "Şimdi AVPlayerda oynat";
"Opening file…" = "Dosya açılıyor…";
"Show channel avatars in channels lists" = "Kanal avatarlarını kanallar listesinde göster";
"Keep channels with unwatched videos on top of subscriptions list" = "İzlenmemiş videoları olan kanalları abonelik listesinin üstte tut";
"Play Now in MPV" = "Şimdi MPVde oynat";
"Seek" = "İlerle";
"Description preview" = "Açıklama önizlemesi";
"No preview" = "Önizleme yok";
"Open vertical chapters expanded" = "Dikey bölümleri genişletilmiş olarak aç";
"Chapters (if available)" = "Bölümler (mevcutsa)";
"Opened File" = "Açılan dosya";
"File Extension" = "Dosya uzantısı";
"Short videos: hidden" = "Kısa videolar: gizli";
"Double tap gesture" = "Çift dokunma hareketi";
"Maximum width expanded" = "Maksimum genişlik genişletildi";
"Clear all" = "Herşeyi temizle";
"Right click channel thumbnail to open context menu with more actions" = "Daha fazla işlem için kanal kapak resmine sağ tıklayın";
"Show unwatched feed badges" = "İzlenmemiş akış rozetlerini göster";
"Gesture: fowards" = "Hareket: İleri";
"System controls" = "Sistem kontrolleri";
"Gesture: backwards" = "Hareket: Geri";
"Hide player" = "Oynatıcıyı gizle";
"Play next item" = "Sıradaki öğeyi çal";
"Music Mode" = "Müzik modu";
"Close video" = "Videoyu kapat";
"Total size: %@" = "Toplam boyut: %@";
"Are you sure you want to clear cache?" = "Önbelleği temizlemek istediğinizden emin misiniz?";
"Player Bar" = "Oynatıcı bar";
"Open expanded" = "Genişletilmiş aç";
"Mark channel feed as unwatched" = "Kanal akışını izlenmemiş olarak işaretle";
"Mark channel feed as watched" = "Kanal akışını izlenmiş olarak işaretle";
"Always show controls buttons" = "Her zaman kontrol tuşlarını göster";
"Tap and hold channel thumbnail to open context menu with more actions" = "Daha fazla işlem için kanal kapak resmine dokunup basılı tutun";
"Short videos: visible" = "Kısa videolar: görünür";
"Play all unwatched" = "İzlenmemiş hepsini oynat";
"Single tap gesture" = "Tek dokunma hareketi";
"Seeking" = "İlerleme";
"Controls Buttons" = "Kontrol düğmeleri";
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "Hareket ayarları, oynatıcıdaki sol/sağ taraf için çift dokunma hareketiyle atlanacak aralığı kontrol eder. Sistem kontrol ayarlarını değiştirmek yeniden başlatma gerektirir.";
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "Hareket ayarları, oynatıcıdaki sol/sağ taraf için çift tıklama ile atlanacak aralığı kontrol eder. Sistem kontrol ayarlarını değiştirmek yeniden başlatma gerektirir.";
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "Hareket ayarları, uzaktan kumanda ok tuşları için atlama aralığını kontrol eder (2. nesil Siri uzaktan kumanda veya daha yenisi için). Sistem kontrol ayarlarını değiştirmek yeniden başlatma gerektirir.";
"Close video and player on end" = "Video ve oynatıcıyı bitişte kapat";
"Public account" = "Halka açık hesap";
"Your Accounts" = "Hesaplarınız";
"Browse without account" = "Hesap olmadan gezin";
"Rotate when entering fullscreen on landscape video" = "Yatay videoda tam ekran moduna geçerken döndür";
"Landscape left" = "Yatay sol";
"Landscape right" = "Yatay sağ";
"No rotation" = "Yön değiştirme yok";
"Open channels with description expanded" = "Açıklaması genişletilmiş kanalları aç";
"Show cache status" = "Önbellek durumunu göster";
"Maximum feed items" = "Maksimum akış öğeleri";
"Toggle size" = "Boyutu değiştir";
"Open channel" = "Kanalı aç";
"Mark all as watched" = "Hepsini izlenmiş olarak işaretle";
"Mark all as unwatched" = "Hepsini izlenmemiş olarak işaretle";
"Toggle player" = "Oynatıcıyı aç/kapa";
"Open video description expanded" = "Video açıklamasını genişletilmiş bir şekilde aç";
"Playback Settings" = "Oynatma ayarları";
"Enter location address to connect..." = "Bağlanmak için konum adresini girin...";
"Actions Buttons" = "Eylem düğmeleri";
"Lock orientation" = "Ekran yönünü kilitle";
"Subscribe/Unsubscribe" = "Abone ol/Abonelikten çık";
"Use system controls with AVPlayer" = "AVPlayer ile sistem kontrollerini kullan";
"Do not share this file with anyone or you can lose access to your accounts. If you don't select to export passwords you will be asked to provide them during import" = "Bu dosyayı kimseyle paylaşmayın, yoksa hesaplarınıza erişiminizi kaybedebilirsiniz. Parolaları dışa aktarmayı seçmezseniz, içe aktarma sırasında bunları sağlamanız istenecektir";
"(shorts hidden)" = "(kısa videolar gizli)";
"Disable filters" = "Filtreleri devre dışı bırak";
"Show channel avatars in videos lists" = "Kanal avatarlarını videolar listesinde göster";
"Available" = "Kullanılabilir";
"Startup section" = "Başlangıç bölümü";
"Home Settings" = "Ana sayfa ayarları";
"Watched: hidden" = "İzlenen: gizli";
"Watched: visible" = "İzlenen: görünür";
"(watched and shorts hidden)" = "(izlenen ve kısa videolar gizli)";
"No videos to show" = "Gösterilecek video yok";
"(watched hidden)" = "(izlenmiş gizli)";
"Limit" = "Limit";
"Are you sure you want to remove %@ from Favorites?" = "Favorilerden %@'yi kaldırmak istediğinizden emin misiniz?";
"List" = "Liste";
"Do nothing" = "Hiçbir şey yapma";
"Show Next in Queue" = "Kuyruktaki sıradakini göster";
"Show toggle watch status button" = "İzleme durumunu değiştiren düğmeyi göster";
"Next in Queue" = "Kuyruktaki sonraki";
"Feed" = "Akış";
"Queue - shuffled" = "Kuyruk - karışık";
"Replay" = "Yeniden oynatma";
"Loop one" = "Bir videoyu döngüde oynat";
"Description" = "Açıklama";
"Autoplay next" = "Otomatik sonrakini oynat";
"Stream" = "Yayın";
"Fullscreen" = "Tam ekran";
"Lock" = "Kilitle";
"Podcasts" = "Podcastler";
"Add %@" = "Ekle %@";

View File

@ -1306,6 +1306,7 @@
376BE50A27349108009AD608 /* BrowsingSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsingSettings.swift; sourceTree = "<group>"; };
376CD21526FBE18D001E1AC1 /* Instance+Fixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Instance+Fixtures.swift"; sourceTree = "<group>"; };
376E331128AD3B320070E30C /* ScrollDismissesKeyboard+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ScrollDismissesKeyboard+Backport.swift"; sourceTree = "<group>"; };
376EC9D82D1DD39800EC4500 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = "<group>"; };
3771429529087BE100306CEA /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
3771429629087BF000306CEA /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = "<group>"; };
3772002527E8ED2600CB2475 /* BridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BridgingHeader.h; sourceTree = "<group>"; };
@ -1500,6 +1501,7 @@
37DD9DA22785BBC900539416 /* NoCommentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoCommentsView.swift; sourceTree = "<group>"; };
37E04C0E275940FB00172673 /* VerticalScrollingFix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalScrollingFix.swift; sourceTree = "<group>"; };
37E084AB2753D95F00039B7D /* AccountsNavigationLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsNavigationLink.swift; sourceTree = "<group>"; };
37E21DC52CDE528A008DF47C /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/Localizable.strings; sourceTree = "<group>"; };
37E64DD026D597EB00C71877 /* SubscribedChannelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribedChannelsModel.swift; sourceTree = "<group>"; };
37E6D79B2944AE1A00550C3D /* FeedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedModel.swift; sourceTree = "<group>"; };
37E6D79F2944CD3800550C3D /* CacheStatusHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheStatusHeader.swift; sourceTree = "<group>"; };
@ -2802,6 +2804,8 @@
tr,
ru,
"zh-Hant",
ta,
hu,
);
mainGroup = 37D4B0BC2671614700C925CA;
packageReferences = (
@ -4089,6 +4093,8 @@
3767F3332B25058300F257BC /* tr */,
3767F3342B2505EF00F257BC /* ru */,
37367E582B8F63C200436163 /* zh-Hant */,
37E21DC52CDE528A008DF47C /* ta */,
376EC9D82D1DD39800EC4500 /* hu */,
);
name = Localizable.strings;
sourceTree = "<group>";
@ -4103,7 +4109,7 @@
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
@ -4134,7 +4140,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
@ -4165,7 +4171,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0;
@ -4185,7 +4191,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0;
@ -4349,7 +4355,7 @@
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@ -4402,7 +4408,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
@ -4455,7 +4461,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
DEAD_CODE_STRIPPING = YES;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
@ -4494,7 +4500,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
DEAD_CODE_STRIPPING = YES;
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
ENABLE_APP_SANDBOX = YES;
@ -4529,7 +4535,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
@ -4552,7 +4558,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
@ -4577,7 +4583,7 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
@ -4601,7 +4607,7 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
@ -4627,7 +4633,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@ -4667,7 +4673,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
DEVELOPMENT_ASSET_PATHS = "";
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES;
@ -4707,7 +4713,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@ -4730,7 +4736,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 196;
CURRENT_PROJECT_VERSION = 200;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@ -4913,7 +4919,7 @@
repositoryURL = "https://github.com/sindresorhus/Defaults";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 7.0.0;
minimumVersion = 7.3.1;
};
};
372AA40E286D067B0000B1DC /* XCRemoteSwiftPackageReference "Repeat" */ = {
@ -4928,8 +4934,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/hyperoslo/Cache.git";
requirement = {
branch = master;
kind = branch;
kind = upToNextMajorVersion;
minimumVersion = 7.4.0;
};
};
375B8AAF28B57F4200397B31 /* XCRemoteSwiftPackageReference "KeychainAccess" */ = {
@ -4944,16 +4950,16 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/pinterest/PINCache";
requirement = {
branch = master;
kind = branch;
kind = upToNextMajorVersion;
minimumVersion = 3.0.4;
};
};
379325D329A265A300181CF1 /* XCRemoteSwiftPackageReference "swift-log" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/yattee/swift-log.git";
repositoryURL = "https://github.com/apple/swift-log.git";
requirement = {
branch = main;
kind = branch;
kind = upToNextMajorVersion;
minimumVersion = 1.6.1;
};
};
3797104728D3D10600D5F53C /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */ = {
@ -4961,7 +4967,7 @@
repositoryURL = "https://github.com/SDWebImage/SDWebImageSwiftUI.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.1.0;
minimumVersion = 2.2.7;
};
};
3797757B268922D100DD52A8 /* XCRemoteSwiftPackageReference "siesta" */ = {
@ -4969,7 +4975,7 @@
repositoryURL = "https://github.com/bustoutsolutions/siesta";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.5.0;
minimumVersion = 1.5.2;
};
};
3799AC0728B03CEC001376F9 /* XCRemoteSwiftPackageReference "ActiveLabel.swift" */ = {
@ -4985,7 +4991,7 @@
repositoryURL = "https://github.com/Alamofire/Alamofire.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.0.0;
minimumVersion = 5.9.1;
};
};
37BD07C52698B27B003EBB87 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */ = {
@ -4993,7 +4999,7 @@
repositoryURL = "https://github.com/siteline/SwiftUI-Introspect.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 0.1.3;
minimumVersion = 1.3.0;
};
};
37CF8B8228535E4F00B71E37 /* XCRemoteSwiftPackageReference "SDWebImage" */ = {
@ -5001,7 +5007,7 @@
repositoryURL = "https://github.com/SDWebImage/SDWebImage";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.19.1;
minimumVersion = 5.19.7;
};
};
37D4B19B2671817900C925CA /* XCRemoteSwiftPackageReference "SwiftyJSON" */ = {
@ -5009,7 +5015,7 @@
repositoryURL = "https://github.com/SwiftyJSON/SwiftyJSON.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.0.0;
minimumVersion = 5.0.2;
};
};
37EE6DC328A305AD00BFD632 /* XCRemoteSwiftPackageReference "Reachability" */ = {
@ -5017,7 +5023,7 @@
repositoryURL = "https://github.com/ashleymills/Reachability.swift";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.1.0;
minimumVersion = 5.2.3;
};
};
37FB2847272207F000A57617 /* XCRemoteSwiftPackageReference "SDWebImageWebPCoder" */ = {
@ -5025,7 +5031,7 @@
repositoryURL = "https://github.com/SDWebImage/SDWebImageWebPCoder.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 0.8.4;
minimumVersion = 0.14.6;
};
};
37FB285227220D8400A57617 /* XCRemoteSwiftPackageReference "SDWebImagePINPlugin" */ = {
@ -5040,8 +5046,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/mpvkit/MPVKit.git";
requirement = {
kind = exactVersion;
version = "0.38.0-fix";
kind = upToNextMajorVersion;
minimumVersion = 0.39.0;
};
};
/* End XCRemoteSwiftPackageReference section */

View File

@ -1,5 +1,5 @@
{
"originHash" : "515d8e68c4a31658288fb3f94789ee539399b042082c08c39f4c03c27fd8860c",
"originHash" : "173de1b718eb898698eaba0221b46be9781899a652725709c8400d3ddfb01980",
"pins" : [
{
"identity" : "activelabel.swift",
@ -15,8 +15,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/Alamofire/Alamofire.git",
"state" : {
"revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a",
"version" : "5.9.1"
"revision" : "513364f870f6bfc468f9d2ff0a95caccc10044c5",
"version" : "5.10.2"
}
},
{
@ -24,8 +24,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/hyperoslo/Cache.git",
"state" : {
"branch" : "master",
"revision" : "81a0277cbc6b63f4e0cd6f42c4abefa1011bbfa9"
"revision" : "24e47109e31b2031cb26e25cc1b81b607496066c",
"version" : "7.4.0"
}
},
{
@ -51,8 +51,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/libwebp-Xcode.git",
"state" : {
"revision" : "b2b1d20a90b14d11f6ef4241da6b81c1d3f171e4",
"version" : "1.3.2"
"revision" : "0d60654eeefd5d7d2bef3835804892c40225e8b2",
"version" : "1.5.0"
}
},
{
@ -60,8 +60,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/mpvkit/MPVKit.git",
"state" : {
"revision" : "ee72059235566df8b455bff15e3f83a1c9053e78",
"version" : "0.38.0-fix"
"revision" : "839dfa34b96029daef10b32d401c98edf17f04ae",
"version" : "0.39.0"
}
},
{
@ -69,8 +69,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/pinterest/PINCache",
"state" : {
"branch" : "master",
"revision" : "2fb85948463292c2e824148cf17dc62a4c217a94"
"revision" : "2fb85948463292c2e824148cf17dc62a4c217a94",
"version" : "3.0.4"
}
},
{
@ -87,8 +87,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/ashleymills/Reachability.swift",
"state" : {
"revision" : "7cbd73f46a7dfaeca079e18df7324c6de6d1834a",
"version" : "5.2.3"
"revision" : "21d1dc412cfecbe6e34f1f4c4eb88d3f912654a6",
"version" : "5.2.4"
}
},
{
@ -105,8 +105,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImage",
"state" : {
"revision" : "8a1be70a625683bc04d6903e2935bf23f3c6d609",
"version" : "5.19.7"
"revision" : "cac9a55a3ae92478a2c95042dcc8d9695d2129ca",
"version" : "5.21.0"
}
},
{
@ -148,10 +148,10 @@
{
"identity" : "swift-log",
"kind" : "remoteSourceControl",
"location" : "https://github.com/yattee/swift-log.git",
"location" : "https://github.com/apple/swift-log.git",
"state" : {
"branch" : "main",
"revision" : "3f3dc1390a2f116894887c352792dc8d5fa9e875"
"revision" : "3d8596ed08bd13520157f0355e35caed215ffbfa",
"version" : "1.6.3"
}
},
{
@ -168,8 +168,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/siteline/SwiftUI-Introspect.git",
"state" : {
"revision" : "121c146fe591b1320238d054ae35c81ffa45f45a",
"version" : "0.12.0"
"revision" : "807f73ce09a9b9723f12385e592b4e0aaebd3336",
"version" : "1.3.0"
}
},
{

View File

@ -11,6 +11,7 @@ struct InstancesSettings: View {
@State private var frontendURL = ""
@State private var proxiesVideos = false
@State private var invidiousCompanion = false
@Environment(\.colorScheme) private var colorScheme
@ObservedObject private var accounts = AccountsModel.shared
@ -105,6 +106,16 @@ struct InstancesSettings: View {
}
}
if selectedInstance != nil, selectedInstance.app == .invidious {
invidiousCompanionToggle
.onAppear {
invidiousCompanion = selectedInstance.invidiousCompanion
}
.onChange(of: invidiousCompanion) { newValue in
InstancesModel.shared.setInvidiousCompanion(selectedInstance, newValue)
}
}
if selectedInstance != nil, !selectedInstance.app.supportsAccounts {
Spacer()
Text("Accounts are not supported for the application of this instance")
@ -191,6 +202,10 @@ struct InstancesSettings: View {
private var proxiesVideosToggle: some View {
Toggle("Proxy videos", isOn: $proxiesVideos)
}
private var invidiousCompanionToggle: some View {
Toggle("Invidious companion", isOn: $invidiousCompanion)
}
}
struct InstancesSettingsView_Previews: PreviewProvider {