diff --git a/Tweaks/YTLite/Makefile b/Tweaks/YTLite/Makefile index 38ae426..35d8758 100644 --- a/Tweaks/YTLite/Makefile +++ b/Tweaks/YTLite/Makefile @@ -5,7 +5,7 @@ endif DEBUG=0 FINALPACKAGE=1 ARCHS = arm64 -PACKAGE_VERSION = 2.0 +PACKAGE_VERSION = 2.1 TARGET := iphone:clang:latest:11.0 include $(THEOS)/makefiles/common.mk diff --git a/Tweaks/YTLite/Settings.x b/Tweaks/YTLite/Settings.x index 11d508c..3866676 100644 --- a/Tweaks/YTLite/Settings.x +++ b/Tweaks/YTLite/Settings.x @@ -119,7 +119,8 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD NSArray *rows = @[ createSwitchItem(LOC(@"RemoveCast"), LOC(@"RemoveCastDesc"), @"noCast", &kNoCast, selfObject), createSwitchItem(LOC(@"RemoveNotifications"), LOC(@"RemoveNotificationsDesc"), @"removeNotifsButton", &kNoNotifsButton, selfObject), - createSwitchItem(LOC(@"RemoveSearch"), LOC(@"RemoveSearchDesc"), @"removeSearchButton", &kNoSearchButton, selfObject) + createSwitchItem(LOC(@"RemoveSearch"), LOC(@"RemoveSearchDesc"), @"removeSearchButton", &kNoSearchButton, selfObject), + createSwitchItem(LOC(@"RemoveVoiceSearch"), LOC(@"RemoveVoiceSearchDesc"), @"removeVoiceSearchButton", &kNoVoiceSearchButton, selfObject) ]; if (kAdvancedMode) { @@ -153,7 +154,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD createSwitchItem(LOC(@"HidePrevNext"), LOC(@"HidePrevNextDesc"), @"hidePrevNext", &kHidePrevNext, selfObject), createSwitchItem(LOC(@"ReplacePrevNext"), LOC(@"ReplacePrevNextDesc"), @"replacePrevNext", &kReplacePrevNext, selfObject), createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject), - createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"noEndScreenCards", &kEndScreenCards, selfObject), + createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"endScreenCards", &kEndScreenCards, selfObject), createSwitchItem(LOC(@"NoFullscreenActions"), LOC(@"NoFullscreenActionsDesc"), @"noFullscreenActions", &kNoFullscreenActions, selfObject), createSwitchItem(LOC(@"NoRelatedVids"), LOC(@"NoRelatedVidsDesc"), @"noRelatedVids", &kNoRelatedVids, selfObject), createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject), @@ -246,6 +247,23 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD [sectionItems addObject:tabbar]; if (kAdvancedMode) { + YTSettingsSectionItem *other = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Other") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject), + createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject) + ]; + + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Other") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:other]; + [sectionItems addObject:space]; YTSettingsSectionItem *startup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Startup") diff --git a/Tweaks/YTLite/YTLite.h b/Tweaks/YTLite/YTLite.h index c17cb4c..c8bce1b 100644 --- a/Tweaks/YTLite/YTLite.h +++ b/Tweaks/YTLite/YTLite.h @@ -17,6 +17,7 @@ #import "../YouTubeHeader/YTSettingsSectionItemManager.h" #import "../YouTubeHeader/YTSettingsPickerViewController.h" #import "../YouTubeHeader/YTUIUtils.h" +#import "../YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h" extern NSBundle *YTLiteBundle(); @@ -30,6 +31,7 @@ BOOL kBackgroundPlayback; BOOL kNoCast; BOOL kNoNotifsButton; BOOL kNoSearchButton; +BOOL kNoVoiceSearchButton; BOOL kStickyNavbar; BOOL kNoSubbar; BOOL kNoYTLogo; @@ -78,6 +80,8 @@ BOOL kRemoveShorts; BOOL kRemoveSubscriptions; BOOL kRemoveUploads; BOOL kRemoveLibrary; +BOOL kRemovePlayNext; +BOOL kNoContinueWatching; BOOL kAdvancedMode; int kPivotIndex; @@ -106,6 +110,9 @@ int kPivotIndex; @interface YTNavigationBarTitleView : UIView @end +@interface YTChipCloudCell : UICollectionViewCell +@end + @interface YTSegmentableInlinePlayerBarView @property (nonatomic, assign, readwrite) BOOL enableSnapToChapter; @end @@ -125,7 +132,7 @@ int kPivotIndex; @end @interface YTAsyncCollectionView : UICollectionView -- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath; +- (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath; @end @interface YTReelWatchPlaybackOverlayView : UIView diff --git a/Tweaks/YTLite/YTLite.x b/Tweaks/YTLite/YTLite.x index 51fe467..a39e0df 100644 --- a/Tweaks/YTLite/YTLite.x +++ b/Tweaks/YTLite/YTLite.x @@ -28,17 +28,19 @@ - (void)decorateContext:(id)context { if (!kNoAds) %orig; } %end -BOOL isAd(YTIElementRenderer *self) { - if (self == nil) return NO; - if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) return YES; +%hook YTIElementRenderer +- (NSData *)elementData { + if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) + return nil; NSString *description = [self description]; if (([description containsString:@"brand_promo"] || [description containsString:@"product_carousel"] || [description containsString:@"product_engagement_panel"] || [description containsString:@"product_item"]) && kNoAds) - return YES; - return NO; + return [NSData data]; + return %orig; } +%end %hook YTSectionListViewController - (void)loadWithModel:(YTISectionListRenderer *)model { @@ -47,7 +49,7 @@ BOOL isAd(YTIElementRenderer *self) { NSIndexSet *removeIndexes = [contentsArray indexesOfObjectsPassingTest:^BOOL(YTISectionListSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { YTIItemSectionRenderer *sectionRenderer = renderers.itemSectionRenderer; YTIItemSectionSupportedRenderers *firstObject = [sectionRenderer.contentsArray firstObject]; - return firstObject.hasPromotedVideoRenderer || firstObject.hasCompactPromotedVideoRenderer || firstObject.hasPromotedVideoInlineMutedRenderer || isAd(firstObject.elementRenderer); + return firstObject.hasPromotedVideoRenderer || firstObject.hasCompactPromotedVideoRenderer || firstObject.hasPromotedVideoInlineMutedRenderer; }]; [contentsArray removeObjectsAtIndexes:removeIndexes]; } %orig; @@ -89,15 +91,6 @@ BOOL isAd(YTIElementRenderer *self) { - (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {} %end -// Statement banner -%hook YTPremiumSeasonCardCellController -- (void)setCell:(id)arg1 { arg1 = NULL; %orig; } -%end - -%hook YTPremiumSeasonCardView -- (long long)accessibilityElementCount { return 0; } -%end - // Navbar Stuff // Disable Cast %hook MDXPlaybackRouteButtonController @@ -117,6 +110,7 @@ BOOL isAd(YTIElementRenderer *self) { if (kNoCast && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) self.subviews[1].hidden = YES; // Hide icon immediately if (kNoNotifsButton) self.notificationButton.hidden = YES; if (kNoSearchButton) self.searchButton.hidden = YES; + if (kNoVoiceSearchButton && self.subviews.count >= 4 && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.settings.overflow.button"]) self.subviews[3].hidden = YES; } %end @@ -131,16 +125,21 @@ BOOL isAd(YTIElementRenderer *self) { %end // Remove Subbar -%hook YTMySubsFilterHeaderView +%hook YTMySubsFilterHeaderView - (void)setChipFilterView:(id)arg1 { if (!kNoSubbar) %orig; } %end %hook YTHeaderContentComboView - (void)enableSubheaderBarWithView:(id)arg1 { if (!kNoSubbar) %orig; } +- (void)setFeedHeaderScrollMode:(int)arg1 { kNoSubbar ? %orig(0) : %orig; } %end -%hook YTHeaderContentComboView -- (void)setFeedHeaderScrollMode:(int)arg1 { kNoSubbar ? %orig(0) : %orig; } +%hook YTChipCloudCell +- (void)layoutSubviews { + if (self.superview && kNoSubbar) { + [self removeFromSuperview]; + } %orig; +} %end // Hide Autoplay Switch and Subs Button @@ -271,27 +270,55 @@ BOOL isAd(YTIElementRenderer *self) { - (void)enableDoubleTapToSeek:(BOOL)arg1 { kNoDoubleTapToSeek ? %orig(NO) : %orig; } %end -// Remove Shorts (https://github.com/MiRO92/YTNoShorts) +// Fit 'Play All' Buttons Text For Localizations +%hook YTQTMButton +- (void)layoutSubviews { + if ([self.accessibilityIdentifier isEqualToString:@"id.playlist.playall.button"]) { + self.titleLabel.adjustsFontSizeToFitWidth = YES; + } %orig; +} +%end + +// Fix Playlist Mini-bar Height For Small Screens +%hook YTPlaylistMiniBarView +- (void)setFrame:(CGRect)frame { + if (frame.size.height < 54.0) frame.size.height = 54.0; + %orig(frame); +} +%end + +// Remove "Play next in queue" from the menu @PoomSmart (https://github.com/qnblackcat/uYouPlus/issues/1138#issuecomment-1606415080) +%hook YTMenuItemVisibilityHandler +- (BOOL)shouldShowServiceItemRenderer:(YTIMenuConditionalServiceItemRenderer *)renderer { + if (kRemovePlayNext && renderer.icon.iconType == 251) { + return NO; + } return %orig; +} +%end + +// Remove Premium Pop-up, Horizontal Video Carousel and Shorts (https://github.com/MiRO92/YTNoShorts) %hook YTAsyncCollectionView - (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath { - if (kHideShorts) { - UICollectionViewCell *cell = %orig; - if ([cell isKindOfClass:NSClassFromString(@"_ASCollectionViewCell")]) { - _ASCollectionViewCell *cell = %orig; - if ([cell respondsToSelector:@selector(node)]) { - if ([[[cell node] accessibilityIdentifier] isEqualToString:@"eml.shorts-shelf"]) { - [self removeShortsCellAtIndexPath:indexPath]; - } + UICollectionViewCell *cell = %orig; + + if ([cell isKindOfClass:objc_lookUpClass("_ASCollectionViewCell")]) { + _ASCollectionViewCell *cell = %orig; + if ([cell respondsToSelector:@selector(node)]) { + NSString *idToRemove = [[cell node] accessibilityIdentifier]; + if ([idToRemove isEqualToString:@"statement_banner.view"] || + (([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"]) && kHideShorts)) { + [self removeCellsAtIndexPath:indexPath]; } - } else if ([cell isKindOfClass:NSClassFromString(@"YTReelShelfCell")]) { - [self removeShortsCellAtIndexPath:indexPath]; - } return %orig; + } + } else if (([cell isKindOfClass:objc_lookUpClass("YTReelShelfCell")] && kHideShorts) || + ([cell isKindOfClass:objc_lookUpClass("YTHorizontalCardListCell")] && kNoContinueWatching)) { + [self removeCellsAtIndexPath:indexPath]; } return %orig; } %new -- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath { - [self deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; +- (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath { + [self deleteItemsAtIndexPaths:@[indexPath]]; } %end @@ -544,6 +571,7 @@ static void reloadPrefs() { kNoCast = [prefs[@"noCast"] boolValue] ?: NO; kNoNotifsButton = [prefs[@"removeNotifsButton"] boolValue] ?: NO; kNoSearchButton = [prefs[@"removeSearchButton"] boolValue] ?: NO; + kNoVoiceSearchButton = [prefs[@"removeVoiceSearchButton"] boolValue] ?: NO; kStickyNavbar = [prefs[@"stickyNavbar"] boolValue] ?: NO; kNoSubbar = [prefs[@"noSubbar"] boolValue] ?: NO; kNoYTLogo = [prefs[@"noYTLogo"] boolValue] ?: NO; @@ -592,6 +620,8 @@ static void reloadPrefs() { kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO; kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES; kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO; + kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO; + kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO; kPivotIndex = (prefs[@"pivotIndex"] != nil) ? [prefs[@"pivotIndex"] intValue] : 0; kAdvancedMode = [prefs[@"advancedMode"] boolValue] ?: NO; @@ -601,6 +631,7 @@ static void reloadPrefs() { @"noCast" : @(kNoCast), @"removeNotifsButton" : @(kNoNotifsButton), @"removeSearchButton" : @(kNoSearchButton), + @"removeVoiceSearchButton" : @(kNoVoiceSearchButton), @"stickyNavbar" : @(kStickyNavbar), @"noSubbar" : @(kNoSubbar), @"noYTLogo" : @(kNoYTLogo), @@ -649,6 +680,8 @@ static void reloadPrefs() { @"removeSubscriptions" : @(kRemoveSubscriptions), @"removeUploads" : @(kRemoveUploads), @"removeLibrary" : @(kRemoveLibrary), + @"removePlayNext" : @(kRemovePlayNext), + @"noContinueWatching" : @(kNoContinueWatching), @"pivotIndex" : @(kPivotIndex), @"advancedMode" : @(kAdvancedMode) }; diff --git a/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings b/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings index 196df2f..bb77d1a 100644 --- a/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings +++ b/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings @@ -11,6 +11,8 @@ "RemoveNotificationsDesc" = "Hides Notifications button from the Navigation bar."; "RemoveSearch" = "Hide Search button"; "RemoveSearchDesc" = "Hides Search button from the Navigation bar."; +"RemoveVoiceSearch" = "Hide Voice search button"; +"RemoveVoiceSearchDesc" = "Hides Voice search button from the Navigation bar."; "StickyNavbar" = "Sticky Navigation bar"; "StickyNavbarDesc" = "Pins the Navigation bar so that it remains visible when scrolling down."; "NoSubbar" = "Hide Subbar"; @@ -116,6 +118,12 @@ "HideShortsAudioTrack" = "Hide AudioTrack"; "HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description."; +"Other" = "Other"; +"RemovePlayNext" = "Remove \"Play next in queue\""; +"RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu."; +"NoContinueWatching" = "Remove \"Continue watching\""; +"NoContinueWatchingDesc" = "Removes the \"Continue watching\" section containing unfinished videos from the Home page."; + "Startup" = "Startup page"; "Home" = "Home"; "Explore" = "Explore"; diff --git a/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings b/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings index aa4b8f4..7a8c1e0 100644 --- a/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings +++ b/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings @@ -10,7 +10,9 @@ "RemoveNotifications" = "Скрыть «Уведомления»"; "RemoveNotificationsDesc" = "Скрывает кнопку уведомлений с панели навигации."; "RemoveSearch" = "Скрыть «Поиск»"; -"RemoveSearchDesc" = "Скрвыает кнопку поиска с панели навигации."; +"RemoveSearchDesc" = "Скрывает кнопку поиска с панели навигации."; +"RemoveVoiceSearch" = "Скрыть «Голосовой поиск»"; +"RemoveVoiceSearchDesc" = "Скрывает кнопку голосового поиска с панели навигации."; "StickyNavbar" = "Закрепить панель навигации"; "StickyNavbarDesc" = "Закрепляет панель навигации в верхней части экрана, запрещая ему скрываться во время скролла страницы вниз."; "NoSubbar" = "Скрыть наклейки"; @@ -116,6 +118,12 @@ "HideShortsAudioTrack" = "Скрыть аудиодорожку"; "HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера."; +"Other" = "Другие настройки"; +"RemovePlayNext" = "Убрать «Добавить в начало очереди»"; +"RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео."; +"NoContinueWatching" = "Отключить «Продолжить просмотр»"; +"NoContinueWatchingDesc" = "Удаляет блок «Продолжить просмотр» содержащий недосмотренные видео с Главной страницы."; + "Startup" = "Начальная страница"; "Home" = "Главная"; "Explore" = "Навигация"; diff --git a/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings b/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings index 1458566..18800f3 100644 --- a/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings +++ b/Tweaks/YTLite/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings @@ -1,136 +1,136 @@ "General" = "常规"; "RemoveAds" = "移除广告"; -"RemoveAdsDesc" = "删除程序内的广告"; +"RemoveAdsDesc" = "删除程序内的广告。"; "BackgroundPlayback" = "后台播放"; -"BackgroundPlaybackDesc" = "启用后台播放"; +"BackgroundPlaybackDesc" = "启用后台播放。"; "Navbar" = "导航栏"; "RemoveCast" = "隐藏投射按钮"; -"RemoveCastDesc" = "从导航栏中隐藏投射按钮"; +"RemoveCastDesc" = "从导航栏中隐藏投射按钮。"; "RemoveNotifications" = "隐藏通知按钮"; -"RemoveNotificationsDesc" = "从导航栏中隐藏通知按钮"; +"RemoveNotificationsDesc" = "从导航栏中隐藏通知按钮。"; "RemoveSearch" = "隐藏搜索按钮"; -"RemoveSearchDesc" = "从导航栏中隐藏搜索按钮"; -"StickyNavbar" = "Sticky Navigation bar"; -"StickyNavbarDesc" = "Pins the Navigation bar so that it remains visible when scrolling down."; -"NoSubbar" = "Hide Subbar"; -"NoSubbarDesc" = "Hides Subbar (All, New to you, Live etc.) under the Navigation bar."; -"NoYTLogo" = "Remove YouTube logo"; -"NoYTLogoDesc" = "Removes YouTube logo in the Navigation bar."; +"RemoveSearchDesc" = "从导航栏中隐藏搜索按钮。"; +"StickyNavbar" = "固定导航栏"; +"StickyNavbarDesc" = "固定导航栏,使其在向下滚动时保持可见。"; +"NoSubbar" = "隐藏子栏"; +"NoSubbarDesc" = "隐藏导航栏下的子栏(全部、新内容、实时等)。"; +"NoYTLogo" = "删除 YouTube Logo"; +"NoYTLogoDesc" = "删除导航栏中的 YouTube Logo。"; -"Overlay" = "Overlay"; -"HideAutoplay" = "Hide Autoplay switch"; -"HideAutoplayDesc" = "Hides Autoplay switch from the overlay."; -"HideSubs" = "Hide Subtitles button"; -"HideSubsDesc" = "Hides Subtitles button from the overlay."; -"NoHUDMsgs" = "Hide HUD Messages"; -"NoHUDMsgsDesc" = "Hides all feature messages from the player. Example: CC is turned on/off, Video loop is on, etc."; -"HidePrevNext" = "Hide Previous and Next buttons"; -"HidePrevNextDesc" = "Hides Previous and Next video buttons from overlay."; -"ReplacePrevNext" = "Fast forward and Rewind buttons"; -"ReplacePrevNextDesc" = "Replaces Previous and Next video buttons to Fast forward and Rewind buttons in overlay."; -"NoDarkBg" = "Remove dark background"; -"NoDarkBgDesc" = "Removes overlay dark background."; -"NoEndScreenCards" = "Hide End screens hover cards"; -"NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos."; -"NoFullscreenActions" = "Disable fullscreen actions"; -"NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode."; -"NoRelatedVids" = "No related videos in overlay"; -"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up."; -"NoPromotionCards" = "Hide Paid Promotion cards"; -"NoPromotionCardsDesc" = "Hides \"Includes Paid Promotions\" card in promotions included videos."; -"NoWatermarks" = "Hide Watermarks"; -"NoWatermarksDesc" = "Hides channel watermarks from the player."; +"Overlay" = "播放界面"; +"HideAutoplay" = "隐藏自动播放开关"; +"HideAutoplayDesc" = "从播放界面隐藏自动播放开关。"; +"HideSubs" = "隐藏字幕按钮"; +"HideSubsDesc" = "从播放界面隐藏字幕按钮。"; +"NoHUDMsgs" = "隐藏屏显信息"; +"NoHUDMsgsDesc" = "隐藏播放界面的所有功能信息。示例:CC按钮打开/关闭、视频循环等。"; +"HidePrevNext" = "隐藏上一个和下一个按钮"; +"HidePrevNextDesc" = "从播放界面中隐藏上一个和下一个视频按钮。"; +"ReplacePrevNext" = "快进和快退按钮"; +"ReplacePrevNextDesc" = "将上一个和下一个视频按钮替换为快进和快退按钮。"; +"NoDarkBg" = "删除深色背景"; +"NoDarkBgDesc" = "删除播放界面的深色背景。"; +"NoEndScreenCards" = "隐藏片尾画面"; +"NoEndScreenCardsDesc" = "隐藏视频结尾处的片尾屏幕(缩略图)。"; +"NoFullscreenActions" = "禁用全屏操作"; +"NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。"; +"NoRelatedVids" = "没有相关视频"; +"NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。"; +"NoPromotionCards" = "隐藏付费"; +"NoPromotionCardsDesc" = "在付费视频中隐藏“付费内容”。"; +"NoWatermarks" = "隐藏水印"; +"NoWatermarksDesc" = "隐藏播放器的频道水印。"; -"Player" = "Player"; -"Miniplayer" = "Enable mini player"; -"MiniplayerDesc" = "Enables the mini player for videos that were not originally designed for it, such as videos targeted for children."; -"DisableAutoplay" = "Disable Autoplay videos"; -"DisableAutoplayDesc" = "Prevents video playback after opening."; -"NoContentWarning" = "Skip content warning"; -"NoContentWarningDesc" = "Skips sensitive content warning message."; -"ClassicQuality" = "Classic video quality"; -"ClassicQualityDesc" = "Brings back classic video quality selection menu."; -"DontSnap2Chapter" = "Disable snap to chapter"; -"DontSnap2ChapterDesc" = "Disables skipping to the next episode by double-tap gesture."; -"RedProgressBar" = "Red progress bar"; -"RedProgressBarDesc" = "Brings back red progress bar."; -"NoHints" = "Disable hints"; -"NoHintsDesc" = "Disables hints by author which appears at the top-right corner during playback."; -"NoFreeZoom" = "Disable free zoom gesture"; -"NoFreeZoomDesc" = "Disables new free zoom gestures."; -"ExitFullscreen" = "Exit fullscreen mode on finish"; -"ExitFullscreenDesc" = "Exits fullscreen mode at the end of video playback."; -"NoDoubleTap2Seek" = "Disable double tap to seek"; -"NoDoubleTap2SeekDesc" = "Disables double tap to seek gesture."; +"Player" = "播放器"; +"Miniplayer" = "启用迷你播放器"; +"MiniplayerDesc" = "启用迷你播放器来播放最初不是为其设计的视频,例如针对儿童的视频。"; +"DisableAutoplay" = "禁用自动播放视频"; +"DisableAutoplayDesc" = "打开后防止视频自动播放。"; +"NoContentWarning" = "跳过内容警告"; +"NoContentWarningDesc" = "跳过敏感内容警告消息。"; +"ClassicQuality" = "经典视频质量"; +"ClassicQualityDesc" = "加回经典的视频质量选择菜单。"; +"DontSnap2Chapter" = "禁用双击跳转"; +"DontSnap2ChapterDesc" = "禁用通过双击手势跳到下一集。"; +"RedProgressBar" = "红色进度条"; +"RedProgressBarDesc" = "加回红色进度条。"; +"NoHints" = "禁用提示"; +"NoHintsDesc" = "禁用播放期间出现在右上角的作者提示。"; +"NoFreeZoom" = "禁用自由缩放手势"; +"NoFreeZoomDesc" = "禁用新的自由缩放手势。"; +"ExitFullscreen" = "完成后退出全屏模式"; +"ExitFullscreenDesc" = "在视频播放结束时退出全屏模式。"; +"NoDoubleTap2Seek" = "禁用双击搜索"; +"NoDoubleTap2SeekDesc" = "禁用双击搜索手势。"; "Tabbar" = "选项卡栏"; "RemoveLabels" = "移除标签"; -"RemoveLabelsDesc" = "删除选项卡标签"; -"ReExplore" = "Replace Shorts tab with Explore tab"; -"ReExploreDesc" = "Shows Explore tab instead of Shorts tab as on old YouTube versions."; +"RemoveLabelsDesc" = "删除选项卡标签。"; +"ReExplore" = "将短视频选项卡替换为“探索”选项卡"; +"ReExploreDesc" = "显示“探索”选项卡,而不是旧版 本中的“短视频”选项卡。"; "HideShortsTab" = "隐藏短视频"; -"HideShortsTabDesc" = "从选项卡栏中隐藏短视频"; +"HideShortsTabDesc" = "从选项卡栏中隐藏短视频。"; "HideSubscriptionsTab" = "隐藏订阅内容"; -"HideSubscriptionsTabDesc" = "从选项卡栏中隐藏订阅内容"; +"HideSubscriptionsTabDesc" = "从选项卡栏中隐藏订阅内容。"; "HideUploadButton" = "隐藏上传按钮"; -"HideUploadButtonDesc" = "从选项卡栏中隐藏上传按钮"; +"HideUploadButtonDesc" = "从选项卡栏中隐藏上传按钮。"; "HideLibraryTab" = "隐藏媒体库"; -"HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库"; +"HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库。"; -"Shorts" = "Shorts"; -"HideShorts" = "Hide Shorts videos"; -"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)"; -"ShortsProgress" = "Enable progress bar"; -"ShortsProgressDesc" = "Displays progress bar in the Shorts overlay."; -"ResumeShorts" = "Don't start from Shorts tab"; -"ResumeShortsDesc" = "Prevents starting from Shorts videos at the opening app, which happens if YouTube was closed while watching Shorts."; -"HideShortsLogo" = "Hide Shorts logo"; -"HideShortsLogoDesc" = "Hides Shorts logo in the top left corner."; -"HideShortsSearch" = "Hide Search button"; -"HideShortsSearchDesc" = "Hides Search button from the Shorts overlay."; -"HideShortsCamera" = "Hide Camera button"; -"HideShortsCameraDesc" = "Hides Camera button from the Shorts overlay."; -"HideShortsMore" = "Hide More (⋮) button"; -"HideShortsMoreDesc" = "Hides More (⋮) button from the Shorts overlay. It's also accessible by long-pressing the screen."; -"HideShortsSubscriptions" = "Hide Subscriptions button"; -"HideShortsSubscriptionsDesc" = "Hides Subscriptions button which appears when Shorts paused."; -"HideShortsLike" = "Hide Like button"; -"HideShortsLikeDesc" = "Hides Like button from the Shorts overlay."; -"HideShortsDislike" = "Hide Dislike button"; -"HideShortsDislikeDesc" = "Hides Dislike button from the Shorts overlay."; -"HideShortsComments" = "Hide Comments button"; -"HideShortsCommentsDesc" = "Hides Comments button from the Shorts overlay."; -"HideShortsRemix" = "Hide Remix button"; -"HideShortsRemixDesc" = "Hides Remix button from the Shorts overlay."; -"HideShortsShare" = "Hide Share button"; -"HideShortsShareDesc" = "Hides Share button from the Shorts overlay."; -"HideShortsAvatars" = "Hide channels avatar"; -"HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner."; -"HideShortsThanks" = "Hide Superthanks button"; -"HideShortsThanksDesc" = "Hides Superthanks (Donate) button from the Shorts overlay."; -"HideShortsChannelName" = "Hide Channel name"; -"HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay."; -"HideShortsDescription" = "Hide Description"; -"HideShortsDescriptionDesc" = "Hides Shorts description under channel name."; -"HideShortsAudioTrack" = "Hide AudioTrack"; -"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description."; +"Shorts" = "短视频"; +"HideShorts" = "隐藏短视频"; +"HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。"; +"ShortsProgress" = "启用进度条"; +"ShortsProgressDesc" = "在短视频播放器中显示进度条。"; +"ResumeShorts" = "不要从短视频开始"; +"ResumeShortsDesc" = "防止在打开应用程序时首先启动短视频,如果在观看短视频时关闭,就会发生这种情况。"; +"HideShortsLogo" = "隐藏短视频Logo"; +"HideShortsLogoDesc" = "隐藏左上角的短视频Logo。"; +"HideShortsSearch" = "隐藏搜索按钮"; +"HideShortsSearchDesc" = "从短视频播放器中隐藏搜索按钮。"; +"HideShortsCamera" = "隐藏相机按钮"; +"HideShortsCameraDesc" = "从短视频播放器中隐藏相机按钮。"; +"HideShortsMore" = "隐藏更多 (⋮) 按钮"; +"HideShortsMoreDesc" = "从短视频播放器中隐藏更多 (⋮) 按钮 。也可以通过长按屏幕来访问它。"; +"HideShortsSubscriptions" = "隐藏订阅按钮"; +"HideShortsSubscriptionsDesc" = "隐藏短视频暂停时显示的订阅按钮。"; +"HideShortsLike" = "隐藏喜欢按钮"; +"HideShortsLikeDesc" = "从短视频播放器中隐藏喜欢按钮。"; +"HideShortsDislike" = "隐藏不喜欢按钮"; +"HideShortsDislikeDesc" = "从短视频播放器中隐藏不喜欢按钮。"; +"HideShortsComments" = "隐藏评论按钮"; +"HideShortsCommentsDesc" = "从短视频播放器中隐藏评论按钮。"; +"HideShortsRemix" = "隐藏混剪按钮"; +"HideShortsRemixDesc" = "从短视频播放器中隐藏混剪按钮。"; +"HideShortsShare" = "隐藏分享按钮"; +"HideShortsShareDesc" = "从短视频播放器中隐藏分享按钮。"; +"HideShortsAvatars" = "隐藏发布者头像"; +"HideShortsAvatarsDesc" = "隐藏右下角的发布者个人资料头像。"; +"HideShortsThanks" = "隐藏捐赠按钮"; +"HideShortsThanksDesc" = "从短视频播放器中隐藏捐赠按钮。"; +"HideShortsChannelName" = "隐藏发布者名称"; +"HideShortsChannelNameDesc" = "从短视频播放器中隐藏发布者名称和订阅按钮。"; +"HideShortsDescription" = "隐藏说明"; +"HideShortsDescriptionDesc" = "在频道名称下隐藏短视频描述。"; +"HideShortsAudioTrack" = "隐藏音频音轨"; +"HideShortsAudioTrackDesc" = "从短视频描述下隐藏音频音轨。"; -"Startup" = "Startup page"; -"Home" = "Home"; -"Explore" = "Explore"; -"ShortsTab" = "Shorts"; -"Subscriptions" = "Subscriptions"; -"Library" = "Library"; -"Warning" = "Warning"; -"TabIsHidden" = "Hidden tab cannot be selected as startup page"; +"Startup" = "启动页"; +"Home" = "首页"; +"Explore" = "探索"; +"ShortsTab" = "短视频"; +"Subscriptions" = "订阅"; +"Library" = "媒体库"; +"Warning" = "警告"; +"TabIsHidden" = "无法选择隐藏选项卡作为启动页。"; "Version" = "版本"; "About" = "关于"; "Credits" = "信息"; "Developer" = "YTLite开发者"; -"Advanced" = "Advanced mode"; -"ResetSettings" = "Reset YTLite settings"; -"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?"; -"Yes" = "Yes"; -"No" = "No"; \ No newline at end of file +"Advanced" = "高级模式"; +"ResetSettings" = "重置YTLite设置"; +"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?"; +"Yes" = "是"; +"No" = "不";