mirror of
https://github.com/yattee/yattee.git
synced 2025-12-12 19:18:16 +00:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1cf45c6a1 | ||
|
|
07f3d841b3 | ||
|
|
b488f86160 | ||
|
|
e64c3a3c77 | ||
|
|
576a993faf | ||
|
|
c77c5a6d21 | ||
|
|
ae16680fc2 | ||
|
|
807c0a1e2e | ||
|
|
96a2119a05 | ||
|
|
7e940d6304 | ||
|
|
11402cc2a6 | ||
|
|
975d8b0ba0 | ||
|
|
e349898d9e | ||
|
|
a8802da5a7 | ||
|
|
19993dfc04 | ||
|
|
e99dd442e1 | ||
|
|
d886113f27 | ||
|
|
ea9b759887 | ||
|
|
0e784be231 | ||
|
|
d0ab73eeb2 | ||
|
|
2193129818 | ||
|
|
f84c6d319a | ||
|
|
87337f31a5 | ||
|
|
5559e78bc0 |
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,6 +1,8 @@
|
||||
## Build 180
|
||||
* Add help text to all header buttons (by @rickykresslein)
|
||||
* Add Chinese (Traditional) localization (by @rexcsk)
|
||||
## Build 181
|
||||
* History Setting: hide the recent activity in the sidebar or limit the number of items shown (by @rickykresslein)
|
||||
* Fix issues with empty comments (by @stonerl)
|
||||
* Improved Invidious comments (by @stonerl)
|
||||
* Downgrade MPVKit to 0.36.0-1 due to issues with WebVTT subtitles
|
||||
* Updated localizations
|
||||
* Updated dependencies
|
||||
|
||||
@@ -13,7 +15,8 @@
|
||||
* Import via URL for tvOS
|
||||
* Added Controls setting "Action button labels" icon or icon and text
|
||||
* Added Advanced setting for MPV: "deinterlace"
|
||||
* Updated dependencies (mpvkit 0.37.0)
|
||||
* Add help text to all header buttons (by @rickykresslein)
|
||||
* Add Chinese (Traditional) localization (by @rexcsk)
|
||||
* Localization fixes
|
||||
* Updated localizations
|
||||
* Fixed reported crash
|
||||
|
||||
24
Gemfile.lock
24
Gemfile.lock
@@ -54,19 +54,19 @@ GEM
|
||||
rexml
|
||||
addressable (2.8.6)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
artifactory (3.0.15)
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.894.0)
|
||||
aws-sdk-core (3.191.3)
|
||||
aws-partitions (1.906.0)
|
||||
aws-sdk-core (3.191.6)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.8)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.77.0)
|
||||
aws-sdk-kms (1.78.0)
|
||||
aws-sdk-core (~> 3, >= 3.191.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.143.0)
|
||||
aws-sdk-s3 (1.146.1)
|
||||
aws-sdk-core (~> 3, >= 3.191.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.8)
|
||||
@@ -85,7 +85,7 @@ GEM
|
||||
domain_name (0.6.20240107)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.109.0)
|
||||
excon (0.110.0)
|
||||
faraday (1.10.3)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
@@ -114,7 +114,7 @@ GEM
|
||||
faraday-retry (1.0.3)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.3.0)
|
||||
fastimage (2.3.1)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.54.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
@@ -132,12 +132,12 @@ GEM
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-storage_v1 (0.31.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-cloud-core (1.6.1)
|
||||
google-cloud-core (1.7.0)
|
||||
google-cloud-env (>= 1.0, < 3.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-errors (1.3.1)
|
||||
google-cloud-errors (1.4.0)
|
||||
google-cloud-storage (1.47.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
@@ -158,7 +158,7 @@ GEM
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.6.2)
|
||||
json (2.7.1)
|
||||
jwt (2.8.0)
|
||||
jwt (2.8.1)
|
||||
base64
|
||||
mini_magick (4.12.0)
|
||||
mini_mime (1.1.5)
|
||||
@@ -170,8 +170,8 @@ GEM
|
||||
optparse (0.4.0)
|
||||
os (1.1.4)
|
||||
plist (3.7.1)
|
||||
public_suffix (5.0.4)
|
||||
rake (13.1.0)
|
||||
public_suffix (5.0.5)
|
||||
rake (13.2.0)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
|
||||
@@ -123,7 +123,7 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
||||
content.json.dictionaryValue["videos"]?.arrayValue.map(self.extractVideo) ?? []
|
||||
}
|
||||
|
||||
["latest", "playlists", "streams", "shorts", "channels", "videos", "releases", "podcasts"].forEach { type in
|
||||
for type in ["latest", "playlists", "streams", "shorts", "channels", "videos", "releases", "podcasts"] {
|
||||
configureTransformer(pathPattern("channels/*/\(type)"), requestMethods: [.get]) { (content: Entity<JSON>) -> ChannelPage in
|
||||
self.extractChannelPage(from: content.json)
|
||||
}
|
||||
@@ -691,6 +691,8 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
||||
let author = details["author"]?.string ?? ""
|
||||
let channelId = details["authorId"]?.string ?? UUID().uuidString
|
||||
let authorAvatarURL = details["authorThumbnails"]?.arrayValue.last?.dictionaryValue["url"]?.string ?? ""
|
||||
let htmlContent = details["contentHtml"]?.string ?? ""
|
||||
let decodedContent = decodeHtml(htmlContent)
|
||||
return Comment(
|
||||
id: UUID().uuidString,
|
||||
author: author,
|
||||
@@ -699,12 +701,25 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
||||
pinned: false,
|
||||
hearted: false,
|
||||
likeCount: details["likeCount"]?.int ?? 0,
|
||||
text: details["content"]?.string ?? "",
|
||||
text: decodedContent,
|
||||
repliesPage: details["replies"]?.dictionaryValue["continuation"]?.string,
|
||||
channel: Channel(app: .invidious, id: channelId, name: author)
|
||||
)
|
||||
}
|
||||
|
||||
private func decodeHtml(_ htmlEncodedString: String) -> String {
|
||||
if let data = htmlEncodedString.data(using: .utf8) {
|
||||
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
|
||||
.documentType: NSAttributedString.DocumentType.html,
|
||||
.characterEncoding: String.Encoding.utf8.rawValue
|
||||
]
|
||||
if let attributedString = try? NSAttributedString(data: data, options: options, documentAttributes: nil) {
|
||||
return attributedString.string
|
||||
}
|
||||
}
|
||||
return htmlEncodedString
|
||||
}
|
||||
|
||||
private func extractCaptions(from content: JSON) -> [Captions] {
|
||||
content["captions"].arrayValue.compactMap { details in
|
||||
guard let url = URL(string: details["url"].stringValue, relativeTo: account.url) else { return nil }
|
||||
|
||||
@@ -113,8 +113,11 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
||||
content.json.arrayValue.compactMap { self.extractVideo(from: $0) }
|
||||
}
|
||||
|
||||
configureTransformer(pathPattern("comments/*")) { (content: Entity<JSON>) -> CommentsPage in
|
||||
let details = content.json.dictionaryValue
|
||||
configureTransformer(pathPattern("comments/*")) { (content: Entity<JSON>?) -> CommentsPage in
|
||||
guard let details = content?.json.dictionaryValue else {
|
||||
return CommentsPage(comments: [], nextPage: nil, disabled: true)
|
||||
}
|
||||
|
||||
let comments = details["comments"]?.arrayValue.compactMap { self.extractComment(from: $0) } ?? []
|
||||
let nextPage = details["nextpage"]?.string
|
||||
let disabled = details["disabled"]?.bool ?? false
|
||||
@@ -663,16 +666,16 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
||||
|
||||
let videoStreams = content.dictionaryValue["videoStreams"]?.arrayValue ?? []
|
||||
|
||||
videoStreams.forEach { videoStream in
|
||||
for videoStream in videoStreams {
|
||||
let videoCodec = videoStream.dictionaryValue["codec"]?.string ?? ""
|
||||
if Self.disallowedVideoCodecs.contains(where: videoCodec.contains) {
|
||||
return
|
||||
continue
|
||||
}
|
||||
|
||||
guard let audioAssetUrl = audioStream.dictionaryValue["url"]?.url,
|
||||
let videoAssetUrl = videoStream.dictionaryValue["url"]?.url
|
||||
else {
|
||||
return
|
||||
continue
|
||||
}
|
||||
|
||||
let audioAsset = AVURLAsset(url: audioAssetUrl)
|
||||
@@ -724,15 +727,23 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
||||
let commentorUrl = details["commentorUrl"]?.string
|
||||
let channelId = commentorUrl?.components(separatedBy: "/")[2] ?? ""
|
||||
|
||||
let commentText = extractCommentText(from: details["commentText"]?.stringValue)
|
||||
let commentId = details["commentId"]?.string ?? UUID().uuidString
|
||||
|
||||
// Sanity checks: return nil if required data is missing
|
||||
if commentText.isEmpty || commentId.isEmpty || author.isEmpty {
|
||||
return nil
|
||||
}
|
||||
|
||||
return Comment(
|
||||
id: details["commentId"]?.string ?? UUID().uuidString,
|
||||
id: commentId,
|
||||
author: author,
|
||||
authorAvatarURL: details["thumbnail"]?.string ?? "",
|
||||
time: details["commentedTime"]?.string ?? "",
|
||||
pinned: details["pinned"]?.bool ?? false,
|
||||
hearted: details["hearted"]?.bool ?? false,
|
||||
likeCount: details["likeCount"]?.int ?? 0,
|
||||
text: extractCommentText(from: details["commentText"]?.stringValue),
|
||||
text: commentText,
|
||||
repliesPage: details["repliesPage"]?.string,
|
||||
channel: Channel(app: .piped, id: channelId, name: author)
|
||||
)
|
||||
|
||||
@@ -35,26 +35,22 @@ final class CommentsModel: ObservableObject {
|
||||
|
||||
func load(page: String? = nil) {
|
||||
guard let video = player.currentVideo else { return }
|
||||
|
||||
if !firstPage && !nextPageAvailable {
|
||||
return
|
||||
}
|
||||
|
||||
firstPage = page.isNil || page!.isEmpty
|
||||
guard firstPage || nextPageAvailable else { return }
|
||||
|
||||
player
|
||||
.playerAPI(video)?
|
||||
.comments(video.videoID, page: page)?
|
||||
.load()
|
||||
.onSuccess { [weak self] response in
|
||||
if let page: CommentsPage = response.typedContent() {
|
||||
self?.all += page.comments
|
||||
self?.nextPage = page.nextPage
|
||||
self?.disabled = page.disabled
|
||||
guard let self = self else { return }
|
||||
if let commentsPage: CommentsPage = response.typedContent() {
|
||||
self.all += commentsPage.comments
|
||||
self.nextPage = commentsPage.nextPage
|
||||
self.disabled = commentsPage.disabled
|
||||
}
|
||||
}
|
||||
.onFailure { [weak self] requestError in
|
||||
self?.disabled = !requestError.json.dictionaryValue["error"].isNil
|
||||
.onFailure { [weak self] _ in
|
||||
self?.disabled = true
|
||||
}
|
||||
.onCompletion { [weak self] _ in
|
||||
self?.loaded = true
|
||||
|
||||
@@ -15,7 +15,11 @@ final class HistorySettingsGroupExporter: SettingsGroupExporter {
|
||||
|
||||
"watchedVideoStyle": Defaults[.watchedVideoStyle].rawValue,
|
||||
"watchedVideoBadgeColor": Defaults[.watchedVideoBadgeColor].rawValue,
|
||||
"showToggleWatchedStatusButton": Defaults[.showToggleWatchedStatusButton]
|
||||
"showToggleWatchedStatusButton": Defaults[.showToggleWatchedStatusButton],
|
||||
|
||||
"showRecents": Defaults[.showRecents],
|
||||
"limitRecents": Defaults[.limitRecents],
|
||||
"limitRecentsAmount": Defaults[.limitRecentsAmount]
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,5 +50,17 @@ struct HistorySettingsGroupImporter {
|
||||
if let showToggleWatchedStatusButton = json["showToggleWatchedStatusButton"].bool {
|
||||
Defaults[.showToggleWatchedStatusButton] = showToggleWatchedStatusButton
|
||||
}
|
||||
|
||||
if let showRecents = json["showRecents"].bool {
|
||||
Defaults[.showRecents] = showRecents
|
||||
}
|
||||
|
||||
if let limitRecents = json["limitRecents"].bool {
|
||||
Defaults[.limitRecents] = limitRecents
|
||||
}
|
||||
|
||||
if let limitRecentsAmount = json["limitRecentsAmount"].int {
|
||||
Defaults[.limitRecentsAmount] = limitRecentsAmount
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,6 +225,9 @@ extension Defaults.Keys {
|
||||
|
||||
static let saveRecents = Key<Bool>("saveRecents", default: true)
|
||||
static let saveHistory = Key<Bool>("saveHistory", default: true)
|
||||
static let showRecents = Key<Bool>("showRecents", default: true)
|
||||
static let limitRecents = Key<Bool>("limitRecents", default: false)
|
||||
static let limitRecentsAmount = Key<Int>("limitRecentsAmount", default: 10)
|
||||
static let showWatchingProgress = Key<Bool>("showWatchingProgress", default: true)
|
||||
static let saveLastPlayed = Key<Bool>("saveLastPlayed", default: false)
|
||||
|
||||
|
||||
@@ -5,12 +5,14 @@ struct AppSidebarRecents: View {
|
||||
var recents = RecentsModel.shared
|
||||
|
||||
@Default(.recentlyOpened) private var recentItems
|
||||
@Default(.limitRecents) private var limitRecents
|
||||
@Default(.limitRecentsAmount) private var limitRecentsAmount
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if !recentItems.isEmpty {
|
||||
Section(header: Text("Recents")) {
|
||||
ForEach(recentItems.reversed()) { recent in
|
||||
ForEach(recentItems.reversed().prefix(limitRecents ? limitRecentsAmount : recentItems.count)) { recent in
|
||||
Group {
|
||||
switch recent.type {
|
||||
case .channel:
|
||||
|
||||
@@ -13,6 +13,7 @@ struct Sidebar: View {
|
||||
@Default(.showDocuments) private var showDocuments
|
||||
#endif
|
||||
@Default(.showUnwatchedFeedBadges) private var showUnwatchedFeedBadges
|
||||
@Default(.showRecents) private var showRecents
|
||||
|
||||
var body: some View {
|
||||
ScrollViewReader { scrollView in
|
||||
@@ -20,8 +21,10 @@ struct Sidebar: View {
|
||||
mainNavigationLinks
|
||||
|
||||
if !accounts.isEmpty {
|
||||
AppSidebarRecents()
|
||||
.id("recentlyOpened")
|
||||
if showRecents {
|
||||
AppSidebarRecents()
|
||||
.id("recentlyOpened")
|
||||
}
|
||||
|
||||
if accounts.api.signedIn {
|
||||
if visibleSections.contains(.subscriptions), accounts.app.supportsSubscriptions {
|
||||
|
||||
@@ -10,6 +10,9 @@ struct HistorySettings: View {
|
||||
@Default(.saveRecents) private var saveRecents
|
||||
@Default(.saveLastPlayed) private var saveLastPlayed
|
||||
@Default(.saveHistory) private var saveHistory
|
||||
@Default(.showRecents) private var showRecents
|
||||
@Default(.limitRecents) private var limitRecents
|
||||
@Default(.limitRecentsAmount) private var limitRecentsAmount
|
||||
@Default(.showWatchingProgress) private var showWatchingProgress
|
||||
@Default(.watchedThreshold) private var watchedThreshold
|
||||
@Default(.watchedVideoStyle) private var watchedVideoStyle
|
||||
@@ -56,6 +59,26 @@ struct HistorySettings: View {
|
||||
Section(header: SettingsHeader(text: "History".localized())) {
|
||||
Toggle("Save history of searches, channels and playlists", isOn: $saveRecents)
|
||||
Toggle("Save history of played videos", isOn: $saveHistory)
|
||||
Toggle("Show recents in sidebar", isOn: $showRecents)
|
||||
#if os(macOS)
|
||||
HStack {
|
||||
Toggle("Limit recents shown", isOn: $limitRecents)
|
||||
.frame(minWidth: 140, alignment: .leading)
|
||||
.disabled(!showRecents)
|
||||
Spacer()
|
||||
counterButtons(for: $limitRecentsAmount)
|
||||
.disabled(!limitRecents)
|
||||
}
|
||||
#else
|
||||
Toggle("Limit recents shown", isOn: $limitRecents)
|
||||
.disabled(!showRecents)
|
||||
HStack {
|
||||
Text("Recents shown")
|
||||
Spacer()
|
||||
counterButtons(for: $limitRecentsAmount)
|
||||
.disabled(!limitRecents)
|
||||
}
|
||||
#endif
|
||||
Toggle("Show progress of watching on thumbnails", isOn: $showWatchingProgress)
|
||||
.disabled(!saveHistory)
|
||||
Toggle("Keep last played video in the queue after restart", isOn: $saveLastPlayed)
|
||||
@@ -169,6 +192,71 @@ struct HistorySettings: View {
|
||||
.foregroundColor(.red)
|
||||
}
|
||||
}
|
||||
|
||||
private func counterButtons(for _value: Binding<Int>) -> some View {
|
||||
var value: Binding<Int> {
|
||||
Binding(
|
||||
get: { return _value.wrappedValue },
|
||||
set: {
|
||||
if $0 < 1 {
|
||||
_value.wrappedValue = 1
|
||||
} else {
|
||||
_value.wrappedValue = $0
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return HStack {
|
||||
#if !os(tvOS)
|
||||
Label("Minus", systemImage: "minus")
|
||||
.imageScale(.large)
|
||||
.labelStyle(.iconOnly)
|
||||
.padding(7)
|
||||
.foregroundColor(limitRecents ? .accentColor : .gray)
|
||||
.accessibilityAddTraits(.isButton)
|
||||
#if os(iOS)
|
||||
.frame(minHeight: 35)
|
||||
.background(RoundedRectangle(cornerRadius: 4).strokeBorder(lineWidth: 1).foregroundColor(.accentColor))
|
||||
#endif
|
||||
.contentShape(Rectangle())
|
||||
.onTapGesture {
|
||||
value.wrappedValue -= 1
|
||||
}
|
||||
#endif
|
||||
|
||||
#if os(tvOS)
|
||||
let textFieldWidth = 100.00
|
||||
#else
|
||||
let textFieldWidth = 30.00
|
||||
#endif
|
||||
|
||||
TextField("Duration", value: value, formatter: NumberFormatter())
|
||||
.frame(width: textFieldWidth, alignment: .trailing)
|
||||
.multilineTextAlignment(.center)
|
||||
.labelsHidden()
|
||||
.foregroundColor(limitRecents ? .accentColor : .gray)
|
||||
#if !os(macOS)
|
||||
.keyboardType(.numberPad)
|
||||
#endif
|
||||
|
||||
#if !os(tvOS)
|
||||
Label("Plus", systemImage: "plus")
|
||||
.imageScale(.large)
|
||||
.labelStyle(.iconOnly)
|
||||
.padding(7)
|
||||
.foregroundColor(limitRecents ? .accentColor : .gray)
|
||||
.accessibilityAddTraits(.isButton)
|
||||
#if os(iOS)
|
||||
.background(RoundedRectangle(cornerRadius: 4).strokeBorder(lineWidth: 1).foregroundColor(.accentColor))
|
||||
#endif
|
||||
.contentShape(Rectangle())
|
||||
.onTapGesture {
|
||||
value.wrappedValue += 1
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct HistorySettings_Previews: PreviewProvider {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"Add Account" = "إضافة حساب";
|
||||
"Add Account..." = "إضافة حساب…";
|
||||
"Add Location" = "إضافة موقع";
|
||||
"Add Location..." = "إضافة موقع...";
|
||||
"Add Location..." = "أضِف موقع..";
|
||||
"%@ Playlist" = "قائمة تشغيل %@";
|
||||
"%@ Channel" = "قناة %@";
|
||||
"%@ subscribers" = "مشتركين %@";
|
||||
@@ -387,7 +387,7 @@
|
||||
"Backend" = "الواجهة الخلفية";
|
||||
"Badge" = "الشارة";
|
||||
"Close PiP when starting playing other video" = "غلق الفيديو المصغر عند بدء تشغيل فيديو آخر";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "تذكيرات صريحة لإبداء الإعجاب بها أو الإشتراك فيها أو التفاعل معها على أي منصة (منصات) مدفوعة أو مجانية (مثل النقر فوق مقطع الفيديو).";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "تذكيرات صريحة لإبداء الإعجاب بها أو الإشتراك فيها أو التفاعل معها على أي منصة (منصات) مدفوعة أو مجانية (مثل النقر فوق مقطع الفيديو).\n";
|
||||
"Filter" = " عامل التصفية";
|
||||
"Frontend URL" = "عنوان URL للواجهة الأمامية";
|
||||
"Fullscreen size" = "حجم ملء الشاشة";
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"Add Account" = "Add Account";
|
||||
"Add Account..." = "Add Account...";
|
||||
"Add Location" = "Add Location";
|
||||
"Add Location..." = "Add Location...";
|
||||
"Add Location..." = "Add Location..";
|
||||
"Add profile..." = "Add profile...";
|
||||
"Add Quality Profile" = "Add Quality Profile";
|
||||
"Add to %@" = "Add to %@";
|
||||
@@ -108,7 +108,7 @@
|
||||
"Enter fullscreen in landscape" = "Enter fullscreen in landscape";
|
||||
"Error" = "Error";
|
||||
"Error when accessing playlist" = "Error when accessing playlist";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video).";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video).\n";
|
||||
"Favorites" = "Favorites";
|
||||
"Filter" = "Filter";
|
||||
"Filter: active" = "Filter: active";
|
||||
|
||||
@@ -112,12 +112,12 @@
|
||||
"Help" = "Ayuda";
|
||||
"Hide sidebar" = "Ocultar barra lateral";
|
||||
"Add Location" = "Añadir ubicación";
|
||||
"Add Location..." = "Añadir ubicación...";
|
||||
"Add Location..." = "Añadir ubicación..";
|
||||
"Decrease rate" = "Tasa de disminución";
|
||||
"Decreased opacity" = "Opacidad disminuida";
|
||||
"High" = "Alto";
|
||||
"%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).";
|
||||
"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 que indiquen les guste, se suscriban o interactúen con ellos en cualquier plataforma de pago o gratuita (por ejemplo, haciendo clic en un vídeo).\n";
|
||||
"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";
|
||||
"Badge & Decreased opacity" = "Insignia y opacidad dosminuída";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
|
||||
" subscribers" = " abonnés";
|
||||
"Add Location..." = "Ajouter une instance…";
|
||||
"Add Location..." = "Ajouter une instance..";
|
||||
"Add profile..." = "Ajouter un profil…";
|
||||
"Add Quality Profile" = "Ajouter un profil de qualité";
|
||||
"Delete" = "Supprimer";
|
||||
@@ -264,7 +264,7 @@
|
||||
"Don't use public locations" = "Ne pas utiliser d'instances publiques";
|
||||
"Enable Return YouTube Dislike" = "Activer Return YouTube Dislike";
|
||||
"Enter fullscreen in landscape" = "Entrer en plein écran en mode paysage";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Rappels d'aimer la vidéo, de s'abonner ou d'interagir avec le créateur sur une plateforme gratuite ou payante.";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Rappels d'aimer la vidéo, de s'abonner ou d'interagir avec le créateur sur une plateforme gratuite ou payante.\n";
|
||||
"Frontend URL" = "URL frontale";
|
||||
"Public Locations" = "Instances publiques";
|
||||
"Public Manifest" = "Manifeste publique";
|
||||
|
||||
@@ -529,7 +529,7 @@
|
||||
"For custom locations you can configure Frontend URL in Locations settings" = "場所を指定するには、場所の設定からフロントエンドのURLを設定します";
|
||||
"Public Locations" = "公開された場所";
|
||||
"Switch to public locations" = "公開された場所に切り替え";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "有料/無料のプラットフォームかを問わず、いいね、登録などを明示的に操作を促す(例: 動画をクリック)。";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "有料/無料のプラットフォームかを問わず、いいね、登録などを明示的に操作を促す(例: 動画をクリック)。\n";
|
||||
"Proxy videos" = "動画閲覧にプロキシ使用";
|
||||
"Sections" = "表示するボタン";
|
||||
"System controls show buttons for %@" = "システム制御「%@」用のボタンを表示";
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
"I want to ask a question" = "Ik wil een vraag stellen";
|
||||
"If you are interested what's coming in future updates, you can track project Milestones." = "Als je geïnteresseerd bent in toekomstige updates, kan je Milestones van het project volgen.";
|
||||
"Increase rate" = "Verhoog tempo";
|
||||
"Info" = "";
|
||||
"Info" = "Info";
|
||||
"Instance of current account" = "Instantie van huidig account";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
@@ -259,3 +259,38 @@
|
||||
"Save history of played videos" = "Sla geschiedenis van afgespeelde videos op";
|
||||
"Save history of searches, channels and playlists" = "Sla geschiedenis van zoekopdrachten, kanalen en afspeellijsten op";
|
||||
"Search" = "Zoeken";
|
||||
"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." = "Stukken normaal in het begin van een video met een animatie, stil plaatje, of stukje van een andere video van dezelfde maker.";
|
||||
"Discord Server" = "Discord Server";
|
||||
"Enable logging" = "Loggen inschakelen";
|
||||
"Interface" = "Interface";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Intro" = "Intro";
|
||||
"LIVE" = "LIVE";
|
||||
"Matrix Chat" = "Matrix Chat";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Outro" = "Outro";
|
||||
"Proxy videos" = "Video's door proxyserver leiden";
|
||||
"Reset" = "Herstellen";
|
||||
"Search history is empty" = "Zoekgeschiedenis is leeg";
|
||||
"Search..." = "Zoeken...";
|
||||
"Sections" = "Secties";
|
||||
"Seek gesture sensitivity" = "Zoek gebaar gevoeligheid";
|
||||
"Seek gesture speed" = "Zoek gebaar snelheid";
|
||||
"Seek with horizontal swipe on video" = "Scrollen met horizontale sleep op video";
|
||||
"Select location closest to you:" = "Selecteer de dichtstbijzijnde locatie:";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Self-promotion" = "Zelfpromotie";
|
||||
"Settings" = "Instellingen";
|
||||
"Share %@ link" = "%@ link delen";
|
||||
"Share %@ link with time" = "%@ link met tijd delen";
|
||||
"Share..." = "Delen...";
|
||||
|
||||
/* Video duration filter in search */
|
||||
"Short" = "Kort";
|
||||
"Show account username" = "Gebruikersnaam van account laten zien";
|
||||
"Show anonymous accounts" = "Anonieme accounts laten zien";
|
||||
"Show channel name" = "Naam van kanaal laten zien";
|
||||
"Show history" = "Geschiedenis laten zien";
|
||||
|
||||
@@ -355,7 +355,7 @@
|
||||
"Could not extract channel information" = "Não pôde extrair informação do canal";
|
||||
"For custom locations you can configure Frontend URL in Locations settings" = "Para localizações personalizadas você pode configurar URL do frontend nas configurações de localização";
|
||||
"Add Location" = "Adicionar Localização";
|
||||
"Add Location..." = "Adicionar Localização…";
|
||||
"Add Location..." = "Adicionar Localização..";
|
||||
"For videos which feature music as the primary content." = "Para vídeos que têm música como conteúdo principal.";
|
||||
"Close video after playing last in the queue" = "Fechar vídeo depois de tocar o último na fila";
|
||||
"Clear Search History" = "Limpar Histórico de Busca";
|
||||
@@ -406,7 +406,7 @@
|
||||
"Country" = "País";
|
||||
"Clear All" = "Limpar Tudo";
|
||||
"Clear All Recents" = "Limpar Todos os Recentes";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Lembretes explícitos de dar like, se inscrever ou interagir com eles em qualquer plataforma, paga ou grátis (p.ex. clique em um vídeo).";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Lembretes explícitos de dar like, se inscrever ou interagir com eles em qualquer plataforma, paga ou grátis (p.ex. clicar em um vídeo).\n";
|
||||
"Duration" = "Duração";
|
||||
"Edit Quality Profile" = "Editar Perfil de Qualidade";
|
||||
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "Discussões acontecem no Discord e no Matrix. É um bom lugar para perguntas gerais.";
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"Accounts are not supported for the application of this instance" = "Conturile nu sunt acceptate pentru aplicaţia acestei instanțe";
|
||||
"%lld videos" = "%lld videoclipuri";
|
||||
"Add Location" = "Adaugă locație";
|
||||
"Add Location..." = "Adaugă locație...";
|
||||
"Add Location..." = "Adaugă locație..";
|
||||
"Add profile..." = "Adaugă profil...";
|
||||
"Add to %@" = "Adaugă la %@";
|
||||
"Add to Playlist" = "Adaugă la playlist";
|
||||
@@ -62,7 +62,7 @@
|
||||
"Edit" = "Editați";
|
||||
"Edit Playlist" = "Editați Playlist";
|
||||
"Enter fullscreen in landscape" = "Introduceți ecranul complet în peisaj";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Mementouri explicite de a aprecia, de a vă abona sau de a interacționa cu ele pe orice platformă (platforme) plătite sau gratuite (de exemplu, faceți clic pe un videoclip).";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Mementouri explicite de a aprecia, de a vă abona sau de a interacționa cu ele pe orice platformă (platforme) plătite sau gratuite (de exemplu, faceți clic pe un videoclip).\n";
|
||||
"Find Other" = "Găsiți alte";
|
||||
"Finding something to play..." = "Să găsești ceva de jucat...";
|
||||
"For videos which feature music as the primary content." = "Pentru videoclipurile care includ muzica ca conținut principal.";
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"Close video" = "關閉視頻";
|
||||
"Play next item" = "播放下一項目";
|
||||
"Maximum width expanded" = "最大寬度已展開";
|
||||
"Show unwatched feed badges" = "顯示未觀看的 Feed 標誌";
|
||||
"Show unwatched feed badges" = "顯示未觀看的\"最新影片\"標誌";
|
||||
"Gesture: fowards" = "手勢: 向前";
|
||||
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "手勢設置控制遠程箭頭按鈕的跳過間隔(用於第二代 Siri Remote 或更新版本)。更改系統控制設置需要重新啓動。";
|
||||
"Opened File" = "已打開文件";
|
||||
@@ -39,8 +39,8 @@
|
||||
"Edit" = "編輯";
|
||||
"Enable Return YouTube Dislike" = "啟用YouTube 不喜歡回報";
|
||||
"Enter fullscreen in landscape" = "橫屏下進入全屏";
|
||||
"Error when accessing playlist" = "播放列表出錯";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "明確提醒在任何付費或免費平台上按讚、訂閱或與他們互動(例如點擊影片)。";
|
||||
"Error when accessing playlist" = "播放清單出錯";
|
||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "明確提醒在任何付費或免費平台上按讚、訂閱或與他們互動(例如點擊影片)。\n";
|
||||
"For videos which feature music as the primary content." = "以音樂為主要內容的視頻。";
|
||||
"I like this app!" = "我喜歡這app!";
|
||||
"If you are interested what's coming in future updates, you can track project Milestones." = "如果您對將來的功能更新感興趣,您可以追蹤我們的專案里程碑。";
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Intro" = "簡介";
|
||||
"Issues Tracker" = "問題追蹤器";
|
||||
"Issues Tracker" = "問題追蹤介面";
|
||||
|
||||
/* Selected video has just finished playing */
|
||||
"Just watched" = "已觀看";
|
||||
@@ -81,7 +81,7 @@
|
||||
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "通常在視頻結束時或接近視頻結尾時,出現 Credits Pop Up 和結束卡片。";
|
||||
"Upload date" = "上載日期";
|
||||
"URL" = "網址";
|
||||
"Used to create links from videos, channels and playlists" = "用於從視頻、頻道和播放列表創建鏈接";
|
||||
"Used to create links from videos, channels and playlists" = "用於從視頻、頻道和播放清單創建連結";
|
||||
|
||||
/* Player controls layout size */
|
||||
"Very Large" = "非常大";
|
||||
@@ -117,7 +117,7 @@
|
||||
|
||||
/* Video date filter in search */
|
||||
"Year" = "年";
|
||||
"You can find information about using Yattee in the Wiki pages." = "您可以在 Wiki 相關頁面中找到有關使用 Yattee 的信息。";
|
||||
"You can find information about using Yattee in the Wiki pages." = "您可以在 GitHub 相關頁面中找到有關使用 Yattee 的信息。";
|
||||
"You can use automatic profile selection based on current device status or switch it in video playback settings controls." = "您可以使用基於當前設備狀態的自動配置文件選擇,或在視頻播放設置控件中進行切換。";
|
||||
"Could not extract playlist ID" = "無法提取播放清單ID";
|
||||
"Could not load video" = "無法載入視頻";
|
||||
@@ -125,9 +125,9 @@
|
||||
"You need to select an account\nto access %@ section" = "你需要選擇帳戶\n來存取 %@ 部分";
|
||||
"If you want this app to be available in your language, join translation project." = "如果你想此app 以你的語言顯示,請加入翻譯專案。";
|
||||
"Private" = "私人";
|
||||
"Playback queue is empty" = "回放隊列空白";
|
||||
"Playback queue is empty" = "播放隊列空白";
|
||||
"Playing Next" = "播放下一個";
|
||||
"You can switch between profiles in playback settings controls." = "您可以在回放設置控件中切換配置文件。";
|
||||
"You can switch between profiles in playback settings controls." = "您可以在播放設置控件中切換配置文件。";
|
||||
"Current Playlist" = "當前播放清單";
|
||||
"Stream & Player" = "串流及播放器";
|
||||
"Statistics" = "數據";
|
||||
@@ -146,9 +146,9 @@
|
||||
"%lld videos" = "%lld 視頻";
|
||||
"Add Account..." = "新增帳戶...";
|
||||
"Add Location" = "新增站點";
|
||||
"Add Location..." = "新增站點...";
|
||||
"Add Location..." = "新增站點..";
|
||||
"Add profile..." = "新增配置...";
|
||||
"Add Quality Profile" = "新增質量配置";
|
||||
"Add Quality Profile" = "新增畫質配置";
|
||||
"Add to %@" = "添加到 %@";
|
||||
"Add to Favorites" = "加至我的最愛";
|
||||
"Add to Playlist" = "加至播放清單";
|
||||
@@ -211,7 +211,7 @@
|
||||
"Disabled" = "禁用";
|
||||
"Discord Server" = "Discord 伺服器";
|
||||
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "討論在 Discord 及 Matrix 中進行,您可以在裡面詢問一些簡單的問題。";
|
||||
"Don't use public locations" = "不要使用公開站台";
|
||||
"Don't use public locations" = "不使用公開站台";
|
||||
"Donations" = "捐贈";
|
||||
"Done" = "完成";
|
||||
"Duration" = "時長";
|
||||
@@ -220,7 +220,7 @@
|
||||
"Edit..." = "編輯...";
|
||||
"Enable logging" = "啟用日誌";
|
||||
"Error" = "錯誤";
|
||||
"Favorites" = "喜歡";
|
||||
"Favorites" = "我的最愛";
|
||||
"Filter" = "篩選";
|
||||
"Filter: active" = "篩選: 啟用";
|
||||
"Find Other" = "搜尋其他";
|
||||
@@ -243,7 +243,7 @@
|
||||
"I found a bug /" = "我發現bug";
|
||||
"I have a feature request" = "我有一個功能需要";
|
||||
"I want to ask a question" = "我想問問題";
|
||||
"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "如果你要反饋一個 bug,請包括所有相關資料(特別是:App 版本,使用設備以及系統版本,重現步驟)。";
|
||||
"If you are reporting a bug, include all relevant details (especially: app version, used device and system version, steps to reproduce)." = "如果你要反饋一個程式錯誤,請包括所有相關資料(特別是:App 版本,使用設備以及系統版本,重現步驟)。";
|
||||
"Info" = "資訊";
|
||||
"Instance of current account" = "此帳戶站台";
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
/* SponsorBlock category name */
|
||||
"Offtopic in Music Videos" = "在音樂視頻中的無關內容";
|
||||
"Only when signed in" = "僅當登錄後";
|
||||
"Open \"Playlists\" tab to create new one" = "打開「播放列表」 頁面創建新的播放列表";
|
||||
"Open \"Playlists\" tab to create new one" = "打開「播放清單」 頁面來創建新的";
|
||||
"Open Settings" = "打開設置";
|
||||
|
||||
/* Loading stream OSD */
|
||||
@@ -309,7 +309,7 @@
|
||||
"Play Music" = "播放音樂";
|
||||
"Play Next" = "播放下一部";
|
||||
"Play Now" = "即時播放";
|
||||
"Playback" = "回放";
|
||||
"Playback" = "播放";
|
||||
"Player" = "播放器";
|
||||
"Playlist" = "播放清單";
|
||||
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "播放清單 “%@” 將被删除。\n此操作不可恢復。";
|
||||
@@ -325,7 +325,7 @@
|
||||
"Quality Profile" = "畫質配置";
|
||||
"Queue" = "隊列";
|
||||
"Queue is empty" = "隊列為空";
|
||||
"Rate" = "比率";
|
||||
"Rate" = "速度";
|
||||
|
||||
/* Video sort order in search */
|
||||
"Rating" = "評級";
|
||||
@@ -339,7 +339,7 @@
|
||||
/* Video sort order in search */
|
||||
"Relevance" = "相關度";
|
||||
"Remove" = "移除";
|
||||
"Remove from Favorites" = "從最愛中移除";
|
||||
"Remove from Favorites" = "從我的最愛中移除";
|
||||
"Remove from history" = "從歷史中移除";
|
||||
"Remove from the queue" = "從隊列中移除";
|
||||
"Reset search filters" = "重設搜尋篩選";
|
||||
@@ -352,7 +352,7 @@
|
||||
"Round corners" = "圓角";
|
||||
"Save" = "儲存";
|
||||
"Save history of played videos" = "儲存已播放視頻記錄";
|
||||
"Save history of searches, channels and playlists" = "儲存搜尋, 頻道及播放清單記錄";
|
||||
"Save history of searches, channels and playlists" = "儲存搜尋,頻道及播放清單記錄";
|
||||
"Search" = "搜尋";
|
||||
"Search history is empty" = "搜尋歷史為空";
|
||||
"Search..." = "搜尋...";
|
||||
@@ -373,7 +373,7 @@
|
||||
"Show anonymous accounts" = "顯示匿名帳戶";
|
||||
"Show history" = "顯示歷史";
|
||||
"Show keywords" = "顯示關鍵字";
|
||||
"Show playback statistics" = "顯示回放統計";
|
||||
"Show playback statistics" = "顯示播放統計";
|
||||
"Show progress of watching on thumbnails" = "縮圖顯示播放進度";
|
||||
"Show sidebar when space permits" = "空間充裕時顯示側邊欄";
|
||||
"Show video length" = "顯示視頻長度";
|
||||
@@ -392,14 +392,14 @@
|
||||
"Source" = "源";
|
||||
|
||||
/* SponsorBlock category name */
|
||||
"Sponsor" = "Sponsor";
|
||||
"SponsorBlock" = "SponsorBlock";
|
||||
"SponsorBlock API Instance" = "SponsorBlock API 實例";
|
||||
"Sponsor" = "宣傳";
|
||||
"SponsorBlock" = "SponsorBlock (跳過贊助廣告)";
|
||||
"SponsorBlock API Instance" = "SponsorBlock API 站台";
|
||||
"Subscribe" = "訂閱";
|
||||
|
||||
/* Subscriptions title */
|
||||
"Subscriptions" = "訂閱";
|
||||
"Switch to other public location" = "轉換其他公共站台";
|
||||
"Switch to other public location" = "轉換至其他公共站台";
|
||||
"Switch to public locations" = "轉換至公共站台";
|
||||
"System controls buttons" = "系統控制鍵";
|
||||
"System controls show buttons for %@" = "系統控制%@鍵";
|
||||
@@ -418,7 +418,7 @@
|
||||
"Watched %@" = "已觀看 %@";
|
||||
"Welcome" = "歡迎";
|
||||
"Wi-Fi" = "無線網絡";
|
||||
"Wiki" = "維基";
|
||||
"Wiki" = "GitHub";
|
||||
"You have no Playlists" = "你沒有播放清單";
|
||||
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "你沒有播放清單\n\n點擊\"新建播放清單\"建立";
|
||||
|
||||
@@ -427,7 +427,7 @@
|
||||
"Unlisted" = "未列出";
|
||||
"Now Playing" = "現正播放";
|
||||
"Current Location" = "現在位置";
|
||||
"Add Channels, Playlists and Searches to Favorites using" = "添加頻道、播放清單和搜索到最愛";
|
||||
"Add Channels, Playlists and Searches to Favorites using" = "添加頻道、播放清單和搜尋到我的最愛";
|
||||
"Make default" = "設為預設";
|
||||
"Visibility" = "可見度";
|
||||
"It can be changed later in settings. You can use your own locations too." = "稍後可以在設置中更改。你也可以使用自己的地址。";
|
||||
@@ -450,9 +450,9 @@
|
||||
"Show Home" = "顯示主頁";
|
||||
"Show Open Videos quick actions" = "顯示打開視頻快速操作";
|
||||
"Recent History" = "最近歷史";
|
||||
"Show Favorites" = "顯示最愛";
|
||||
"Show Favorites" = "顯示我的最愛";
|
||||
"Inspector visibility" = "檢查器可見度";
|
||||
"Edit Favorites…" = "編輯最愛…";
|
||||
"Edit Favorites…" = "編輯我的最愛…";
|
||||
"Show Open Videos toolbar button" = "顯示打開視頻工具按鈕";
|
||||
"Buttons labels" = "按鈕標簽";
|
||||
"Files" = "文件";
|
||||
@@ -471,7 +471,7 @@
|
||||
"Paste" = "貼上";
|
||||
"Open Videos" = "打開視頻";
|
||||
"Enter links to open, one per line" = "輸入需要打開的連結,每行一個";
|
||||
"Playback Mode" = "回放模式";
|
||||
"Playback Mode" = "播放模式";
|
||||
"Add" = "添加";
|
||||
"Hide" = "隱藏";
|
||||
"Always" = "總是";
|
||||
@@ -490,7 +490,7 @@
|
||||
"Remove Location" = "移除地址";
|
||||
"Open Video" = "打開視頻";
|
||||
"Default Profile" = "預設配置";
|
||||
"Playback history is empty" = "回放記錄空白";
|
||||
"Playback history is empty" = "播放記錄空白";
|
||||
"Copy%@link" = "複製%@連結";
|
||||
"Share%@link" = "分享%@連結";
|
||||
"Are you sure you want to remove this document?" = "你確定要移除文件?";
|
||||
@@ -528,13 +528,13 @@
|
||||
"Open channels with description expanded" = "打開頻道(含描述展開)";
|
||||
"Subscribe/Unsubscribe" = "訂閱/取消訂閱";
|
||||
"Show cache status" = "顯示緩存狀態";
|
||||
"Maximum feed items" = "最大Feed 項目";
|
||||
"Maximum feed items" = "最大\"最新影片\"數目";
|
||||
"Open channel" = "打開頻道";
|
||||
"Inspector" = "檢查器";
|
||||
"Open video description expanded" = "打開視頻描述";
|
||||
"Mark all as unwatched" = "標記所有為未觀看";
|
||||
"Mark all as watched" = "標記所有為已觀看";
|
||||
"Playback Settings" = "回放設定";
|
||||
"Playback Settings" = "播放設定";
|
||||
"Replay" = "重播";
|
||||
"Fullscreen" = "全屏幕";
|
||||
"Lock" = "鎖定";
|
||||
@@ -546,11 +546,11 @@
|
||||
"Show toggle watch status button" = "顯示切換觀看狀態按鈕";
|
||||
"Next in Queue" = "隊列中下一個";
|
||||
"List" = "列表";
|
||||
"Cells" = "Cells";
|
||||
"Cells" = "網格";
|
||||
"Toggle size" = "替換大小";
|
||||
"Toggle player" = "替換播放器";
|
||||
"Do nothing" = "不做";
|
||||
"Feed" = "Feed";
|
||||
"Feed" = "最新影片";
|
||||
"Queue - shuffled" = "隊列 - 隨機";
|
||||
"Loop one" = "單個循環";
|
||||
"File Extension" = "副檔名";
|
||||
@@ -565,7 +565,7 @@
|
||||
"Use system controls with AVPlayer" = "在AVPlayer 時使用系統控制按鈕";
|
||||
"Rotate when entering fullscreen on landscape video" = "觀看橫向全屏視頻時旋轉";
|
||||
"Available" = "可用";
|
||||
"Home Settings" = "首頁設置";
|
||||
"Home Settings" = "主頁設置";
|
||||
"Watched: hidden" = "已觀看: 隱藏";
|
||||
"No rotation" = "不要旋轉";
|
||||
"Startup section" = "啟動部分";
|
||||
@@ -573,8 +573,8 @@
|
||||
"No videos to show" = "沒有視頻顯示";
|
||||
"(shorts hidden)" = "(隱藏短片)";
|
||||
"Disable filters" = "禁用過濾";
|
||||
"Limit" = "限制";
|
||||
"Are you sure you want to remove %@ from Favorites?" = "你確定要從最愛中刪除 %@ 嗎?";
|
||||
"Limit" = "上限";
|
||||
"Are you sure you want to remove %@ from Favorites?" = "你確定要從我的最愛中刪除 %@ 嗎?";
|
||||
"Keep channels with unwatched videos on top of subscriptions list" = "保留頻道內未觀看視頻在訂閱列表頂端";
|
||||
"Play Now in MPV" = "在MPV 中播放";
|
||||
"Play Now in AVPlayer" = "在AVPlayer 中播放";
|
||||
@@ -618,7 +618,7 @@
|
||||
"Blue" = "藍";
|
||||
"Browsing" = "瀏覽";
|
||||
"Buffering stream..." = "緩衝中...";
|
||||
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "缺陷及主意也可以在 GitHub Issues 界面提出。 ";
|
||||
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "程式錯誤及出色的功能構思也可以在 GitHub 問題追蹤介面提出。 ";
|
||||
"Cancel" = "取消";
|
||||
"Button" = "按鈕";
|
||||
"Captions" = "字幕";
|
||||
|
||||
@@ -4062,7 +4062,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
|
||||
@@ -4093,7 +4093,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||
@@ -4124,7 +4124,7 @@
|
||||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
@@ -4144,7 +4144,7 @@
|
||||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
@@ -4308,7 +4308,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
@@ -4361,7 +4361,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
|
||||
@@ -4413,7 +4413,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
@@ -4452,7 +4452,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
@@ -4487,7 +4487,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4511,7 +4511,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4537,7 +4537,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4562,7 +4562,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4588,7 +4588,7 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -4628,7 +4628,7 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -4669,7 +4669,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -4693,7 +4693,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 180;
|
||||
CURRENT_PROJECT_VERSION = 181;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -5003,8 +5003,8 @@
|
||||
isa = XCRemoteSwiftPackageReference;
|
||||
repositoryURL = "https://github.com/cxfksword/MPVKit.git";
|
||||
requirement = {
|
||||
kind = upToNextMajorVersion;
|
||||
minimumVersion = 0.36.0;
|
||||
kind = revision;
|
||||
revision = dca1e345a26d09a3d621d7656a94e6427f3f7b83;
|
||||
};
|
||||
};
|
||||
/* End XCRemoteSwiftPackageReference section */
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/Alamofire/Alamofire.git",
|
||||
"state" : {
|
||||
"revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad",
|
||||
"version" : "5.8.1"
|
||||
"revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a",
|
||||
"version" : "5.9.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -25,7 +25,7 @@
|
||||
"location" : "https://github.com/hyperoslo/Cache.git",
|
||||
"state" : {
|
||||
"branch" : "master",
|
||||
"revision" : "ad6abdf2a3a866288a7dad2c4e13379406002a81"
|
||||
"revision" : "f44a8f6b5ec27730198725ccc542fef0d1cc6b3d"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -60,8 +60,7 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/cxfksword/MPVKit.git",
|
||||
"state" : {
|
||||
"revision" : "645f430ff0b99ccc2c61062727ad7e8bf32ca72a",
|
||||
"version" : "0.37.0"
|
||||
"revision" : "dca1e345a26d09a3d621d7656a94e6427f3f7b83"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -87,8 +86,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/ashleymills/Reachability.swift",
|
||||
"state" : {
|
||||
"revision" : "c01127cb51f591045696128effe43c16840d08bf",
|
||||
"version" : "5.2.0"
|
||||
"revision" : "7b7018a69c84ea94ac2a38dff626e16ea81d1db9",
|
||||
"version" : "5.2.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -106,7 +105,7 @@
|
||||
"location" : "https://github.com/SDWebImage/SDWebImage",
|
||||
"state" : {
|
||||
"branch" : "master",
|
||||
"revision" : "e7329c6fb61c04f4b6fda008b6650efdb08cf9b7"
|
||||
"revision" : "f6afa0132961d593f07970d84e2d8b588c29ea04"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -123,8 +122,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
|
||||
"state" : {
|
||||
"revision" : "261b6cec35686d2dc192b809ab50742b4502a73b",
|
||||
"version" : "2.2.6"
|
||||
"revision" : "53573d6dd017e354c0e7d8f1c86b77ef1383c996",
|
||||
"version" : "2.2.7"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -177,8 +176,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/SwiftyJSON/SwiftyJSON.git",
|
||||
"state" : {
|
||||
"revision" : "b3dcd7dbd0d488e1a7077cb33b00f2083e382f07",
|
||||
"version" : "5.0.1"
|
||||
"revision" : "af76cf3ef710b6ca5f8c05f3a31307d44a3c5828",
|
||||
"version" : "5.0.2"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user