mirror of
https://github.com/yattee/yattee.git
synced 2025-12-12 19:18:16 +00:00
Compare commits
93 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39f6319043 | ||
|
|
6a2dc9164e | ||
|
|
37d3f43596 | ||
|
|
aef0ba6ffd | ||
|
|
1ae12cfa21 | ||
|
|
8475669aab | ||
|
|
6fec76fcb3 | ||
|
|
08b2e7ceac | ||
|
|
60972f0c7b | ||
|
|
a49db76588 | ||
|
|
bd0c86060b | ||
|
|
9849f31e1f | ||
|
|
00ac222af6 | ||
|
|
732a8d7385 | ||
|
|
a009ad7d53 | ||
|
|
91c7c9fc8e | ||
|
|
e836f87c88 | ||
|
|
1e1a23acd0 | ||
|
|
d8d728a48f | ||
|
|
067e8a79bf | ||
|
|
576f40360d | ||
|
|
c679a52903 | ||
|
|
82f109290d | ||
|
|
765006b185 | ||
|
|
86cddb06e4 | ||
|
|
012b5156b7 | ||
|
|
d6c04540e9 | ||
|
|
3144b52b55 | ||
|
|
b04385ceae | ||
|
|
721a97dc41 | ||
|
|
4ca8adc4dd | ||
|
|
d361ef01d4 | ||
|
|
0d9c27319d | ||
|
|
600b8d198b | ||
|
|
d65224320e | ||
|
|
586cea7d44 | ||
|
|
aa5d6733b2 | ||
|
|
982dca1846 | ||
|
|
7de702ad23 | ||
|
|
13ef96cd02 | ||
|
|
4ec6f35c5d | ||
|
|
7f19f7aa47 | ||
|
|
fb5cd0f681 | ||
|
|
3feafc153c | ||
|
|
8f08674527 | ||
|
|
a7baaeb485 | ||
|
|
b0d81cdefd | ||
|
|
a33a1d7658 | ||
|
|
e436dec4ba | ||
|
|
eb1dfe69cd | ||
|
|
9f5720d393 | ||
|
|
675db6f651 | ||
|
|
fb5e86c2cb | ||
|
|
d384a4c520 | ||
|
|
6994271eca | ||
|
|
ed5fa8e4aa | ||
|
|
cbdf295d67 | ||
|
|
5d78946320 | ||
|
|
84fdc22861 | ||
|
|
a57645f824 | ||
|
|
e78f40c555 | ||
|
|
23f5fc9575 | ||
|
|
fc7a7b085f | ||
|
|
7ffa34b0f9 | ||
|
|
177e28121b | ||
|
|
68a35b8804 | ||
|
|
9ec9a680a6 | ||
|
|
7629931747 | ||
|
|
afb22e6c25 | ||
|
|
052fc86388 | ||
|
|
4de51f29c8 | ||
|
|
d1a1f4da38 | ||
|
|
d1153ed97d | ||
|
|
1c356560d5 | ||
|
|
bbd18d921b | ||
|
|
9e4860d97c | ||
|
|
50d42f721f | ||
|
|
9bfccb49e3 | ||
|
|
919126f9b0 | ||
|
|
d00903569f | ||
|
|
25e7b0d3e1 | ||
|
|
2aafe33417 | ||
|
|
e525f36824 | ||
|
|
5a5f5a8696 | ||
|
|
45d2968d9e | ||
|
|
c3e1465f31 | ||
|
|
df47ffb013 | ||
|
|
8900f96ce7 | ||
|
|
ed69780d52 | ||
|
|
691a3305e7 | ||
|
|
987f6dcac8 | ||
|
|
1113a94d67 | ||
|
|
8c6fc7d561 |
22
CHANGELOG.md
22
CHANGELOG.md
@@ -1,3 +1,21 @@
|
||||
## Build 168
|
||||
## Build 171
|
||||
* Collapsible chapters view, player setting "Open vertical chapters expanded"
|
||||
* Current chapter is highlighted
|
||||
* Disabled portrait upside down orientation on iPhone
|
||||
* Fixed issue with handling private Invidious instances requests
|
||||
* Added Persian, Spanish, Turkish and Russian localizations
|
||||
* Fixed issue with displaying account username
|
||||
* Updated dependencies
|
||||
* Other minor changes and improvements
|
||||
|
||||
**Big thanks to [@stonerl](https://github.com/stonerl) for the last contributions!**
|
||||
**And to past, current and future project contributors!**
|
||||
|
||||
## Previous builds
|
||||
* Description is collapsible with a button
|
||||
* Links in description are clickable on macOS
|
||||
* Aspect ratio is honored on resize on macOS
|
||||
* Added support for private Invidious instances
|
||||
* Fixed issue where Piped login token would not refresh
|
||||
* Update dependencies
|
||||
* Fixed issue with MPV subtitles not working
|
||||
* Other minor changes and improvements
|
||||
|
||||
65
Gemfile.lock
65
Gemfile.lock
@@ -3,25 +3,25 @@ GEM
|
||||
specs:
|
||||
CFPropertyList (3.0.6)
|
||||
rexml
|
||||
addressable (2.8.5)
|
||||
addressable (2.8.6)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.840.0)
|
||||
aws-sdk-core (3.185.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.864.0)
|
||||
aws-sdk-core (3.190.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (~> 1.8)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.72.0)
|
||||
aws-sdk-core (~> 3, >= 3.184.0)
|
||||
aws-sdk-kms (1.74.0)
|
||||
aws-sdk-core (~> 3, >= 3.188.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.136.0)
|
||||
aws-sdk-core (~> 3, >= 3.181.0)
|
||||
aws-sdk-s3 (1.141.0)
|
||||
aws-sdk-core (~> 3, >= 3.189.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.6)
|
||||
aws-sigv4 (1.6.0)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-sigv4 (1.8.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.1.0)
|
||||
@@ -32,11 +32,10 @@ GEM
|
||||
declarative (0.0.20)
|
||||
digest-crc (0.6.5)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
domain_name (0.6.20231109)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.104.0)
|
||||
excon (0.105.0)
|
||||
faraday (1.10.3)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
@@ -66,7 +65,7 @@ GEM
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.7)
|
||||
fastlane (2.216.0)
|
||||
fastlane (2.217.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
@@ -107,9 +106,9 @@ GEM
|
||||
xcpretty (~> 0.3.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.51.0)
|
||||
google-apis-androidpublisher_v3 (0.53.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-core (0.11.1)
|
||||
google-apis-core (0.11.2)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
@@ -122,24 +121,25 @@ GEM
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.13.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-storage_v1 (0.19.0)
|
||||
google-apis-core (>= 0.9.0, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-apis-storage_v1 (0.29.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-cloud-core (1.6.1)
|
||||
google-cloud-env (>= 1.0, < 3.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-env (2.0.1)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-errors (1.3.1)
|
||||
google-cloud-storage (1.44.0)
|
||||
google-cloud-storage (1.45.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.19.0)
|
||||
google-apis-storage_v1 (~> 0.29.0)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.8.1)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
googleauth (1.9.0)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-env (~> 2.0, >= 2.0.1)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
@@ -149,7 +149,7 @@ GEM
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.6.2)
|
||||
json (2.6.3)
|
||||
json (2.7.1)
|
||||
jwt (2.7.1)
|
||||
mini_magick (4.12.0)
|
||||
mini_mime (1.1.5)
|
||||
@@ -160,8 +160,8 @@ GEM
|
||||
optparse (0.1.1)
|
||||
os (1.1.4)
|
||||
plist (3.7.0)
|
||||
public_suffix (5.0.3)
|
||||
rake (13.0.6)
|
||||
public_suffix (5.0.4)
|
||||
rake (13.1.0)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
@@ -189,9 +189,6 @@ GEM
|
||||
tty-spinner (0.9.3)
|
||||
tty-cursor (~> 0.7)
|
||||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.2)
|
||||
unicode-display_width (2.5.0)
|
||||
webrick (1.8.1)
|
||||
word_wrap (1.0.0)
|
||||
|
||||
@@ -596,6 +596,8 @@ final class AVPlayerBackend: PlayerBackend {
|
||||
if self.controlsUpdates {
|
||||
self.updateControls()
|
||||
}
|
||||
|
||||
self.model.updateTime(self.currentTime!)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -182,13 +182,21 @@ final class MPVBackend: PlayerBackend {
|
||||
}
|
||||
|
||||
init() {
|
||||
// swiftlint:disable shorthand_optional_binding
|
||||
clientTimer = .init(interval: .seconds(Self.timeUpdateInterval), mode: .infinite) { [weak self] _ in
|
||||
self?.getTimeUpdates()
|
||||
guard let self = self, self.model.activeBackend == .mpv else {
|
||||
return
|
||||
}
|
||||
self.getTimeUpdates()
|
||||
}
|
||||
|
||||
networkStateTimer = .init(interval: .seconds(Self.networkStateUpdateInterval), mode: .infinite) { [weak self] _ in
|
||||
self?.updateNetworkState()
|
||||
guard let self = self, self.model.activeBackend == .mpv else {
|
||||
return
|
||||
}
|
||||
self.updateNetworkState()
|
||||
}
|
||||
// swiftlint:enable shorthand_optional_binding
|
||||
}
|
||||
|
||||
typealias AreInIncreasingOrder = (Stream, Stream) -> Bool
|
||||
@@ -432,6 +440,8 @@ final class MPVBackend: PlayerBackend {
|
||||
timeObserverThrottle.execute {
|
||||
self.model.updateWatch(time: self.currentTime)
|
||||
}
|
||||
|
||||
self.model.updateTime(self.currentTime!)
|
||||
}
|
||||
|
||||
private func stopClientUpdates() {
|
||||
|
||||
@@ -131,6 +131,8 @@ final class PlayerModel: ObservableObject {
|
||||
@Default(.rotateToLandscapeOnEnterFullScreen) private var rotateToLandscapeOnEnterFullScreen
|
||||
#endif
|
||||
|
||||
@Published var currentChapterIndex: Int?
|
||||
|
||||
var accounts: AccountsModel { .shared }
|
||||
var comments: CommentsModel { .shared }
|
||||
var controls: PlayerControlsModel { .shared }
|
||||
@@ -1112,4 +1114,36 @@ final class PlayerModel: ObservableObject {
|
||||
onPlayStream.forEach { $0(stream) }
|
||||
onPlayStream.removeAll()
|
||||
}
|
||||
|
||||
func updateTime(_ cmTime: CMTime) {
|
||||
let time = CMTimeGetSeconds(cmTime)
|
||||
let newChapterIndex = chapterForTime(time)
|
||||
if currentChapterIndex != newChapterIndex {
|
||||
DispatchQueue.main.async {
|
||||
self.currentChapterIndex = newChapterIndex
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func chapterForTime(_ time: Double) -> Int? {
|
||||
guard let chapters = self.videoForDisplay?.chapters else {
|
||||
return nil
|
||||
}
|
||||
|
||||
for (index, chapter) in chapters.enumerated() {
|
||||
let nextChapterStartTime = index < (chapters.count - 1) ? chapters[index + 1].start : nil
|
||||
|
||||
if let nextChapterStart = nextChapterStartTime {
|
||||
if time >= chapter.start, time < nextChapterStart {
|
||||
return index
|
||||
}
|
||||
} else {
|
||||
if time >= chapter.start {
|
||||
return index
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +105,7 @@ extension PlayerModel {
|
||||
|
||||
func playerAPI(_ video: Video) -> VideosAPI? {
|
||||
guard let url = video.instanceURL else { return accounts.api }
|
||||
if accounts.current?.url == url { return accounts.api }
|
||||
switch video.app {
|
||||
case .local:
|
||||
return nil
|
||||
|
||||
@@ -364,6 +364,7 @@ struct ChannelVideosView: View {
|
||||
}
|
||||
} label: {
|
||||
Label("Unsubscribe", systemImage: "xmark.circle")
|
||||
.help("Unsubscribe")
|
||||
#if os(iOS)
|
||||
.labelStyle(.automatic)
|
||||
#else
|
||||
@@ -380,6 +381,7 @@ struct ChannelVideosView: View {
|
||||
}
|
||||
} label: {
|
||||
Label("Subscribe", systemImage: "circle")
|
||||
.help("Subscribe")
|
||||
#if os(iOS)
|
||||
.labelStyle(.automatic)
|
||||
#else
|
||||
@@ -413,6 +415,7 @@ struct ChannelVideosView: View {
|
||||
feed.markChannelAsWatched(channel.id)
|
||||
} label: {
|
||||
Label("Mark channel feed as watched", systemImage: "checkmark.circle.fill")
|
||||
.help("Mark channel feed as watched")
|
||||
}
|
||||
.disabled(!feed.canMarkAllFeedAsWatched)
|
||||
}
|
||||
@@ -423,6 +426,7 @@ struct ChannelVideosView: View {
|
||||
feed.markChannelAsUnwatched(channel.id)
|
||||
} label: {
|
||||
Label("Mark channel feed as unwatched", systemImage: "checkmark.circle")
|
||||
.help("Mark channel feed as unwatched")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -147,6 +147,7 @@ extension Defaults.Keys {
|
||||
static let expandVideoDescriptionDefault = true
|
||||
#endif
|
||||
static let expandVideoDescription = Key<Bool>("expandVideoDescription", default: expandVideoDescriptionDefault)
|
||||
static let collapsedLinesDescription = Key<Int>("collapsedLinesDescription", default: 5)
|
||||
|
||||
static let showChannelAvatarInChannelsLists = Key<Bool>("showChannelAvatarInChannelsLists", default: true)
|
||||
static let showChannelAvatarInVideosListing = Key<Bool>("showChannelAvatarInVideosListing", default: true)
|
||||
@@ -264,6 +265,7 @@ extension Defaults.Keys {
|
||||
static let hideWatched = Key<Bool>("hideWatched", default: false)
|
||||
static let showInspector = Key<ShowInspectorSetting>("showInspector", default: .onlyLocal)
|
||||
static let showChapters = Key<Bool>("showChapters", default: true)
|
||||
static let expandChapters = Key<Bool>("expandChapters", default: true)
|
||||
static let showRelated = Key<Bool>("showRelated", default: true)
|
||||
static let widgetsSettings = Key<[WidgetSettings]>("widgetsSettings", default: [])
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ struct AccountViewButton: View {
|
||||
|
||||
if accountPickerDisplaysUsername {
|
||||
label
|
||||
.labelStyle(.titleOnly)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,6 +46,6 @@ struct AccountViewButton: View {
|
||||
}
|
||||
|
||||
private var label: some View {
|
||||
Label(model.current?.description ?? "Select Account", systemImage: "globe")
|
||||
Text(model.current?.description ?? "Select Account")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,28 +2,85 @@ import Foundation
|
||||
import SDWebImageSwiftUI
|
||||
import SwiftUI
|
||||
|
||||
struct ChapterView: View {
|
||||
var chapter: Chapter
|
||||
#if !os(tvOS)
|
||||
struct ChapterView: View {
|
||||
var chapter: Chapter
|
||||
|
||||
var player = PlayerModel.shared
|
||||
var chapterIndex: Int
|
||||
@ObservedObject private var player = PlayerModel.shared
|
||||
|
||||
var body: some View {
|
||||
Button {
|
||||
player.backend.seek(to: chapter.start, seekType: .userInteracted)
|
||||
} label: {
|
||||
Group {
|
||||
#if os(tvOS)
|
||||
horizontalChapter
|
||||
#else
|
||||
verticalChapter
|
||||
#endif
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
var isCurrentChapter: Bool {
|
||||
player.currentChapterIndex == chapterIndex
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Button(action: {
|
||||
player.backend.seek(to: chapter.start, seekType: .userInteracted)
|
||||
}) {
|
||||
Group {
|
||||
verticalChapter
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
|
||||
var verticalChapter: some View {
|
||||
VStack(spacing: 12) {
|
||||
if !chapter.image.isNil {
|
||||
smallImage(chapter)
|
||||
}
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
Text(chapter.title)
|
||||
.lineLimit(3)
|
||||
.multilineTextAlignment(.leading)
|
||||
.font(.headline)
|
||||
.foregroundColor(isCurrentChapter ? Color("AppRedColor") : .primary)
|
||||
Text(chapter.start.formattedAsPlaybackTime(allowZero: true) ?? "")
|
||||
.font(.system(.subheadline).monospacedDigit())
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
.frame(maxWidth: !chapter.image.isNil ? Self.thumbnailWidth : nil, alignment: .leading)
|
||||
}
|
||||
}
|
||||
|
||||
@ViewBuilder func smallImage(_ chapter: Chapter) -> some View {
|
||||
WebImage(url: chapter.image, options: [.lowPriority])
|
||||
.resizable()
|
||||
.placeholder {
|
||||
ProgressView()
|
||||
}
|
||||
.indicator(.activity)
|
||||
.frame(width: Self.thumbnailWidth, height: Self.thumbnailHeight)
|
||||
|
||||
.mask(RoundedRectangle(cornerRadius: 6))
|
||||
}
|
||||
|
||||
static var thumbnailWidth: Double {
|
||||
250
|
||||
}
|
||||
|
||||
static var thumbnailHeight: Double {
|
||||
thumbnailWidth / 1.7777
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
|
||||
#if os(tvOS)
|
||||
#else
|
||||
struct ChapterViewTVOS: View {
|
||||
var chapter: Chapter
|
||||
var player = PlayerModel.shared
|
||||
|
||||
var body: some View {
|
||||
Button {
|
||||
player.backend.seek(to: chapter.start, seekType: .userInteracted)
|
||||
} label: {
|
||||
Group {
|
||||
horizontalChapter
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
|
||||
var horizontalChapter: some View {
|
||||
HStack(spacing: 12) {
|
||||
@@ -41,53 +98,36 @@ struct ChapterView: View {
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
#else
|
||||
var verticalChapter: some View {
|
||||
VStack(spacing: 12) {
|
||||
if !chapter.image.isNil {
|
||||
smallImage(chapter)
|
||||
|
||||
@ViewBuilder func smallImage(_ chapter: Chapter) -> some View {
|
||||
WebImage(url: chapter.image, options: [.lowPriority])
|
||||
.resizable()
|
||||
.placeholder {
|
||||
ProgressView()
|
||||
}
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
Text(chapter.title)
|
||||
.lineLimit(2)
|
||||
.multilineTextAlignment(.leading)
|
||||
.font(.headline)
|
||||
Text(chapter.start.formattedAsPlaybackTime(allowZero: true) ?? "")
|
||||
.font(.system(.subheadline).monospacedDigit())
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
.frame(maxWidth: Self.thumbnailWidth, alignment: .leading)
|
||||
}
|
||||
.indicator(.activity)
|
||||
.frame(width: Self.thumbnailWidth, height: Self.thumbnailHeight)
|
||||
.mask(RoundedRectangle(cornerRadius: 12))
|
||||
}
|
||||
#endif
|
||||
|
||||
@ViewBuilder func smallImage(_ chapter: Chapter) -> some View {
|
||||
WebImage(url: chapter.image, options: [.lowPriority])
|
||||
.resizable()
|
||||
.placeholder {
|
||||
ProgressView()
|
||||
}
|
||||
.indicator(.activity)
|
||||
.frame(width: Self.thumbnailWidth, height: Self.thumbnailHeight)
|
||||
#if os(tvOS)
|
||||
.mask(RoundedRectangle(cornerRadius: 12))
|
||||
#else
|
||||
.mask(RoundedRectangle(cornerRadius: 6))
|
||||
#endif
|
||||
}
|
||||
static var thumbnailWidth: Double {
|
||||
250
|
||||
}
|
||||
|
||||
static var thumbnailWidth: Double {
|
||||
250
|
||||
static var thumbnailHeight: Double {
|
||||
thumbnailWidth / 1.7777
|
||||
}
|
||||
}
|
||||
|
||||
static var thumbnailHeight: Double {
|
||||
thumbnailWidth / 1.7777
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
struct ChapterView_Preview: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ChapterView(chapter: .init(title: "Chapter", start: 30))
|
||||
.injectFixtureEnvironmentObjects()
|
||||
#if os(tvOS)
|
||||
ChapterViewTVOS(chapter: .init(title: "Chapter", start: 30))
|
||||
.injectFixtureEnvironmentObjects()
|
||||
#else
|
||||
ChapterView(chapter: .init(title: "Chapter", start: 30), chapterIndex: 0)
|
||||
.injectFixtureEnvironmentObjects()
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import SwiftUI
|
||||
|
||||
struct ChaptersView: View {
|
||||
@ObservedObject private var player = PlayerModel.shared
|
||||
@Binding var expand: Bool
|
||||
|
||||
var chapters: [Chapter] {
|
||||
player.videoForDisplay?.chapters ?? []
|
||||
@@ -15,45 +16,71 @@ struct ChaptersView: View {
|
||||
|
||||
var body: some View {
|
||||
if !chapters.isEmpty {
|
||||
#if os(tvOS)
|
||||
List {
|
||||
Section {
|
||||
ForEach(chapters) { chapter in
|
||||
ChapterView(chapter: chapter)
|
||||
}
|
||||
}
|
||||
.listRowBackground(Color.clear)
|
||||
}
|
||||
.listStyle(.plain)
|
||||
#else
|
||||
if chaptersHaveImages {
|
||||
ScrollView(.horizontal) {
|
||||
LazyHStack(spacing: 20) {
|
||||
if chaptersHaveImages {
|
||||
#if os(tvOS)
|
||||
List {
|
||||
Section {
|
||||
ForEach(chapters) { chapter in
|
||||
ChapterView(chapter: chapter)
|
||||
ChapterViewTVOS(chapter: chapter)
|
||||
}
|
||||
}
|
||||
.padding(.horizontal, 15)
|
||||
.listRowBackground(Color.clear)
|
||||
}
|
||||
.frame(minHeight: ChapterView.thumbnailHeight + 100)
|
||||
} else {
|
||||
.listStyle(.plain)
|
||||
#else
|
||||
ScrollView(.horizontal) {
|
||||
LazyHStack(spacing: 20) { chapterViews(for: chapters[...]) }.padding(.horizontal, 15)
|
||||
}
|
||||
#endif
|
||||
} else if expand {
|
||||
#if os(tvOS)
|
||||
Section {
|
||||
ForEach(chapters) { chapter in
|
||||
ChapterView(chapter: chapter)
|
||||
ChapterViewTVOS(chapter: chapter)
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
NoCommentsView(text: "No chapters information available".localized(), systemImage: "xmark.circle.fill")
|
||||
#else
|
||||
Section { chapterViews(for: chapters[...]) }.padding(.horizontal)
|
||||
#endif
|
||||
} else {
|
||||
#if os(iOS)
|
||||
Button(action: {
|
||||
self.expand.toggle()
|
||||
}) {
|
||||
Section {
|
||||
chapterViews(for: chapters.prefix(3), opacity: 0.3, clickable: false)
|
||||
}.padding(.horizontal)
|
||||
}
|
||||
#elseif os(macOS)
|
||||
Section {
|
||||
chapterViews(for: chapters.prefix(3), opacity: 0.3, clickable: false)
|
||||
}.padding(.horizontal)
|
||||
#else
|
||||
Section {
|
||||
ForEach(chapters) { chapter in
|
||||
ChapterViewTVOS(chapter: chapter)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if !os(tvOS)
|
||||
private func chapterViews(for chaptersToShow: ArraySlice<Chapter>, opacity: Double = 1.0, clickable: Bool = true) -> some View {
|
||||
ForEach(Array(chaptersToShow.indices), id: \.self) { index in
|
||||
let chapter = chaptersToShow[index]
|
||||
ChapterView(chapter: chapter, chapterIndex: index)
|
||||
.opacity(index == 0 ? 1.0 : opacity)
|
||||
.allowsHitTesting(clickable)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
struct ChaptersView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ChaptersView()
|
||||
ChaptersView(expand: .constant(false))
|
||||
.injectFixtureEnvironmentObjects()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,10 @@ import Foundation
|
||||
import SwiftUI
|
||||
|
||||
struct VideoDescription: View {
|
||||
static let collapsedLines = 5
|
||||
|
||||
private var search: SearchModel { .shared }
|
||||
@Default(.showKeywords) private var showKeywords
|
||||
@Default(.expandVideoDescription) private var expandVideoDescription
|
||||
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
|
||||
|
||||
var video: Video
|
||||
var detailsSize: CGSize?
|
||||
@@ -21,64 +20,90 @@ struct VideoDescription: View {
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if !expandVideoDescription && !expand {
|
||||
Button {
|
||||
expand = true
|
||||
} label: {
|
||||
descriptionView
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
} else {
|
||||
descriptionView
|
||||
descriptionView.id(video.videoID)
|
||||
}
|
||||
|
||||
@ViewBuilder var descriptionView: some View {
|
||||
if !expand && collapsedLinesDescription == 0 {
|
||||
EmptyView()
|
||||
} else {
|
||||
VStack {
|
||||
#if os(iOS)
|
||||
ActiveLabelDescriptionRepresentable(
|
||||
description: description,
|
||||
detailsSize: detailsSize,
|
||||
expand: expand
|
||||
)
|
||||
#else
|
||||
textDescription
|
||||
#endif
|
||||
|
||||
keywords
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
.overlay(
|
||||
Group {
|
||||
#if canImport(UIKit)
|
||||
if !expand {
|
||||
Button(action: { expand.toggle() }) {
|
||||
Rectangle()
|
||||
.foregroundColor(.clear)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
)
|
||||
}
|
||||
.id(video.videoID)
|
||||
}
|
||||
|
||||
var descriptionView: some View {
|
||||
VStack {
|
||||
#if os(iOS)
|
||||
ActiveLabelDescriptionRepresentable(
|
||||
description: description,
|
||||
detailsSize: detailsSize,
|
||||
expand: shouldExpand
|
||||
)
|
||||
#else
|
||||
textDescription
|
||||
#endif
|
||||
|
||||
keywords
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
|
||||
var shouldExpand: Bool {
|
||||
expandVideoDescription || expand
|
||||
}
|
||||
|
||||
@ViewBuilder var textDescription: some View {
|
||||
#if !os(iOS)
|
||||
#if canImport(AppKit)
|
||||
Group {
|
||||
if #available(macOS 12, *) {
|
||||
Text(description)
|
||||
DescriptionWithLinks(description: description, detailsSize: detailsSize)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.lineLimit(shouldExpand ? 500 : Self.collapsedLines)
|
||||
#if !os(tvOS)
|
||||
.lineLimit(expand ? 500 : collapsedLinesDescription)
|
||||
.textSelection(.enabled)
|
||||
#endif
|
||||
} else {
|
||||
Text(description)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.lineLimit(shouldExpand ? 500 : Self.collapsedLines)
|
||||
.lineLimit(expand ? 500 : collapsedLinesDescription)
|
||||
}
|
||||
}
|
||||
.multilineTextAlignment(.leading)
|
||||
.font(.system(size: 14))
|
||||
.lineSpacing(3)
|
||||
.allowsHitTesting(expand)
|
||||
#endif
|
||||
}
|
||||
|
||||
// If possibe convert URLs to clickable links
|
||||
#if canImport(AppKit)
|
||||
@available(macOS 12, *)
|
||||
struct DescriptionWithLinks: View {
|
||||
let description: String
|
||||
let detailsSize: CGSize?
|
||||
let separators = CharacterSet(charactersIn: " \n")
|
||||
|
||||
var formattedString: AttributedString {
|
||||
var attrString = AttributedString(description)
|
||||
let words = description.unicodeScalars.split(whereSeparator: separators.contains).map(String.init)
|
||||
words.forEach { word in
|
||||
if word.hasPrefix("https://") || word.hasPrefix("http://"), let url = URL(string: String(word)) {
|
||||
if let range = attrString.range(of: word) {
|
||||
attrString[range].link = url
|
||||
}
|
||||
}
|
||||
}
|
||||
return attrString
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Text(formattedString)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ViewBuilder var keywords: some View {
|
||||
if showKeywords {
|
||||
ScrollView(.horizontal, showsIndicators: showScrollIndicators) {
|
||||
@@ -109,7 +134,7 @@ struct VideoDescription: View {
|
||||
}
|
||||
|
||||
var showScrollIndicators: Bool {
|
||||
#if os(macOS)
|
||||
#if canImport(AppKit)
|
||||
false
|
||||
#else
|
||||
true
|
||||
@@ -127,6 +152,8 @@ struct VideoDescription: View {
|
||||
|
||||
@Environment(\.openURL) private var openURL
|
||||
|
||||
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
|
||||
|
||||
var player = PlayerModel.shared
|
||||
|
||||
func makeUIView(context _: Context) -> some UIView {
|
||||
@@ -160,7 +187,12 @@ struct VideoDescription: View {
|
||||
}
|
||||
|
||||
func updateNumberOfLines() {
|
||||
label.numberOfLines = expand ? 0 : VideoDescription.collapsedLines
|
||||
if expand || collapsedLinesDescription > 0 {
|
||||
label.numberOfLines = expand ? 0 : collapsedLinesDescription
|
||||
label.isHidden = false
|
||||
} else {
|
||||
label.isHidden = true
|
||||
}
|
||||
}
|
||||
|
||||
func urlTapHandler(_ url: URL) {
|
||||
|
||||
@@ -169,6 +169,7 @@ struct VideoDetails: View {
|
||||
@State private var subscriptionToggleButtonDisabled = false
|
||||
@State private var page = DetailsPage.info
|
||||
@State private var descriptionExpanded = false
|
||||
@State private var chaptersExpanded = false
|
||||
|
||||
@Environment(\.navigationStyle) private var navigationStyle
|
||||
#if os(iOS)
|
||||
@@ -190,6 +191,7 @@ struct VideoDetails: View {
|
||||
@Default(.showScrollToTopInComments) private var showScrollToTopInComments
|
||||
#endif
|
||||
@Default(.expandVideoDescription) private var expandVideoDescription
|
||||
@Default(.expandChapters) private var expandChapters
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
@@ -243,6 +245,10 @@ struct VideoDetails: View {
|
||||
}
|
||||
})
|
||||
.background(colorScheme == .dark ? Color.black : .white)
|
||||
.onAppear {
|
||||
descriptionExpanded = expandVideoDescription
|
||||
chaptersExpanded = expandChapters
|
||||
}
|
||||
}
|
||||
|
||||
#if os(iOS)
|
||||
@@ -317,7 +323,7 @@ struct VideoDetails: View {
|
||||
!video.chapters.isEmpty
|
||||
{
|
||||
Section(header: chaptersHeader) {
|
||||
ChaptersView()
|
||||
ChaptersView(expand: $chaptersExpanded)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -407,25 +413,78 @@ struct VideoDetails: View {
|
||||
}
|
||||
|
||||
var descriptionHeader: some View {
|
||||
HStack {
|
||||
Text("Description".localized())
|
||||
|
||||
if !expandVideoDescription, !descriptionExpanded {
|
||||
Spacer()
|
||||
Image(systemName: "arrow.up.and.down")
|
||||
.imageScale(.small)
|
||||
#if canImport(UIKit)
|
||||
Button(action: {
|
||||
descriptionExpanded.toggle()
|
||||
}) {
|
||||
HStack {
|
||||
Text("Description".localized())
|
||||
Spacer()
|
||||
Image(systemName: descriptionExpanded ? "chevron.up" : "chevron.down")
|
||||
.imageScale(.small)
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
#elseif canImport(AppKit)
|
||||
HStack {
|
||||
Text("Description".localized())
|
||||
Spacer()
|
||||
Button { descriptionExpanded.toggle()
|
||||
} label: {
|
||||
Image(systemName: descriptionExpanded ? "chevron.up" : "chevron.down")
|
||||
.imageScale(.small)
|
||||
}
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
|
||||
var chaptersHeader: some View {
|
||||
Text("Chapters".localized())
|
||||
.padding(.horizontal)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
#endif
|
||||
}
|
||||
|
||||
var chaptersHaveImages: Bool {
|
||||
player.videoForDisplay?.chapters.allSatisfy { $0.image != nil } ?? false
|
||||
}
|
||||
|
||||
var chaptersHeader: some View {
|
||||
Group {
|
||||
if !chaptersHaveImages {
|
||||
#if canImport(UIKit)
|
||||
Button(action: {
|
||||
chaptersExpanded.toggle()
|
||||
}) {
|
||||
HStack {
|
||||
Text("Chapters".localized())
|
||||
Spacer()
|
||||
Image(systemName: chaptersExpanded ? "chevron.up" : "chevron.down")
|
||||
.imageScale(.small)
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
#elseif canImport(AppKit)
|
||||
HStack {
|
||||
Text("Chapters".localized())
|
||||
Spacer()
|
||||
Button(action: { chaptersExpanded.toggle() }) {
|
||||
Image(systemName: chaptersExpanded ? "chevron.up" : "chevron.down")
|
||||
.imageScale(.small)
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
#endif
|
||||
} else {
|
||||
// No button, just the title when there are images
|
||||
Text("Chapters".localized())
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
.padding(.horizontal)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,10 +27,7 @@ struct VideoPlayerSizeModifier: ViewModifier {
|
||||
content
|
||||
.frame(width: geometry.size.width)
|
||||
.frame(maxHeight: maxHeight)
|
||||
|
||||
#if !os(macOS)
|
||||
.aspectRatio(ratio, contentMode: usedAspectRatioContentMode)
|
||||
#endif
|
||||
}
|
||||
|
||||
var ratio: CGFloat? { // swiftlint:disable:this no_cgfloat
|
||||
@@ -46,10 +43,10 @@ struct VideoPlayerSizeModifier: ViewModifier {
|
||||
}
|
||||
|
||||
var usedAspectRatioContentMode: ContentMode {
|
||||
#if os(iOS)
|
||||
fullScreen ? .fill : .fit
|
||||
#else
|
||||
#if os(tvOS)
|
||||
.fit
|
||||
#else
|
||||
fullScreen ? .fill : .fit
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ struct VideoPlayerView: View {
|
||||
static let defaultAspectRatio = 16 / 9.0
|
||||
static var defaultMinimumHeightLeft: Double {
|
||||
#if os(macOS)
|
||||
300
|
||||
335
|
||||
#else
|
||||
200
|
||||
#endif
|
||||
@@ -156,7 +156,7 @@ struct VideoPlayerView: View {
|
||||
.persistentSystemOverlays(!fullScreenPlayer)
|
||||
#endif
|
||||
#if os(macOS)
|
||||
.frame(minWidth: 1100, minHeight: 700)
|
||||
.frame(minWidth: playerSidebar != .never ? 1100 : 650, minHeight: 700)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ struct PlayerSettings: View {
|
||||
@Default(.showKeywords) private var showKeywords
|
||||
#if !os(tvOS)
|
||||
@Default(.showScrollToTopInComments) private var showScrollToTopInComments
|
||||
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
|
||||
#endif
|
||||
@Default(.expandVideoDescription) private var expandVideoDescription
|
||||
@Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer
|
||||
@@ -31,6 +32,7 @@ struct PlayerSettings: View {
|
||||
|
||||
@Default(.showInspector) private var showInspector
|
||||
@Default(.showChapters) private var showChapters
|
||||
@Default(.expandChapters) private var expandChapters
|
||||
@Default(.showRelated) private var showRelated
|
||||
|
||||
@ObservedObject private var accounts = AccountsModel.shared
|
||||
@@ -77,7 +79,9 @@ struct PlayerSettings: View {
|
||||
#if !os(tvOS)
|
||||
Section(header: SettingsHeader(text: "Info".localized())) {
|
||||
expandVideoDescriptionToggle
|
||||
collapsedLineDescriptionStepper
|
||||
showChaptersToggle
|
||||
expandChaptersToggle
|
||||
showRelatedToggle
|
||||
#if os(macOS)
|
||||
HStack {
|
||||
@@ -194,6 +198,24 @@ struct PlayerSettings: View {
|
||||
Toggle("Open video description expanded", isOn: $expandVideoDescription)
|
||||
}
|
||||
|
||||
#if !os(tvOS)
|
||||
private var collapsedLineDescriptionStepper: some View {
|
||||
LazyVStack {
|
||||
Stepper(value: $collapsedLinesDescription, in: 0 ... 10) {
|
||||
Text("Description preview")
|
||||
#if os(macOS)
|
||||
Spacer()
|
||||
#endif
|
||||
if collapsedLinesDescription == 0 {
|
||||
Text("No preview")
|
||||
} else {
|
||||
Text("\(collapsedLinesDescription) lines")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
private var returnYouTubeDislikeToggle: some View {
|
||||
Toggle("Enable Return YouTube Dislike", isOn: $enableReturnYouTubeDislike)
|
||||
}
|
||||
@@ -262,7 +284,13 @@ struct PlayerSettings: View {
|
||||
}
|
||||
|
||||
private var showChaptersToggle: some View {
|
||||
Toggle("Chapters", isOn: $showChapters)
|
||||
Toggle("Chapters (if available)", isOn: $showChapters)
|
||||
}
|
||||
|
||||
private var expandChaptersToggle: some View {
|
||||
Toggle("Open vertical chapters expanded", isOn: $expandChapters)
|
||||
.disabled(!showChapters)
|
||||
.foregroundColor(showChapters ? .primary : .secondary)
|
||||
}
|
||||
|
||||
private var showRelatedToggle: some View {
|
||||
|
||||
4
Shared/ars.lproj/Localizable.strings
Normal file
4
Shared/ars.lproj/Localizable.strings
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
|
||||
" subscribers" = " المشتركين";
|
||||
"%@ Channel" = "القناة";
|
||||
@@ -93,10 +93,10 @@
|
||||
"Player" = "Player";
|
||||
"Charging" = "Aufladen";
|
||||
"Clear" = "Löschen";
|
||||
"Clear Search History..." = "Suchverlauf löschen...";
|
||||
"Clear Search History..." = "Suchverlauf löschen …";
|
||||
"Filter: active" = "Filter: aktiv";
|
||||
"Find Other" = "Andere finden";
|
||||
"Edit..." = "Bearbeiten...";
|
||||
"Edit..." = "Bearbeiten …";
|
||||
|
||||
/* Selected video has just finished playing */
|
||||
"Just watched" = "Kürzlich angesehen";
|
||||
@@ -133,7 +133,7 @@
|
||||
"Are you sure you want to restore default quality profiles?" = "Möchten Sie die Standardqualitätsprofile wirklich wiederherstellen?";
|
||||
"Autoplaying Next" = "Nächstes Element automatisch abspielen";
|
||||
"Based on system color scheme" = "Basierend auf System Farbschema";
|
||||
"Buffering stream..." = "Lädt…";
|
||||
"Buffering stream..." = "Lädt …";
|
||||
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Fehler und tolle Ideen für Funktionen können an den Github Issue Tracker gesendet werden. ";
|
||||
"Categories to Skip" = "Zu überspringende Kategorien";
|
||||
"Close PiP and open player when application enters foreground" = "Schließe Bild-in-Bild und öffne den Player wenn die App in den Vordergrund geholt wird";
|
||||
@@ -167,7 +167,7 @@
|
||||
"Issues Tracker" = "Issues Tracker";
|
||||
"Enter fullscreen in landscape" = "Vollbild im Querformat aufrufen";
|
||||
"Error when accessing playlist" = "Fehler beim Zugriff auf Wiedergabeliste";
|
||||
"Finding something to play..." = "Etwas zu spielen finden...";
|
||||
"Finding something to play..." = "Etwas zu spielen finden …";
|
||||
"Fullscreen size" = "Vollbildgröße";
|
||||
|
||||
/* Video date filter in search */
|
||||
@@ -182,7 +182,7 @@
|
||||
"Large" = "Groß";
|
||||
|
||||
/* Loading stream OSD */
|
||||
"Loading streams..." = "Lädt Streams...";
|
||||
"Loading streams..." = "Lädt Streams …";
|
||||
|
||||
/* Video duration filter in search */
|
||||
"Long" = "Lang";
|
||||
@@ -199,7 +199,7 @@
|
||||
"More info can be found in:" = "Weitere Informationen finden Sie in:";
|
||||
"Movies" = "Filme";
|
||||
"Music" = "Musik";
|
||||
"Loading..." = "Lädt...";
|
||||
"Loading..." = "Lädt …";
|
||||
"Lock portrait mode" = "Hochformatmodus sperren";
|
||||
"Mark as watched" = "Als gesehen markieren";
|
||||
"Mark video as watched after playing" = "Video nach dem Abspielen als angesehen markieren";
|
||||
@@ -210,7 +210,7 @@
|
||||
"Only when signed in" = "Nur wenn Sie eingeloggt sind";
|
||||
|
||||
/* Loading stream OSD */
|
||||
"Opening %@ stream..." = "Öffne %@-stream...";
|
||||
"Opening %@ stream..." = "Öffne %@-stream …";
|
||||
"Connection failed" = "Verbindung fehlgeschlagen";
|
||||
"Continue from %@" = "Ab %@ fortsetzen";
|
||||
"Contributing" = "Beitragen";
|
||||
@@ -227,7 +227,7 @@
|
||||
"I want to ask a question" = "Ich möchte eine Frage stellen";
|
||||
"If you are interested what's coming in future updates, you can track project Milestones." = "Wenn Sie sich für künftige Updates interessieren, können Sie die Meilensteine des Projekts verfolgen.";
|
||||
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "Das große Layout ist nicht für alle Geräte geeignet und kann dazu führen, dass die Bedienelemente nicht auf den Bildschirm passen.";
|
||||
"Opening audio stream..." = "Audiostream wird geöffnet...";
|
||||
"Opening audio stream..." = "Audiostream wird geöffnet …";
|
||||
"Orientation" = "Ausrichtung";
|
||||
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Die Wiedergabeliste \"%@\" wird gelöscht.\nDies kann nicht rückgängig gemacht werden.";
|
||||
"Preferred Formats" = "Bevorzugte Formate";
|
||||
@@ -248,7 +248,7 @@
|
||||
/* Video sort order in search */
|
||||
"Rating" = "Bewertung";
|
||||
"Settings" = "Einstellungen";
|
||||
"Share..." = "Teilen...";
|
||||
"Share..." = "Teilen …";
|
||||
"Remove from Playlist" = "Aus Wiedergabeliste entfernen";
|
||||
"Remove from the queue" = "Aus der Warteschlange entfernen";
|
||||
"Replies" = "Antworten anzeigen";
|
||||
@@ -257,7 +257,7 @@
|
||||
"Resolution" = "Auflösung";
|
||||
"Restart the app to apply the settings above." = "Starten Sie die App neu, um die Einstellungen zu übernehmen.";
|
||||
"Restart/Play next" = "Von Anfang an/Als Nächstes spielen";
|
||||
"Restore default profiles..." = "Standardprofile wiederherstellen...";
|
||||
"Restore default profiles..." = "Standardprofile wiederherstellen …";
|
||||
"Rotate to portrait when exiting fullscreen" = "Auf Hochformat drehen, wenn der Vollbildmodus beendet wird";
|
||||
"Round corners" = "Runde Ecken";
|
||||
"Switch to public locations" = "Zu öffentlichen Adressen wechseln";
|
||||
@@ -271,10 +271,10 @@
|
||||
|
||||
/* Video sort order in search */
|
||||
"Views" = "Aufrufe";
|
||||
"Watched" = "Beobachtet";
|
||||
"Watched" = "Gesehen";
|
||||
|
||||
/* Selected video was played on given date */
|
||||
"Watched %@" = "Beobachtet %@";
|
||||
"Watched %@" = "%@ gesehen";
|
||||
|
||||
/* Selected video is being played */
|
||||
"Watching now" = "Jetzt anschauen";
|
||||
@@ -309,7 +309,7 @@
|
||||
/* Player controls layout size for TV */
|
||||
"TV" = "Fernsehen";
|
||||
"unknown" = "unbekannt";
|
||||
"Unsubscribe" = "Deabonnieren";
|
||||
"Unsubscribe" = "Abbestellen";
|
||||
"Upload date" = "Uploaddatum";
|
||||
"URL" = "URL";
|
||||
"Wi-Fi" = "Wi-Fi";
|
||||
@@ -357,7 +357,7 @@
|
||||
"Hardware decoder" = "Hardware-Decoder";
|
||||
"Save history of searches, channels and playlists" = "Verlauf von Suchen, Kanälen und Wiedergabelisten speichern";
|
||||
"Search history is empty" = "Suchverlauf ist leer";
|
||||
"Search..." = "Suche...";
|
||||
"Search..." = "Suche …";
|
||||
"Sections" = "Abschnitte";
|
||||
"Seek gesture sensitivity" = "Suchgesten-Sensibilität";
|
||||
"Seek gesture speed" = "Geschwindigkeit der Suchgesten";
|
||||
@@ -427,7 +427,7 @@
|
||||
"Could not refresh Trending" = "Trends kann nicht aktualisiert werden";
|
||||
"Could not open channel" = "Kanal kann nicht geöffnet werden";
|
||||
"This URL could not be opened" = "Diese URL kann nicht geöffnet werden";
|
||||
"Share Logs..." = "Logs teilen…";
|
||||
"Share Logs..." = "Logs teilen …";
|
||||
"Channel could not be found" = "Der Kanal konnte nicht gefunden werden";
|
||||
"Could not refresh Subscriptions" = "Abonnements konnten nicht aktualisiert werden";
|
||||
"If you want this app to be available in your language, join translation project." = "Wenn Sie wünschen, dass diese App auch in Ihrer Sprache verfügbar ist, nehmen Sie am Übersetzungsprojekt teil.";
|
||||
@@ -439,11 +439,11 @@
|
||||
"Show Home" = "Startseite anzeigen";
|
||||
"Video Details" = "Videodetails";
|
||||
"Share files from Finder on a Mac\nor iTunes on Windows" = "Teilen von Dateien über den Finder auf einem Mac\noder iTunes unter Windows";
|
||||
"Recent History" = "Neueste Verlauf";
|
||||
"Recent History" = "Neuester Verlauf";
|
||||
"Show Open Videos toolbar button" = "Schaltfläche \"Videos öffnen\" in der Symbolleiste anzeigen";
|
||||
"Edit Favorites…" = "Favoriten bearbeiten…";
|
||||
"Edit Favorites…" = "Favoriten bearbeiten …";
|
||||
"Show Documents" = "Dokumente anzeigen";
|
||||
"Buttons labels" = "Tasten-Etiketten";
|
||||
"Buttons labels" = "Schaltflächen-Etiketten";
|
||||
"Inspector visibility" = "Sichtbarkeit der Inspector";
|
||||
"Pages toolbar position" = "Position der Seitensymbolleiste";
|
||||
"Clear Queue before opening" = "Warteschlange vor dem Öffnen löschen";
|
||||
@@ -482,7 +482,7 @@
|
||||
"Sample Rate" = "Samplerate";
|
||||
"Files" = "Dateien";
|
||||
"Could not find any links to open in your clipboard" = "Kann keine Links zum Öffnen in Ihrer Zwischenablage finden";
|
||||
"Remove…" = "Entfernen…";
|
||||
"Remove…" = "Entfernen …";
|
||||
"Show Inspector" = "Inspector einblenden";
|
||||
"Actions buttons" = "Aktionsschaltflächen";
|
||||
"Show sidebar" = "Seitenleiste anzeigen";
|
||||
@@ -503,7 +503,7 @@
|
||||
"Verified" = "Verifiziert";
|
||||
"Channel" = "Kanal";
|
||||
"Short videos: visible" = "Kurze Videos: sichtbar";
|
||||
"Player Bar" = "Spielerleiste";
|
||||
"Player Bar" = "Video-Player-Leiste";
|
||||
"Short videos: hidden" = "Kurze Videos: versteckt";
|
||||
"Play all unwatched" = "Alle ungesehen abspielen";
|
||||
"Double tap gesture" = "Doppeltippgeste";
|
||||
@@ -539,7 +539,7 @@
|
||||
"Subscribe/Unsubscribe" = "Abonnieren/abbestellen";
|
||||
"Are you sure you want to clear cache?" = "Möchten Sie den Cache wirklich löschen?";
|
||||
"Single tap gesture" = "Einmalige Antippen-Geste";
|
||||
"Seeking" = "Suchend";
|
||||
"Seeking" = "Suchen";
|
||||
"List" = "Liste";
|
||||
"Cells" = "Zellen";
|
||||
"Show Next in Queue" = "Nächste in Warteschlange anzeigen";
|
||||
@@ -564,12 +564,12 @@
|
||||
"Lock" = "Sperre";
|
||||
"Description" = "Beschreibung";
|
||||
"Seek" = "Suchen";
|
||||
"Enter account credentials to connect..." = "Geben Sie die Kontozugangsdaten ein, um eine Verbindung herzustellen...";
|
||||
"Enter account credentials to connect..." = "Geben Sie die Kontozugangsdaten ein, um eine Verbindung herzustellen …";
|
||||
"Show scroll to top button in comments" = "Schaltfläche Nach oben scrollen in Kommentaren anzeigen";
|
||||
"Enter location address to connect..." = "Geben Sie die Internetadresse ein, um eine Verbindung herzustellen...";
|
||||
"Enter location address to connect..." = "Geben Sie die Internetadresse ein, um eine Verbindung herzustellen …";
|
||||
"Opened File" = "Geöffnete Datei";
|
||||
"File Extension" = "Dateierweiterung";
|
||||
"Opening file..." = "Datei öffnen...";
|
||||
"Opening file..." = "Datei öffnen …";
|
||||
"Close video and player on end" = "Video und Player am Ende beenden";
|
||||
"Use system controls with AVPlayer" = "Systemsteuerung mit AVPlayer verwenden";
|
||||
"Public account" = "Öffentliches Konto";
|
||||
@@ -582,12 +582,12 @@
|
||||
"Available" = "Verfügbar";
|
||||
"Startup section" = "Bereich Startup";
|
||||
"Home Settings" = "Startseite Einstellungen";
|
||||
"Watched: hidden" = "Beobachtet: versteckt";
|
||||
"(watched and shorts hidden)" = "(beobachtet und shorts versteckt)";
|
||||
"Watched: visible" = "Beobachtet: sichtbar";
|
||||
"Watched: hidden" = "Gesehene: versteckt";
|
||||
"(watched and shorts hidden)" = "(gesehene und Shorts versteckt)";
|
||||
"Watched: visible" = "Gesehene: sichtbar";
|
||||
"No videos to show" = "Keine Videos zu zeigen";
|
||||
"(watched hidden)" = "(versteckt beobachtet)";
|
||||
"(shorts hidden)" = "(shorts versteckt)";
|
||||
"(watched hidden)" = "(gesehene versteckt)";
|
||||
"(shorts hidden)" = "(Shorts versteckt)";
|
||||
"Disable filters" = "Filter deaktivieren";
|
||||
"Limit" = "Grenze";
|
||||
"Are you sure you want to remove %@ from Favorites?" = "Möchten Sie %@ wirklich aus den Favoriten entfernen?";
|
||||
@@ -597,3 +597,6 @@
|
||||
"Play Now in AVPlayer" = "Jetzt in AVPlayer abspielen";
|
||||
"Show channel avatars in videos lists" = "Kanal-Avatare in Videolisten anzeigen";
|
||||
"Show channel avatars in channels lists" = "Kanal-Avatare in Kanallisten anzeigen";
|
||||
"Podcasts" = "Podcasts";
|
||||
"Add %@" = "%@ hinzufügen";
|
||||
"Releases" = "Veröffentlichungen";
|
||||
|
||||
@@ -598,3 +598,7 @@
|
||||
"Podcasts" = "Podcasts";
|
||||
"Releases" = "Releases";
|
||||
"Add %@" = "Add %@";
|
||||
"Description preview" = "Description preview";
|
||||
"No preview" = "No preview";
|
||||
"Open vertical chapters expanded" = "Open vertical chapters expanded";
|
||||
"Chapters (if available)" = "Chapters (if available)";
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
"Are you sure you want to restore default quality profiles?" = "¿Estás seguro de que quieres restablecer los ajustes por defecto de los perfiles de calidad?";
|
||||
"Are you sure you want to unsubscribe from %@?" = "¿Estás seguro de que quieres dejar de estar suscrito a %@?";
|
||||
"Cancel" = "Cancelar";
|
||||
"Autoplaying Next" = "Autorreproducir el siguiente";
|
||||
"Autoplaying Next" = "Autoreproducir el siguiente";
|
||||
"Based on system color scheme" = "Basado en el tema del sistema";
|
||||
"Clear Search History..." = "Limpiar el historial de búsqueda...";
|
||||
"Battery" = "Batería";
|
||||
@@ -116,7 +116,7 @@
|
||||
"Decrease rate" = "Tasa de disminución";
|
||||
"Decreased opacity" = "Opacidad disminuida";
|
||||
"High" = "Alto";
|
||||
"%lld videos" = "%lld vídeos";
|
||||
"%lld videos" = "%lld videos";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Recordatorios explícitos para marquen \"me gusta\", se suscriban o interactúen con ellos en cualquier plataforma de pago o gratuita (por ejemplo, haciendo clic en un vídeo).";
|
||||
"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "Los formatos se seleccionarán en orden como se indica.\nHLS es un formato adaptable (no aplica la configuración de resolución).";
|
||||
"Fullscreen size" = "Tamaño de pantalla completa";
|
||||
@@ -169,7 +169,7 @@
|
||||
"Stream & Player" = "Transmisión y reproductor";
|
||||
"Picture in Picture" = "Imagen en imagen";
|
||||
"Visibility" = "Visibilidad";
|
||||
"Edit Favorites…" = "Editar Favoritos...";
|
||||
"Edit Favorites…" = "Editar los favoritos…";
|
||||
"Center" = "Centrar";
|
||||
"Wiki" = "Wiki";
|
||||
"Live Streams" = "Transmisiones en vivo";
|
||||
@@ -250,7 +250,7 @@
|
||||
"Actions buttons" = "Botones de acciones";
|
||||
"Files" = "Archivos";
|
||||
"Sign In Required" = "Inicio de sesión requerido";
|
||||
"Buttons labels" = "Etiquetas de botones";
|
||||
"Buttons labels" = "Etiquetas de los botones";
|
||||
"Next" = "Siguiente";
|
||||
"Default Profile" = "Perfil por defecto";
|
||||
"Paste" = "Pegar";
|
||||
@@ -258,7 +258,7 @@
|
||||
"File" = "Archivo";
|
||||
"Right" = "Derecha";
|
||||
"Reset search filters" = "Restablecer filtros de búsqueda";
|
||||
"Channel" = "Vanal";
|
||||
"Channel" = "Canal";
|
||||
"Open Files" = "Abrir archivos";
|
||||
"You can find information about using Yattee in the Wiki pages." = "Puede encontrar información sobre el uso de Yattee en la Wiki.";
|
||||
"Lock portrait mode" = "Bloquear modo retrato";
|
||||
@@ -266,7 +266,7 @@
|
||||
|
||||
/* Loading stream OSD */
|
||||
"Loading streams..." = "Cargando secuencias...";
|
||||
"Public Locations" = "Ubicaciones Públicas";
|
||||
"Public Locations" = "Ubicaciones públicas";
|
||||
"Yattee" = "Yattee";
|
||||
"No results" = "No hay resultados";
|
||||
"Driver" = "Driver";
|
||||
@@ -397,7 +397,7 @@
|
||||
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Se eliminará la lista de reproducción \"%@\".\nNo se puede revertir.";
|
||||
"Playlists" = "Listas de reproducción";
|
||||
"Popular" = "Popular";
|
||||
"Proxy videos" = "Proxy videos";
|
||||
"Proxy videos" = "Utilizar un proxy para ver los vídeos";
|
||||
"Regular size" = "Tamaño regular";
|
||||
"Related" = "Relacionado";
|
||||
|
||||
@@ -456,7 +456,7 @@
|
||||
"Press and hold remote button to open captions and quality menus" = "Mantenga presionado el botón del control remoto para abrir subtítulos y menús de calidad";
|
||||
"Comments are disabled" = "Los comentarios están deshabilitados";
|
||||
"No comments" = "Sin comentarios";
|
||||
"Share Logs..." = "Compartir registros...";
|
||||
"Share Logs..." = "Compartir registros…";
|
||||
"Open logs in Finder" = "Abrir registros en Finder";
|
||||
"Could not open video" = "No se pudo abrir el video";
|
||||
"Channel could not be found" = "No se pudo encontrar el canal";
|
||||
@@ -481,14 +481,14 @@
|
||||
"Playback" = "Reproducción";
|
||||
"Restart/Play next" = "Reiniciar/Reproducir siguiente";
|
||||
"This cannot be reverted" = "Esto no se puede revertir";
|
||||
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Esto no se puede revertir. Es posible que deba cambiar entre vistas o reiniciar la aplicación para ver los cambios";
|
||||
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Esto no se puede revertir. Es posible que deba cambiar entre vistas o reiniciar la aplicación para ver los cambios.";
|
||||
"Could not open channel" = "No se pudo abrir el canal";
|
||||
"Recent History" = "Historial reciente";
|
||||
"Share files from Finder on a Mac\nor iTunes on Windows" = "Comparta archivos desde Finder en una Mac\no iTunes en Windows";
|
||||
"Pages toolbar position" = "Posición de la barra de herramientas de páginas";
|
||||
"Video actions buttons" = "Botones de acciones de video";
|
||||
"Video" = "Video";
|
||||
"Show Open Videos toolbar button" = "Mostrar el botón de la barra de herramientas Abrir videos";
|
||||
"Show Open Videos toolbar button" = "Mostrar el botón de los vídeos abiertos en la barra de herramientas";
|
||||
"Show Documents" = "Mostrar documentos";
|
||||
"Clear Queue before opening" = "Borrar cola antes de abrir";
|
||||
"Open" = "Abrir";
|
||||
@@ -498,21 +498,107 @@
|
||||
"Audio" = "Audio";
|
||||
"Codec" = "Codec";
|
||||
"Size" = "Tamaño";
|
||||
"Remove…" = "Eliminar...";
|
||||
"Remove…" = "Eliminar…";
|
||||
"Playback history is empty" = "El historial de reproducción está vacío";
|
||||
"Copy%@link" = "Copiar%@enlace";
|
||||
"Share%@link" = "Compartir%@enlace";
|
||||
"Open expanded" = "Abrir maximizada";
|
||||
"Single tap gesture" = "Gesto con un solo toque";
|
||||
"Open expanded" = "Abrir maximizado";
|
||||
"Single tap gesture" = "Gesto de un solo toque";
|
||||
"Right click channel thumbnail to open context menu with more actions" = "Haz clic con el botón derecho en la miniatura del canal para abrir el menú contextual con más acciones";
|
||||
"Short videos: visible" = "Vídeos cortos: visibles";
|
||||
"Short videos: visible" = "Videos cortos: visible";
|
||||
"Tap and hold channel thumbnail to open context menu with more actions" = "Mantén pulsada la miniatura del canal para abrir el menú contextual con más acciones";
|
||||
"Maximum width expanded" = "Ancho máximo ampliado";
|
||||
"Short videos: hidden" = "Vídeos cortos: ocultos";
|
||||
"Maximum width expanded" = "Ancho máximo expandido";
|
||||
"Short videos: hidden" = "Videos cortos: oculto";
|
||||
"Clear all" = "Borrar todo";
|
||||
"Always show controls buttons" = "Mostrar siempre los botones de control";
|
||||
"Mark channel feed as unwatched" = "Marcar el canal como no visto";
|
||||
"Mark channel feed as unwatched" = "Marcar el feed del canal como no visto";
|
||||
"Play all unwatched" = "Reproducir todo lo no visto";
|
||||
"Mark channel feed as watched" = "Marcar el canal como visto";
|
||||
"Double tap gesture" = "Doble toque";
|
||||
"Mark channel feed as watched" = "Marcar el feed del canal como visto";
|
||||
"Double tap gesture" = "Gesto de doble toque";
|
||||
"Player Bar" = "Barra del reproductor";
|
||||
"Controls Buttons" = "Botones de control";
|
||||
"Seeking" = "Buscando";
|
||||
"Total size: %@" = "Tamaño total: %@";
|
||||
"Gesture: backwards" = "Gesto: atrás";
|
||||
"Gesture: fowards" = "Gesto: adelante";
|
||||
"System controls" = "Controles del sistema";
|
||||
"Close video" = "Cerrar vídeo";
|
||||
"Controls button: backwards" = "Botón de control: hacia atrás";
|
||||
"Controls button: forwards" = "Botón de control: hacia delante";
|
||||
"Show unwatched feed badges" = "Mostrar insignias de feeds no vistos";
|
||||
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "Los ajustes de los gestos controlan el intervalo de salto para el gesto de doble toque en el lado izquierdo/derecho del reproductor. Para cambiar los ajustes de los controles del sistema es necesario reiniciar.";
|
||||
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "Los ajustes gestuales controlan el intervalo de salto para el doble clic en el lado izquierdo/derecho del reproductor. Para cambiar la configuración de los controles del sistema es necesario reiniciar.";
|
||||
"Open channels with description expanded" = "Canales abiertos con la descripción ampliada";
|
||||
"Subscribe/Unsubscribe" = "Suscribirse/Desuscribirse";
|
||||
"Are you sure you want to clear cache?" = "¿Seguro que quieres borrar la caché?";
|
||||
"Lock orientation" = "Bloquear orientación";
|
||||
"Cache" = "Cache";
|
||||
"Actions Buttons" = "Botones de Acción";
|
||||
"Music Mode" = "Modo Música";
|
||||
"Play next item" = "Reproducir siguiente elemento";
|
||||
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "Los ajustes gestuales controlan el intervalo del salto de los botones de la flecha del mando a distancia (para Siri Remote de 2ª generación o posterior). Para cambiar los ajustes de los controles del sistema es necesario reiniciar.";
|
||||
"Show cache status" = "Mostrar estado de cache";
|
||||
"Show Next in Queue" = "Mostrar el siguiente en la cola";
|
||||
"Hide player" = "Ocultar al jugador";
|
||||
"Toggle player" = "Alternar el reproductor";
|
||||
"Inspector" = "Inspector";
|
||||
"Playback Settings" = "Ajustes de la reproducción";
|
||||
"Show toggle watch status button" = "Mostrar el botón para alternar estado de la visualización";
|
||||
"Queue - shuffled" = "Cola - aleatoria";
|
||||
"Cells" = "Celdas";
|
||||
"Do nothing" = "No hacer nada";
|
||||
"Next in Queue" = "Siguiente en la cola";
|
||||
"Open video description expanded" = "Abrir la descripción del vídeo ampliada";
|
||||
"Mark all as unwatched" = "Marcar todo como no visto";
|
||||
"Mark all as watched" = "Marcar todo como visto";
|
||||
"List" = "Lista";
|
||||
"Toggle size" = "Alternar el tamaño";
|
||||
"Open channel" = "Abrir el canal";
|
||||
"Feed" = "Feed";
|
||||
"Available" = "Disponible";
|
||||
"Loop one" = "Bucle uno";
|
||||
"Use system controls with AVPlayer" = "Utilizar los controles del sistema con AVPlayer";
|
||||
"Opening file..." = "Abriendo el archivo...";
|
||||
"No videos to show" = "No hay vídeos que mostrar";
|
||||
"Autoplay next" = "Reproducir automáticamente la siguiente";
|
||||
"Home Settings" = "Ajustes iniciales";
|
||||
"Watched: visible" = "Visto: visible";
|
||||
"Fullscreen" = "A pantalla completa";
|
||||
"Seek" = "Buscar";
|
||||
"Landscape left" = "Apaisado a la izquierda";
|
||||
"(watched and shorts hidden)" = "(ocultar videos reproducidos y cortos)";
|
||||
"Rotate when entering fullscreen on landscape video" = "Rotar al entrar en pantalla completa en un vídeo apaisado";
|
||||
"Enter account credentials to connect..." = "Introduce las credenciales de la cuenta para conectarte...";
|
||||
"Watched: hidden" = "Visto: oculto";
|
||||
"Stream" = "Stream";
|
||||
"Replay" = "Repetir";
|
||||
"(watched hidden)" = "(ocultar lo reproducido)";
|
||||
"Show scroll to top button in comments" = "Mostrar el botón de desplazamiento hacia arriba en los comentarios";
|
||||
"Enter location address to connect..." = "Introduzca la dirección para conectarse...";
|
||||
"File Extension" = "Extensión del archivo";
|
||||
"Opened File" = "Archivo abierto";
|
||||
"Public account" = "Cuenta pública";
|
||||
"Lock" = "Bloquear";
|
||||
"No rotation" = "Sin rotación";
|
||||
"Startup section" = "Sección de inicio";
|
||||
"Browse without account" = "Navegar sin cuenta";
|
||||
"Close video and player on end" = "Cerrar el vídeo y el reproductor al final";
|
||||
"Landscape right" = "Apaisado a la derecha";
|
||||
"Your Accounts" = "Tus cuentas";
|
||||
"Description" = "Descripción";
|
||||
"Maximum feed items" = "Número máximo de elementos en el feed";
|
||||
"Are you sure you want to remove %@ from Favorites?" = "¿Estás seguro de que quieres eliminar %@ de favoritos?";
|
||||
"Limit" = "Límite";
|
||||
"Keep channels with unwatched videos on top of subscriptions list" = "Mantén los canales con los vídeos sin ver en la parte superior de la lista de suscripciones";
|
||||
"(shorts hidden)" = "(cortos ocultos)";
|
||||
"Disable filters" = "Desactivar los filtros";
|
||||
"Podcasts" = "Podcasts";
|
||||
"Releases" = "Lanzamientos";
|
||||
"Show channel avatars in channels lists" = "Mostrar los avatares de los canales en las listas de los canales";
|
||||
"Play Now in MPV" = "Reproducir ahora en MPV";
|
||||
"Show channel avatars in videos lists" = "Mostrar los avatares de los canales en las listas de los vídeos";
|
||||
"Add %@" = "Añada %@";
|
||||
"Show video context menu options to force selected backend" = "Mostrar las opciones del menú contextual del vídeo para forzar el backend seleccionado";
|
||||
"Play Now in AVPlayer" = "Reproducir ahora en AVPlayer";
|
||||
"Description preview" = "Vista previa de la descripción";
|
||||
"No preview" = "Sin vista previa";
|
||||
|
||||
485
Shared/fa.lproj/Localizable.strings
Normal file
485
Shared/fa.lproj/Localizable.strings
Normal file
@@ -0,0 +1,485 @@
|
||||
|
||||
|
||||
"Podcasts" = "پادکستها";
|
||||
"Reset watched status when playing again" = "بازنشانی وضعیت تماشای ویدیو هنگام تماشای مجدد";
|
||||
"Finding something to play..." = "یافتن چیزی برای پخش…";
|
||||
"Available" = "در دسترس";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Very Large" = "خیلی بزرگ";
|
||||
"Audio" = "صدا";
|
||||
"Custom Locations" = "سرویس دهندگان سفارشی";
|
||||
"Always use AVPlayer for live videos" = "همیشه از AVPlayer برای ویدیوهای پخش زنده استفاده کن";
|
||||
"Clear Search History..." = "پاک کردن سابقهٔ جست و جو…";
|
||||
"Related" = "مرتبط";
|
||||
"Close Video" = "بستن پخش کننده";
|
||||
"Add to %@" = "افزودن به %@";
|
||||
"Could not open playlist" = "فهرست پخش باز نشد";
|
||||
"Disabled" = "غیرفعال";
|
||||
"Share..." = "اشتراک گذاری…";
|
||||
"For videos which feature music as the primary content." = "برای ویدیوهایی که محتوای اصلیشان موسیقی است.";
|
||||
"Save history of searches, channels and playlists" = "ذخیرهٔ سابقهٔ جست و جو، کانالها و فهرستهای پخش";
|
||||
"Clear Queue before opening" = "صف را پیش از باز کردن خالی کن";
|
||||
"Show playback statistics" = "نمایش آمار پخش";
|
||||
"Could not extract channel information" = "اطلاعات کانال دریافت نشد";
|
||||
"Video" = "ویدیو";
|
||||
"Matrix Chat" = "چت Matrix";
|
||||
"Loop one" = "پخش دوبارهٔ تکی";
|
||||
"Settings" = "تنظیمات";
|
||||
"10 seconds forwards/backwards" = "۱۰ ثانیه جلو/عقب";
|
||||
"Show progress of watching on thumbnails" = "پیشرفت پخش را روی تصویر بندانگشتی نشان بده";
|
||||
"Recents" = "تازهترینها";
|
||||
"Could not open channel" = "کانال باز نمیشود";
|
||||
"Select location closest to you:" = "نزدیکترین سرویس دهنده را انتخاب کنید:";
|
||||
"Fullscreen size" = "ابعاد تمام صفحه";
|
||||
"No Playlists" = "بدون فهرست پخش";
|
||||
"Highest quality" = "بالاترین کیفیت";
|
||||
"Edit..." = "ویرایش…";
|
||||
"Based on system color scheme" = "براساس طرح رنگ سیستم";
|
||||
"Quality" = "کیفیت";
|
||||
"Pause" = "مکث";
|
||||
"Controls Buttons" = "دکمههای کنترل";
|
||||
|
||||
/* Subscriptions title */
|
||||
"Subscriptions" = "اشتراکها";
|
||||
" subscribers" = " مشترکان";
|
||||
"Channels" = "کانالها";
|
||||
"Resolution" = "وضوح تصویر";
|
||||
"Button" = "دکمه";
|
||||
"Badge & Decreased opacity" = "نشان و کاهش شفافیت";
|
||||
"Milestones" = "نقطهٔ عطف";
|
||||
"Are you sure you want to restore default quality profiles?" = "آیا از بازنشانی نمایههای کیفیت پیشفرض مطمئنید؟";
|
||||
"Show sidebar" = "نمایش نوار کناری";
|
||||
"Error" = "خطا";
|
||||
|
||||
/* Video date filter in search */
|
||||
"Week" = "هفته";
|
||||
"Make default" = "پیش فرض شو";
|
||||
"Verified" = "تاییدشده";
|
||||
"Subscribe/Unsubscribe" = "اشتراک/لغو اشتراک";
|
||||
"Close player when closing video" = "هنگامی که ویدیو بسته میشود پخش کننده را ببند";
|
||||
"It can be changed later in settings. You can use your own locations too." = "میتوانید بعدا در تنظیمات تغییر دهید. همچنان میتوانید از سرویس دهندهٔ خودتان استفاده کنید.";
|
||||
"Comments are disabled" = "نظرها غیرفعال است";
|
||||
"Queue is empty" = "صف خالیست";
|
||||
"Playback Mode" = "وضعیت پخش";
|
||||
"Country" = "کشور";
|
||||
"Share" = "اشتراکگذاری";
|
||||
"Play in PiP" = "در تصویر-در-تصویر پخش کن";
|
||||
"System controls buttons" = "دکمههای کنترل سیستم";
|
||||
"Picture in Picture" = "تصویر-در-تصویر";
|
||||
"Comments" = "نظرها";
|
||||
"\"%@\" will be irreversibly removed from this device." = "\"%@\" از دستگاه حذف شده و غیرقابل بازگردانی خواهد بود.";
|
||||
"Now Playing" = "در حال پخش";
|
||||
"Charging" = "در حال شارژ";
|
||||
"Refresh" = "تازهسازی";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Large" = "بزرگ";
|
||||
"Are you sure you want to unsubscribe from %@?" = "آیا از لفو اشتراک %@ مطمئنید؟";
|
||||
|
||||
/* Video duration filter in search */
|
||||
"Short" = "Short";
|
||||
"Switch to public locations" = "به سرویس دهندهٔ عمومی منتقل شو";
|
||||
"Profiles" = "نمایهها";
|
||||
"New Playlist" = "فهرست پخش جدید";
|
||||
"Automatic" = "خودکار";
|
||||
"Opening file..." = "در حال باز کردن فایل…";
|
||||
"Add Quality Profile" = "افزودن نمایهٔ کیفیت";
|
||||
"Close video after playing last in the queue" = "ویدیو را پس از پخش آخرین مورد فهرست ببند";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Small" = "کوچک";
|
||||
"Clear" = "پاک کردن";
|
||||
"Anonymous" = "ناشناس";
|
||||
"Channel could not be found" = "کانال پیدا نشد";
|
||||
"Add to Favorites" = "افزودن به موردعلاقهها";
|
||||
"Total size: %@" = "مجموع اندازه: %@";
|
||||
"Wi-Fi" = "اینترنت Wi-Fi";
|
||||
|
||||
/* Selected video is being played */
|
||||
"Watching now" = "در حال تماشا";
|
||||
"Size" = "اندازه";
|
||||
"Connection failed" = "اتصال موفق نبود";
|
||||
"Could not open video" = "ویدیو باز نشد";
|
||||
"Badge color" = "رنگ نشان";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Medium" = "متوسط";
|
||||
"Reset search filters" = "بازنشانی صافیهای جست و جو";
|
||||
"Play" = "پخش";
|
||||
|
||||
/* Trending category, section containing all kinds of videos */
|
||||
"All" = "همه";
|
||||
"No videos to show" = "ویدیویی برای نمایش نیست";
|
||||
"Username" = "نام کاربری";
|
||||
"Don't use public locations" = "از سرویس دهندگان عمومی استفاده نکنید";
|
||||
"I have a feature request" = "درخواست ویژگی و قابلیت دارم";
|
||||
"Clear All Recents" = "همهٔ موارد اخیر را پاک کن";
|
||||
"Regular size" = "ابعاد معمولی";
|
||||
"Autoplay next" = "پخش خودکار بعدی";
|
||||
"Shuffle" = "شافل";
|
||||
"This cannot be reverted" = "این گزینه غیرقابل بازگشت است";
|
||||
"unknown" = "ناشناخته";
|
||||
"Could not create share link" = "پیوند اشتراکگذاری ساخته نشد";
|
||||
"Home Settings" = "تنظیمات صفحهٔ اصلی";
|
||||
"You have no Playlists" = "فهرست پخشی ندارید";
|
||||
"Watched: visible" = "تماشاشدهها: قابل رویت";
|
||||
"Are you sure you want to remove this document?" = "از حذف این سند مطمئنید؟";
|
||||
|
||||
/* Video sort order in search */
|
||||
"Rating" = "امتیازدهی";
|
||||
|
||||
|
||||
"Public" = "عمومی";
|
||||
"Add to Playlist..." = "افزودن به فهرست پخش…";
|
||||
"Category" = "دستهبندی";
|
||||
"Fullscreen" = "تمام صفحه";
|
||||
"No description" = "بدون شرح";
|
||||
"Gaming" = "بازی";
|
||||
"Apply to all" = "اعمال روی همه";
|
||||
"Close" = "بستن";
|
||||
|
||||
/* Video date filter in search */
|
||||
"Year" = "سال";
|
||||
"Continue" = "ادامه";
|
||||
"Show channel name" = "نمایش نام کانال";
|
||||
"Remove Location" = "حذف سرویس دهنده";
|
||||
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "چیدمان بزرگ مناسب همهٔ دستگاهها نیست و استفاده از آن ممکن است باعث بیرون ماندن کنترلها از صفحهٔ نمایش شود.";
|
||||
"Shorts" = "Shortها";
|
||||
"Show Favorites" = "نمایش موردعلاقهها";
|
||||
"Interface" = "رابط کاربری";
|
||||
"Unsubscribe" = "لغو اشتراک";
|
||||
"URL" = "نشانی";
|
||||
"Short videos: visible" = "ویدیوهای Short: قابل رویت";
|
||||
"Hardware decoder" = "دکودر سختافزاری";
|
||||
"Search history is empty" = "سابقهٔ جست و جو خالیست";
|
||||
"Playback Settings" = "تنظیمات پخش";
|
||||
"Are you sure you want to clear search history?" = "آیا از حذف سابقهٔ جست و جو مطمئنید؟";
|
||||
"Could not load video" = "ویدیو دریافت نشد";
|
||||
"Show video length" = "طول ویدیو را نشان بده";
|
||||
"Hide" = "مخفی کردن";
|
||||
"Clear Search History" = "پاک کردن سابقهٔ جست و جو";
|
||||
"Play Now in MPV" = "الان در MPV پخش کن";
|
||||
"Switch to other public location" = "به یک سرویس دهندهٔ عمومی دیگر منتقل شو";
|
||||
"Restart the app to apply the settings above." = "برای اعمال تنظیمات بالا اپ را دوباره راهاندازی کنید.";
|
||||
"Are you sure you want to clear cache?" = "آیا از حذف حافظهٔ مخفی مطمئنید؟";
|
||||
"Filter" = "صافی";
|
||||
"Open Settings" = "باز کردن تنظیمات";
|
||||
"Buffering stream..." = "بافر کردن استریم…";
|
||||
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "فهرست پخش خالیست\n\nروی ویدیو ضربه بزنید و نگه دارید، سپس\n\"افزودن به فهرست پخش\" را انتخاب کنید";
|
||||
"Playback history is empty" = "سابقهٔ پخش خالیست";
|
||||
"Chapters" = "فصلهای ویدیو";
|
||||
"(watched and shorts hidden)" = "(تماشاشدهها و Shortها مخفی)";
|
||||
|
||||
/* Video sort order in search */
|
||||
"Views" = "بازدیدها";
|
||||
"I want to ask a question" = "میخواهم سوالی بپرسم";
|
||||
"Show keywords" = "نمایش کلیدواژهها";
|
||||
"Edit" = "ویرایش";
|
||||
"Could not refresh Playlists" = "فهرست پخش بازسازی نشد";
|
||||
"Categories to Skip" = "دستهبندیهایی که رد میشوند";
|
||||
"Private" = "خصوصی";
|
||||
"This video could not be opened" = "این ویدیو باز نمیشود";
|
||||
"Center" = "وسط";
|
||||
"High" = "بالا";
|
||||
|
||||
/* Video date filter in search */
|
||||
"Today" = "امروز";
|
||||
"Remove from Playlist" = "حذف از فهرست پخش";
|
||||
"URL to Open" = "نشانی برای باز کردن";
|
||||
"Replies" = "پاسخها";
|
||||
"Movies" = "فیلمها";
|
||||
"Unlisted" = "فهرست نشده";
|
||||
"Wiki" = "ویکی";
|
||||
"Sort" = "ترتیب";
|
||||
"Frontend URL" = "نشانی Frontend";
|
||||
"Restore default profiles..." = "بازنشانی نمایههای پیشفرض…";
|
||||
"Any format" = "هر فرمتی";
|
||||
"Open" = "باز کردن";
|
||||
"Filter: active" = "صافی: فعال";
|
||||
"Play Music" = "موسیقی را پخش کن";
|
||||
"Clear All" = "همه را پاک کن";
|
||||
"Add Account" = "افزودن حساب کاربری";
|
||||
"Cancel" = "لغو";
|
||||
"Accounts are not supported for the application of this instance" = "حساب کاربری در این سرویس دهنده پشتیبانی نمیشود";
|
||||
"System controls" = "کنترلهای سیستم";
|
||||
"Hide player" = "پخشکننده را مخفی کن";
|
||||
"Lock orientation" = "قفل چرخش صفحه";
|
||||
"Cache" = "حافظهٔ مخفی";
|
||||
|
||||
/* Video date filter in search */
|
||||
"Hour" = "ساعت";
|
||||
"Open Videos" = "باز کردن ویدیو";
|
||||
"Add" = "افزودن";
|
||||
"Show icons and text when space permits" = "اگر جا بود متن و آیکنها را نشان بده";
|
||||
"Documents" = "مستندات";
|
||||
"Play Next" = "بعدی را پخش کن";
|
||||
"Battery" = "باتری";
|
||||
"Rotate to portrait when exiting fullscreen" = "پس از خروج از تمام صفحه به حالت عمودی بچرخ";
|
||||
"Could not delete document" = "سند حذف نشد";
|
||||
"Show account username" = "نمایش نام کاربری";
|
||||
"Queue - shuffled" = "صف - شافل";
|
||||
"Source" = "منبع";
|
||||
"Always" = "همیشه";
|
||||
|
||||
/* Video duration filter in search */
|
||||
"Long" = "دراز";
|
||||
"Mark video as watched after playing" = "ویدیو را پس از پخش به عنوان تماشا شده نشانه بگذار";
|
||||
"%@ Playlist" = "%@ فهرست پخش";
|
||||
"Playback queue is empty" = "صف پخش خالیست";
|
||||
"Add profile..." = "افزودن نمایه…";
|
||||
"Short videos: hidden" = "ویدیوهای Short: مخفی";
|
||||
"No documents" = "بدون مستندات";
|
||||
"Lowest" = "پایینترین";
|
||||
"Not available" = "در دسترس نیست";
|
||||
"Add Location" = "افزودن سرویس دهنده";
|
||||
"Public Locations" = "سرویس دهندگان عمومی";
|
||||
"Remove from history" = "حذف از سابقه";
|
||||
"Could not update your token." = "Token شما به روز نشد.";
|
||||
"Channel" = "کانال";
|
||||
"Limit" = "محدود";
|
||||
|
||||
/* Locations settings, custom instance is selected as current */
|
||||
"Custom" = "سفارشی";
|
||||
"Close video" = "ویدیو را ببند";
|
||||
"Remove from Favorites" = "حذف از موردعلاقهها";
|
||||
"Watched: hidden" = "تماشاشده: مخفی";
|
||||
"Close PiP and open player when application enters foreground" = "هنگامی که اپ باز میشود تصویر-در-تصویر را ببند و پخشکننده را باز کن";
|
||||
"Show Documents" = "نمایش مستندات";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Outro" = "انتها";
|
||||
"Music Mode" = "وضعیت موسیقی";
|
||||
"Edit Playlist" = "ویرایش فهرست پخش";
|
||||
"Mark as watched" = "نشانه گذاری به عنوان تماشا شده";
|
||||
"Stream" = "استریم";
|
||||
"Remove…" = "حذف…";
|
||||
"Add Location..." = "افزودن سرویس دهنده…";
|
||||
"%@ subscribers" = "%@ مشترکان";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Sponsor" = "حامی مالی";
|
||||
"Remove from the queue" = "حذف از صف";
|
||||
"Quality Profile" = "نمایهٔ کیفیت";
|
||||
"LIVE" = "زنده";
|
||||
"Accounts" = "حسابها";
|
||||
"Done" = "انجام شد";
|
||||
"Enter links to open, one per line" = "پیوندها را وارد کنید تا باز شوند، هر خط یک پیوند";
|
||||
"Files" = "فایلها";
|
||||
"No results" = "بدون نتیجه";
|
||||
"Current: %@\n%@" = "فعلی: %@\n%@";
|
||||
"Donations" = "حمایت مالی";
|
||||
"%@ Channel" = "%@ کانال";
|
||||
"Do nothing" = "کاری نکن";
|
||||
"File" = "فایل";
|
||||
"Yattee %@ (build %@)" = "Yattee %@ (بیلد %@)";
|
||||
"Proxy videos" = "پروکسی کردن ویدیوها";
|
||||
"Player" = "پخشکننده";
|
||||
"Play next item" = "مورد بعدی را پخش کن";
|
||||
"Controls" = "کنترلها";
|
||||
"This URL could not be opened" = "این نشانی باز نمیشود";
|
||||
"Trending" = "پرطرفدار";
|
||||
"Opening audio stream..." = "باز کردن استریم صوتی…";
|
||||
"Statistics" = "آمار";
|
||||
"Pause when player is closed" = "پس از بسته شدن پخشکننده مکث کن";
|
||||
"Play All" = "همه را پخش کن";
|
||||
"Sort: %@" = "ترتیب: %@";
|
||||
|
||||
/* Loading stream OSD */
|
||||
"Opening %@ stream..." = "باز کردن استریم %@…";
|
||||
"Next in Queue" = "مورد بعد در صف";
|
||||
"Honor orientation lock" = "قفل چرخش صفحه را در نظر بگیر";
|
||||
"Rate" = "امتیاز";
|
||||
"Playing Next" = "پخش بعدی";
|
||||
"%lld videos" = "%lld ویدیو";
|
||||
"Enable Return YouTube Dislike" = "فعال کردن بازگرداندن YouTube Dislike";
|
||||
"Country Name or Code" = "نام یا کد کشور";
|
||||
"Clear the queue" = "پاک کردن صف";
|
||||
"Could not extract playlist ID" = "شناسهٔ فهرست پخش دریافت نشد";
|
||||
"Could not load streams" = "استریم قابل دریافت نیست";
|
||||
"Are you sure you want to clear history of watched videos?" = "آیا از حذف سابقهٔ تماشا مطمئنید؟";
|
||||
"Mark all as unwatched" = "همه را به عنوان تماشانشده نشانه بگذار";
|
||||
"Thumbnails" = "بندانگشتیها";
|
||||
"Left" = "چپ";
|
||||
"Open \"Playlists\" tab to create new one" = "زبانهٔ «فهرست پخش» را باز کنید تا یک فهرست جدید بسازید";
|
||||
"Replay" = "پخش دوباره";
|
||||
"Remove" = "حذف کردن";
|
||||
"Close player when starting PiP" = "هنگامی که تصویر-در-تصویر آغاز میشود پخش کننده را ببند";
|
||||
"Controls button: backwards" = "دکمههای کنترل: عقب";
|
||||
"I am lost" = "گم شدهام";
|
||||
"Show only icons" = "فقط آیکنها را نشان بده";
|
||||
"Clear all" = "همه را پاک کن";
|
||||
"Shuffle All" = "شافل کردن همه";
|
||||
"Discord Server" = "سرور Discord";
|
||||
"Subscribe" = "اشتراک";
|
||||
"Loading..." = "درحال دریافت…";
|
||||
"Edit Favorites…" = "ویرایش موردعلاقهها…";
|
||||
"Sections" = "بخشها";
|
||||
"Play Last" = "آخرین را پخش کن";
|
||||
"Pages buttons" = "دکمههای صفحهها";
|
||||
"No comments" = "بدون نظر";
|
||||
"Connected successfully (%@)" = "با موفقیت وصل شد (%@)";
|
||||
"(watched hidden)" = "(تماشاشدهها مخفی)";
|
||||
"Enable logging" = "فعال کردن ثبت log";
|
||||
"Are you sure you want to delete playlist?" = "آیا از حذف فهرست پخش مطمئنید؟";
|
||||
"Description preview" = "پیشنمایش شرح";
|
||||
"Open Files" = "باز کردن فایلها";
|
||||
"Hide sidebar" = "نوار کناری را مخفی کن";
|
||||
"Show anonymous accounts" = "نمایش حسابهای ناشناس";
|
||||
"Always show controls buttons" = "همیشه دکمههای کنترل را نشان بده";
|
||||
"Mark all as watched" = "همه را به عنوان تماشاشده نشانه بگذار";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Smaller" = "کوچکتر";
|
||||
"Search" = "جست و جو";
|
||||
"Favorites" = "مورد علاقهها";
|
||||
"Address" = "نشانی";
|
||||
"MPV Documentation" = "مستندات MPV";
|
||||
"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "اگر ایرادی را گزارش میکنید، همهٔ جزییات مربوط (به ویژه نسخهٔ اپ، دستگاه مورد استفاده و نسخهٔ سیستم عامل و گامهایی که برای بازسازی ایراد لازم است) را ذکر کنید.";
|
||||
"Only when signed in" = "تنها پس از ورود";
|
||||
"Sign In Required" = "لازم است که وارد شوید";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Self-promotion" = "تبلیغ شخصی";
|
||||
"Only for local files and URLs" = "فقط برای فایلهای محلی و پیوندها";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Interaction" = "تعامل";
|
||||
"Preferred Formats" = "فرمتهای ترجیحی";
|
||||
"Reset" = "بازنشانی";
|
||||
"Badge" = "نشان";
|
||||
"Error when accessing playlist" = "خطا هنگام دسترسی به فهرست پخش";
|
||||
"Right" = "راست";
|
||||
"Blue" = "آبی";
|
||||
"Low quality" = "کیفیت پایین";
|
||||
"Popular" = "محبوب";
|
||||
"List" = "فهرست";
|
||||
"Create Playlist" = "ساخت فهرست پخش";
|
||||
"Show sidebar when space permits" = "اگر جا بود نوارکناری را نشان بده";
|
||||
"Locations" = "سرویس دهندگان";
|
||||
"Playlists" = "فهرستهای پخش";
|
||||
"Current Location" = "سرویس دهندهٔ فعلی";
|
||||
"Could not open Files" = "فایل باز نشد";
|
||||
"Regular Size" = "ابعاد معمولی";
|
||||
"Could not refresh Popular" = "محبوبترینها به روز نمیشود";
|
||||
"Recent History" = "سابقهٔ اخیر";
|
||||
"Clear History" = "پاک کردن سابقه";
|
||||
"Play all unwatched" = "همهٔ دیدهنشدهها را پخش کن";
|
||||
"Show Home" = "نمایش صفحهٔ اصلی";
|
||||
"More info can be found in:" = "اطلاعات بیشتر در:";
|
||||
"Name" = "نام";
|
||||
"History" = "سابقه";
|
||||
|
||||
/* Video date filter in search */
|
||||
"Month" = "ماه";
|
||||
"Matrix Channel" = "کانال Matrix";
|
||||
"Round corners" = "گوشههای گرد";
|
||||
"Pause when entering background" = "پس از ورود به پسزمینه مکث کن";
|
||||
"Music" = "موسیقی";
|
||||
"I like this app!" = "از این اپ خوشم میآید!";
|
||||
"Upload date" = "تاریخ انتشار";
|
||||
"Save history of played videos" = "ذخیرهٔ سابقهٔ ویدیوهای پخش شده";
|
||||
"Add Account..." = "افزودن حساب کاربری…";
|
||||
"Public account" = "حساب کاربری عمومی";
|
||||
"Add %@" = "افزودن %@";
|
||||
"Autoplaying Next" = "پخش خودکار بعدی";
|
||||
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "فهرست پخش ندارید\n\nروی «فهرست جدید» ضربه بزنید و یکی بسازید";
|
||||
"No chapters information available" = "اطلاعاتی در مورد فصلهای ویدیو در دسترس نیست";
|
||||
"Lock" = "قفل";
|
||||
"Nothing" = "هیچ";
|
||||
"Cellular" = "اینترنت همراه";
|
||||
"Password" = "رمز عبور";
|
||||
"Add to Playlist" = "افزودن به فهرست پخش";
|
||||
"(shorts hidden)" = "(Shortها مخفی)";
|
||||
"Are you sure you want to remove %@ location?" = "از حذف سرویس دهندهٔ \"%@\" مطمئنید؟";
|
||||
"Current Playlist" = "فهرست پخش فعلی";
|
||||
|
||||
/* Selected video was played on given date */
|
||||
"Watched %@" = "تماشا شده %@";
|
||||
"Videos" = "ویدیوها";
|
||||
"No locations available at the moment" = "در حال حاضر سرویس دهندهای در دسترس نیست";
|
||||
"Show history" = "نمایش سابقه";
|
||||
"Default Profile" = "نمایهٔ پیشفرض";
|
||||
"Red" = "قرمز";
|
||||
"No preview" = "بدون پیشنمایش";
|
||||
"Info" = "اطلاعات";
|
||||
|
||||
/* Loading stream OSD */
|
||||
"Loading streams..." = "درحال دریافت استریم…";
|
||||
"No rotation" = "بدون چرخش";
|
||||
"Codec" = "کدک (Codec)";
|
||||
"Startup section" = "بخش آغازین";
|
||||
"Edit Quality Profile" = "ویرایش نمایهٔ کیفیت";
|
||||
"Browse without account" = "استفاده بدون حساب کاربری";
|
||||
|
||||
/* Video sort order in search */
|
||||
"Relevance" = "ارتباط";
|
||||
"Help" = "کمک";
|
||||
"Find Other" = "یافتن دیگری";
|
||||
"Play Now" = "الان پخش کن";
|
||||
"Close PiP when starting playing other video" = "هنگامی که ویدیوی دیگری آغاز به پخش میکند تصویر-در-تصویر را ببند";
|
||||
"Show cache status" = "نمایش وضعیت حافظهٔ مخفی";
|
||||
"Play Now in AVPlayer" = "الان در AVPlayer پخش کن";
|
||||
"Medium quality" = "کیفیت متوسط";
|
||||
"Stream & Player" = "استریم و پخشکننده";
|
||||
"Contributing" = "مشارکت";
|
||||
"Save" = "ذخیره";
|
||||
"Buttons labels" = "برچسب دکمهها";
|
||||
"Close video and player on end" = "در پایان ویدیو و پخشکننده را ببند";
|
||||
"Delete" = "حذف";
|
||||
|
||||
/* Player controls layout size for TV */
|
||||
"TV" = "تلویزیون";
|
||||
"Continue from %@" = "از %@ ادامه بده";
|
||||
"I found a bug /" = "ایرادی پیدا کردهام /";
|
||||
"Recent Documents" = "مستندات تازه";
|
||||
"Orientation" = "چرخش صفحه";
|
||||
"Low" = "پایین";
|
||||
"Restart" = "راهاندازی دوباره";
|
||||
"Search..." = "جست و جو…";
|
||||
"Open Video" = "ویدیو را باز کن";
|
||||
"Sidebar" = "نوار کناری";
|
||||
"Translations" = "ترجمهها";
|
||||
"Duration" = "مدت زمان";
|
||||
|
||||
/* Video sort order in search */
|
||||
"Date" = "تاریخ";
|
||||
"Disable filters" = "غیرفعال کردن صافیها";
|
||||
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "فهرست پخش \"%@\" حذف خواهد شد.\nقابل بازگردانی نیست.";
|
||||
"Enter link to open" = "پیوند را وارد کنید تا باز شود";
|
||||
"Restart/Play next" = "پخش دوباره/بعدی";
|
||||
"Your Accounts" = "حساب کاربری شما";
|
||||
"Open channel" = "کانال را باز کن";
|
||||
"Queue" = "صف";
|
||||
"Controls button: forwards" = "دکمههای کنترل: جلو";
|
||||
"Normal" = "عادی";
|
||||
"Next" = "بعدی";
|
||||
"Home" = "صفحهٔ اصلی";
|
||||
"Contact" = "تماس";
|
||||
"Show Next in Queue" = "مورد بعدی صف را نشان بده";
|
||||
"Browsing" = "مرور";
|
||||
"Watched" = "تماشا شده";
|
||||
"Highest" = "بالاترین";
|
||||
"You can find information about using Yattee in the Wiki pages." = "اطلاعات در مورد چگونگی استفاده از Yattee را میتوانید در صفحات ویکی پیدا کنید.";
|
||||
"Captions" = "زیرنویس";
|
||||
"Playlist" = "فهرست پخش";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Intro" = "مقدمه";
|
||||
"Description" = "شرح";
|
||||
"Instance of current account" = "سرویس دهندهٔ حساب کاربری فعلی";
|
||||
"Advanced" = "پیشرفته";
|
||||
"Welcome" = "خوش آمدید";
|
||||
|
||||
/* Selected video has just finished playing */
|
||||
"Just watched" = "همین الان تماشا کردم";
|
||||
"Close PiP when player is opened" = "هنگامی که پخشکننده باز میشود تصویر-در-تصویر را ببند";
|
||||
"Lock portrait mode" = "قفل حالت عمودی";
|
||||
|
||||
/* Video date filter in search
|
||||
Video duration filter in search */
|
||||
"Any" = "هر";
|
||||
"Mark watched videos with" = "نشانه گذاری ویدیوها به عنوان تماشا شده با";
|
||||
"Not Playing" = "پخش نمیشود";
|
||||
"Video Details" = "جزییات ویدیو";
|
||||
"Live Streams" = "پخش زنده";
|
||||
@@ -600,3 +600,5 @@
|
||||
"Podcasts" = "Podcasts";
|
||||
"Releases" = "Sorties";
|
||||
"Add %@" = "Ajouter %@";
|
||||
"Description preview" = "Aperçu de la description";
|
||||
"No preview" = "Aucun aperçu";
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
|
||||
|
||||
"%@ Channel" = "%@ चैनल";
|
||||
"%@ Playlist" = "%@ प्लेलिस्ट";
|
||||
"%@ Playlist" = "%@ गीतमाला";
|
||||
"%@ subscribers" = "%@ सदस्य";
|
||||
"%lld videos" = "%lld वीडियों";
|
||||
"%lld videos" = "%lld वीडियो";
|
||||
" subscribers" = " सदस्य";
|
||||
"10 seconds forwards/backwards" = "10 पल आगे/पीछे";
|
||||
"Accounts" = "खातें";
|
||||
"Accounts are not supported for the application of this instance" = "इस इन्सटेंस के लिए खातों उपलब्ध नहीं हैं";
|
||||
"10 seconds forwards/backwards" = "10 सेकंड आगे/पीछे";
|
||||
"Accounts" = "खाते";
|
||||
"Accounts are not supported for the application of this instance" = "इस इन्सटेंस के लिए खाते उपलब्ध नहीं हैं";
|
||||
"Add to Playlist..." = "गीतमाला में जोड़ें…";
|
||||
"Advanced" = "उन्नत";
|
||||
|
||||
/* Trending category, section containing all kinds of videos */
|
||||
"All" = "सभी";
|
||||
"Always use AVPlayer for live videos" = "लाइव वीडियो के लिए सदा ए.वी. प्लेयर का उपयोग करें";
|
||||
"Always use AVPlayer for live videos" = "लाइव वीडियो के लिए सदा AVPlayer का उपयोग करें";
|
||||
"Anonymous" = "गुप्त";
|
||||
|
||||
/* Video date filter in search
|
||||
@@ -24,16 +24,16 @@
|
||||
"Are you sure you want to clear search history?" = "क्या आप निश्चित रूप से खोज का इतिहास मिटाना चाहते हैं?";
|
||||
"Close PiP and open player when application enters foreground" = "PiP बंद करें और प्लेयर खोलें जब ऐप्लिकेशन मुख्यभूमी में जाता है";
|
||||
"Close PiP when player is opened" = "PiP बंद करें जब प्लेयर खुले";
|
||||
"Close PiP when starting playing other video" = "PiP बंद करें जब दूसरा वीडियो प्ले हो";
|
||||
"Close player when closing video" = "प्लेयर बंद करें जब वीडियो बंद हो";
|
||||
"Close player when starting PiP" = "प्लेयर बंद करें जब PiP चालू हो";
|
||||
"Close PiP when starting playing other video" = "PiP बंद करें जब दूसरा वीडियो चालू हो";
|
||||
"Close player when closing video" = "जब वीडियो बंद हो तब प्लेयर बंद करें";
|
||||
"Close player when starting PiP" = "जब PiP चालू हो रहा हो तब प्लेयर बंद करें";
|
||||
"Close Video" = "वीडियो बंद करें";
|
||||
"Close video after playing last in the queue" = "कतार में आख़िरी समाप्त होने के पश्चात वीडियो बंद करें";
|
||||
"Close video after playing last in the queue" = "अंतिम पंक्तिबद्ध समाप्त होने के पश्चात वीडियो बंद करें";
|
||||
"Comments" = "टिप्पणियाँ";
|
||||
"Connected successfully (%@)" = "जुड़ाव सफल";
|
||||
"Connected successfully (%@)" = "जुड़ाव सफल (%@)";
|
||||
"Connection failed" = "जुड़ाव असफल";
|
||||
"Contact" = "संपर्क";
|
||||
"Continue" = "जारी";
|
||||
"Continue" = "जारी रखें";
|
||||
"Disabled" = "निर्योग्य";
|
||||
"Discord Server" = "डिस्कॉर्ड सर्वर";
|
||||
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "चर्चाएँ डिस्कॉर्ड एवं मेट्रिक्स पर होतीं हैं। यह सामान्य प्रश्नों के लिए अच्छा मंच है।";
|
||||
@@ -154,18 +154,18 @@
|
||||
"Play Now" = "अभी चलाएँ";
|
||||
"Playback" = "प्लेबैक";
|
||||
"Player" = "प्लेयर";
|
||||
"Playlist" = "प्लेलिस्ट";
|
||||
"Playlist" = "गीतमाला";
|
||||
"Decreased opacity" = "पारदर्शिता घटी";
|
||||
"Continue from %@" = "%@ से जारी करें";
|
||||
"Continue from %@" = "%@ से जारी रखें";
|
||||
"Current: %@\n%@" = "वर्तमान: %@\n%@";
|
||||
"Contributing" = "योगदान दें";
|
||||
"Contributing" = "योगदान";
|
||||
"Controls" = "नियंत्रक";
|
||||
"Copy %@ link" = "%@ लिंक नक़ल करें";
|
||||
"Copy %@ link" = "%@ लिंक कॉपी करें";
|
||||
"Country" = "देश";
|
||||
"Country Name or Code" = "देश नाम एवं कोड";
|
||||
"Could not load locations manifest" = "लोकेशन मैनिफ़ेस्ट लोड नहीं हो पाई";
|
||||
"Country Name or Code" = "देश का नाम एवं कोड";
|
||||
"Could not load locations manifest" = "लोकेशन मैनिफ़ेस्ट लोड नहीं हो सका";
|
||||
"Custom Locations" = "कस्टम स्थान";
|
||||
"Copy %@ link with time" = "%@ लिंक समय के साथ नक़ल करें";
|
||||
"Copy %@ link with time" = "%@ लिंक समय के साथ कॉपी करें";
|
||||
"Add Account" = "खाता जोड़ें";
|
||||
"Add Account..." = "खाता जोड़ें…";
|
||||
"Add Location" = "स्थान जोड़ें";
|
||||
@@ -177,35 +177,35 @@
|
||||
"Add to %@" = "%@ में जोड़ें";
|
||||
"Badge color" = "बिल्ले का रंग";
|
||||
"Category" = "श्रेणी";
|
||||
"Clear Search History..." = "खोज इतिहास साफ़ करें…";
|
||||
"Clear Search History..." = "खोज इतिहास हटायें…";
|
||||
"Are you sure you want to restore default quality profiles?" = "क्या आप निश्चित रूप से डीफ़ॉल्ट गुणवत्ता प्रोफ़ाइल को पुनः प्राप्त करना चाहते हैं?";
|
||||
"Based on system color scheme" = "मूल तंत्र रंग प्रणाली पर निर्भर";
|
||||
"Based on system color scheme" = "सिस्टम के रंग प्रणाली पर निर्भर";
|
||||
"Categories to Skip" = "श्रेणियाँ जिन्हें छोड़ें";
|
||||
"Chapters" = "अध्यायें";
|
||||
"Chapters" = "अध्याय";
|
||||
"Are you sure you want to delete playlist?" = "क्या आप निश्चित रूप से इस गीतमाला को मिटाना चाहते हैं?";
|
||||
"Are you sure you want to unsubscribe from %@?" = "क्या आप निश्चित रूप से %@ की सदस्यता छोड़ना चाहते हैं?";
|
||||
"Automatic" = "स्वतः";
|
||||
"Autoplaying Next" = "अगला ऑटोप्ले हो रहा";
|
||||
"Automatic" = "स्वचालित";
|
||||
"Autoplaying Next" = "अगला स्वतः चालू हो रहा";
|
||||
"Badge" = "बिल्ला";
|
||||
"Blue" = "नीला";
|
||||
"Browsing" = "ब्राउज़ करना";
|
||||
"Buffering stream..." = "स्ट्रीम बफ़र हो रहा…";
|
||||
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "आप बग एवं फ़ीचर सुझाव गिटहब के इशु ट्रैकर पर भेज सकते हैं ";
|
||||
"Cancel" = "रद्द";
|
||||
"Captions" = "कैप्शन";
|
||||
"Charging" = "चार्ज हो रहा";
|
||||
"Clear" = "साफ़";
|
||||
"Clear All" = "सभी साफ़";
|
||||
"Clear All Recents" = "सभी हालिया साफ़ करें";
|
||||
"Clear History" = "इतिहास साफ़ करें";
|
||||
"Clear Search History" = "खोज इतिहास साफ़ करें";
|
||||
"Clear the queue" = "क़तार साफ़ करें";
|
||||
"Captions" = "अनुशीर्षक";
|
||||
"Charging" = "चार्ज हो रहा है";
|
||||
"Clear" = "हटायें";
|
||||
"Clear All" = "सभी हटायें";
|
||||
"Clear All Recents" = "सभी हालिया हटायें";
|
||||
"Clear History" = "इतिहास हटायें";
|
||||
"Clear Search History" = "खोज इतिहास हटायें";
|
||||
"Clear the queue" = "पंक्तिबद्ध हटायें";
|
||||
"Close" = "बंद";
|
||||
"Backend" = "बैकऐंड";
|
||||
"Backend" = "पृष्ठभाग";
|
||||
"Badge & Decreased opacity" = "बिल्ला एवं पारदर्शिता में कमी";
|
||||
"Battery" = "बैटरी";
|
||||
"Button" = "बटन";
|
||||
"Cellular" = "मोबाइल डाटा";
|
||||
"Cellular" = "मोबाइल";
|
||||
"Create Playlist" = "गीतमाला बनाएँ";
|
||||
|
||||
/* Player controls layout size */
|
||||
@@ -267,7 +267,7 @@
|
||||
"Statistics" = "आँकड़े";
|
||||
"Hardware decoder" = "हार्डवेयर डीकोडर";
|
||||
"Stream FPS" = "स्ट्रीम FPS";
|
||||
"Playlists" = "प्लेलिस्ट";
|
||||
"Playlists" = "गीतमाला";
|
||||
"Popular" = "लोकप्रिय";
|
||||
"Preferred Formats" = "पसंदीदा प्रारूप";
|
||||
"Profiles" = "प्रोफ़ाइल";
|
||||
@@ -415,7 +415,7 @@
|
||||
"Locations Manifest" = "";
|
||||
"Could not delete document" = "";
|
||||
"Show Inspector" = "";
|
||||
"Could not load streams" = "";
|
||||
"Could not load streams" = "स्ट्रीम्स नहीं खोला जा सका";
|
||||
"Address" = "";
|
||||
"Playback Mode" = "";
|
||||
"Left" = "";
|
||||
@@ -447,17 +447,17 @@
|
||||
"Verified" = "";
|
||||
"No documents" = "";
|
||||
"Show Open Videos toolbar button" = "";
|
||||
"Could not refresh Subscriptions" = "";
|
||||
"Could not refresh Subscriptions" = "सदस्यता पुनर्स्थापित नहीं किया जा सका";
|
||||
"Remove Location" = "";
|
||||
"Only for local files and URLs" = "";
|
||||
"Codec" = "";
|
||||
"File" = "";
|
||||
"Could not extract playlist ID" = "";
|
||||
"Paste" = "";
|
||||
"Could not extract SID from received cookies: %@" = "";
|
||||
"Could not extract SID from received cookies: %@" = "प्राप्त कुकीज़ से SID नहीं निकाला जा सका: %@";
|
||||
"Files" = "";
|
||||
"Show Home" = "";
|
||||
"Could not extract channel information" = "";
|
||||
"Could not extract channel information" = "चैनल की जानकारी नहीं निकाली जा सकी";
|
||||
"Enter link to open" = "";
|
||||
"Home" = "";
|
||||
"No locations available at the moment" = "";
|
||||
@@ -469,7 +469,7 @@
|
||||
"Format" = "";
|
||||
"Share files from Finder on a Mac\nor iTunes on Windows" = "";
|
||||
"Share%@link" = "";
|
||||
"Could not open video" = "";
|
||||
"Could not open video" = "वीडियो नहीं खोला जा सका";
|
||||
"Center" = "";
|
||||
"Size" = "";
|
||||
"Recent Documents" = "";
|
||||
@@ -484,14 +484,14 @@
|
||||
"Could not create share link" = "";
|
||||
"Sample Rate" = "";
|
||||
"Translations" = "";
|
||||
"Open logs in Finder" = "";
|
||||
"Open logs in Finder" = "लॉग को Finder में खोलें";
|
||||
"Could not refresh Playlists" = "";
|
||||
"Could not update your token." = "";
|
||||
"Could not refresh Trending" = "";
|
||||
"Could not update your token." = "आपका टोकन अपडेट नहीं हो सका।";
|
||||
"Could not refresh Trending" = "ट्रेंडिंग को पुनर्स्थापित नहीं किया जा सका";
|
||||
"Could not open playlist" = "";
|
||||
"This URL could not be opened" = "";
|
||||
"Could not open channel" = "";
|
||||
"Channel could not be found" = "";
|
||||
"This URL could not be opened" = "इस URL को नहीं खोला जा सका";
|
||||
"Could not open channel" = "चैनल नहीं खुल सका";
|
||||
"Channel could not be found" = "चैनल नहीं मिला";
|
||||
"Could not refresh Popular" = "";
|
||||
"Could not extract video ID" = "";
|
||||
"Channel" = "";
|
||||
@@ -501,4 +501,4 @@
|
||||
"Pages toolbar position" = "";
|
||||
"Default Profile" = "";
|
||||
"Copy%@link" = "";
|
||||
"Share Logs..." = "";
|
||||
"Share Logs..." = "लॉग साझा करें…";
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
"Not available" = "利用できません";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Offtopic in Music Videos" = "音楽動画の脱線した内容";
|
||||
"Offtopic in Music Videos" = "音楽動画の非音楽部分";
|
||||
"Only when signed in" = "ログイン時のみ";
|
||||
"Orientation" = "向き";
|
||||
"Opening audio stream..." = "音声ストリーム 開始中...";
|
||||
@@ -487,13 +487,13 @@
|
||||
"Category" = "分類";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Interaction" = "操作の要求";
|
||||
"Interaction" = "操作の依頼";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Self-promotion" = "自己宣伝";
|
||||
"Quality" = "品質";
|
||||
"Are you sure you want to clear search history?" = "検索履歴を消去しますか?";
|
||||
"For videos which feature music as the primary content." = "音楽を主なコンテンツとする動画用です。";
|
||||
"For videos which feature music as the primary content." = "音楽が主な内容の動画が対象です。";
|
||||
"Always use AVPlayer for live videos" = "ライブ配信には常に AVPlayer を使用";
|
||||
"Clear Search History" = "検索履歴を消去";
|
||||
"Disabled" = "無効化";
|
||||
@@ -600,3 +600,5 @@
|
||||
"Podcasts" = "ポッドキャスト";
|
||||
"Releases" = "リリース";
|
||||
"Add %@" = "追加 %@";
|
||||
"Description preview" = "説明のプレビュー";
|
||||
"No preview" = "プレビューなし";
|
||||
|
||||
@@ -601,3 +601,7 @@
|
||||
"Podcasts" = "Podkasty";
|
||||
"Releases" = "Wydania";
|
||||
"Add %@" = "Dodaj %@";
|
||||
"Description preview" = "Podgląd opisu";
|
||||
"No preview" = "Brak podglądu";
|
||||
"Open vertical chapters expanded" = "Otwórz pionowe rozdziały rozwinięte";
|
||||
"Chapters (if available)" = "Rozdziały (jeśli dostępne)";
|
||||
|
||||
@@ -600,3 +600,5 @@
|
||||
"Podcasts" = "Podcasts";
|
||||
"Releases" = "Lançamentos";
|
||||
"Add %@" = "Adicionar %@";
|
||||
"Description preview" = "Descrição da prévia";
|
||||
"No preview" = "Sem prévia";
|
||||
|
||||
@@ -294,15 +294,15 @@
|
||||
"Hide" = "";
|
||||
"Playing Next" = "";
|
||||
"Are you sure you want to remove this document?" = "";
|
||||
"Show channel name" = "";
|
||||
"Show channel name" = "Kanal adını göster";
|
||||
"Unlisted" = "";
|
||||
"Paste" = "";
|
||||
"Rate & Captions" = "";
|
||||
"Format" = "";
|
||||
"Right" = "";
|
||||
"Right" = "Sağ";
|
||||
"Stream FPS" = "";
|
||||
"Cached time" = "";
|
||||
"Sign In Required" = "";
|
||||
"Sign In Required" = "Giriş yapmanız gerekiyor";
|
||||
"Could not create share link" = "";
|
||||
"Locations Manifest" = "";
|
||||
"When partially watched video is played" = "";
|
||||
@@ -323,19 +323,19 @@
|
||||
"Show Documents" = "";
|
||||
"Press and hold remote button to open captions and quality menus" = "";
|
||||
"No locations available at the moment" = "";
|
||||
"Show account username" = "";
|
||||
"Show account username" = "Hesabın kullanıcı adını göster";
|
||||
"Used to create links from videos, channels and playlists" = "";
|
||||
"Size" = "";
|
||||
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "";
|
||||
"Sort: %@" = "";
|
||||
"Select location closest to you:" = "";
|
||||
"Sort: %@" = "Sırala: %@";
|
||||
"Select location closest to you:" = "Size en yakın konumu seçin:";
|
||||
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "";
|
||||
|
||||
/* Video duration filter in search */
|
||||
"Short" = "";
|
||||
"Short" = "Kısa";
|
||||
"Home" = "";
|
||||
"Remove Location" = "";
|
||||
"Edit Favorites…" = "";
|
||||
"Edit Favorites…" = "Favorileri düzenle…";
|
||||
"Show Open Videos toolbar button" = "";
|
||||
"Sample Rate" = "";
|
||||
"Private" = "";
|
||||
@@ -365,14 +365,14 @@
|
||||
"Subscriptions" = "";
|
||||
"Upload date" = "";
|
||||
"This information will be processed only on your device and used to connect you to the server in the specified country." = "";
|
||||
"Shuffle" = "";
|
||||
"Shuffle" = "Karıştır";
|
||||
"Buttons labels" = "";
|
||||
"Share %@ link" = "";
|
||||
"Share %@ link" = "%@ bağlantısını paylaş";
|
||||
"Could not load streams" = "";
|
||||
"Playback history is empty" = "";
|
||||
"Show icons and text when space permits" = "";
|
||||
"unknown" = "";
|
||||
"Share..." = "";
|
||||
"Share..." = "Paylaş...";
|
||||
|
||||
/* Video sort order in search */
|
||||
"Views" = "";
|
||||
@@ -382,7 +382,7 @@
|
||||
"Could not refresh Playlists" = "";
|
||||
"Actions buttons" = "";
|
||||
"Any format" = "";
|
||||
"Show playback statistics" = "";
|
||||
"Show playback statistics" = "Oynatma istatistiklerini göster";
|
||||
"Pages buttons" = "";
|
||||
"Videos" = "";
|
||||
"Codec" = "";
|
||||
@@ -396,7 +396,7 @@
|
||||
"Open" = "";
|
||||
|
||||
/* Loading stream OSD */
|
||||
"Opening %@ stream..." = "";
|
||||
"Opening %@ stream..." = "%@ akışı açılıyor...";
|
||||
"Clear Queue before opening" = "";
|
||||
"Copy %@ link with time" = "Bağlantıyı %@ zaman ile kopyala";
|
||||
"Show Inspector" = "";
|
||||
@@ -412,15 +412,15 @@
|
||||
|
||||
/* Video date filter in search */
|
||||
"Week" = "";
|
||||
"Sidebar" = "";
|
||||
"Sidebar" = "Kenar çubuğu";
|
||||
"Show only icons" = "";
|
||||
"Current: %@\n%@" = "Şuan: %@\n%@";
|
||||
"Show anonymous accounts" = "";
|
||||
"Show anonymous accounts" = "Anonim hesapları göster";
|
||||
"Could not open playlist" = "";
|
||||
"Round corners" = "";
|
||||
"URL" = "";
|
||||
"Recents" = "";
|
||||
"Show sidebar when space permits" = "";
|
||||
"Show sidebar when space permits" = "Alan olduğu sürece kenar çubuğunu göster";
|
||||
"System controls buttons" = "";
|
||||
"Could not extract channel information" = "";
|
||||
"Public Locations" = "";
|
||||
@@ -431,22 +431,22 @@
|
||||
"Continue from %@" = "% devam et";
|
||||
"Copy %@ link" = "Bağlantıyı %@ kopyala";
|
||||
"Seek gesture sensitivity" = "";
|
||||
"Show keywords" = "";
|
||||
"Show keywords" = "Anahtar kelimeleri göster";
|
||||
"Wiki" = "";
|
||||
"Username" = "";
|
||||
"Could not extract video ID" = "";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Smaller" = "";
|
||||
"Sort" = "";
|
||||
"Smaller" = "Küçült";
|
||||
"Sort" = "Sırala";
|
||||
"This cannot be reverted" = "";
|
||||
"Public Manifest" = "";
|
||||
"You have no Playlists" = "";
|
||||
"Watched" = "";
|
||||
"Could not open video" = "";
|
||||
"Channel could not be found" = "";
|
||||
"Show video length" = "";
|
||||
"Source" = "";
|
||||
"Show video length" = "Video uzunluğunu göster";
|
||||
"Source" = "Kaynak";
|
||||
"Welcome" = "";
|
||||
"Wi-Fi" = "";
|
||||
"Could not open channel" = "";
|
||||
@@ -454,13 +454,13 @@
|
||||
"Could not extract playlist ID" = "";
|
||||
"Could not load video" = "";
|
||||
"Decreased opacity" = "Düşük şeffaflık";
|
||||
"Shuffle All" = "";
|
||||
"Share %@ link with time" = "";
|
||||
"Shuffle All" = "Tümünü karıştır";
|
||||
"Share %@ link with time" = "%@ bağlantısını zaman bilgisiyle birlikte paylaş";
|
||||
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "";
|
||||
"Unsubscribe" = "";
|
||||
"Current Location" = "";
|
||||
"Stream & Player" = "";
|
||||
"Hardware decoder" = "";
|
||||
"Hardware decoder" = "Donanımsal çözücü";
|
||||
"Honor orientation lock" = "";
|
||||
"Seek with horizontal swipe on video" = "";
|
||||
"Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator." = "";
|
||||
@@ -473,12 +473,12 @@
|
||||
"Self-promotion" = "";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Small" = "";
|
||||
"Small" = "Küçük";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Sponsor" = "";
|
||||
"Sponsor" = "Sponsor";
|
||||
"System controls show buttons for %@" = "";
|
||||
"Show history" = "";
|
||||
"Show history" = "Kullanım geçmişini göster";
|
||||
"Could not extract SID from received cookies: %@" = "";
|
||||
"This will remove all your custom profiles and return their default values. This cannot be reverted." = "";
|
||||
"Switch to other public location" = "";
|
||||
@@ -502,3 +502,6 @@
|
||||
"Share" = "";
|
||||
"File" = "";
|
||||
"Share%@link" = "";
|
||||
"Cache" = "Önbellek";
|
||||
"Enter account credentials to connect..." = "Bağlanmak için hesap bilgilerini girin...";
|
||||
"Show scroll to top button in comments" = "Yorumlarda yukarıya götür düğmesini göster";
|
||||
|
||||
@@ -1183,6 +1183,10 @@
|
||||
376578902685490700D4EA09 /* PlaylistsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistsView.swift; sourceTree = "<group>"; };
|
||||
37658ED428E1C567004BF6A2 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
376787BA291C43CD00D356A4 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3767F3312B2504F800F257BC /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3767F3322B25053B00F257BC /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3767F3332B25058300F257BC /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3767F3342B2505EF00F257BC /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3768122C28E8D0BC0036FC8D /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3769C02D2779F18600DDB3EA /* PlaceholderProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaceholderProgressView.swift; sourceTree = "<group>"; };
|
||||
376A33DF2720CAD6000C1D6B /* VideosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideosApp.swift; sourceTree = "<group>"; };
|
||||
@@ -2606,6 +2610,10 @@
|
||||
pt,
|
||||
"pt-BR",
|
||||
ja,
|
||||
fa,
|
||||
es,
|
||||
tr,
|
||||
ru,
|
||||
);
|
||||
mainGroup = 37D4B0BC2671614700C925CA;
|
||||
packageReferences = (
|
||||
@@ -3787,6 +3795,10 @@
|
||||
37E868FE29AA402D003128D0 /* pt */,
|
||||
37E868FF29AA407B003128D0 /* pt-BR */,
|
||||
37ABD5FE29BE7FA800DDCAD7 /* ja */,
|
||||
3767F3312B2504F800F257BC /* fa */,
|
||||
3767F3322B25053B00F257BC /* es */,
|
||||
3767F3332B25058300F257BC /* tr */,
|
||||
3767F3342B2505EF00F257BC /* ru */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
@@ -3801,7 +3813,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
|
||||
@@ -3832,7 +3844,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||
@@ -3863,7 +3875,7 @@
|
||||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
@@ -3883,7 +3895,7 @@
|
||||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
@@ -4047,7 +4059,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
@@ -4100,7 +4112,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
|
||||
@@ -4152,7 +4164,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
@@ -4191,7 +4203,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
@@ -4226,7 +4238,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4250,7 +4262,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4276,7 +4288,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4301,7 +4313,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4327,7 +4339,7 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -4367,7 +4379,7 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -4408,7 +4420,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -4432,7 +4444,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 168;
|
||||
CURRENT_PROJECT_VERSION = 171;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -4742,8 +4754,8 @@
|
||||
isa = XCRemoteSwiftPackageReference;
|
||||
repositoryURL = "https://github.com/cxfksword/MPVKit.git";
|
||||
requirement = {
|
||||
kind = upToNextMajorVersion;
|
||||
minimumVersion = 0.35.1;
|
||||
branch = main;
|
||||
kind = branch;
|
||||
};
|
||||
};
|
||||
/* End XCRemoteSwiftPackageReference section */
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/Alamofire/Alamofire.git",
|
||||
"state" : {
|
||||
"revision" : "b2fa556e4e48cbf06cf8c63def138c98f4b811fa",
|
||||
"version" : "5.8.0"
|
||||
"revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad",
|
||||
"version" : "5.8.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -42,7 +42,7 @@
|
||||
"location" : "https://github.com/kishikawakatsumi/KeychainAccess.git",
|
||||
"state" : {
|
||||
"branch" : "master",
|
||||
"revision" : "ecb18d8ce4d88277cc4fb103973352d91e18c535"
|
||||
"revision" : "e0c7eebc5a4465a3c4680764f26b7a61f567cdaf"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -59,8 +59,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/cxfksword/MPVKit.git",
|
||||
"state" : {
|
||||
"revision" : "96825b3dc2b38e5550268156148d47798ce6aa74",
|
||||
"version" : "0.36.0"
|
||||
"branch" : "main",
|
||||
"revision" : "dca1e345a26d09a3d621d7656a94e6427f3f7b83"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -105,7 +105,7 @@
|
||||
"location" : "https://github.com/SDWebImage/SDWebImage",
|
||||
"state" : {
|
||||
"branch" : "master",
|
||||
"revision" : "7550aa759c8d57800f7fdb3d17272a232b05e8cb"
|
||||
"revision" : "fbe79221b146aa6647dceb5a5c75873a48b69519"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -122,8 +122,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
|
||||
"state" : {
|
||||
"revision" : "5f025e54a03d3d33dff24d7a19331f446f00ed9d",
|
||||
"version" : "2.2.4"
|
||||
"revision" : "aee64ef39b570c44ccf0f884c440fc6494a23c76",
|
||||
"version" : "2.2.5"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -131,8 +131,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/SDWebImage/SDWebImageWebPCoder.git",
|
||||
"state" : {
|
||||
"revision" : "b442fafefeee8d3f489e33e69e0bb9407deb4757",
|
||||
"version" : "0.14.0"
|
||||
"revision" : "db4603921b31a6ce0f8c26d36d6a3fffc2dba481",
|
||||
"version" : "0.14.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -86,9 +86,11 @@ public class OrientationTracker {
|
||||
if accelerometerData.acceleration.y <= -threshold {
|
||||
return .portrait
|
||||
}
|
||||
if accelerometerData.acceleration.y >= threshold {
|
||||
|
||||
if UIDevice.current.userInterfaceIdiom == .pad && accelerometerData.acceleration.y >= threshold {
|
||||
return .portraitUpsideDown
|
||||
}
|
||||
|
||||
return currentDeviceOrientation
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ struct NowPlayingView: View {
|
||||
} else {
|
||||
Section(header: Text("Chapters")) {
|
||||
ForEach(video.chapters) { chapter in
|
||||
ChapterView(chapter: chapter)
|
||||
ChapterViewTVOS(chapter: chapter)
|
||||
.padding(.horizontal, 40)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user