diff --git a/Makefile b/Makefile index 15cbe89..df76bfe 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ endif DEBUG=0 FINALPACKAGE=1 ARCHS = arm64 -PACKAGE_VERSION = 2.2.1 +PACKAGE_VERSION = 2.3 TARGET := iphone:clang:latest:11.0 include $(THEOS)/makefiles/common.mk diff --git a/Settings.x b/Settings.x index 1130de0..738bb68 100644 --- a/Settings.x +++ b/Settings.x @@ -18,7 +18,7 @@ static void resetYTLiteSettings() { NSBundle *YTLiteBundle() { static NSBundle *bundle = nil; static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ + dispatch_once(&onceToken, ^{ NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"]; if (tweakBundlePath) bundle = [NSBundle bundleWithPath:tweakBundlePath]; @@ -178,6 +178,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ createSwitchItem(LOC(@"Miniplayer"), LOC(@"MiniplayerDesc"), @"miniplayer", &kMiniplayer, selfObject), + createSwitchItem(LOC(@"PortraitFullscreen"), LOC(@"PortraitFullscreenDesc"), @"portraitFullscreen", &kPortraitFullscreen, selfObject), createSwitchItem(LOC(@"DisableAutoplay"), LOC(@"DisableAutoplayDesc"), @"disableAutoplay", &kDisableAutoplay, selfObject), createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject), createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject), @@ -261,7 +262,13 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject), - createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject) + createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject), + createSwitchItem(LOC(@"NoSearchHistory"), LOC(@"NoSearchHistoryDesc"), @"noSearchHistory", &kNoSearchHistory, selfObject), + createSwitchItem(LOC(@"NoRelatedWatchNexts"), LOC(@"NoRelatedWatchNextsDesc"), @"noRelatedWatchNexts", &kNoRelatedWatchNexts, selfObject), + createSwitchItem(LOC(@"StickSortComments"), LOC(@"StickSortCommentsDesc"), @"stickSortComments", &kStickSortComments, selfObject), + createSwitchItem(LOC(@"HideSortComments"), LOC(@"HideSortCommentsDesc"), @"hideSortComments", &kHideSortComments, selfObject), + createSwitchItem(LOC(@"PlaylistOldMinibar"), LOC(@"PlaylistOldMinibarDesc"), @"playlistOldMinibar", &kPlaylistOldMinibar, selfObject), + createSwitchItem(LOC(@"DisableRTL"), LOC(@"DisableRTLDesc"), @"disableRTL", &kDisableRTL, selfObject) ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Other") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; diff --git a/YTLite.h b/YTLite.h index 74e4c0a..0ca9f93 100644 --- a/YTLite.h +++ b/YTLite.h @@ -87,6 +87,12 @@ BOOL kRemoveUploads; BOOL kRemoveLibrary; BOOL kRemovePlayNext; BOOL kNoContinueWatching; +BOOL kNoSearchHistory; +BOOL kNoRelatedWatchNexts; +BOOL kStickSortComments; +BOOL kHideSortComments; +BOOL kPlaylistOldMinibar; +BOOL kDisableRTL; BOOL kAdvancedMode; BOOL kAdvancedModeReminder; int kPivotIndex; diff --git a/YTLite.x b/YTLite.x index 42cd97f..b45708f 100644 --- a/YTLite.x +++ b/YTLite.x @@ -30,16 +30,13 @@ %hook YTIElementRenderer - (NSData *)elementData { - if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) - return nil; + if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) return nil; + + NSArray *adDescriptions = @[@"brand_promo", @"product_carousel", @"product_engagement_panel", @"product_item", @"text_search_ad", @"text_image_button_layout", @"carousel_headered_layout", @"square_image_layout", @"feed_ad_metadata"]; NSString *description = [self description]; - if ((([description containsString:@"brand_promo"] - || [description containsString:@"product_carousel"] - || [description containsString:@"product_engagement_panel"] - || [description containsString:@"product_item"]) && kNoAds) - || ([description containsString:@"inline_shorts"] && kHideShorts)) + if (([adDescriptions containsObject:description] && kNoAds) || ([description containsString:@"inline_shorts"] && kHideShorts)) { return [NSData data]; - return %orig; + } return %orig; } %end @@ -104,40 +101,53 @@ - (void)setDisableMDXDeviceDiscovery:(BOOL)arg1 { %orig(kNoCast); } %end -// Hide Cast, Notifications and Search Buttons +// Hide Navigation Bar Buttons %hook YTRightNavigationButtons - (void)layoutSubviews { %orig; 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; + + NSInteger moreButtonIndex = -1; + for (NSInteger i = 0; i < self.subviews.count; i++) { + UIView *subview = self.subviews[i]; + if ([subview.accessibilityIdentifier isEqualToString:@"id.settings.overflow.button"]) { + moreButtonIndex = i; + break; + } + } + + if (moreButtonIndex != -1 && moreButtonIndex < self.subviews.count - 1 && kNoVoiceSearchButton) { + UIView *voiceButton = self.subviews[moreButtonIndex + 1]; + voiceButton.hidden = YES; + } } %end %hook YTSearchView - (void)layoutSubviews { %orig; - + // Hide Search History + if (kNoSearchHistory && self.subviews.count > 1) self.subviews[1].hidden = YES; + // Hide Voice Search Button if (kNoVoiceSearchButton && self.subviews.count > 0) { UIView *firstSubview = self.subviews.firstObject; - if (firstSubview.subviews.count > 1) { - UIView *subview1 = firstSubview.subviews[1]; - [subview1 setValue:@(1) forKey:@"hidden"]; + for (UIView *subview in firstSubview.subviews) { + if ([NSStringFromClass([subview class]) isEqualToString:@"UIView"]) { + [subview setValue:@(1) forKey:@"hidden"]; + break; + } } } } %end -%hook YTSearchBarView -- (void)layoutSubviews { - %orig; - - if (kNoVoiceSearchButton && ![self.superview isKindOfClass:objc_lookUpClass("YTNavigationBarTitleView")]) { - CGRect frame = self.frame; - frame.size.width += 20; - self.frame = frame; - } +// Remove Videos Section Under Player +%hook YTWatchNextResultsViewController +- (void)setVisibleSections:(NSInteger)arg1 { + arg1 = (kNoRelatedWatchNexts) ? 1 : arg1; + %orig(arg1); } %end @@ -183,19 +193,25 @@ %hook YTColdConfig // Hide Next & Previous buttons -- (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : NO; } -- (BOOL)removePreviousPaddleForSingletonVideos { return kHidePrevNext ? YES : NO; } +- (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : %orig; } +- (BOOL)removePreviousPaddleForSingletonVideos { return kHidePrevNext ? YES : %orig; } // Replace Next & Previous with Fast Forward & Rewind buttons -- (BOOL)replaceNextPaddleWithFastForwardButtonForSingletonVods { return kReplacePrevNext ? YES : NO; } -- (BOOL)replacePreviousPaddleWithRewindButtonForSingletonVods { return kReplacePrevNext ? YES : NO; } +- (BOOL)replaceNextPaddleWithFastForwardButtonForSingletonVods { return kReplacePrevNext ? YES : %orig; } +- (BOOL)replacePreviousPaddleWithRewindButtonForSingletonVods { return kReplacePrevNext ? YES : %orig; } // Disable Free Zoom -- (BOOL)videoZoomFreeZoomEnabledGlobalConfig { return kNoFreeZoom ? NO : YES; } +- (BOOL)videoZoomFreeZoomEnabledGlobalConfig { return kNoFreeZoom ? NO : %orig; } +// Stick Sort Buttons in Comments Section +- (BOOL)enableHideChipsInTheCommentsHeaderOnScrollIos { return kStickSortComments ? NO : %orig; } +// Hide Sort Buttons in Comments Section +- (BOOL)enableChipsInTheCommentsHeaderIos { return kHideSortComments ? NO : %orig; } // Use System Theme - (BOOL)shouldUseAppThemeSetting { return YES; } // Dismiss Panel By Swiping in Fullscreen Mode - (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; } // Remove Video in Playlist By Swiping To The Right - (BOOL)enableSwipeToRemoveInPlaylistWatchEp { return YES; } +// Enable Old-style Minibar For Playlist Panel +- (BOOL)queueClientGlobalConfigEnableFloatingPlaylistMinibar { return kPlaylistOldMinibar ? NO : %orig; } %end // Remove Dark Background in Overlay @@ -685,6 +701,12 @@ BOOL isTabSelected = NO; } %end +// Disable Right-To-Left Formatting +%hook NSParagraphStyle ++ (NSWritingDirection)defaultWritingDirectionForLanguage:(id)lang { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; } ++ (NSWritingDirection)_defaultWritingDirection { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; } +%end + static void reloadPrefs() { NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"]; NSDictionary *prefs = [NSDictionary dictionaryWithContentsOfFile:path]; @@ -749,6 +771,12 @@ static void reloadPrefs() { kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO; kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO; kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO; + kNoSearchHistory = [prefs[@"noSearchHistory"] boolValue] ?: NO; + kNoRelatedWatchNexts = [prefs[@"noRelatedWatchNexts"] boolValue] ?: NO; + kStickSortComments = [prefs[@"stickSortComments"] boolValue] ?: NO; + kHideSortComments = [prefs[@"hideSortComments"] boolValue] ?: NO; + kPlaylistOldMinibar = [prefs[@"playlistOldMinibar"] boolValue] ?: NO; + kDisableRTL = [prefs[@"disableRTL"] boolValue] ?: NO; kPivotIndex = (prefs[@"pivotIndex"] != nil) ? [prefs[@"pivotIndex"] intValue] : 0; kAdvancedMode = [prefs[@"advancedMode"] boolValue] ?: NO; kAdvancedModeReminder = [prefs[@"advancedModeReminder"] boolValue] ?: NO; @@ -814,6 +842,12 @@ static void reloadPrefs() { @"removeLibrary" : @(kRemoveLibrary), @"removePlayNext" : @(kRemovePlayNext), @"noContinueWatching" : @(kNoContinueWatching), + @"noSearchHistory" : @(kNoSearchHistory), + @"noRelatedWatchNexts" : @(kNoRelatedWatchNexts), + @"stickSortComments" : @(kStickSortComments), + @"hideSortComments" : @(kHideSortComments), + @"playlistOldMinibar" : @(kPlaylistOldMinibar), + @"disableRTL" : @(kDisableRTL), @"pivotIndex" : @(kPivotIndex), @"advancedMode" : @(kAdvancedMode), @"advancedModeReminder" : @(kAdvancedModeReminder) diff --git a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings index a6069a8..75660b3 100644 --- a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings @@ -129,6 +129,18 @@ "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."; +"NoSearchHistory" = "Hide search history"; +"NoSearchHistoryDesc" = "Visually hides search history and suggestions. Note: Your search history will still be accessible in your other YouTube clients."; +"NoRelatedWatchNexts" = "Hide all videos under player"; +"NoRelatedWatchNextsDesc" = "Hides all videos below the player, leaving only the video info and comments section."; +"StickSortComments" = "Stick comments header"; +"StickSortCommentsDesc" = "Pins sort comments header (Top, Newest) so that it won't disappear while scrolling."; +"HideSortComments" = "Hide comments header"; +"HideSortCommentsDesc" = "Hides sort comments header (Top, Newest) so it will never appear."; +"PlaylistOldMinibar" = "Old playlist minibar"; +"PlaylistOldMinibarDesc" = "Replaces the new floating playlist panel with the old one."; +"DisableRTL" = "Disable RTL formatting"; +"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL)."; "Startup" = "Startup page"; "Home" = "Home"; diff --git a/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings index 8233fe5..c9432bd 100644 --- a/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings @@ -129,6 +129,18 @@ "RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú."; "NoContinueWatching" = "Eliminar \"Continuar viendo\""; "NoContinueWatchingDesc" = "Elimina la sección \"Continuar viendo\" que contiene videos sin terminar de la página de inicio."; +"NoSearchHistory" = "Hide search history"; +"NoSearchHistoryDesc" = "Visually hides search history and suggestions. Note: Your search history will still be accessible in your other YouTube clients."; +"NoRelatedWatchNexts" = "Hide all videos under player"; +"NoRelatedWatchNextsDesc" = "Hides all videos below the player, leaving only the video info and comments section."; +"StickSortComments" = "Stick comments header"; +"StickSortCommentsDesc" = "Pins sort comments header (Top, Newest) so that it won't disappear while scrolling."; +"HideSortComments" = "Hide comments header"; +"HideSortCommentsDesc" = "Hides sort comments header (Top, Newest) so it will never appear."; +"PlaylistOldMinibar" = "Old playlist minibar"; +"PlaylistOldMinibarDesc" = "Replaces the new floating playlist panel with the old one."; +"DisableRTL" = "Disable RTL formatting"; +"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL)."; "Startup" = "Página de inicio"; "Home" = "Inicio"; diff --git a/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings index f7c9f32..a2c8474 100644 --- a/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings @@ -131,6 +131,18 @@ "RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu."; "NoContinueWatching" = "Supprimer \"Continuer à regarder\""; "NoContinueWatchingDesc" = "Supprime la section \"Continuer à regarder\" contenant les vidéos inachevées de la page d'accueil."; +"NoSearchHistory" = "Hide search history"; +"NoSearchHistoryDesc" = "Visually hides search history and suggestions. Note: Your search history will still be accessible in your other YouTube clients."; +"NoRelatedWatchNexts" = "Hide all videos under player"; +"NoRelatedWatchNextsDesc" = "Hides all videos below the player, leaving only the video info and comments section."; +"StickSortComments" = "Stick comments header"; +"StickSortCommentsDesc" = "Pins sort comments header (Top, Newest) so that it won't disappear while scrolling."; +"HideSortComments" = "Hide comments header"; +"HideSortCommentsDesc" = "Hides sort comments header (Top, Newest) so it will never appear."; +"PlaylistOldMinibar" = "Old playlist minibar"; +"PlaylistOldMinibarDesc" = "Replaces the new floating playlist panel with the old one."; +"DisableRTL" = "Disable RTL formatting"; +"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL)."; "Startup" = "Page de démarrage"; "Home" = "Accueil"; diff --git a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings index 41606e8..153a21e 100644 --- a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings @@ -65,7 +65,7 @@ "NoHintsDesc" = "Скрывает подсказки от авторов видео, появляющиеся в правом верхнем углу."; "NoFreeZoom" = "Отключить жесты для зума"; "NoFreeZoomDesc" = "Отключает жесты приближения для нового зума."; -"AutoFullscreen" = "Воспроизводить в полноэкранном режиме"; +"AutoFullscreen" = "Открывать в полноэкранном режиме"; "AutoFullscreenDesc" = "Автоматически воспроизводит ролики в полноэкранном режиме."; "ExitFullscreen" = "Автовыход из полноэкранного режима"; "ExitFullscreenDesc" = "Выходит из полноэкранного режима по окончанию воспроизведения."; @@ -129,6 +129,18 @@ "RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео."; "NoContinueWatching" = "Отключить «Продолжить просмотр»"; "NoContinueWatchingDesc" = "Удаляет блок «Продолжить просмотр» содержащий недосмотренные видео с Главной страницы."; +"NoSearchHistory" = "Скрыть историю поиска"; +"NoSearchHistoryDesc" = "Визуально скрывает историю поиска и подсказок. Данная опция не отменяет трекинг вашей истории поиска."; +"NoRelatedWatchNexts" = "Скрыть все видео под плеером"; +"NoRelatedWatchNextsDesc" = "Скрывает все видео под плеером, оставляя только информацию о видео и раздел комментариев."; +"StickSortComments" = "Закрепить панель комментариев"; +"StickSortCommentsDesc" = "Закрепляет панель сортировки комментариев, чтобы она не терялись при прокрутке."; +"HideSortComments" = "Скрыть панель комментариев"; +"HideSortCommentsDesc" = "Скрывает панель сортировки комментариев."; +"PlaylistOldMinibar" = "Отображать старую панель плейлистов"; +"PlaylistOldMinibarDesc" = "Заменяет новую, плавающую панель плейлистов, на старую."; +"DisableRTL" = "Запретить формат «справа налево»"; +"DisableRTLDesc" = "Принудительно отображает текст в формате слева направо для языков, изначально отображающихся в формате справа налево."; "Startup" = "Начальная страница"; "Home" = "Главная"; diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings index 529c9fc..a56ddf3 100644 --- a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings @@ -47,8 +47,8 @@ "Player" = "播放器"; "Miniplayer" = "启用迷你播放器"; "MiniplayerDesc" = "启用迷你播放器来播放最初不是为其设计的视频,例如针对儿童的视频。"; -"PortraitFullscreen" = "Portrait fullscreen mode"; -"PortraitFullscreenDesc" = "Enables portrait fullscreen mode support."; +"PortraitFullscreen" = "竖屏全屏模式"; +"PortraitFullscreenDesc" = "启用竖屏全屏模式支持。"; "DisableAutoplay" = "禁用自动播放视频"; "DisableAutoplayDesc" = "打开后防止视频自动播放。"; "NoContentWarning" = "跳过内容警告"; @@ -119,16 +119,28 @@ "HideShortsThanksDesc" = "从短视频播放器中隐藏捐赠按钮。"; "HideShortsChannelName" = "隐藏发布者名称"; "HideShortsChannelNameDesc" = "从短视频播放器中隐藏发布者名称和订阅按钮。"; -"HideShortsDescription" = "隐藏说明"; -"HideShortsDescriptionDesc" = "在频道名称下隐藏短视频描述。"; -"HideShortsAudioTrack" = "隐藏音频音轨"; -"HideShortsAudioTrackDesc" = "从短视频描述下隐藏音频音轨。"; +"HideShortsDescription" = "隐藏文案"; +"HideShortsDescriptionDesc" = "隐藏短视频下方的视频文案。"; +"HideShortsAudioTrack" = "隐藏音轨"; +"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。"; "Other" = "其他"; "RemovePlayNext" = "删除“播放队列中的下一个”"; "RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。"; "NoContinueWatching" = "删除“继续观看”"; "NoContinueWatchingDesc" = "从首页中删除包含未完成视频的“继续观看”部分。"; +"NoSearchHistory" = "Hide search history"; +"NoSearchHistoryDesc" = "Visually hides search history and suggestions. Note: Your search history will still be accessible in your other YouTube clients."; +"NoRelatedWatchNexts" = "Hide all videos under player"; +"NoRelatedWatchNextsDesc" = "Hides all videos below the player, leaving only the video info and comments section."; +"StickSortComments" = "Stick comments header"; +"StickSortCommentsDesc" = "Pins sort comments header (Top, Newest) so that it won't disappear while scrolling."; +"HideSortComments" = "Hide comments header"; +"HideSortCommentsDesc" = "Hides sort comments header (Top, Newest) so it will never appear."; +"PlaylistOldMinibar" = "Old playlist minibar"; +"PlaylistOldMinibarDesc" = "Replaces the new floating playlist panel with the old one."; +"DisableRTL" = "Disable RTL formatting"; +"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL)."; "Startup" = "启动页"; "Home" = "首页"; @@ -143,12 +155,12 @@ "About" = "关于"; "Credits" = "信息"; "Developer" = "YTLite开发者"; -"ChineseSimplified" = "Chinese (Simplified) localization"; -"ChineseTraditional" = "Chinese (Traditional) localization"; -"French" = "French localization"; -"Spanish" = "Spanish localization"; +"ChineseSimplified" = "中文(简体)本地化"; +"ChineseTraditional" = "中文(繁体)本地化"; +"French" = "法语本地化"; +"Spanish" = "西班牙语本地化"; "Advanced" = "高级模式"; -"AdvancedModeReminder" = "Would you like to activate Advanced mode for YTLite?\n\nThis mode provides more than 50 additional options to customize and optimize your YouTube experience. You can enable/disable it later from Settings → %@ → %@ → %@."; +"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。"; "ResetSettings" = "重置YTLite设置"; "ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?"; "Yes" = "是"; diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings index 3fe2176..68b7efb 100644 --- a/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings @@ -129,6 +129,18 @@ "RemovePlayNextDesc" = "從選單移除「播放下一個」"; "NoContinueWatching" = "移除「繼續觀看」"; "NoContinueWatchingDesc" = "從首頁中移除包含未完成影片的「繼續觀看」部分"; +"NoSearchHistory" = "Hide search history"; +"NoSearchHistoryDesc" = "Visually hides search history and suggestions. Note: Your search history will still be accessible in your other YouTube clients."; +"NoRelatedWatchNexts" = "Hide all videos under player"; +"NoRelatedWatchNextsDesc" = "Hides all videos below the player, leaving only the video info and comments section."; +"StickSortComments" = "Stick comments header"; +"StickSortCommentsDesc" = "Pins sort comments header (Top, Newest) so that it won't disappear while scrolling."; +"HideSortComments" = "Hide comments header"; +"HideSortCommentsDesc" = "Hides sort comments header (Top, Newest) so it will never appear."; +"PlaylistOldMinibar" = "Old playlist minibar"; +"PlaylistOldMinibarDesc" = "Replaces the new floating playlist panel with the old one."; +"DisableRTL" = "Disable RTL formatting"; +"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL)."; "Startup" = "啟動頁面"; "Home" = "首頁"; diff --git a/packages/com.dvntm.ytlite_2.3_iphoneos-arm.deb b/packages/com.dvntm.ytlite_2.3_iphoneos-arm.deb new file mode 100644 index 0000000..266fe7b Binary files /dev/null and b/packages/com.dvntm.ytlite_2.3_iphoneos-arm.deb differ diff --git a/packages/com.dvntm.ytlite_2.3_iphoneos-arm64.deb b/packages/com.dvntm.ytlite_2.3_iphoneos-arm64.deb new file mode 100644 index 0000000..2ccf6fe Binary files /dev/null and b/packages/com.dvntm.ytlite_2.3_iphoneos-arm64.deb differ