Compare commits

...
57 Commits
Author SHA1 Message Date
Dan 44436a0d1c Merge pull request #48 from Balackburn/main
Updated french localization
2024-02-17 20:58:23 +03:00
Balackburn cccd5adb58 Merge branch 'dayanch96:main' into main 2024-02-17 18:26:27 +01:00
Balackburn db8cf75f07 Updated fr localization 2024-02-17 18:26:10 +01:00
Dan 43af06cf1b Merge pull request #47 from mumuisdog/main
Update zh-Hant Localizable
2024-02-17 20:15:25 +03:00
mumuisdog 6cadf005c0 Update Localizable.strings 2024-02-18 01:12:33 +08:00
Dan 8f272f567d Merge pull request #46 from xiangfeidexiaohuo/main
update zh-Hans
2024-02-17 18:59:36 +03:00
xiangfeidexiaohuo 7ea704af46 update zh-Hans
Signed-off-by: xiangfeidexiaohuo <jsjson@163.com>
2024-02-17 23:28:48 +08:00
Dan 6efa3c74c9 Merge pull request #44 from Deci8BelioS/main
Update Localizable.strings Spanish
2024-02-17 16:44:32 +03:00
DeciBelioS 3337bd2dd4 Update Localizable.strings Spanish 2024-02-17 14:42:43 +01:00
dayanch96 870e7ba5b4 2.5 2024-02-17 16:00:29 +03:00
Dan 5b24103c2e Merge pull request #43 from xiangfeidexiaohuo/main
support 19.03.2
2024-02-06 14:25:33 +03:00
xiangfeidexiaohuo 1abb4894ca support 19.03.2
Signed-off-by: xiangfeidexiaohuo <jsjson@163.com>
2024-01-25 19:07:12 +08:00
Dan 1b18429bd2 Merge pull request #41 from SKEIDs/Update-Japanese-localization
Update Japanese localization
2023-12-29 12:52:46 +03:00
SKEIDs 58d9c4411f Update Japanese localization 2023-12-27 20:41:54 +09:00
Dan 66802f049e Merge pull request #36 from Deci8BelioS/main
Update Spanish Localizable.strings
2023-11-12 23:32:31 +03:00
Dan 7f829f8768 Merge pull request #38 from mumuisdog/main
Update zh_Hant Localizable.strings
2023-11-12 23:32:17 +03:00
mumuisdog 057815f3f0 Update Localizable.strings 2023-11-12 10:39:05 +08:00
Dan 3a64da39d6 Merge pull request #37 from xiangfeidexiaohuo/main
Update Simplified Chinese
2023-11-12 00:44:19 +03:00
xiangfeidexiaohuo 06606c26a8 Update Simplified Chinese
Signed-off-by: xiangfeidexiaohuo <jsjson@163.com>
2023-11-11 22:34:44 +08:00
DeciBelioS 2d36a15054 Update Spanish Localizable.strings 2023-11-11 02:14:07 +01:00
dayanch96 dff35cbb43 Timestamped Links, Tabbar Indicators, More ads 2023-11-10 21:41:34 +03:00
Dan 245baff41d Merge pull request #34 from Balackburn/main
correction of indentation and removal of duplicate lines
2023-11-04 20:23:58 +03:00
Balackburn 8062417cce correction of indentation and removal of duplicate lines 2023-10-06 00:08:19 +02:00
Dan 21a960dff7 Merge pull request #31 from Balackburn/main
Updated French localization
2023-08-29 17:19:30 +03:00
Balackburn f6d81e3647 Merge branch 'dayanch96:main' into main 2023-08-27 20:20:32 +02:00
Balackburn 6ac142f6d0 Updated French localization 2023-08-27 20:19:48 +02:00
Dan 68d88704d5 Merge pull request #27 from Neo1102/main
Update Localizable.strings
2023-08-10 21:50:24 +03:00
ИEØ_ΙΙØZ 3373a75599 Update Localizable.strings 2023-08-10 12:01:44 +08:00
Dan f0a6984c3f Merge pull request #25 from xiangfeidexiaohuo/main
update
2023-08-03 10:45:07 +03:00
xiangfeidexiaohuo 0540f6ca1b update
Signed-off-by: xiangfeidexiaohuo <jsjson@163.com>
2023-08-03 15:15:13 +08:00
dayanch96 f1e1706fce Merge branch 'main' of https://github.com/dayanch96/YTLite 2023-07-29 18:52:46 +03:00
dayanch96 d0f7d9521c show real version, bug fixes 2023-07-29 18:50:16 +03:00
Dan 05b7faff70 Merge pull request #22 from arichorn/patch-1
Fix `Remove Dark Background in Overlay`
2023-07-26 02:37:49 +03:00
Dan 6876c2e572 Fix Remove Dark Background in Overlay #22 2023-07-26 02:37:17 +03:00
arichorn 08784c4819 Update YTLite.x 2023-07-25 18:35:01 -05:00
arichorn afd9e6054b Update YTLite.x 2023-07-25 18:18:55 -05:00
Dan bcd9e54137 Merge pull request #21 from SKEIDs/Add-Japanese-localization
Add Japanese localization
2023-07-21 19:49:11 +03:00
SKEIDs b3f4e9216a Update Japanese localization 2023-07-20 22:02:03 +09:00
SKEIDs 392330189e Add Japanese localization 2023-07-20 02:33:44 +09:00
Dan e8c23c0e8f Merge pull request #19 from mumuisdog/main
Update zh-Hant Localizable for 2.3
2023-07-16 15:13:28 +03:00
Dan d454fe1642 Merge pull request #18 from xiangfeidexiaohuo/main
Update Simplified Chinese of v2.3
2023-07-16 15:13:11 +03:00
mumuisdog 0206d55fef Update Localizable.strings 2023-07-16 20:10:15 +08:00
xiangfeidexiaohuo 8c44277e7c Update Simplified Chinese of v2.3
Signed-off-by: xiangfeidexiaohuo <jsjson@163.com>
2023-07-16 17:53:51 +08:00
Dan 753e1b480d Merge pull request #17 from Deci8BelioS/main
Update Localizable.strings Spanish
2023-07-15 22:46:07 +03:00
DeciBelioS b6b441103d Update Localizable.strings Spanish 2023-07-15 21:28:47 +02:00
dayanch96 d52e3b79c8 Merge branch 'main' of https://github.com/dayanch96/YTLite 2023-07-15 20:11:05 +03:00
dayanch96 5862a73ac9 more options and improvements 2023-07-15 20:11:03 +03:00
Dan 1bdc0e0e62 Merge pull request #15 from xiangfeidexiaohuo/main
Update Simplified Chinese
2023-07-13 14:01:38 +03:00
xiangfeidexiaohuo 0755b5abbd Update Simplified Chinese
Signed-off-by: xiangfeidexiaohuo <jsjson@163.com>
2023-07-12 16:06:08 +08:00
Dan 887ba2fdbe Merge pull request #13 from Balackburn/main
updated fr.lproj
2023-07-11 16:16:10 +03:00
Balackburn 2083ab7fbf translated lines 50, 51 2023-07-11 15:13:15 +02:00
Balackburn 83c53f9ede Merge branch 'dayanch96:main' into main 2023-07-11 15:12:12 +02:00
Dan 9bc4036a73 Merge pull request #14 from mumuisdog/main
Update zh-Hant Localizable
2023-07-11 15:19:39 +03:00
mumuisdog a16d978e7d Update Localizable.strings 2023-07-11 18:21:58 +08:00
Balackburn f269dd4022 updated fr.lproj 2023-07-11 03:41:30 +02:00
dayanch96 49b17ce2b0 Update Spanish translate @Deci8BelioS 2023-07-11 01:04:37 +03:00
dayanch96 06ed61a83a portrait fullscreen mode 2023-07-11 00:24:08 +03:00
22 changed files with 1199 additions and 309 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ endif
DEBUG=0 DEBUG=0
FINALPACKAGE=1 FINALPACKAGE=1
ARCHS = arm64 ARCHS = arm64
PACKAGE_VERSION = 2.2.1 PACKAGE_VERSION = 2.5
TARGET := iphone:clang:latest:11.0 TARGET := iphone:clang:latest:11.0
include $(THEOS)/makefiles/common.mk include $(THEOS)/makefiles/common.mk
+85 -41
View File
@@ -6,28 +6,6 @@
static const NSInteger YTLiteSection = 789; static const NSInteger YTLiteSection = 789;
static void resetYTLiteSettings() {
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
[[NSFileManager defaultManager] removeItemAtPath:prefsPath error:nil];
[[UIApplication sharedApplication] performSelector:@selector(suspend)];
[NSThread sleepForTimeInterval:1.0];
exit(0);
}
NSBundle *YTLiteBundle() {
static NSBundle *bundle = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"];
if (tweakBundlePath)
bundle = [NSBundle bundleWithPath:tweakBundlePath];
else
bundle = [NSBundle bundleWithPath:ROOT_PATH_NS("/Library/Application Support/YTLite.bundle")];
});
return bundle;
}
// Settings // Settings
%hook YTAppSettingsPresentationData %hook YTAppSettingsPresentationData
+ (NSArray *)settingsCategoryOrder { + (NSArray *)settingsCategoryOrder {
@@ -75,12 +53,30 @@ NSBundle *YTLiteBundle() {
static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleDescription, NSString *key, BOOL *value, id selfObject) { static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleDescription, NSString *key, BOOL *value, id selfObject) {
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem); Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
Class YTAlertViewClass = %c(YTAlertView);
YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:title YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:title
titleDescription:titleDescription titleDescription:titleDescription
accessibilityIdentifier:nil accessibilityIdentifier:nil
switchOn:*value switchOn:*value
switchBlock:^BOOL(YTSettingsCell *cell, BOOL enabled) { switchBlock:^BOOL(YTSettingsCell *cell, BOOL enabled) {
[selfObject updatePrefsForKey:key enabled:enabled]; if ([key isEqualToString:@"shortsOnlyMode"]) {
YTAlertView *alertView = [YTAlertViewClass confirmationDialogWithAction:^{
[selfObject updatePrefsForKey:@"shortsOnlyMode" enabled:enabled];
}
actionTitle:LOC(@"Yes")
cancelAction:^{
[cell setSwitchOn:!enabled animated:YES];
}
cancelTitle:LOC(@"No")];
alertView.title = LOC(@"Warning");
alertView.subtitle = LOC(@"ShortsOnlyWarning");
[alertView show];
}
else {
[selfObject updatePrefsForKey:key enabled:enabled];
}
return YES; return YES;
} }
settingItemId:0]; settingItemId:0];
@@ -159,6 +155,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject), createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject),
createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"endScreenCards", &kEndScreenCards, selfObject), createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"endScreenCards", &kEndScreenCards, selfObject),
createSwitchItem(LOC(@"NoFullscreenActions"), LOC(@"NoFullscreenActionsDesc"), @"noFullscreenActions", &kNoFullscreenActions, selfObject), createSwitchItem(LOC(@"NoFullscreenActions"), LOC(@"NoFullscreenActionsDesc"), @"noFullscreenActions", &kNoFullscreenActions, selfObject),
createSwitchItem(LOC(@"PersistentProgressBar"), LOC(@"PersistentProgressBarDesc"), @"persistentProgressBar", &kPersistentProgressBar, selfObject),
createSwitchItem(LOC(@"NoRelatedVids"), LOC(@"NoRelatedVidsDesc"), @"noRelatedVids", &kNoRelatedVids, selfObject), createSwitchItem(LOC(@"NoRelatedVids"), LOC(@"NoRelatedVidsDesc"), @"noRelatedVids", &kNoRelatedVids, selfObject),
createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject), createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject),
createSwitchItem(LOC(@"NoWatermarks"), LOC(@"NoWatermarksDesc"), @"noWatermarks", &kNoWatermarks, selfObject) createSwitchItem(LOC(@"NoWatermarks"), LOC(@"NoWatermarksDesc"), @"noWatermarks", &kNoWatermarks, selfObject)
@@ -178,7 +175,10 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[ NSArray <YTSettingsSectionItem *> *rows = @[
createSwitchItem(LOC(@"Miniplayer"), LOC(@"MiniplayerDesc"), @"miniplayer", &kMiniplayer, selfObject), createSwitchItem(LOC(@"Miniplayer"), LOC(@"MiniplayerDesc"), @"miniplayer", &kMiniplayer, selfObject),
createSwitchItem(LOC(@"PortraitFullscreen"), LOC(@"PortraitFullscreenDesc"), @"portraitFullscreen", &kPortraitFullscreen, selfObject),
createSwitchItem(LOC(@"CopyWithTimestamp"), LOC(@"CopyWithTimestampDesc"), @"copyWithTimestamp", &kCopyWithTimestamp, selfObject),
createSwitchItem(LOC(@"DisableAutoplay"), LOC(@"DisableAutoplayDesc"), @"disableAutoplay", &kDisableAutoplay, selfObject), createSwitchItem(LOC(@"DisableAutoplay"), LOC(@"DisableAutoplayDesc"), @"disableAutoplay", &kDisableAutoplay, selfObject),
createSwitchItem(LOC(@"DisableAutoCaptions"), LOC(@"DisableAutoCaptionsDesc"), @"disableAutoCaptions", &kDisableAutoCaptions, selfObject),
createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject), createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject),
createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject), createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject),
createSwitchItem(LOC(@"ExtraSpeedOptions"), LOC(@"ExtraSpeedOptionsDesc"), @"extraSpeedOptions", &kExtraSpeedOptions, selfObject), createSwitchItem(LOC(@"ExtraSpeedOptions"), LOC(@"ExtraSpeedOptionsDesc"), @"extraSpeedOptions", &kExtraSpeedOptions, selfObject),
@@ -204,8 +204,11 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
} }
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[ NSArray <YTSettingsSectionItem *> *rows = @[
createSwitchItem(LOC(@"ShortsOnlyMode"), LOC(@"ShortsOnlyModeDesc"), @"shortsOnlyMode", &kShortsOnlyMode, selfObject),
createSwitchItem(LOC(@"HideShorts"), LOC(@"HideShortsDesc"), @"hideShorts", &kHideShorts, selfObject), createSwitchItem(LOC(@"HideShorts"), LOC(@"HideShortsDesc"), @"hideShorts", &kHideShorts, selfObject),
createSwitchItem(LOC(@"ShortsProgress"), LOC(@"ShortsProgressDesc"), @"shortsProgress", &kShortsProgress, selfObject), createSwitchItem(LOC(@"ShortsProgress"), LOC(@"ShortsProgressDesc"), @"shortsProgress", &kShortsProgress, selfObject),
createSwitchItem(LOC(@"PinchToFullscreenShorts"), LOC(@"PinchToFullscreenShortsDesc"), @"pinchToFullscreenShorts", &kPinchToFullscreenShorts, selfObject),
createSwitchItem(LOC(@"ShortsToRegular"), LOC(@"ShortsToRegularDesc"), @"shortsToRegular", &kShortsToRegular, selfObject),
createSwitchItem(LOC(@"ResumeShorts"), LOC(@"ResumeShortsDesc"), @"resumeShorts", &kResumeShorts, selfObject), createSwitchItem(LOC(@"ResumeShorts"), LOC(@"ResumeShortsDesc"), @"resumeShorts", &kResumeShorts, selfObject),
createSwitchItem(LOC(@"HideShortsLogo"), LOC(@"HideShortsLogoDesc"), @"hideShortsLogo", &kHideShortsLogo, selfObject), createSwitchItem(LOC(@"HideShortsLogo"), LOC(@"HideShortsLogoDesc"), @"hideShortsLogo", &kHideShortsLogo, selfObject),
createSwitchItem(LOC(@"HideShortsSearch"), LOC(@"HideShortsSearchDesc"), @"hideShortsSearch", &kHideShortsSearch, selfObject), createSwitchItem(LOC(@"HideShortsSearch"), LOC(@"HideShortsSearchDesc"), @"hideShortsSearch", &kHideShortsSearch, selfObject),
@@ -219,6 +222,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
createSwitchItem(LOC(@"HideShortsShare"), LOC(@"HideShortsShareDesc"), @"hideShortsShare", &kHideShortsShare, selfObject), createSwitchItem(LOC(@"HideShortsShare"), LOC(@"HideShortsShareDesc"), @"hideShortsShare", &kHideShortsShare, selfObject),
createSwitchItem(LOC(@"HideShortsAvatars"), LOC(@"HideShortsAvatarsDesc"), @"hideShortsAvatars", &kHideShortsAvatars, selfObject), createSwitchItem(LOC(@"HideShortsAvatars"), LOC(@"HideShortsAvatarsDesc"), @"hideShortsAvatars", &kHideShortsAvatars, selfObject),
createSwitchItem(LOC(@"HideShortsThanks"), LOC(@"HideShortsThanksDesc"), @"hideShortsThanks", &kHideShortsThanks, selfObject), createSwitchItem(LOC(@"HideShortsThanks"), LOC(@"HideShortsThanksDesc"), @"hideShortsThanks", &kHideShortsThanks, selfObject),
createSwitchItem(LOC(@"HideShortsSource"), LOC(@"HideShortsSourceDesc"), @"hideShortsSource", &kHideShortsSource, selfObject),
createSwitchItem(LOC(@"HideShortsChannelName"), LOC(@"HideShortsChannelNameDesc"), @"hideShortsChannelName", &kHideShortsChannelName, selfObject), createSwitchItem(LOC(@"HideShortsChannelName"), LOC(@"HideShortsChannelNameDesc"), @"hideShortsChannelName", &kHideShortsChannelName, selfObject),
createSwitchItem(LOC(@"HideShortsDescription"), LOC(@"HideShortsDescriptionDesc"), @"hideShortsDescription", &kHideShortsDescription, selfObject), createSwitchItem(LOC(@"HideShortsDescription"), LOC(@"HideShortsDescriptionDesc"), @"hideShortsDescription", &kHideShortsDescription, selfObject),
createSwitchItem(LOC(@"HideShortsAudioTrack"), LOC(@"HideShortsAudioTrackDesc"), @"hideShortsAudioTrack", &kHideShortsAudioTrack, selfObject), createSwitchItem(LOC(@"HideShortsAudioTrack"), LOC(@"HideShortsAudioTrackDesc"), @"hideShortsAudioTrack", &kHideShortsAudioTrack, selfObject),
@@ -239,7 +243,9 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[ NSArray <YTSettingsSectionItem *> *rows = @[
createSwitchItem(LOC(@"RemoveLabels"), LOC(@"RemoveLabelsDesc"), @"removeLabels", &kRemoveLabels, selfObject), createSwitchItem(LOC(@"RemoveLabels"), LOC(@"RemoveLabelsDesc"), @"removeLabels", &kRemoveLabels, selfObject),
createSwitchItem(LOC(@"RemoveIndicators"), LOC(@"RemoveIndicatorsDesc"), @"removeIndicators", &kRemoveIndicators, selfObject),
createSwitchItem(LOC(@"ReExplore"), LOC(@"ReExploreDesc"), @"reExplore", &kReExplore, selfObject), createSwitchItem(LOC(@"ReExplore"), LOC(@"ReExploreDesc"), @"reExplore", &kReExplore, selfObject),
createSwitchItem(LOC(@"AddExplore"), LOC(@"AddExploreDesc"), @"addExplore", &kAddExplore, selfObject),
createSwitchItem(LOC(@"HideShortsTab"), LOC(@"HideShortsTabDesc"), @"removeShorts", &kRemoveShorts, selfObject), createSwitchItem(LOC(@"HideShortsTab"), LOC(@"HideShortsTabDesc"), @"removeShorts", &kRemoveShorts, selfObject),
createSwitchItem(LOC(@"HideSubscriptionsTab"), LOC(@"HideSubscriptionsTabDesc"), @"removeSubscriptions", &kRemoveSubscriptions, selfObject), createSwitchItem(LOC(@"HideSubscriptionsTab"), LOC(@"HideSubscriptionsTabDesc"), @"removeSubscriptions", &kRemoveSubscriptions, selfObject),
createSwitchItem(LOC(@"HideUploadButton"), LOC(@"HideUploadButtonDesc"), @"removeUploads", &kRemoveUploads, selfObject), createSwitchItem(LOC(@"HideUploadButton"), LOC(@"HideUploadButtonDesc"), @"removeUploads", &kRemoveUploads, selfObject),
@@ -260,8 +266,18 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
} }
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[ NSArray <YTSettingsSectionItem *> *rows = @[
createSwitchItem(LOC(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject),
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, selfObject),
createSwitchItem(LOC(@"FixAlbums"), LOC(@"FixAlbumsDesc"), @"fixAlbums", &kFixAlbums, selfObject),
createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject), 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]]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Other") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
@@ -277,10 +293,12 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
detailTextBlock:^NSString *() { detailTextBlock:^NSString *() {
switch (kPivotIndex) { switch (kPivotIndex) {
case 1: case 1:
return LOC(@"ShortsTab"); return LOC(@"Explore");
case 2: case 2:
return LOC(@"Subscriptions"); return LOC(@"ShortsTab");
case 3: case 3:
return LOC(@"Subscriptions");
case 4:
return LOC(@"Library"); return LOC(@"Library");
case 0: case 0:
default: default:
@@ -295,6 +313,20 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
return YES; return YES;
}], }],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Explore") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *library, NSUInteger arg1) {
if (!kReExplore && !kAddExplore) {
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
alertView.title = LOC(@"Warning");
alertView.subtitle = LOC(@"TabIsHidden");
[alertView show];
return NO;
} else {
kPivotIndex = 1;
[settingsViewController reloadData];
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
return YES;
}
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ShortsTab") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *shorts, NSUInteger arg1) { [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ShortsTab") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *shorts, NSUInteger arg1) {
if (kRemoveShorts) { if (kRemoveShorts) {
YTAlertView *alertView = [%c(YTAlertView) infoDialog]; YTAlertView *alertView = [%c(YTAlertView) infoDialog];
@@ -303,7 +335,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
[alertView show]; [alertView show];
return NO; return NO;
} else { } else {
kPivotIndex = 1; kPivotIndex = 2;
[settingsViewController reloadData]; [settingsViewController reloadData];
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
return YES; return YES;
@@ -317,7 +349,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
[alertView show]; [alertView show];
return NO; return NO;
} else { } else {
kPivotIndex = 2; kPivotIndex = 3;
[settingsViewController reloadData]; [settingsViewController reloadData];
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
return YES; return YES;
@@ -331,7 +363,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
[alertView show]; [alertView show];
return NO; return NO;
} else { } else {
kPivotIndex = 3; kPivotIndex = 4;
[settingsViewController reloadData]; [settingsViewController reloadData];
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
return YES; return YES;
@@ -375,13 +407,22 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Deci8BelioS"]]; return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Deci8BelioS"]];
}]; }];
YTSettingsSectionItem *skeids = [%c(YTSettingsSectionItem) itemWithTitle:@"SKEIDs" titleDescription:LOC(@"Japanese") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/SKEIDs"]];
}];
YTSettingsSectionItem *dayanch96 = [%c(YTSettingsSectionItem) itemWithTitle:@"Dayanch96" titleDescription:LOC(@"Developer") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { YTSettingsSectionItem *dayanch96 = [%c(YTSettingsSectionItem) itemWithTitle:@"Dayanch96" titleDescription:LOC(@"Developer") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]]; return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]];
}]; }];
YTSettingsSectionItem *reset = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { YTSettingsSectionItem *reset = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{ YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
resetYTLiteSettings(); NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
[[NSFileManager defaultManager] removeItemAtPath:prefsPath error:nil];
[[UIApplication sharedApplication] performSelector:@selector(suspend)];
[NSThread sleepForTimeInterval:1.0];
exit(0);
} }
actionTitle:LOC(@"Yes") actionTitle:LOC(@"Yes")
cancelTitle:LOC(@"No")]; cancelTitle:LOC(@"No")];
@@ -397,7 +438,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
return @(OS_STRINGIFY(TWEAK_VERSION)); return @(OS_STRINGIFY(TWEAK_VERSION));
} }
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[ps, miro, lillie, dayanch96, stalker, clement, balackburn, decibelios, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), reset]; NSArray <YTSettingsSectionItem *> *rows = @[ps, miro, lillie, dayanch96, stalker, clement, balackburn, decibelios, skeids, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), reset];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker]; [settingsViewController pushViewController:picker];
@@ -405,7 +446,10 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
}]; }];
[sectionItems addObject:version]; [sectionItems addObject:version];
[settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:@"YTLite" titleDescription:nil headerHidden:NO]; BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)];
isNew ? [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:@"YTLite" icon:nil titleDescription:nil headerHidden:NO]
: [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:@"YTLite" titleDescription:nil headerHidden:NO];
} }
- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry { - (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry {
@@ -426,15 +470,15 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{ YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
[prefs setObject:@(YES) forKey:@"advancedMode"]; [prefs setObject:@(YES) forKey:@"advancedMode"];
[prefs writeToFile:prefsPath atomically:NO]; [prefs writeToFile:prefsPath atomically:NO];
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
} }
actionTitle:LOC(@"Yes") actionTitle:LOC(@"Yes")
cancelTitle:LOC(@"No")]; cancelTitle:LOC(@"No")];
alertView.title = @"YTLite"; alertView.title = @"YTLite";
alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")]; alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")];
[alertView show]; [alertView show];
}); });
} }
} }
+24 -16
View File
@@ -71,31 +71,39 @@ static NSString *accessGroupID() {
} }
%end %end
%hook NSBundle BOOL isSelf() {
- (NSString *)bundleIdentifier {
NSArray *address = [NSThread callStackReturnAddresses]; NSArray *address = [NSThread callStackReturnAddresses];
Dl_info info = {0}; Dl_info info = {0};
if (dladdr((void *)[address[2] longLongValue], &info) == 0) if (dladdr((void *)[address[2] longLongValue], &info) == 0) return NO;
return %orig;
NSString *path = [NSString stringWithUTF8String:info.dli_fname]; NSString *path = [NSString stringWithUTF8String:info.dli_fname];
if ([path hasPrefix:NSBundle.mainBundle.bundlePath]) return [path hasPrefix:NSBundle.mainBundle.bundlePath];
return YT_BUNDLE_ID;
return %orig;
} }
%hook NSBundle
- (NSString *)bundleIdentifier {
return isSelf() ? YT_BUNDLE_ID : %orig;
}
- (NSDictionary *)infoDictionary {
NSDictionary *dict = %orig;
if (!isSelf())
return %orig;
NSMutableDictionary *info = [dict mutableCopy];
if (info[@"CFBundleIdentifier"]) info[@"CFBundleIdentifier"] = YT_BUNDLE_ID;
if (info[@"CFBundleDisplayName"]) info[@"CFBundleDisplayName"] = YT_NAME;
if (info[@"CFBundleName"]) info[@"CFBundleName"] = YT_NAME;
return info;
}
- (id)objectForInfoDictionaryKey:(NSString *)key { - (id)objectForInfoDictionaryKey:(NSString *)key {
if (!isSelf())
return %orig;
if ([key isEqualToString:@"CFBundleIdentifier"]) if ([key isEqualToString:@"CFBundleIdentifier"])
return YT_BUNDLE_ID; return YT_BUNDLE_ID;
if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"]) if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"])
return YT_NAME; return YT_NAME;
return %orig; return %orig;
} }
// Fix Google Sign in by @PoomSmart and @level3tjg (qnblackcat/uYouPlus#684)
- (NSDictionary *)infoDictionary {
NSMutableDictionary *info = %orig.mutableCopy;
NSString *altBundleIdentifier = info[@"ALTBundleIdentifier"];
if (altBundleIdentifier) info[@"CFBundleIdentifier"] = altBundleIdentifier;
return info;
}
%end %end
// Fix login for YouTube 18.13.2 and higher // Fix login for YouTube 18.13.2 and higher
@@ -133,6 +141,6 @@ static NSString *accessGroupID() {
%end %end
%ctor { %ctor {
NSString *embeddedMobileProvisionPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]; BOOL isAppStoreApp = [[NSFileManager defaultManager] fileExistsAtPath:[[NSBundle mainBundle] appStoreReceiptURL].path];
if ([[NSFileManager defaultManager] fileExistsAtPath:embeddedMobileProvisionPath]) %init(gSideloading); if (!isAppStoreApp) %init(gSideloading);
} }
+108 -21
View File
@@ -1,6 +1,8 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <rootless.h> #import <rootless.h>
#import <Photos/Photos.h>
#import "../YouTubeHeader/YTAlertView.h"
#import "../YouTubeHeader/YTIGuideResponse.h" #import "../YouTubeHeader/YTIGuideResponse.h"
#import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h" #import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
#import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h" #import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h"
@@ -8,6 +10,7 @@
#import "../YouTubeHeader/YTIBrowseRequest.h" #import "../YouTubeHeader/YTIBrowseRequest.h"
#import "../YouTubeHeader/YTISectionListRenderer.h" #import "../YouTubeHeader/YTISectionListRenderer.h"
#import "../YouTubeHeader/YTQTMButton.h" #import "../YouTubeHeader/YTQTMButton.h"
#import "../YouTubeHeader/YTIButtonRenderer.h"
#import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h" #import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
#import "../YouTubeHeader/YTPlayerViewController.h" #import "../YouTubeHeader/YTPlayerViewController.h"
#import "../YouTubeHeader/YTWatchController.h" #import "../YouTubeHeader/YTWatchController.h"
@@ -19,12 +22,25 @@
#import "../YouTubeHeader/YTSettingsPickerViewController.h" #import "../YouTubeHeader/YTSettingsPickerViewController.h"
#import "../YouTubeHeader/YTUIUtils.h" #import "../YouTubeHeader/YTUIUtils.h"
#import "../YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h" #import "../YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h"
#import "../YouTubeHeader/YTToastResponderEvent.h"
#import "../YouTubeHeader/YTPageStyleController.h"
extern NSBundle *YTLiteBundle(); static inline NSBundle *YTLiteBundle() {
static NSBundle *bundle = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"];
NSString *rootlessBundlePath = ROOT_PATH_NS("/Library/Application Support/YTLite.bundle");
bundle = [NSBundle bundleWithPath:tweakBundlePath ?: rootlessBundlePath];
});
return bundle;
}
static inline NSString *LOC(NSString *key) { static inline NSString *LOC(NSString *key) {
NSBundle *tweakBundle = YTLiteBundle(); return [YTLiteBundle() localizedStringForKey:key value:nil table:nil];
return [tweakBundle localizedStringForKey:key value:nil table:nil];
} }
BOOL kNoAds; BOOL kNoAds;
@@ -44,11 +60,15 @@ BOOL kReplacePrevNext;
BOOL kNoDarkBg; BOOL kNoDarkBg;
BOOL kEndScreenCards; BOOL kEndScreenCards;
BOOL kNoFullscreenActions; BOOL kNoFullscreenActions;
BOOL kPersistentProgressBar;
BOOL kNoRelatedVids; BOOL kNoRelatedVids;
BOOL kNoPromotionCards; BOOL kNoPromotionCards;
BOOL kNoWatermarks; BOOL kNoWatermarks;
BOOL kMiniplayer; BOOL kMiniplayer;
BOOL kPortraitFullscreen;
BOOL kCopyWithTimestamp;
BOOL kDisableAutoplay; BOOL kDisableAutoplay;
BOOL kDisableAutoCaptions;
BOOL kNoContentWarning; BOOL kNoContentWarning;
BOOL kClassicQuality; BOOL kClassicQuality;
BOOL kExtraSpeedOptions; BOOL kExtraSpeedOptions;
@@ -59,8 +79,11 @@ BOOL kNoFreeZoom;
BOOL kAutoFullscreen; BOOL kAutoFullscreen;
BOOL kExitFullscreen; BOOL kExitFullscreen;
BOOL kNoDoubleTapToSeek; BOOL kNoDoubleTapToSeek;
BOOL kShortsOnlyMode;
BOOL kHideShorts; BOOL kHideShorts;
BOOL kShortsProgress; BOOL kShortsProgress;
BOOL kPinchToFullscreenShorts;
BOOL kShortsToRegular;
BOOL kResumeShorts; BOOL kResumeShorts;
BOOL kHideShortsLogo; BOOL kHideShortsLogo;
BOOL kHideShortsSearch; BOOL kHideShortsSearch;
@@ -74,18 +97,32 @@ BOOL kHideShortsRemix;
BOOL kHideShortsShare; BOOL kHideShortsShare;
BOOL kHideShortsAvatars; BOOL kHideShortsAvatars;
BOOL kHideShortsThanks; BOOL kHideShortsThanks;
BOOL kHideShortsSource;
BOOL kHideShortsChannelName; BOOL kHideShortsChannelName;
BOOL kHideShortsDescription; BOOL kHideShortsDescription;
BOOL kHideShortsAudioTrack; BOOL kHideShortsAudioTrack;
BOOL kHideShortsPromoCards; BOOL kHideShortsPromoCards;
BOOL kRemoveLabels; BOOL kRemoveLabels;
BOOL kRemoveIndicators;
BOOL kReExplore; BOOL kReExplore;
BOOL kAddExplore;
BOOL kRemoveShorts; BOOL kRemoveShorts;
BOOL kRemoveSubscriptions; BOOL kRemoveSubscriptions;
BOOL kRemoveUploads; BOOL kRemoveUploads;
BOOL kRemoveLibrary; BOOL kRemoveLibrary;
BOOL kCopyPostText;
BOOL kSavePostImage;
BOOL kSaveProfilePhoto;
BOOL kSavePost;
BOOL kFixAlbums;
BOOL kRemovePlayNext; BOOL kRemovePlayNext;
BOOL kNoContinueWatching; BOOL kNoContinueWatching;
BOOL kNoSearchHistory;
BOOL kNoRelatedWatchNexts;
BOOL kStickSortComments;
BOOL kHideSortComments;
BOOL kPlaylistOldMinibar;
BOOL kDisableRTL;
BOOL kAdvancedMode; BOOL kAdvancedMode;
BOOL kAdvancedModeReminder; BOOL kAdvancedModeReminder;
int kPivotIndex; int kPivotIndex;
@@ -100,11 +137,13 @@ int kPivotIndex;
@interface YTPivotBarView : UIView @interface YTPivotBarView : UIView
@end @end
@interface YTPivotBarItemView : UIView @interface YTQTMButton ()
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
@end @end
@interface YTPivotBarViewController : UIViewController @interface YTPivotBarItemView : UIView
- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier; @property (nonatomic, strong, readwrite) YTQTMButton *navigationButton;
@end @end
@interface YTRightNavigationButtons : UIView @interface YTRightNavigationButtons : UIView
@@ -112,10 +151,7 @@ int kPivotIndex;
@property (nonatomic, strong) YTQTMButton *searchButton; @property (nonatomic, strong) YTQTMButton *searchButton;
@end @end
@interface YTSearchView : UIView @interface YTSearchViewController : UIViewController
@end
@interface YTSearchBarView : UIView
@end @end
@interface YTNavigationBarTitleView : UIView @interface YTNavigationBarTitleView : UIView
@@ -124,8 +160,51 @@ int kPivotIndex;
@interface YTChipCloudCell : UICollectionViewCell @interface YTChipCloudCell : UICollectionViewCell
@end @end
@interface YTAppViewController : UIViewController
- (void)hidePivotBar;
- (void)showPivotBar;
@end
@interface YTPivotBarViewController : UIViewController
@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController;
- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier;
@end
@interface YTScrollableNavigationController : UINavigationController
@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController;
@end
@interface YTReelWatchRootViewController : UIViewController
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
@end
@interface YTTabsViewController : UIViewController
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
@end
@interface YTReelWatchPlaybackOverlayView : UIView
@end
@interface YTReelContentView : UIView
@property (nonatomic, assign, readonly) YTReelWatchPlaybackOverlayView *playbackOverlay;
@end
@interface YTShortsPlayerViewController : UIViewController
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
@end
@interface YTPlayerViewController (YTAFS) @interface YTPlayerViewController (YTAFS)
@property (nonatomic, weak, readwrite) UIViewController *parentViewController;
@property (readonly, nonatomic) NSString *contentVideoID;
- (void)setActiveCaptionTrack:(id)arg1;
- (void)shortsToRegular;
- (void)autoFullscreen; - (void)autoFullscreen;
- (void)turnOffCaptions;
@end
@interface YTPlayerView : UIView
@property (nonatomic, weak, readwrite) YTPlayerViewController *playerViewDelegate;
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture;
@end @end
@interface YTSegmentableInlinePlayerBarView @interface YTSegmentableInlinePlayerBarView
@@ -150,18 +229,29 @@ int kPivotIndex;
- (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath; - (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath;
@end @end
@interface YTReelWatchPlaybackOverlayView : UIView // @interface YTReelWatchPlaybackOverlayView : UIView
@end // @end
@interface YTReelTransparentStackView : UIView // @interface YTReelWatchHeaderView : UIView
@end // @end
@interface YTReelWatchHeaderView : UIView @interface YTReelTransparentStackView : UIStackView
@end @end
@interface YTELMView : UIView @interface YTELMView : UIView
@end @end
@interface ASNetworkImageNode : NSObject
@property (atomic, copy, readwrite) NSURL *URL;
@end
@interface _ASDisplayView : UIView
@property (nonatomic, strong, readwrite) ASNetworkImageNode *keepalive_node;
- (void)copyText:(UILongPressGestureRecognizer *)sender;
- (void)saveImage:(UILongPressGestureRecognizer *)sender;
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
@end
@interface MLHAMQueuePlayer : NSObject @interface MLHAMQueuePlayer : NSObject
@property id playerEventCenter; @property id playerEventCenter;
-(void)setRate:(float)rate; -(void)setRate:(float)rate;
@@ -179,10 +269,7 @@ int kPivotIndex;
- (void)broadcastRateChange:(float)rate; - (void)broadcastRateChange:(float)rate;
@end @end
@interface YTAlertView : UIView @interface YTMainAppVideoPlayerOverlayViewController : UIViewController
@property (nonatomic, copy, readwrite) NSString *title; @property (readonly, nonatomic) CGFloat mediaTime;
@property (nonatomic, copy, readwrite) NSString *subtitle; @property (readonly, nonatomic) NSString *videoID;
+ (instancetype)infoDialog;
+ (instancetype)confirmationDialogWithAction:(void (^)(void))action actionTitle:(NSString *)actionTitle cancelTitle:(NSString *)cancelTitle;
- (void)show;
@end @end
+454 -183
View File
@@ -30,15 +30,22 @@
%hook YTIElementRenderer %hook YTIElementRenderer
- (NSData *)elementData { - (NSData *)elementData {
if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) return nil;
return nil;
NSString *description = [self description]; NSString *description = [self description];
if ((([description containsString:@"brand_promo"]
|| [description containsString:@"product_carousel"] NSArray *ads = @[@"brand_promo", @"product_carousel", @"product_engagement_panel", @"product_item", @"text_search_ad", @"text_image_button_layout", @"carousel_headered_layout", @"carousel_footered_layout", @"square_image_layout", @"landscape_image_wide_button_layout", @"feed_ad_metadata"];
|| [description containsString:@"product_engagement_panel"] if (kNoAds && [ads containsObject:description]) {
|| [description containsString:@"product_item"]) && kNoAds)
|| ([description containsString:@"inline_shorts"] && kHideShorts))
return [NSData data]; return [NSData data];
}
NSArray *shortsToRemove = @[@"shorts_shelf.eml", @"shorts_video_cell.eml", @"6Shorts"];
for (NSString *shorts in shortsToRemove) {
if (kHideShorts && [description containsString:shorts] && ![description containsString:@"history*"]) {
return nil;
}
}
return %orig; return %orig;
} }
%end %end
@@ -104,51 +111,50 @@
- (void)setDisableMDXDeviceDiscovery:(BOOL)arg1 { %orig(kNoCast); } - (void)setDisableMDXDeviceDiscovery:(BOOL)arg1 { %orig(kNoCast); }
%end %end
// Hide Cast, Notifications and Search Buttons // Hide Navigation Bar Buttons
%hook YTRightNavigationButtons %hook YTRightNavigationButtons
- (void)layoutSubviews { - (void)layoutSubviews {
%orig; %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 (kNoNotifsButton) self.notificationButton.hidden = YES;
if (kNoSearchButton) self.searchButton.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
%hook YTSearchView for (UIView *subview in self.subviews) {
- (void)layoutSubviews { if (kNoVoiceSearchButton && [subview.accessibilityLabel isEqualToString:NSLocalizedString(@"search.voice.access", nil)]) subview.hidden = YES;
%orig; if (kNoCast && [subview.accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) subview.hidden = YES;
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"];
}
} }
} }
%end %end
%hook YTSearchBarView %hook YTSearchViewController
- (void)layoutSubviews { - (void)viewDidLoad {
%orig; %orig;
if (kNoVoiceSearchButton && ![self.superview isKindOfClass:objc_lookUpClass("YTNavigationBarTitleView")]) { if (kNoVoiceSearchButton) [self setValue:@(NO) forKey:@"_isVoiceSearchAllowed"];
CGRect frame = self.frame; }
frame.size.width += 20;
self.frame = frame; - (void)setSuggestions:(id)arg1 { if (!kNoSearchHistory) %orig; }
} %end
%hook YTPersonalizedSuggestionsCacheProvider
- (id)activeCache { return kNoSearchHistory ? nil : %orig; }
%end
// Remove Videos Section Under Player
%hook YTWatchNextResultsViewController
- (void)setVisibleSections:(NSInteger)arg1 {
arg1 = (kNoRelatedWatchNexts) ? 1 : arg1;
%orig(arg1);
} }
%end %end
%hook YTHeaderView
// Stick Navigation bar
- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : %orig; }
// Hide YouTube Logo // Hide YouTube Logo
%hook YTNavigationBarTitleView - (void)setCustomTitleView:(UIView *)customTitleView { if (!kNoYTLogo) %orig; }
- (void)layoutSubviews { %orig; if (kNoYTLogo && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.yoodle.logo"]) self.subviews[1].hidden = YES; } - (void)setTitle:(NSString *)title { kNoYTLogo ? %orig(@"") : %orig; }
%end
// Stick Navigation bar
%hook YTHeaderView
- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : NO; }
%end %end
// Remove Subbar // Remove Subbar
@@ -180,27 +186,32 @@
- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { return kNoHUDMsgs ? nil : %orig; } - (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { return kNoHUDMsgs ? nil : %orig; }
%end %end
%hook YTColdConfig %hook YTColdConfig
// Hide Next & Previous buttons // Hide Next & Previous buttons
- (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : NO; } - (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : %orig; }
- (BOOL)removePreviousPaddleForSingletonVideos { return kHidePrevNext ? YES : NO; } - (BOOL)removePreviousPaddleForSingletonVideos { return kHidePrevNext ? YES : %orig; }
// Replace Next & Previous with Fast Forward & Rewind buttons // Replace Next & Previous with Fast Forward & Rewind buttons
- (BOOL)replaceNextPaddleWithFastForwardButtonForSingletonVods { return kReplacePrevNext ? YES : NO; } - (BOOL)replaceNextPaddleWithFastForwardButtonForSingletonVods { return kReplacePrevNext ? YES : %orig; }
- (BOOL)replacePreviousPaddleWithRewindButtonForSingletonVods { return kReplacePrevNext ? YES : NO; } - (BOOL)replacePreviousPaddleWithRewindButtonForSingletonVods { return kReplacePrevNext ? YES : %orig; }
// Disable Free Zoom // 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 // Use System Theme
- (BOOL)shouldUseAppThemeSetting { return YES; } - (BOOL)shouldUseAppThemeSetting { return YES; }
// Dismiss Panel By Swiping in Fullscreen Mode // Dismiss Panel By Swiping in Fullscreen Mode
- (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; } - (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; }
// Remove Video in Playlist By Swiping To The Right // Remove Video in Playlist By Swiping To The Right
- (BOOL)enableSwipeToRemoveInPlaylistWatchEp { return YES; } - (BOOL)enableSwipeToRemoveInPlaylistWatchEp { return YES; }
// Enable Old-style Minibar For Playlist Panel
- (BOOL)queueClientGlobalConfigEnableFloatingPlaylistMinibar { return kPlaylistOldMinibar ? NO : %orig; }
%end %end
// Remove Dark Background in Overlay // Remove Dark Background in Overlay
%hook YTMainAppVideoPlayerOverlayView %hook YTMainAppVideoPlayerOverlayView
- (void)setBackgroundVisible:(BOOL)arg1 { kNoDarkBg ? %orig(NO) : %orig; } - (void)setBackgroundVisible:(BOOL)arg1 isGradientBackground:(BOOL)arg2 { kNoDarkBg ? %orig(NO, arg2) : %orig; }
%end %end
// No Endscreen Cards // No Endscreen Cards
@@ -232,16 +243,29 @@
- (void)setPaidContentWithPlayerData:(id)data { if (!kNoPromotionCards) %orig; } - (void)setPaidContentWithPlayerData:(id)data { if (!kNoPromotionCards) %orig; }
%end %end
%hook YTInlinePlayerBarContainerView
- (void)setPlayerBarAlpha:(CGFloat)alpha { kPersistentProgressBar ? %orig(1.0) : %orig; }
%end
// Remove Watermarks // Remove Watermarks
%hook YTAnnotationsViewController %hook YTAnnotationsViewController
- (void)loadFeaturedChannelWatermark { if (!kNoWatermarks) %orig; } - (void)loadFeaturedChannelWatermark { if (!kNoWatermarks) %orig; }
%end %end
%hook YTMainAppVideoPlayerOverlayView
- (BOOL)isWatermarkEnabled { return kNoWatermarks ? NO : %orig; }
%end
// Forcibly Enable Miniplayer // Forcibly Enable Miniplayer
%hook YTWatchMiniBarViewController %hook YTWatchMiniBarViewController
- (void)updateMiniBarPlayerStateFromRenderer { if (!kMiniplayer) %orig; } - (void)updateMiniBarPlayerStateFromRenderer { if (!kMiniplayer) %orig; }
%end %end
// Portrait Fullscreen
%hook YTWatchViewController
- (unsigned long long)allowedFullScreenOrientations { return kPortraitFullscreen ? UIInterfaceOrientationMaskAllButUpsideDown : %orig; }
%end
// Disable Autoplay // Disable Autoplay
%hook YTPlaybackConfig %hook YTPlaybackConfig
- (void)setStartPlayback:(BOOL)arg1 { kDisableAutoplay ? %orig(NO) : %orig; } - (void)setStartPlayback:(BOOL)arg1 { kDisableAutoplay ? %orig(NO) : %orig; }
@@ -249,7 +273,7 @@
// Skip Content Warning (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L452-L454) // Skip Content Warning (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L452-L454)
%hook YTPlayabilityResolutionUserActionUIController %hook YTPlayabilityResolutionUserActionUIController
- (void)showConfirmAlert { if (kNoContentWarning) [self confirmAlertDidPressConfirm]; } - (void)showConfirmAlert { kNoContentWarning ? [self confirmAlertDidPressConfirm] : %orig; }
%end %end
// Classic Video Quality (https://github.com/PoomSmart/YTClassicVideoQuality) // Classic Video Quality (https://github.com/PoomSmart/YTClassicVideoQuality)
@@ -312,6 +336,18 @@
} }
%end %end
// Show real version in YT Settings
%hook YTSettingsCell
- (void)setDetailText:(id)arg1 {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appVersion = infoDictionary[@"CFBundleShortVersionString"];
if ([arg1 isEqualToString:@"18.18.2"]) {
arg1 = appVersion;
} %orig(arg1);
}
%end
// Disable Snap To Chapter (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L457-464) // Disable Snap To Chapter (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L457-464)
%hook YTSegmentableInlinePlayerBarView %hook YTSegmentableInlinePlayerBarView
- (void)didMoveToWindow { %orig; if (kDontSnapToChapter) self.enableSnapToChapter = NO; } - (void)didMoveToWindow { %orig; if (kDontSnapToChapter) self.enableSnapToChapter = NO; }
@@ -341,7 +377,10 @@
%hook YTPlayerViewController %hook YTPlayerViewController
- (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 { - (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 {
%orig; %orig;
if (kAutoFullscreen) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO]; if (kAutoFullscreen) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO];
if (kShortsToRegular) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(shortsToRegular) userInfo:nil repeats:NO];
if (kDisableAutoCaptions) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(turnOffCaptions) userInfo:nil repeats:NO];
} }
%new %new
@@ -349,6 +388,21 @@
YTWatchController *watchController = [self valueForKey:@"_UIDelegate"]; YTWatchController *watchController = [self valueForKey:@"_UIDelegate"];
[watchController showFullScreen]; [watchController showFullScreen];
} }
%new
- (void)shortsToRegular {
if (self.contentVideoID != nil && [self.parentViewController isKindOfClass:NSClassFromString(@"YTShortsPlayerViewController")]) {
NSString *vidLink = [NSString stringWithFormat:@"vnd.youtube://%@", self.contentVideoID];
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:vidLink]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:vidLink] options:@{} completionHandler:nil];
}
}
}
%new
- (void)turnOffCaptions {
[self setActiveCaptionTrack:nil];
}
%end %end
// Exit Fullscreen on Finish // Exit Fullscreen on Finish
@@ -356,9 +410,22 @@
- (BOOL)shouldExitFullScreenOnFinish { return kExitFullscreen ? YES : NO; } - (BOOL)shouldExitFullScreenOnFinish { return kExitFullscreen ? YES : NO; }
%end %end
// Disable Double Tap To Seek
%hook YTMainAppVideoPlayerOverlayViewController %hook YTMainAppVideoPlayerOverlayViewController
// Disable Double Tap To Seek
- (BOOL)allowDoubleTapToSeekGestureRecognizer { return kNoDoubleTapToSeek ? NO : %orig; } - (BOOL)allowDoubleTapToSeekGestureRecognizer { return kNoDoubleTapToSeek ? NO : %orig; }
// Copy Timestamped Link by Pressing On Pause
- (void)didPressPause:(id)arg1 {
%orig;
if (kCopyWithTimestamp) {
NSInteger mediaTimeInteger = (NSInteger)self.mediaTime;
NSString *currentTimeLink = [NSString stringWithFormat:@"https://www.youtube.com/watch?v=%@&t=%lds", self.videoID, mediaTimeInteger];
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = currentTimeLink;
}
}
%end %end
// Fit 'Play All' Buttons Text For Localizations // Fit 'Play All' Buttons Text For Localizations
@@ -412,7 +479,7 @@
if ([cell respondsToSelector:@selector(node)]) { if ([cell respondsToSelector:@selector(node)]) {
NSString *idToRemove = [[cell node] accessibilityIdentifier]; NSString *idToRemove = [[cell node] accessibilityIdentifier];
if ([idToRemove isEqualToString:@"statement_banner.view"] || if ([idToRemove isEqualToString:@"statement_banner.view"] ||
(([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"] || [idToRemove isEqualToString:@"eml.inline_shorts"]) && kHideShorts)) { (([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"]) && kHideShorts)) {
[self removeCellsAtIndexPath:indexPath]; [self removeCellsAtIndexPath:indexPath];
} }
} }
@@ -441,6 +508,11 @@
- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; } - (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; }
%end %end
%hook YTShortsPlayerViewController
- (BOOL)shouldAlwaysEnablePlayerBar { return kShortsProgress ? YES : NO; }
- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; }
%end
%hook YTColdConfig %hook YTColdConfig
- (BOOL)iosEnableVideoPlayerScrubber { return kShortsProgress ? YES : NO; } - (BOOL)iosEnableVideoPlayerScrubber { return kShortsProgress ? YES : NO; }
- (BOOL)mobileShortsTabInlined { return kShortsProgress ? YES : NO; } - (BOOL)mobileShortsTabInlined { return kShortsProgress ? YES : NO; }
@@ -466,16 +538,7 @@
- (void)setViewCommentButton:(id)arg1 { if (!kHideShortsComments) %orig; } - (void)setViewCommentButton:(id)arg1 { if (!kHideShortsComments) %orig; }
- (void)setRemixButton:(id)arg1 { if (!kHideShortsRemix) %orig; } - (void)setRemixButton:(id)arg1 { if (!kHideShortsRemix) %orig; }
- (void)setShareButton:(id)arg1 { if (!kHideShortsShare) %orig; } - (void)setShareButton:(id)arg1 { if (!kHideShortsShare) %orig; }
- (void)layoutSubviews { - (void)setNativePivotButton:(id)arg1 { if (!kHideShortsAvatars) %orig; }
%orig;
for (UIView *subview in self.subviews) {
if (kHideShortsAvatars && [NSStringFromClass([subview class]) isEqualToString:@"YTELMView"]) {
subview.hidden = YES;
break;
}
}
}
%end %end
%hook YTReelHeaderView %hook YTReelHeaderView
@@ -485,31 +548,200 @@
%hook YTReelTransparentStackView %hook YTReelTransparentStackView
- (void)layoutSubviews { - (void)layoutSubviews {
%orig; %orig;
if (kHideShortsSearch && self.subviews.count >= 3 && [self.subviews[0].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[0].hidden = YES;
if (kHideShortsCamera && self.subviews.count >= 3 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[1].hidden = YES;
if (kHideShortsMore && self.subviews.count >= 3 && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[2].hidden = YES;
}
%end
%hook YTReelWatchHeaderView for (YTQTMButton *button in self.subviews) {
- (void)layoutSubviews { if ([button respondsToSelector:@selector(buttonRenderer)]) {
%orig; if (kHideShortsSearch && button.buttonRenderer.icon.iconType == 1045) button.hidden = YES;
if (kHideShortsDescription && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.reels_smv_player_title_label"]) self.subviews[2].hidden = YES; if (kHideShortsCamera && button.buttonRenderer.icon.iconType == 1046) button.hidden = YES;
if (kHideShortsThanks && [self.subviews[self.subviews.count - 3].accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.subviews[self.subviews.count - 3].hidden = YES; // Might be useful for older versions if (kHideShortsMore && button.buttonRenderer.icon.iconType == 1047) button.hidden = YES;
if (kHideShortsChannelName) self.subviews[self.subviews.count - 2].hidden = YES;
if (kHideShortsAudioTrack) self.subviews.lastObject.hidden = YES;
for (UIView *subview in self.subviews) {
if (kHideShortsPromoCards && [NSStringFromClass([subview class]) isEqualToString:@"YTBadge"]) {
subview.hidden = YES;
} }
} }
} }
%end %end
%hook YTELMView %hook YTReelWatchHeaderView
- (void)setChannelBarElementRenderer:(id)renderer { if (!kHideShortsChannelName) %orig; }
- (void)setHeaderRenderer:(id)renderer { if (!kHideShortsDescription) %orig; }
- (void)setSoundMetadataElementRenderer:(id)renderer { if (!kHideShortsAudioTrack) %orig; }
- (void)setActionElement:(id)renderer { if (!kHideShortsPromoCards) %orig; }
- (void)setBadgeRenderer:(id)renderer { if (!kHideShortsThanks) %orig; }
- (void)setMultiFormatLinkElementRenderer:(id)renderer { if (!kHideShortsSource) %orig; }
%end
static BOOL isOverlayShown = YES;
%hook YTPlayerView
- (void)didPinch:(UIPinchGestureRecognizer *)gesture {
%orig;
if (kPinchToFullscreenShorts && [self.playerViewDelegate.parentViewController isKindOfClass:NSClassFromString(@"YTShortsPlayerViewController")]) {
YTShortsPlayerViewController *shortsPlayerVC = (YTShortsPlayerViewController *)self.playerViewDelegate.parentViewController;
YTReelContentView *contentView = (YTReelContentView *)shortsPlayerVC.view;
if (gesture.scale > 1) {
if (!kShortsOnlyMode) [shortsPlayerVC.navigationController.parentViewController hidePivotBar];
[UIView animateWithDuration:0.3 animations:^{
contentView.playbackOverlay.alpha = 0;
isOverlayShown = contentView.playbackOverlay.alpha;
}];
} else {
if (!kShortsOnlyMode) [shortsPlayerVC.navigationController.parentViewController showPivotBar];
[UIView animateWithDuration:0.3 animations:^{
contentView.playbackOverlay.alpha = 1;
isOverlayShown = contentView.playbackOverlay.alpha;
}];
}
}
}
- (void)layoutSubviews { - (void)layoutSubviews {
%orig; %orig;
if (kHideShortsThanks && [self.subviews.firstObject.accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.subviews.firstObject.hidden = YES;
if (kShortsOnlyMode && [self.playerViewDelegate.parentViewController isKindOfClass:NSClassFromString(@"YTShortsPlayerViewController")]) {
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(turnShortsOnlyModeOff:)];
longPressGesture.numberOfTouchesRequired = 2;
longPressGesture.minimumPressDuration = 0.5;
[self addGestureRecognizer:longPressGesture];
}
}
%new
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateBegan) {
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"];
NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:path];
[prefs setObject:@NO forKey:@"shortsOnlyMode"];
[prefs writeToFile:path atomically:NO];
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
UIResponder *responder = self.nextResponder;
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"ShortsModeTurnedOff") firstResponder:responder] send];
YTShortsPlayerViewController *shortsPlayerVC = (YTShortsPlayerViewController *)self.playerViewDelegate.parentViewController;
[shortsPlayerVC.navigationController.parentViewController performSelector:@selector(showPivotBar) withObject:nil afterDelay:1.0];
}
}
%end
%hook YTReelWatchPlaybackOverlayView
- (void)layoutSubviews {
%orig;
self.alpha = isOverlayShown;
}
%end
%hook _ASDisplayView
- (void)setKeepalive_node:(id)arg1 {
%orig;
NSString *description = [self description];
if (kCopyPostText && [description containsString:@"ELMExpandableTextNode-View"]) {
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(copyText:)];
longPress.minimumPressDuration = 0.3;
[self addGestureRecognizer:longPress];
}
if (kSavePostImage && [description containsString:@"YTImageZoomNode-View"]) {
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(saveImage:)];
longPress.minimumPressDuration = 0.3;
[self addGestureRecognizer:longPress];
}
if (kSaveProfilePhoto && [description containsString:@"ELMImageNode-View"] && [description containsString:@"eml.avatar"]) {
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(savePFP:)];
longPress.minimumPressDuration = 0.3;
[self addGestureRecognizer:longPress];
}
}
%new
- (void)savePFP:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
NSString *URLString = self.keepalive_node.URL.absoluteString;
if (URLString) {
NSRange sizeRange = [URLString rangeOfString:@"=s"];
if (sizeRange.location != NSNotFound) {
NSRange dashRange = [URLString rangeOfString:@"-" options:0 range:NSMakeRange(sizeRange.location, URLString.length - sizeRange.location)];
if (dashRange.location != NSNotFound) {
NSString *newURLString = [URLString stringByReplacingCharactersInRange:NSMakeRange(sizeRange.location + 2, dashRange.location - sizeRange.location - 2) withString:@"1024"];
NSURL *PFPURL = [NSURL URLWithString:newURLString];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:PFPURL]];
if (image) {
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
UIResponder *responder = self.nextResponder;
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Saved") firstResponder:responder] send];
}
}
}
}
}
}
%new
- (void)copyText:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = self.accessibilityLabel;
UIResponder *responder = self.nextResponder;
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:responder] send];
}
}
%new
- (void)saveImage:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
NSURL *imageURL = self.keepalive_node.URL;
if (imageURL) {
NSString *URLString = imageURL.absoluteString;
if (kFixAlbums && [URLString hasPrefix:@"https://yt3."]) {
URLString = [URLString stringByReplacingOccurrencesOfString:@"https://yt3." withString:@"https://yt4."];
}
NSURL *downloadURL = nil;
if ([URLString containsString:@"c-fcrop"]) {
NSRange croppedURL = [URLString rangeOfString:@"c-fcrop"];
if (croppedURL.location != NSNotFound) {
NSString *newURL = [URLString stringByReplacingOccurrencesOfString:[URLString substringFromIndex:croppedURL.location] withString:@"nd-v1"];
downloadURL = [NSURL URLWithString:newURL];
}
} else {
downloadURL = imageURL;
}
UIResponder *responder = self.nextResponder;
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:downloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
[request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil];
} completionHandler:^(BOOL success, NSError *error) {
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
}];
} else {
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
}
}] resume];
}
}
} }
%end %end
@@ -519,133 +751,56 @@
NSMutableArray <YTIPivotBarSupportedRenderers *> *items = [renderer itemsArray]; NSMutableArray <YTIPivotBarSupportedRenderers *> *items = [renderer itemsArray];
NSDictionary *identifiersToRemove = @{ NSDictionary *identifiersToRemove = @{
@"FEshorts": @(kRemoveShorts), @"FEshorts": @[@(kRemoveShorts), @(kReExplore)],
@"FEsubscriptions": @(kRemoveSubscriptions), @"FEsubscriptions": @[@(kRemoveSubscriptions)],
@"FEuploads": @(kRemoveUploads), @"FEuploads": @[@(kRemoveUploads)],
@"FElibrary": @(kRemoveLibrary) @"FElibrary": @[@(kRemoveLibrary)]
}; };
for (NSString *identifier in identifiersToRemove) { for (NSString *identifier in identifiersToRemove) {
BOOL shouldRemoveItem = [identifiersToRemove[identifier] boolValue]; NSArray *removeValues = identifiersToRemove[identifier];
NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { BOOL shouldRemoveItem = [removeValues containsObject:@(YES)];
NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderer, NSUInteger idx, BOOL *stop) {
if ([identifier isEqualToString:@"FEuploads"]) { if ([identifier isEqualToString:@"FEuploads"]) {
return shouldRemoveItem && [[[renderers pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier]; return shouldRemoveItem && [[[renderer pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier];
} else { } else {
return shouldRemoveItem && [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier]; return shouldRemoveItem && [[[renderer pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier];
} }
}]; }];
if (index != NSNotFound) { if (index != NSNotFound) {
[items removeObjectAtIndex:index]; [items removeObjectAtIndex:index];
} }
} %orig; }
NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]];
}];
if (exploreIndex == NSNotFound && (kReExplore || kAddExplore)) {
YTIPivotBarSupportedRenderers *exploreTab = [%c(YTIPivotBarRenderer) pivotSupportedRenderersWithBrowseId:[%c(YTIBrowseRequest) browseIDForExploreTab] title:LOC(@"Explore") iconType:292];
[items insertObject:exploreTab atIndex:1];
}
%orig;
} }
%end %end
// Replace Shorts with Explore tab (https://github.com/PoomSmart/YTReExplore) // Hide Tab Bar Indicators
static void replaceTab(YTIGuideResponse *response) { %hook YTPivotBarIndicatorView
NSMutableArray <YTIGuideResponseSupportedRenderers *> *renderers = [response itemsArray]; - (void)setFillColor:(id)arg1 { %orig(kRemoveIndicators ? [UIColor clearColor] : arg1); }
for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) { - (void)setBorderColor:(id)arg1 { %orig(kRemoveIndicators ? [UIColor clearColor] : arg1); }
YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer];
NSMutableArray <YTIPivotBarSupportedRenderers *> *items = [pivotBarRenderer itemsArray];
NSUInteger shortIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:@"FEshorts"];
}];
if (shortIndex != NSNotFound) {
[items removeObjectAtIndex:shortIndex];
NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]];
}];
if (exploreIndex == NSNotFound) {
YTIPivotBarSupportedRenderers *exploreTab = [%c(YTIPivotBarRenderer) pivotSupportedRenderersWithBrowseId:[%c(YTIBrowseRequest) browseIDForExploreTab] title:LOC(@"Explore") iconType:292];
[items insertObject:exploreTab atIndex:1];
}
}
}
}
%hook YTGuideServiceCoordinator
- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion {
if (kReExplore) replaceTab(response);
%orig(response, completion);
}
- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion {
if (kReExplore) replaceTab(response);
%orig(response, error, completion);
}
%end %end
// Hide Tab Labels // Hide Tab Labels
BOOL hasHomeBar = NO;
CGFloat pivotBarViewHeight;
%hook YTPivotBarView
- (void)layoutSubviews {
%orig;
pivotBarViewHeight = self.frame.size.height;
}
%end
%hook YTPivotBarItemView %hook YTPivotBarItemView
- (void)layoutSubviews { - (void)setRenderer:(YTIPivotBarRenderer *)renderer {
%orig; %orig;
CGFloat pivotBarAccessibilityControlWidth;
if (kRemoveLabels) { if (kRemoveLabels) {
for (UIView *subview in self.subviews) { [self.navigationButton setTitle:@"" forState:UIControlStateNormal];
if ([subview isKindOfClass:objc_lookUpClass("YTPivotBarItemViewAccessibilityControl")]) { [self.navigationButton setSizeWithPaddingAndInsets:NO];
pivotBarAccessibilityControlWidth = CGRectGetWidth(subview.frame);
break;
}
}
for (UIView *subview in self.subviews) {
if ([subview isKindOfClass:objc_lookUpClass("YTQTMButton")]) {
for (UIView *buttonSubview in subview.subviews) {
if ([buttonSubview isKindOfClass:[UILabel class]]) {
[buttonSubview removeFromSuperview];
break;
}
}
UIImageView *imageView = nil;
for (UIView *buttonSubview in subview.subviews) {
if ([buttonSubview isKindOfClass:[UIImageView class]]) {
imageView = (UIImageView *)buttonSubview;
break;
}
}
if (imageView) {
CGFloat imageViewHeight = imageView.image.size.height;
CGFloat imageViewWidth = imageView.image.size.width;
CGRect buttonFrame = subview.frame;
if (@available(iOS 13.0, *)) {
UIWindowScene *mainWindowScene = (UIWindowScene *)[[[UIApplication sharedApplication] connectedScenes] anyObject];
if (mainWindowScene) {
UIEdgeInsets safeAreaInsets = mainWindowScene.windows.firstObject.safeAreaInsets;
if (safeAreaInsets.bottom > 0) {
hasHomeBar = YES;
}
}
}
CGFloat yOffset = hasHomeBar ? 15.0 : 0.0;
CGFloat xOffset = (pivotBarAccessibilityControlWidth - imageViewWidth) / 2.0;
buttonFrame.origin.y = (pivotBarViewHeight - imageViewHeight - yOffset) / 2.0;
buttonFrame.origin.x = xOffset;
buttonFrame.size.height = imageViewHeight;
buttonFrame.size.width = imageViewWidth;
subview.frame = buttonFrame;
subview.bounds = CGRectMake(0, 0, imageViewWidth, imageViewHeight);
}
}
}
} }
} }
%end %end
@@ -654,21 +809,24 @@ CGFloat pivotBarViewHeight;
BOOL isTabSelected = NO; BOOL isTabSelected = NO;
%hook YTPivotBarViewController %hook YTPivotBarViewController
- (void)viewDidAppear:(BOOL)animated { - (void)viewDidAppear:(BOOL)animated {
%orig(); %orig;
if (!isTabSelected) { if (!isTabSelected && !kShortsOnlyMode) {
NSString *pivotIdentifier; NSString *pivotIdentifier;
switch (kPivotIndex) { switch (kPivotIndex) {
case 0: case 0:
pivotIdentifier = @"FEwhat_to_watch"; pivotIdentifier = @"FEwhat_to_watch";
break; break;
case 1: case 1:
pivotIdentifier = @"FEshorts"; pivotIdentifier = @"FEexplore";
break; break;
case 2: case 2:
pivotIdentifier = @"FEsubscriptions"; pivotIdentifier = @"FEshorts";
break; break;
case 3: case 3:
pivotIdentifier = @"FEsubscriptions";
break;
case 4:
pivotIdentifier = @"FElibrary"; pivotIdentifier = @"FElibrary";
break; break;
default: default:
@@ -677,6 +835,70 @@ BOOL isTabSelected = NO;
[self selectItemWithPivotIdentifier:pivotIdentifier]; [self selectItemWithPivotIdentifier:pivotIdentifier];
isTabSelected = YES; isTabSelected = YES;
} }
if (kShortsOnlyMode) {
[self selectItemWithPivotIdentifier:@"FEshorts"];
[self.parentViewController hidePivotBar];
}
}
%end
%hook YTTabsViewController
- (void)viewDidAppear:(BOOL)animated {
%orig;
if (kShortsOnlyMode) {
[self.navigationController.parentViewController hidePivotBar];
}
}
%end
%hook YTAppViewController
- (void)showPivotBar { if (!kShortsOnlyMode) %orig;} ;
%end
%hook YTReelWatchRootViewController
- (void)viewDidAppear:(BOOL)animated {
%orig;
if (kShortsOnlyMode) {
[self.navigationController.parentViewController hidePivotBar];
}
}
%end
// Disable Right-To-Left Formatting
%hook NSParagraphStyle
+ (NSWritingDirection)defaultWritingDirectionForLanguage:(id)lang { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; }
+ (NSWritingDirection)_defaultWritingDirection { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; }
%end
// Fix Albums For Russian Users
static NSURL *newCoverURL(NSURL *originalURL) {
NSDictionary <NSString *, NSString *> *hostsToReplace = @{
@"yt3.ggpht.com": @"yt4.ggpht.com",
@"yt3.googleusercontent.com": @"yt4.googleusercontent.com",
};
NSString *const replacement = hostsToReplace[originalURL.host];
if (kFixAlbums && replacement) {
NSURLComponents *components = [NSURLComponents componentsWithURL:originalURL resolvingAgainstBaseURL:NO];
components.host = replacement;
return components.URL;
}
return originalURL;
}
%hook ELMImageDownloader
- (id)downloadImageWithURL:(id)arg1 targetSize:(CGSize)arg2 callbackQueue:(id)arg3 downloadProgress:(id)arg4 completion:(id)arg5 {
return %orig(newCoverURL(arg1), arg2, arg3, arg4, arg5);
}
%end
// Not necessary but preferred
%hook ASBasicImageDownloader
- (id)downloadImageWithURL:(id)arg1 shouldRetry:(BOOL)arg2 callbackQueue:(id)arg3 downloadProgress:(id)arg4 completion:(id)arg5 {
return %orig(newCoverURL(arg1), arg2, arg3, arg4, arg5);
} }
%end %end
@@ -701,11 +923,15 @@ static void reloadPrefs() {
kNoDarkBg = [prefs[@"noDarkBg"] boolValue] ?: NO; kNoDarkBg = [prefs[@"noDarkBg"] boolValue] ?: NO;
kEndScreenCards = [prefs[@"endScreenCards"] boolValue] ?: NO; kEndScreenCards = [prefs[@"endScreenCards"] boolValue] ?: NO;
kNoFullscreenActions = [prefs[@"noFullscreenActions"] boolValue] ?: NO; kNoFullscreenActions = [prefs[@"noFullscreenActions"] boolValue] ?: NO;
kPersistentProgressBar = [prefs[@"persistentProgressBar"] boolValue] ?: NO;
kNoRelatedVids = [prefs[@"noRelatedVids"] boolValue] ?: NO; kNoRelatedVids = [prefs[@"noRelatedVids"] boolValue] ?: NO;
kNoPromotionCards = [prefs[@"noPromotionCards"] boolValue] ?: NO; kNoPromotionCards = [prefs[@"noPromotionCards"] boolValue] ?: NO;
kNoWatermarks = [prefs[@"noWatermarks"] boolValue] ?: NO; kNoWatermarks = [prefs[@"noWatermarks"] boolValue] ?: NO;
kMiniplayer = [prefs[@"miniplayer"] boolValue] ?: NO; kMiniplayer = [prefs[@"miniplayer"] boolValue] ?: NO;
kPortraitFullscreen = [prefs[@"portraitFullscreen"] boolValue] ?: NO;
kCopyWithTimestamp = [prefs[@"copyWithTimestamp"] boolValue] ?: NO;
kDisableAutoplay = [prefs[@"disableAutoplay"] boolValue] ?: NO; kDisableAutoplay = [prefs[@"disableAutoplay"] boolValue] ?: NO;
kDisableAutoCaptions = [prefs[@"disableAutoCaptions"] boolValue] ?: NO;
kNoContentWarning = [prefs[@"noContentWarning"] boolValue] ?: NO; kNoContentWarning = [prefs[@"noContentWarning"] boolValue] ?: NO;
kClassicQuality = [prefs[@"classicQuality"] boolValue] ?: NO; kClassicQuality = [prefs[@"classicQuality"] boolValue] ?: NO;
kExtraSpeedOptions = [prefs[@"extraSpeedOptions"] boolValue] ?: NO; kExtraSpeedOptions = [prefs[@"extraSpeedOptions"] boolValue] ?: NO;
@@ -716,8 +942,11 @@ static void reloadPrefs() {
kAutoFullscreen = [prefs[@"autoFullscreen"] boolValue] ?: NO; kAutoFullscreen = [prefs[@"autoFullscreen"] boolValue] ?: NO;
kExitFullscreen = [prefs[@"exitFullscreen"] boolValue] ?: NO; kExitFullscreen = [prefs[@"exitFullscreen"] boolValue] ?: NO;
kNoDoubleTapToSeek = [prefs[@"noDoubleTapToSeek"] boolValue] ?: NO; kNoDoubleTapToSeek = [prefs[@"noDoubleTapToSeek"] boolValue] ?: NO;
kShortsOnlyMode = [prefs[@"shortsOnlyMode"] boolValue] ?: NO;
kHideShorts = [prefs[@"hideShorts"] boolValue] ?: NO; kHideShorts = [prefs[@"hideShorts"] boolValue] ?: NO;
kShortsProgress = [prefs[@"shortsProgress"] boolValue] ?: NO; kShortsProgress = [prefs[@"shortsProgress"] boolValue] ?: NO;
kPinchToFullscreenShorts = [prefs[@"pinchToFullscreenShorts"] boolValue] ?: NO;
kShortsToRegular = [prefs[@"shortsToRegular"] boolValue] ?: NO;
kResumeShorts = [prefs[@"resumeShorts"] boolValue] ?: NO; kResumeShorts = [prefs[@"resumeShorts"] boolValue] ?: NO;
kHideShortsLogo = [prefs[@"hideShortsLogo"] boolValue] ?: NO; kHideShortsLogo = [prefs[@"hideShortsLogo"] boolValue] ?: NO;
kHideShortsSearch = [prefs[@"hideShortsSearch"] boolValue] ?: NO; kHideShortsSearch = [prefs[@"hideShortsSearch"] boolValue] ?: NO;
@@ -731,18 +960,31 @@ static void reloadPrefs() {
kHideShortsShare = [prefs[@"hideShortsShare"] boolValue] ?: NO; kHideShortsShare = [prefs[@"hideShortsShare"] boolValue] ?: NO;
kHideShortsAvatars = [prefs[@"hideShortsAvatars"] boolValue] ?: NO; kHideShortsAvatars = [prefs[@"hideShortsAvatars"] boolValue] ?: NO;
kHideShortsThanks = [prefs[@"hideShortsThanks"] boolValue] ?: NO; kHideShortsThanks = [prefs[@"hideShortsThanks"] boolValue] ?: NO;
kHideShortsSource = [prefs[@"hideShortsSource"] boolValue] ?: NO;
kHideShortsChannelName = [prefs[@"hideShortsChannelName"] boolValue] ?: NO; kHideShortsChannelName = [prefs[@"hideShortsChannelName"] boolValue] ?: NO;
kHideShortsDescription = [prefs[@"hideShortsDescription"] boolValue] ?: NO; kHideShortsDescription = [prefs[@"hideShortsDescription"] boolValue] ?: NO;
kHideShortsAudioTrack = [prefs[@"hideShortsAudioTrack"] boolValue] ?: NO; kHideShortsAudioTrack = [prefs[@"hideShortsAudioTrack"] boolValue] ?: NO;
kHideShortsPromoCards = [prefs[@"hideShortsPromoCards"] boolValue] ?: NO; kHideShortsPromoCards = [prefs[@"hideShortsPromoCards"] boolValue] ?: NO;
kRemoveLabels = [prefs[@"removeLabels"] boolValue] ?: NO; kRemoveLabels = [prefs[@"removeLabels"] boolValue] ?: NO;
kRemoveIndicators = [prefs[@"removeIndicators"] boolValue] ?: NO;
kReExplore = [prefs[@"reExplore"] boolValue] ?: NO; kReExplore = [prefs[@"reExplore"] boolValue] ?: NO;
kAddExplore = [prefs[@"addExplore"] boolValue] ?: NO;
kRemoveShorts = [prefs[@"removeShorts"] boolValue] ?: NO; kRemoveShorts = [prefs[@"removeShorts"] boolValue] ?: NO;
kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO; kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO;
kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES; kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES;
kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO; kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO;
kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO;
kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO;
kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO;
kFixAlbums = [prefs[@"fixAlbums"] boolValue] ?: NO;
kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO; kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO;
kNoContinueWatching = [prefs[@"noContinueWatching"] 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; kPivotIndex = (prefs[@"pivotIndex"] != nil) ? [prefs[@"pivotIndex"] intValue] : 0;
kAdvancedMode = [prefs[@"advancedMode"] boolValue] ?: NO; kAdvancedMode = [prefs[@"advancedMode"] boolValue] ?: NO;
kAdvancedModeReminder = [prefs[@"advancedModeReminder"] boolValue] ?: NO; kAdvancedModeReminder = [prefs[@"advancedModeReminder"] boolValue] ?: NO;
@@ -765,11 +1007,15 @@ static void reloadPrefs() {
@"noDarkBg" : @(kNoDarkBg), @"noDarkBg" : @(kNoDarkBg),
@"endScreenCards" : @(kEndScreenCards), @"endScreenCards" : @(kEndScreenCards),
@"noFullscreenActions" : @(kNoFullscreenActions), @"noFullscreenActions" : @(kNoFullscreenActions),
@"persistentProgressBar" : @(kPersistentProgressBar),
@"noRelatedVids" : @(kNoRelatedVids), @"noRelatedVids" : @(kNoRelatedVids),
@"noPromotionCards" : @(kNoPromotionCards), @"noPromotionCards" : @(kNoPromotionCards),
@"noWatermarks" : @(kNoWatermarks), @"noWatermarks" : @(kNoWatermarks),
@"miniplayer" : @(kMiniplayer), @"miniplayer" : @(kMiniplayer),
@"portraitFullscreen" : @(kPortraitFullscreen),
@"copyWithTimestamp" : @(kCopyWithTimestamp),
@"disableAutoplay" : @(kDisableAutoplay), @"disableAutoplay" : @(kDisableAutoplay),
@"disableAutoCaptions" : @(kDisableAutoCaptions),
@"noContentWarning" : @(kNoContentWarning), @"noContentWarning" : @(kNoContentWarning),
@"classicQuality" : @(kClassicQuality), @"classicQuality" : @(kClassicQuality),
@"extraSpeedOptions" : @(kExtraSpeedOptions), @"extraSpeedOptions" : @(kExtraSpeedOptions),
@@ -780,8 +1026,11 @@ static void reloadPrefs() {
@"autoFullscreen" : @(kAutoFullscreen), @"autoFullscreen" : @(kAutoFullscreen),
@"exitFullscreen" : @(kExitFullscreen), @"exitFullscreen" : @(kExitFullscreen),
@"noDoubleTapToSeek" : @(kNoDoubleTapToSeek), @"noDoubleTapToSeek" : @(kNoDoubleTapToSeek),
@"shortsOnlyMode" : @(kShortsOnlyMode),
@"hideShorts" : @(kHideShorts), @"hideShorts" : @(kHideShorts),
@"shortsProgress" : @(kShortsProgress), @"shortsProgress" : @(kShortsProgress),
@"pinchToFullscreenShorts" : @(kPinchToFullscreenShorts),
@"shortsToRegular" : @(kShortsToRegular),
@"resumeShorts" : @(kResumeShorts), @"resumeShorts" : @(kResumeShorts),
@"hideShortsLogo" : @(kHideShortsLogo), @"hideShortsLogo" : @(kHideShortsLogo),
@"hideShortsSearch" : @(kHideShortsSearch), @"hideShortsSearch" : @(kHideShortsSearch),
@@ -795,18 +1044,31 @@ static void reloadPrefs() {
@"hideShortsShare" : @(kHideShortsShare), @"hideShortsShare" : @(kHideShortsShare),
@"hideShortsAvatars" : @(kHideShortsAvatars), @"hideShortsAvatars" : @(kHideShortsAvatars),
@"hideShortsThanks" : @(kHideShortsThanks), @"hideShortsThanks" : @(kHideShortsThanks),
@"hideShortsSource" : @(kHideShortsSource),
@"hideShortsChannelName" : @(kHideShortsChannelName), @"hideShortsChannelName" : @(kHideShortsChannelName),
@"hideShortsDescription" : @(kHideShortsDescription), @"hideShortsDescription" : @(kHideShortsDescription),
@"hideShortsAudioTrack" : @(kHideShortsAudioTrack), @"hideShortsAudioTrack" : @(kHideShortsAudioTrack),
@"hideShortsPromoCards" : @(kHideShortsPromoCards), @"hideShortsPromoCards" : @(kHideShortsPromoCards),
@"removeLabels" : @(kRemoveLabels), @"removeLabels" : @(kRemoveLabels),
@"removeIndicators" : @(kRemoveIndicators),
@"reExplore" : @(kReExplore), @"reExplore" : @(kReExplore),
@"addExplore" : @(kAddExplore),
@"removeShorts" : @(kRemoveShorts), @"removeShorts" : @(kRemoveShorts),
@"removeSubscriptions" : @(kRemoveSubscriptions), @"removeSubscriptions" : @(kRemoveSubscriptions),
@"removeUploads" : @(kRemoveUploads), @"removeUploads" : @(kRemoveUploads),
@"removeLibrary" : @(kRemoveLibrary), @"removeLibrary" : @(kRemoveLibrary),
@"copyPostText" : @(kCopyPostText),
@"savePostImage" : @(kSavePostImage),
@"saveProfilePhoto" : @(kSaveProfilePhoto),
@"fixAlbums" : @(kFixAlbums),
@"removePlayNext" : @(kRemovePlayNext), @"removePlayNext" : @(kRemovePlayNext),
@"noContinueWatching" : @(kNoContinueWatching), @"noContinueWatching" : @(kNoContinueWatching),
@"noSearchHistory" : @(kNoSearchHistory),
@"noRelatedWatchNexts" : @(kNoRelatedWatchNexts),
@"stickSortComments" : @(kStickSortComments),
@"hideSortComments" : @(kHideSortComments),
@"playlistOldMinibar" : @(kPlaylistOldMinibar),
@"disableRTL" : @(kDisableRTL),
@"pivotIndex" : @(kPivotIndex), @"pivotIndex" : @(kPivotIndex),
@"advancedMode" : @(kAdvancedMode), @"advancedMode" : @(kAdvancedMode),
@"advancedModeReminder" : @(kAdvancedModeReminder) @"advancedModeReminder" : @(kAdvancedModeReminder)
@@ -820,6 +1082,15 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin
} }
%ctor { %ctor {
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"];
NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:path];
if ([prefs[@"shortsOnlyMode"] boolValue] && ([prefs[@"removeShorts"] boolValue] || [prefs[@"reExplore"] boolValue])) {
[prefs setObject:@NO forKey:@"removeShorts"];
[prefs setObject:@NO forKey:@"reExplore"];
[prefs writeToFile:path atomically:NO];
}
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.dvntm.ytlite.prefschanged"), NULL, CFNotificationSuspensionBehaviorCoalesce); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.dvntm.ytlite.prefschanged"), NULL, CFNotificationSuspensionBehaviorCoalesce);
reloadPrefs(); reloadPrefs();
} }
@@ -37,6 +37,8 @@
"NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos."; "NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos.";
"NoFullscreenActions" = "Disable fullscreen actions"; "NoFullscreenActions" = "Disable fullscreen actions";
"NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode."; "NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode.";
"PersistentProgressBar" = "Persistent progress bar";
"PersistentProgressBarDesc" = "Always shows progress bar in the player.";
"NoRelatedVids" = "No related videos in overlay"; "NoRelatedVids" = "No related videos in overlay";
"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up."; "NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up.";
"NoPromotionCards" = "Hide Paid Promotion cards"; "NoPromotionCards" = "Hide Paid Promotion cards";
@@ -47,8 +49,14 @@
"Player" = "Player"; "Player" = "Player";
"Miniplayer" = "Enable mini 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."; "MiniplayerDesc" = "Enables the mini player for videos that were not originally designed for it, such as videos targeted for children.";
"PortraitFullscreen" = "Portrait fullscreen mode";
"PortraitFullscreenDesc" = "Enables portrait fullscreen mode support.";
"CopyWithTimestamp" = "Copy timestamped links";
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
"DisableAutoplay" = "Disable Autoplay videos"; "DisableAutoplay" = "Disable Autoplay videos";
"DisableAutoplayDesc" = "Prevents video playback after opening."; "DisableAutoplayDesc" = "Prevents video playback after opening.";
"DisableAutoCaptions" = "Disable auto captions";
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
"NoContentWarning" = "Skip content warning"; "NoContentWarning" = "Skip content warning";
"NoContentWarningDesc" = "Skips sensitive content warning message."; "NoContentWarningDesc" = "Skips sensitive content warning message.";
"ClassicQuality" = "Classic video quality"; "ClassicQuality" = "Classic video quality";
@@ -73,22 +81,32 @@
"Tabbar" = "Tab bar"; "Tabbar" = "Tab bar";
"RemoveLabels" = "Remove labels"; "RemoveLabels" = "Remove labels";
"RemoveLabelsDesc" = "Removes tab labels."; "RemoveLabelsDesc" = "Removes tab labels.";
"RemoveIndicators" = "Remove indicators";
"RemoveIndicatorsDesc" = "Removes tab indicators.";
"ReExplore" = "Replace Shorts tab with Explore tab"; "ReExplore" = "Replace Shorts tab with Explore tab";
"ReExploreDesc" = "Shows Explore tab instead of Shorts tab as on old YouTube versions."; "ReExploreDesc" = "Shows Explore tab instead of Shorts tab as on old YouTube versions.";
"AddExplore" = "Add Explore tab";
"AddExploreDesc" = "Adds Explore tab to the Tab bar.";
"HideShortsTab" = "Hide Shorts tab"; "HideShortsTab" = "Hide Shorts tab";
"HideShortsTabDesc" = "Hides Shorts tab from the Tab bar"; "HideShortsTabDesc" = "Hides Shorts tab from the Tab bar.";
"HideSubscriptionsTab" = "Hide Subscriptions tab"; "HideSubscriptionsTab" = "Hide Subscriptions tab";
"HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar"; "HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar.";
"HideUploadButton" = "Hide Upload button"; "HideUploadButton" = "Hide Upload button";
"HideUploadButtonDesc" = "Hides Upload button from the Tab bar"; "HideUploadButtonDesc" = "Hides Upload button from the Tab bar.";
"HideLibraryTab" = "Hide Library tab"; "HideLibraryTab" = "Hide Library tab";
"HideLibraryTabDesc" = "Hides Library tab from the Tab bar"; "HideLibraryTabDesc" = "Hides Library tab from the Tab bar.";
"Shorts" = "Shorts"; "Shorts" = "Shorts";
"ShortsOnlyMode" = "Shorts Only Mode";
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
"HideShorts" = "Hide Shorts videos"; "HideShorts" = "Hide Shorts videos";
"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)"; "HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)";
"ShortsProgress" = "Enable progress bar"; "ShortsProgress" = "Enable progress bar";
"ShortsProgressDesc" = "Displays progress bar in the Shorts overlay."; "ShortsProgressDesc" = "Displays progress bar in the Shorts overlay.";
"PinchToFullscreenShorts" = "Pinch to Fullscreen";
"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode.";
"ShortsToRegular" = "Shorts to regular videos";
"ShortsToRegularDesc" = "Opens Shorts videos as regular videos.";
"ResumeShorts" = "Don't start from Shorts tab"; "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."; "ResumeShortsDesc" = "Prevents starting from Shorts videos at the opening app, which happens if YouTube was closed while watching Shorts.";
"HideShortsLogo" = "Hide Shorts logo"; "HideShortsLogo" = "Hide Shorts logo";
@@ -115,6 +133,8 @@
"HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner."; "HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner.";
"HideShortsThanks" = "Hide Superthanks button"; "HideShortsThanks" = "Hide Superthanks button";
"HideShortsThanksDesc" = "Hides Superthanks (Donate) button from the Shorts overlay."; "HideShortsThanksDesc" = "Hides Superthanks (Donate) button from the Shorts overlay.";
"HideShortsSource" = "Hide Shorts Source";
"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name.";
"HideShortsChannelName" = "Hide Channel name"; "HideShortsChannelName" = "Hide Channel name";
"HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay."; "HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay.";
"HideShortsDescription" = "Hide Description"; "HideShortsDescription" = "Hide Description";
@@ -123,10 +143,30 @@
"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description."; "HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description.";
"Other" = "Other"; "Other" = "Other";
"CopyPostText" = "Copy community posts text";
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
"SavePostImage" = "Save image from community posts";
"SavePostImageDesc" = "Saves community post image to the Photos app by long tap.";
"SaveProfilePhoto" = "Save profile picture";
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
"FixAlbums" = "Fix covers";
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
"RemovePlayNext" = "Remove \"Play next in queue\""; "RemovePlayNext" = "Remove \"Play next in queue\"";
"RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu."; "RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu.";
"NoContinueWatching" = "Remove \"Continue watching\""; "NoContinueWatching" = "Remove \"Continue watching\"";
"NoContinueWatchingDesc" = "Removes the \"Continue watching\" section containing unfinished videos from the Home page."; "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"; "Startup" = "Startup page";
"Home" = "Home"; "Home" = "Home";
@@ -145,9 +185,16 @@
"ChineseTraditional" = "Chinese (Traditional) localization"; "ChineseTraditional" = "Chinese (Traditional) localization";
"French" = "French localization"; "French" = "French localization";
"Spanish" = "Spanish localization"; "Spanish" = "Spanish localization";
"Japanese" = "Japanese localization";
"Advanced" = "Advanced mode"; "Advanced" = "Advanced mode";
"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" = "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 → %@ → %@ → %@.";
"ResetSettings" = "Reset YTLite settings"; "ResetSettings" = "Reset YTLite settings";
"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?"; "ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?";
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off";
"Yes" = "Yes"; "Yes" = "Yes";
"No" = "No"; "No" = "No";
"Copied" = "Copied to clipboard";
"Saved" = "Saved to Photos";
"Error" = "Error";
@@ -37,6 +37,8 @@
"NoEndScreenCardsDesc" = "Oculta las tarjetas emergentes de fin de pantalla (miniaturas) al final de los vídeos."; "NoEndScreenCardsDesc" = "Oculta las tarjetas emergentes de fin de pantalla (miniaturas) al final de los vídeos.";
"NoFullscreenActions" = "Desactivar acciones en pantalla completa"; "NoFullscreenActions" = "Desactivar acciones en pantalla completa";
"NoFullscreenActionsDesc" = "Desactiva el panel de acciones en el modo de pantalla completa."; "NoFullscreenActionsDesc" = "Desactiva el panel de acciones en el modo de pantalla completa.";
"PersistentProgressBar" = "Barra de progreso persistente";
"PersistentProgressBarDesc" = "Muestra siempre la barra de progreso en el reproductor.";
"NoRelatedVids" = "Sin vídeos relacionados en la superposición"; "NoRelatedVids" = "Sin vídeos relacionados en la superposición";
"NoRelatedVidsDesc" = "Elimina los vídeos relacionados que se muestran en la superposición al deslizar hacia arriba."; "NoRelatedVidsDesc" = "Elimina los vídeos relacionados que se muestran en la superposición al deslizar hacia arriba.";
"NoPromotionCards" = "Ocultar tarjetas de promoción pagada"; "NoPromotionCards" = "Ocultar tarjetas de promoción pagada";
@@ -47,8 +49,14 @@
"Player" = "Reproductor"; "Player" = "Reproductor";
"Miniplayer" = "Activar mini reproductor"; "Miniplayer" = "Activar mini reproductor";
"MiniplayerDesc" = "Activa el mini reproductor para vídeos que no fueron diseñados originalmente para ello, como los vídeos dirigidos a niños."; "MiniplayerDesc" = "Activa el mini reproductor para vídeos que no fueron diseñados originalmente para ello, como los vídeos dirigidos a niños.";
"PortraitFullscreen" = "Modo de pantalla completa vertical";
"PortraitFullscreenDesc" = "Activa el modo de pantalla completa vertical.";
"CopyWithTimestamp" = "Copiar enlaces con marca de tiempo";
"CopyWithTimestampDesc" = "Permite copiar el enlace con marca de tiempo en el portapapeles pulsando el botón de pausa.";
"DisableAutoplay" = "Desactivar reproducción automática"; "DisableAutoplay" = "Desactivar reproducción automática";
"DisableAutoplayDesc" = "Evita la reproducción automática de vídeos después de abrirlos."; "DisableAutoplayDesc" = "Evita la reproducción automática de vídeos después de abrirlos.";
"DisableAutoCaptions" = "Desactivar subtítulos automáticos";
"DisableAutoCaptionsDesc" = "Evita la activación automática de subtítulos.";
"NoContentWarning" = "Omitir advertencia de contenido"; "NoContentWarning" = "Omitir advertencia de contenido";
"NoContentWarningDesc" = "Omite el mensaje de advertencia de contenido sensible."; "NoContentWarningDesc" = "Omite el mensaje de advertencia de contenido sensible.";
"ClassicQuality" = "Calidad de vídeo clásica"; "ClassicQuality" = "Calidad de vídeo clásica";
@@ -73,8 +81,12 @@
"Tabbar" = "Barra de pestañas"; "Tabbar" = "Barra de pestañas";
"RemoveLabels" = "Eliminar etiquetas"; "RemoveLabels" = "Eliminar etiquetas";
"RemoveLabelsDesc" = "Elimina las etiquetas de las pestañas."; "RemoveLabelsDesc" = "Elimina las etiquetas de las pestañas.";
"RemoveIndicators" = "Eliminar indicadores";
"RemoveIndicatorsDesc" = "Elimina los indicadores de pestaña.";
"ReExplore" = "Reemplazar pestaña Shorts con pestaña Explorar"; "ReExplore" = "Reemplazar pestaña Shorts con pestaña Explorar";
"ReExploreDesc" = "Muestra la pestaña Explorar en lugar de la pestaña Shorts como en versiones antiguas de YouTube."; "ReExploreDesc" = "Muestra la pestaña Explorar en lugar de la pestaña Shorts como en versiones antiguas de YouTube.";
"AddExplore" = "Añadir pestaña Explorar";
"AddExploreDesc" = "Añade la pestaña Explorar a la barra de pestañas.";
"HideShortsTab" = "Ocultar pestaña Shorts"; "HideShortsTab" = "Ocultar pestaña Shorts";
"HideShortsTabDesc" = "Oculta la pestaña Shorts de la barra de pestañas."; "HideShortsTabDesc" = "Oculta la pestaña Shorts de la barra de pestañas.";
"HideSubscriptionsTab" = "Ocultar pestaña Suscripciones"; "HideSubscriptionsTab" = "Ocultar pestaña Suscripciones";
@@ -85,10 +97,16 @@
"HideLibraryTabDesc" = "Oculta la pestaña Biblioteca de la barra de pestañas."; "HideLibraryTabDesc" = "Oculta la pestaña Biblioteca de la barra de pestañas.";
"Shorts" = "Shorts"; "Shorts" = "Shorts";
"ShortsOnlyMode" = "Modo sólo Shorts";
"ShortsOnlyModeDesc" = "Limita la funcionalidad de YouTube únicamente a la visualización de Shorts.";
"HideShorts" = "Ocultar vídeos Shorts"; "HideShorts" = "Ocultar vídeos Shorts";
"HideShortsDesc" = "Oculta los vídeos Shorts de la página de inicio, Recomendados, etc. (No se aplica al historial de reproducciones)"; "HideShortsDesc" = "Oculta los vídeos Shorts de la página de inicio, Recomendados, etc. (No se aplica al historial de reproducciones)";
"ShortsProgress" = "Activar barra de progreso"; "ShortsProgress" = "Activar barra de progreso";
"ShortsProgressDesc" = "Muestra una barra de progreso en la superposición de Shorts."; "ShortsProgressDesc" = "Muestra una barra de progreso en la superposición de Shorts.";
"PinchToFullscreenShorts" = "Pellizcar para pantalla completa";
"PinchToFullscreenShortsDesc" = "Gestiona la visibilidad de la superposición con gestos de pellizcar para acercar y pellizcar para alejar, mostrando Shorts en modo de pantalla completa.";
"ShortsToRegular" = "De Shorts a vídeos normales";
"ShortsToRegularDesc" = "Abre los Shorts como vídeos normales.";
"ResumeShorts" = "No empezar desde la pestaña Shorts"; "ResumeShorts" = "No empezar desde la pestaña Shorts";
"ResumeShortsDesc" = "Evita empezar desde los vídeos Shorts al abrir la aplicación, lo cual ocurre si YouTube se cerró mientras se veían Shorts."; "ResumeShortsDesc" = "Evita empezar desde los vídeos Shorts al abrir la aplicación, lo cual ocurre si YouTube se cerró mientras se veían Shorts.";
"HideShortsLogo" = "Ocultar el logo de Shorts"; "HideShortsLogo" = "Ocultar el logo de Shorts";
@@ -115,6 +133,8 @@
"HideShortsAvatarsDesc" = "Oculta la imagen de perfil en la esquina inferior derecha."; "HideShortsAvatarsDesc" = "Oculta la imagen de perfil en la esquina inferior derecha.";
"HideShortsThanks" = "Ocultar botón de Supergracias"; "HideShortsThanks" = "Ocultar botón de Supergracias";
"HideShortsThanksDesc" = "Oculta el botón de Supergracias (Donar) en la superposición de Shorts."; "HideShortsThanksDesc" = "Oculta el botón de Supergracias (Donar) en la superposición de Shorts.";
"HideShortsSource" = "Ocultar fuente de Shorts";
"HideShortsSourceDesc" = "Oculta las fuentes Shorts bajo el nombre del canal.";
"HideShortsChannelName" = "Ocultar nombre del canal"; "HideShortsChannelName" = "Ocultar nombre del canal";
"HideShortsChannelNameDesc" = "Oculta el nombre del canal y el botón de Suscribirse en la superposición de Shorts."; "HideShortsChannelNameDesc" = "Oculta el nombre del canal y el botón de Suscribirse en la superposición de Shorts.";
"HideShortsDescription" = "Ocultar descripción"; "HideShortsDescription" = "Ocultar descripción";
@@ -123,10 +143,30 @@
"HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts."; "HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts.";
"Other" = "Otro"; "Other" = "Otro";
"CopyPostText" = "Copia el texto de las publicaciones de la comunidad";
"CopyPostTextDesc" = "Copia el texto de los posts de la comunidad al portapapeles mediante pulsación larga";
"SavePostImage" = "Guardar imagen de las entradas de la comunidad";
"SavePostImageDesc" = "Guarda la imagen de las publicaciones de la comunidad en la aplicación Fotos con un toque prolongado";
"SaveProfilePhoto" = "Guardar foto de perfil";
"SaveProfilePhotoDesc" = "Guarda la imagen de perfil en la aplicación Fotos con un toque prolongado";
"FixAlbums" = "Arreglar portadas";
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\""; "RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
"RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú."; "RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú.";
"NoContinueWatching" = "Eliminar \"Continuar viendo\""; "NoContinueWatching" = "Eliminar \"Continuar viendo\"";
"NoContinueWatchingDesc" = "Elimina la sección \"Continuar viendo\" que contiene videos sin terminar de la página de inicio."; "NoContinueWatchingDesc" = "Elimina la sección \"Continuar viendo\" que contiene videos sin terminar de la página de inicio.";
"NoSearchHistory" = "Ocultar el historial de búsqueda";
"NoSearchHistoryDesc" = "Oculta visualmente el historial de búsqueda y las sugerencias. Nota: El historial de búsqueda seguirá siendo accesible en otros clientes de YouTube.";
"NoRelatedWatchNexts" = "Ocultar todos los vídeos del reproductor";
"NoRelatedWatchNextsDesc" = "Oculta todos los vídeos debajo del reproductor, dejando sólo la información del vídeo y la sección de comentarios.";
"StickSortComments" = "Pegar cabecera de comentarios";
"StickSortCommentsDesc" = "Los pines ordenan la cabecera de comentarios (Arriba, Más reciente) para que no desaparezca al desplazarse.";
"HideSortComments" = "Ocultar cabecera de comentarios";
"HideSortCommentsDesc" = "Oculta la cabecera de los comentarios de ordenación (Top, Newest) para que nunca aparezca.";
"PlaylistOldMinibar" = "Lista de reproducción antigua minibar";
"PlaylistOldMinibarDesc" = "Sustituye el nuevo panel flotante de listas de reproducción por el antiguo.";
"DisableRTL" = "Desactivar el formato RTL";
"DisableRTLDesc" = "Muestra forzosamente el texto en formato de izquierda a derecha (LTR) para los idiomas que se muestran inicialmente en formato de derecha a izquierda (RTL).";
"Startup" = "Página de inicio"; "Startup" = "Página de inicio";
"Home" = "Inicio"; "Home" = "Inicio";
@@ -141,13 +181,20 @@
"About" = "Acerca de"; "About" = "Acerca de";
"Credits" = "Créditos"; "Credits" = "Créditos";
"Developer" = "Desarrollador de YTLite"; "Developer" = "Desarrollador de YTLite";
"ChineseSimplified" = "Chinese (Simplified) localization"; "ChineseSimplified" = "Traducción: Chino (Simplificado)";
"ChineseTraditional" = "Chinese (Traditional) localization"; "ChineseTraditional" = "Traducción: Chino (Tradicional)";
"French" = "French localization"; "French" = "Traducción: Frances";
"Spanish" = "Spanish localization"; "Spanish" = "Traducción: Español";
"Japanese" = "Traducción: Japonés";
"Advanced" = "Modo avanzado"; "Advanced" = "Modo avanzado";
"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" = "¿Desea activar el modo Avanzado para YTLite?\n\nEste modo ofrece más de 50 opciones adicionales para personalizar y optimizar tu experiencia en YouTube. Puedes activarlo/desactivarlo más tarde desde Ajustes → %@ → %@ → %@.";
"ResetSettings" = "Restablecer configuración de YTLite"; "ResetSettings" = "Restablecer configuración de YTLite";
"ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?"; "ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?";
"ShortsOnlyWarning" = "¿Estás seguro de que quieres activar este modo?\n\nEn este modo, sólo podrás ver Shorts y no podrás hacer nada más.\n\nPuedes desactivar el modo sólo Shorts realizando una pulsación larga con dos dedos en el reproductor de Shorts."
"ShortsModeTurnedOff" = "Se ha desactivado el modo de sólo Shorts";
"Yes" = "Sí"; "Yes" = "Sí";
"No" = "No"; "No" = "No";
"Copied" = "Copiado al portapapeles";
"Saved" = "Guardado en Fotos";
"Error" = "Error";
@@ -21,8 +21,8 @@
"NoYTLogoDesc" = "Supprime le logo YouTube dans la barre de navigation."; "NoYTLogoDesc" = "Supprime le logo YouTube dans la barre de navigation.";
"Overlay" = "Overlay"; "Overlay" = "Overlay";
"HideAutoplay" = "Masquer l'interrupteur de lecture automatique"; "HideAutoplay" = "Masquer le toggle de lecture automatique";
"HideAutoplayDesc" = "Masque l'interrupteur de lecture automatique de l'overlay."; "HideAutoplayDesc" = "Masque le toggle de lecture automatique de l'overlay.";
"HideSubs" = "Masquer le bouton Sous-titres"; "HideSubs" = "Masquer le bouton Sous-titres";
"HideSubsDesc" = "Masque le bouton Sous-titres de l'overlay."; "HideSubsDesc" = "Masque le bouton Sous-titres de l'overlay.";
"NoHUDMsgs" = "Masquer les messages HUD"; "NoHUDMsgs" = "Masquer les messages HUD";
@@ -37,6 +37,8 @@
"NoEndScreenCardsDesc" = "Masque les cartes de fin d'écran (vignettes) à la fin des vidéos."; "NoEndScreenCardsDesc" = "Masque les cartes de fin d'écran (vignettes) à la fin des vidéos.";
"NoFullscreenActions" = "Désactiver les actions en plein écran"; "NoFullscreenActions" = "Désactiver les actions en plein écran";
"NoFullscreenActionsDesc" = "Désactive le panneau d'actions en mode plein écran."; "NoFullscreenActionsDesc" = "Désactive le panneau d'actions en mode plein écran.";
"PersistentProgressBar" = "Barre de progression persistante";
"PersistentProgressBarDesc" = " Affiche toujours la barre de progression dans le lecteur ";
"NoRelatedVids" = "Pas de vidéos associées dans l'overlay"; "NoRelatedVids" = "Pas de vidéos associées dans l'overlay";
"NoRelatedVidsDesc" = "Supprime les vidéos associées affichées dans l'overlay en faisant glisser vers le haut."; "NoRelatedVidsDesc" = "Supprime les vidéos associées affichées dans l'overlay en faisant glisser vers le haut.";
"NoPromotionCards" = "Masquer les cartes de promotion payante"; "NoPromotionCards" = "Masquer les cartes de promotion payante";
@@ -47,16 +49,20 @@
"Player" = "Lecteur"; "Player" = "Lecteur";
"Miniplayer" = "Activer le mini-lecteur"; "Miniplayer" = "Activer le mini-lecteur";
"MiniplayerDesc" = "Active le mini-lecteur pour les vidéos qui n'étaient pas initialement conçues pour cela, comme les vidéos destinées aux enfants."; "MiniplayerDesc" = "Active le mini-lecteur pour les vidéos qui n'étaient pas initialement conçues pour cela, comme les vidéos destinées aux enfants.";
"PortraitFullscreen" = "Mode plein écran en portrait";
"PortraitFullscreenDesc" = "Active la prise en charge du mode plein écran en portrait.";
"CopyWithTimestamp" = "Copier les liens avec horodatage";
"CopyWithTimestampDesc" = "Permet de copier les liens avec horodatage dans le presse-papiers en appuyant sur le bouton de pause.";
"DisableAutoplay" = "Désactiver la lecture automatique des vidéos"; "DisableAutoplay" = "Désactiver la lecture automatique des vidéos";
"DisableAutoplayDesc" = "Empêche la lecture des vidéos après ouverture."; "DisableAutoplayDesc" = "Empêche la lecture des vidéos après ouverture.";
"DisableAutoCaptions" = "Désactiver les sous-titres automatiques";
"DisableAutoCaptionsDesc" = "Empêche l'activation des sous-titres automatique.";
"NoContentWarning" = "Passer l'avertissement de contenu"; "NoContentWarning" = "Passer l'avertissement de contenu";
"NoContentWarningDesc" = "Ignore le message d'avertissement de contenu sensible."; "NoContentWarningDesc" = "Ignore le message d'avertissement de contenu sensible.";
"ClassicQuality" = "Qualité vidéo classique"; "ClassicQuality" = "Qualité vidéo classique";
"ClassicQualityDesc" = "Rétablit le menu de sélection de la qualité vidéo classique."; "ClassicQualityDesc" = "Rétablit le menu de sélection de la qualité vidéo classique.";
"ExtraSpeedOptions"= "Options de vitesse supplémentaires"; "ExtraSpeedOptions" = "Options de vitesse supplémentaires";
"ExtraSpeedOptionsDesc" = "Ajoute des options de vitesse de lecture supplémentaires au menu de vitesse."; "ExtraSpeedOptionsDesc" = "Ajoute des options de vitesse de lecture supplémentaires au menu de vitesse.";
"DontSnap2Chapter" = "Disable snap to chapter";
"DontSnap2ChapterDesc" = "Disables skipping to the next episode by double-tap gesture.";
"DontSnap2Chapter" = "Désactiver la coupure au chapitre"; "DontSnap2Chapter" = "Désactiver la coupure au chapitre";
"DontSnap2ChapterDesc" = "Désactive le passage à l'épisode suivant en double tapant."; "DontSnap2ChapterDesc" = "Désactive le passage à l'épisode suivant en double tapant.";
"RedProgressBar" = "Barre de progression rouge"; "RedProgressBar" = "Barre de progression rouge";
@@ -75,8 +81,12 @@
"Tabbar" = "Barre d'onglets"; "Tabbar" = "Barre d'onglets";
"RemoveLabels" = "Supprimer les sous-titres"; "RemoveLabels" = "Supprimer les sous-titres";
"RemoveLabelsDesc" = "Supprime les sous-titres des onglets."; "RemoveLabelsDesc" = "Supprime les sous-titres des onglets.";
"RemoveIndicators" = "Supprimer les indicateurs";
"RemoveIndicatorsDesc" = "Supprime les indicateurs d'onglets.";
"ReExplore" = "Remplacer l'onglet Shorts par l'onglet Explorer"; "ReExplore" = "Remplacer l'onglet Shorts par l'onglet Explorer";
"ReExploreDesc" = "Affiche l'onglet Explorer à la place de l'onglet Shorts comme dans les anciennes versions de YouTube."; "ReExploreDesc" = "Affiche l'onglet Explorer à la place de l'onglet Shorts comme dans les anciennes versions de YouTube.";
"AddExplore" = "Ajouter l'onglet Explorer";
"AddExploreDesc" = "Ajoute l'onglet Explorer à la barre d'onglets.";
"HideShortsTab" = "Masquer l'onglet Shorts"; "HideShortsTab" = "Masquer l'onglet Shorts";
"HideShortsTabDesc" = "Masque l'onglet Shorts de la barre d'onglets"; "HideShortsTabDesc" = "Masque l'onglet Shorts de la barre d'onglets";
"HideSubscriptionsTab" = "Masquer l'onglet Abonnements"; "HideSubscriptionsTab" = "Masquer l'onglet Abonnements";
@@ -87,10 +97,16 @@
"HideLibraryTabDesc" = "Masque l'onglet Bibliothèque de la barre d'onglets"; "HideLibraryTabDesc" = "Masque l'onglet Bibliothèque de la barre d'onglets";
"Shorts" = "Shorts"; "Shorts" = "Shorts";
"ShortsOnlyMode" = "Mode Shorts uniquement";
"ShortsOnlyModeDesc" = "Limite les fonctionnalités de YouTube à la visualisation des Shorts uniquement.";
"HideShorts" = "Masquer les vidéos Shorts"; "HideShorts" = "Masquer les vidéos Shorts";
"HideShortsDesc" = "Masque les vidéos Shorts de la page d'accueil, des recommandations, etc. (Non appliqué à l'historique de visionnage)"; "HideShortsDesc" = "Masque les vidéos Shorts de la page d'accueil, des recommandations, etc. (Non appliqué à l'historique de visionnage)";
"ShortsProgress" = "Activer la barre de progression"; "ShortsProgress" = "Activer la barre de progression";
"ShortsProgressDesc" = "Affiche la barre de progression dans l'overlay Shorts."; "ShortsProgressDesc" = "Affiche la barre de progression dans l'overlay Shorts.";
"PinchToFullscreenShorts" = "Pincer pour plein écran";
"PinchToFullscreenShortsDesc" = "Gère la visibilité de l'overlay avec les gestes de pincement, affichant les Shorts en mode plein écran.";
"ShortsToRegular" = "Shorts vers vidéos normales";
"ShortsToRegularDesc" = "Ouvre les vidéos Shorts en tant que vidéos normales.";
"ResumeShorts" = "Ne pas démarrer depuis l'onglet Shorts"; "ResumeShorts" = "Ne pas démarrer depuis l'onglet Shorts";
"ResumeShortsDesc" = "Empêche de démarrer depuis les vidéos Shorts lors de l'ouverture de l'application, ce qui se produit si YouTube était fermé pendant la lecture des Shorts."; "ResumeShortsDesc" = "Empêche de démarrer depuis les vidéos Shorts lors de l'ouverture de l'application, ce qui se produit si YouTube était fermé pendant la lecture des Shorts.";
"HideShortsLogo" = "Masquer le logo Shorts"; "HideShortsLogo" = "Masquer le logo Shorts";
@@ -107,7 +123,7 @@
"HideShortsLikeDesc" = "Masque le bouton J'aime de l'overlay Shorts."; "HideShortsLikeDesc" = "Masque le bouton J'aime de l'overlay Shorts.";
"HideShortsDislike" = "Masquer le bouton Je n'aime pas"; "HideShortsDislike" = "Masquer le bouton Je n'aime pas";
"HideShortsDislikeDesc" = "Masque le bouton Je n'aime pas de l'overlay Shorts."; "HideShortsDislikeDesc" = "Masque le bouton Je n'aime pas de l'overlay Shorts.";
"HideShortortsComments" = "Masquer le bouton Commentaires"; "HideShortsComments" = "Masquer le bouton Commentaires";
"HideShortsCommentsDesc" = "Masque le bouton Commentaires de l'overlay Shorts."; "HideShortsCommentsDesc" = "Masque le bouton Commentaires de l'overlay Shorts.";
"HideShortsRemix" = "Masquer le bouton Remix"; "HideShortsRemix" = "Masquer le bouton Remix";
"HideShortsRemixDesc" = "Masque le bouton Remix de l'overlay Shorts."; "HideShortsRemixDesc" = "Masque le bouton Remix de l'overlay Shorts.";
@@ -117,6 +133,8 @@
"HideShortsAvatarsDesc" = "Masque la photo de profil dans le coin inférieur droit."; "HideShortsAvatarsDesc" = "Masque la photo de profil dans le coin inférieur droit.";
"HideShortsThanks" = "Masquer le bouton Superthanks"; "HideShortsThanks" = "Masquer le bouton Superthanks";
"HideShortsThanksDesc" = "Masque le bouton Superthanks (Don) de l'overlay Shorts."; "HideShortsThanksDesc" = "Masque le bouton Superthanks (Don) de l'overlay Shorts.";
"HideShortsSource" = "Cacher la source des Shorts";
"HideShortsSourceDesc" = "Masque les sources des Shorts sous le nom de la chaîne.";
"HideShortsChannelName" = "Masquer le nom de la chaîne"; "HideShortsChannelName" = "Masquer le nom de la chaîne";
"HideShortsChannelNameDesc" = "Masque le nom de la chaîne et le bouton S'abonner de l'overlay Shorts."; "HideShortsChannelNameDesc" = "Masque le nom de la chaîne et le bouton S'abonner de l'overlay Shorts.";
"HideShortsDescription" = "Masquer la description"; "HideShortsDescription" = "Masquer la description";
@@ -125,10 +143,30 @@
"HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts."; "HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts.";
"Other" = "Autre"; "Other" = "Autre";
"CopyPostText" = "Copier le texte des publications de la communauté";
"CopyPostTextDesc" = "Copie le texte des publications de la communauté dans le presse-papiers en appuyant longuement.";
"SavePostImage" = "Enregistrer l'image des publications de la communauté";
"SavePostImageDesc" = "Enregistre l'image des publications de la communauté dans l'application Photos en appuyant longuement.";
"SaveProfilePhoto" = "Enregistrer la photo de profil";
"SaveProfilePhotoDesc" = "Enregistre la photo de profil dans l'application Photos en appuyant longuement.";
"FixAlbums" = "Réparer les couvertures";
"FixAlbumsDesc" = "Répare l'affichage des couvertures pour les utilisateurs de Russie.";
"RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\""; "RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\"";
"RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu."; "RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu.";
"NoContinueWatching" = "Supprimer \"Continuer à regarder\""; "NoContinueWatching" = "Supprimer \"Continuer à regarder\"";
"NoContinueWatchingDesc" = "Supprime la section \"Continuer à regarder\" contenant les vidéos inachevées de la page d'accueil."; "NoContinueWatchingDesc" = "Supprime la section \"Continuer à regarder\" contenant les vidéos inachevées de la page d'accueil.";
"NoSearchHistory" = "Masquer l'historique de recherche";
"NoSearchHistoryDesc" = "Masque visuellement l'historique de recherche et les suggestions. Note : Votre historique de recherche sera toujours accessible dans vos autres clients YouTube.";
"NoRelatedWatchNexts" = "Masquer toutes les vidéos sous le lecteur";
"NoRelatedWatchNextsDesc" = "Masque toutes les vidéos sous le lecteur, ne laissant que les informations sur la vidéo et la section des commentaires.";
"StickSortComments" = "Épingler l'en-tête des commentaires";\
"StickSortCommentsDesc" = "Épingle l'en-tête de tri des commentaires (Meilleurs, Plus récents) pour qu'il ne disparaisse pas pendant le défilement.";
"HideSortComments" = "Masquer l'en-tête des commentaires";
"HideSortCommentsDesc" = "Masque l'en-tête de tri des commentaires (Meilleurs, Plus récents) pour qu'il n'apparaisse jamais.";
"PlaylistOldMinibar" = "Ancienne barre latérale de lecture";
"PlaylistOldMinibarDesc" = "Remplace le nouveau panneau de lecture flottant par l'ancien.";
"DisableRTL" = "Désactiver le formatage de droite à gauche";
"DisableRTLDesc" = "Affiche le texte de force en format de gauche à droite (LTR) pour les langues qui sont initialement affichées de droite à gauche (RTL).";
"Startup" = "Page de démarrage"; "Startup" = "Page de démarrage";
"Home" = "Accueil"; "Home" = "Accueil";
@@ -143,13 +181,20 @@
"About" = "À propos"; "About" = "À propos";
"Credits" = "Crédits"; "Credits" = "Crédits";
"Developer" = "Développeur YTLite"; "Developer" = "Développeur YTLite";
"ChineseSimplified" = "Chinese (Simplified) localization"; "ChineseSimplified" = "Localisation chinoise (simplifiée)";
"ChineseTraditional" = "Chinese (Traditional) localization"; "ChineseTraditional" = "Localisation chinoise (traditionnelle)";
"French" = "French localization"; "French" = "Localisation française";
"Spanish" = "Spanish localization"; "Spanish" = "Localisation espagnole";
"Japanese" = "Localisation japonaise";
"Advanced" = "Mode avancé"; "Advanced" = "Mode avancé";
"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" = "Voulez-vous activer le mode avancé pour YTLite ?\n\nCe mode offre plus de 50 options supplémentaires pour personnaliser et optimiser votre expérience YouTube. Vous pouvez l'activer/désactiver ultérieurement depuis Paramètres → %@ → %@ → %@.";
"ResetSettings" = "Réinitialiser les paramètres YTLite"; "ResetSettings" = "Réinitialiser les paramètres YTLite";
"ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?"; "ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?";
"ShortsOnlyWarning" = "Êtes-vous sûr de vouloir activer ce mode?\n\nDans ce mode, vous ne pourrez regarder que des vidéos Shorts et vous ne pourrez rien d'autre faire.\n\nVous pouvez désactiver le mode Shorts Only en appuyant longuement avec deux doigts dans le lecteur Shorts.";
"ShortsModeTurnedOff" = "Le mode Shorts uniquement a été désactivé";
"Yes" = "Oui"; "Yes" = "Oui";
"No" = "Non"; "No" = "Non";
"Copied" = "Copié dans le presse-papiers";
"Saved" = "Enregistré dans Photos";
"Error" = "Erreur";
@@ -0,0 +1,200 @@
"General" = "一般";
"RemoveAds" = "広告を削除";
"RemoveAdsDesc" = "アプリ内の広告を削除します";
"BackgroundPlayback" = "バックグラウンド再生";
"BackgroundPlaybackDesc" = "バックグラウンドでの再生を有効にします";
"Navbar" = "ナビゲーションバー";
"RemoveCast" = "キャストボタンを非表示";
"RemoveCastDesc" = "ナビゲーションバーからキャストボタンを非表示にします";
"RemoveNotifications" = "通知ボタンを非表示";
"RemoveNotificationsDesc" = "ナビゲーションバーから通知ボタンを非表示にします";
"RemoveSearch" = "検索ボタンを非表示";
"RemoveSearchDesc" = "ナビゲーションバーから検索ボタンを非表示にします";
"RemoveVoiceSearch" = "音声検索ボタンを非表示";
"RemoveVoiceSearchDesc" = "ナビゲーションバーから音声検索ボタンを非表示にします";
"StickyNavbar" = "ナビゲーションバーを固定";
"StickyNavbarDesc" = "スクロール中もナビゲーションバーを固定して表示します";
"NoSubbar" = "サブバーを非表示";
"NoSubbarDesc" = "ナビゲーションバーの下にあるサブバー(すべて,音楽,ライブ など)を非表示にします";
"NoYTLogo" = "YouTubeロゴを削除";
"NoYTLogoDesc" = "ナビゲーションバーのYouTubeロゴを非表示にします";
"Overlay" = "オーバーレイ";
"HideAutoplay" = "自動再生スイッチを非表示";
"HideAutoplayDesc" = "オーバーレイから自動再生スイッチを非表示にします";
"HideSubs" = "字幕ボタンを非表示";
"HideSubsDesc" = "オーバーレイから字幕ボタンを非表示にします";
"NoHUDMsgs" = "HUDメッセージを非表示";
"NoHUDMsgsDesc" = "プレーヤーからすべての機能メッセージを非表示にします。例:字幕がオン/オフになりました, ループ再生はオンになっています など";
"HidePrevNext" = "前へ/次へボタンを非表示";
"HidePrevNextDesc" = "オーバーレイから前へ/次へのビデオボタンを非表示にします";
"ReplacePrevNext" = "早送り/巻き戻しボタンに置き換え";
"ReplacePrevNextDesc" = "オーバーレイの前へ/次へボタンを早送り/巻き戻しボタンに置き換えます";
"NoDarkBg" = "暗い背景を削除";
"NoDarkBgDesc" = "オーバーレイの暗い背景を削除します";
"NoEndScreenCards" = "エンドスクリーンのホバーカードを非表示";
"NoEndScreenCardsDesc" = "動画の終わりに表示されるエンドスクリーン(サムネイル)を非表示にします";
"NoFullscreenActions" = "フルスクリーンアクションを無効化";
"NoFullscreenActionsDesc" = "フルスクリーンモードでのアクションパネルを無効にします";
"PersistentProgressBar" = "Persistent progress bar";
"PersistentProgressBarDesc" = "Always shows progress bar in the player.";
"NoRelatedVids" = "オーバーレイの関連動画を非表示";
"NoRelatedVidsDesc" = "スワイプアップでオーバーレイに表示される関連動画を非表示にします";
"NoPromotionCards" = "有料プロモーションカードを非表示";
"NoPromotionCardsDesc" = "プロモーションが含まれている動画の\"有料プロモーションを含む\"カードを非表示にします";
"NoWatermarks" = "ウォーターマークを非表示";
"NoWatermarksDesc" = "プレーヤーからチャンネルのウォーターマークを非表示にします";
"Player" = "プレーヤー";
"Miniplayer" = "ミニプレーヤーを有効化";
"MiniplayerDesc" = "ミニプレーヤーに対応していない動画(子供向けの動画など)でもミニプレーヤーを有効にします";
"PortraitFullscreen" = "縦画面フルスクリーンモード";
"PortraitFullscreenDesc" = "縦画面フルスクリーンモードをサポートします";
"CopyWithTimestamp" = "タイムスタンプ付きリンクをコピー";
"CopyWithTimestampDesc" = "一時停止ボタンを押すことで、タイムスタンプ付きリンクをクリップボードにコピーできます";
"DisableAutoplay" = "自動再生を無効化";
"DisableAutoplayDesc" = "アプリを開いた後に動画の自動再生を防止します";
"DisableAutoCaptions" = "Disable auto captions";
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
"NoContentWarning" = "コンテンツ警告をスキップ";
"NoContentWarningDesc" = "不適切なコンテンツの警告メッセージをスキップします";
"ClassicQuality" = "クラシックなビデオ品質";
"ClassicQualityDesc" = "クラシックなビデオ品質選択メニューを復元します";
"ExtraSpeedOptions" = "再生速度の追加オプション";
"ExtraSpeedOptionsDesc" = "プレーヤーメニューに追加の再生速度オプションを追加します";
"DontSnap2Chapter" = "チャプターへのスナップを無効化";
"DontSnap2ChapterDesc" = "ダブルタップジェスチャーで次のエピソードへスキップするのを無効にします";
"RedProgressBar" = "赤いプログレスバー";
"RedProgressBarDesc" = "赤いプログレスバーを復元します";
"NoHints" = "ヒントを無効化";
"NoHintsDesc" = "再生中に右上に表示される投稿者のヒントを無効にします";
"NoFreeZoom" = "フリーズームジェスチャーを無効化";
"NoFreeZoomDesc" = "新しいフリーズームジェスチャーを無効にします";
"AutoFullscreen" = "動画をフルスクリーンで再生";
"AutoFullscreenDesc" = "動画を自動的にフルスクリーンモードで再生します";
"ExitFullscreen" = "再生終了時にフルスクリーンモードを終了";
"ExitFullscreenDesc" = "動画再生が終了したときにフルスクリーンモードを終了します";
"NoDoubleTap2Seek" = "ダブルタップでのシークを無効化";
"NoDoubleTap2SeekDesc" = "ダブルタップでのシークジェスチャーを無効にします";
"Tabbar" = "タブバー";
"RemoveLabels" = "ラベルを削除";
"RemoveLabelsDesc" = "タブラベルを削除します";
"RemoveIndicators" = "インジケーターを削除";
"RemoveIndicatorsDesc" = "タブインジケーターを削除します";
"ReExplore" = "ショートタブを探索タブに置き換え";
"ReExploreDesc" = "古いYouTubeバージョンのように、ショートタブの代わりに探索タブを表示します";
"AddExplore" = "Add Explore tab";
"AddExploreDesc" = "Adds Explore tab to the Tab bar.";
"HideShortsTab" = "ショートタブを非表示";
"HideShortsTabDesc" = "タブバーからショートタブを非表示にします";
"HideSubscriptionsTab" = "登録チャンネルタブを非表示";
"HideSubscriptionsTabDesc" = "タブバーから登録チャンネルタブを非表示にします";
"HideUploadButton" = "アップロードボタンを非表示";
"HideUploadButtonDesc" = "タブバーからアップロードボタンを非表示にします";
"HideLibraryTab" = "ライブラリタブを非表示";
"HideLibraryTabDesc" = "タブバーからライブラリタブを非表示にします";
"Shorts" = "ショート";
"ShortsOnlyMode" = "Shorts Only Mode";
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
"HideShorts" = "ショート動画を非表示";
"HideShortsDesc" = "ホーム, おすすめなどからショート動画を非表示にします(視聴履歴には適用されません)";
"ShortsProgress" = "プログレスバーを有効化";
"ShortsProgressDesc" = "ショートオーバーレイにプログレスバーを表示します";
"PinchToFullscreenShorts" = "Pinch to Fullscreen";
"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode.";
"ShortsToRegular" = "Shorts to regular videos";
"ShortsToRegularDesc" = "Opens Shorts videos as regular videos.";
"ResumeShorts" = "ショートタブからの再開を防止";
"ResumeShortsDesc" = "ショートを視聴中にアプリを閉じた場合でも、ショートからの再開を防止します";
"HideShortsLogo" = "ショートロゴを非表示";
"HideShortsLogoDesc" = "左上隅のショートロゴを非表示にします";
"HideShortsSearch" = "検索ボタンを非表示";
"HideShortsSearchDesc" = "ショートオーバーレイから検索ボタンを非表示にします";
"HideShortsCamera" = "カメラボタンを非表示";
"HideShortsCameraDesc" = "ショートオーバーレイからカメラボタンを非表示にします";
"HideShortsMore" = "その他(⋮)ボタンを非表示";
"HideShortsMoreDesc" = "ショートオーバーレイからその他(⋮)ボタンを非表示にします。画面の長押しでアクセスも可能です";
"HideShortsSubscriptions" = "チャンネル登録ボタンを非表示";
"HideShortsSubscriptionsDesc" = "ショートが一時停止されたときに表示されるチャンネル登録ボタンを非表示にします";
"HideShortsLike" = "いいねボタンを非表示";
"HideShortsLikeDesc" = "ショートオーバーレイからいいねボタンを非表示にします";
"HideShortsDislike" = "低評価ボタンを非表示";
"HideShortsDislikeDesc" = "ショートオーバーレイから低評価ボタンを非表示にします";
"HideShortsComments" = "コメントボタンを非表示";
"HideShortsCommentsDesc" = "ショートオーバーレイからコメントボタンを非表示にします";
"HideShortsRemix" = "リミックスボタンを非表示";
"HideShortsRemixDesc" = "ショートオーバーレイからリミックスボタンを非表示にします";
"HideShortsShare" = "共有ボタンを非表示";
"HideShortsShareDesc" = "ショートオーバーレイから共有ボタンを非表示にします";
"HideShortsAvatars" = "チャンネルのアバターを非表示";
"HideShortsAvatarsDesc" = "右下隅のプロフィール画像を非表示にします";
"HideShortsThanks" = "スーパーサンクスボタンを非表示";
"HideShortsThanksDesc" = "ショートオーバーレイからスーパーサンクス(寄付)ボタンを非表示にします";
"HideShortsSource" = "Hide Shorts Source";
"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name.";
"HideShortsChannelName" = "チャンネル名を非表示";
"HideShortsChannelNameDesc" = "ショートオーバーレイからチャンネル名とチャンネル登録ボタンを非表示にします";
"HideShortsDescription" = "説明を非表示";
"HideShortsDescriptionDesc" = "チャンネル名の下に表示されるショートの説明を非表示にします";
"HideShortsAudioTrack" = "オーディオトラックを非表示";
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
"Other" = "その他";
"CopyPostText" = "Copy community posts text";
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
"SavePostImage" = "Save community posts image";
"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap.";
"SaveProfilePhoto" = "Save profile picture";
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
"FixAlbums" = "Fix covers";
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
"RemovePlayNext" = "\"次に再生\"を削除";
"RemovePlayNextDesc" = "メニューから\"次に再生\"オプションを削除します";
"NoContinueWatching" = "\"続きを見る\"を削除";
"NoContinueWatchingDesc" = "ホームページに未完成の動画を含む\"続きを見る\"セクションを削除します";
"NoSearchHistory" = "検索履歴を非表示";
"NoSearchHistoryDesc" = "検索履歴とサジェストを視覚的に非表示にします。注意:検索履歴は他のYouTubeクライアントからアクセス可能です";
"NoRelatedWatchNexts" = "プレーヤー下のすべての動画を非表示";
"NoRelatedWatchNextsDesc" = "プレーヤー下に表示されるすべての動画を非表示にし、動画情報とコメントセクションのみにします";
"StickSortComments" = "コメントヘッダーを固定";
"StickSortCommentsDesc" = "コメントのソートヘッダー(トップ,最新)をスクロールしても消えないように固定します";
"HideSortComments" = "コメントヘッダーを非表示";
"HideSortCommentsDesc" = "コメントのソートヘッダー(トップ,最新)を表示しないようにします";
"PlaylistOldMinibar" = "古いプレイリストミニバー";
"PlaylistOldMinibarDesc" = "新しいフローティングプレイリストパネルを古いものに置き換えます";
"DisableRTL" = "RTLフォーマットを無効化";
"DisableRTLDesc" = "RTLで表示される言語を左から右(LTR)の形式で表示するように強制します";
"Startup" = "スタートアップページ";
"Home" = "ホーム";
"Explore" = "探索";
"ShortsTab" = "ショート";
"Subscriptions" = "登録チャンネル";
"Library" = "ライブラリ";
"Warning" = "警告";
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
"Version" = "バージョン";
"About" = "About";
"Credits" = "クレジット";
"Developer" = "YTLiteの開発者";
"ChineseSimplified" = "中国語(簡体字)翻訳";
"ChineseTraditional" = "中国語(繁体字)翻訳";
"French" = "フランス語翻訳";
"Spanish" = "スペイン語翻訳";
"Japanese" = "日本語翻訳";
"Advanced" = "アドバンスモード";
"AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます";
"ResetSettings" = "YTLiteの設定をリセット";
"ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、アプリが終了します。\n\n続行してもよろしいですか?";
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off";
"Yes" = "はい";
"No" = "いいえ";
"Copied" = "Copied to clipboard";
"Saved" = "Saved to Photos";
"Error" = "Error";
@@ -37,6 +37,8 @@
"NoEndScreenCardsDesc" = "Скрывает эскизы, отображаемые по окончанию видеоролика."; "NoEndScreenCardsDesc" = "Скрывает эскизы, отображаемые по окончанию видеоролика.";
"NoFullscreenActions" = "Отключить панель действий"; "NoFullscreenActions" = "Отключить панель действий";
"NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера."; "NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера.";
"PersistentProgressBar" = "Всегда отображать прогресс-бар";
"PersistentProgressBarDesc" = "Всегда отображает прогресс-бар внутри плеера.";
"NoRelatedVids" = "Скрыть рекомендации в оверлее"; "NoRelatedVids" = "Скрыть рекомендации в оверлее";
"NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере."; "NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере.";
"NoPromotionCards" = "Скрыть сообщение «Есть реклама»"; "NoPromotionCards" = "Скрыть сообщение «Есть реклама»";
@@ -47,8 +49,14 @@
"Player" = "Настройки плеера"; "Player" = "Настройки плеера";
"Miniplayer" = "Разрешить миниплеер"; "Miniplayer" = "Разрешить миниплеер";
"MiniplayerDesc" = "Принудительно активирует миниплеер для видео, в которых изначально не был предназначен (например, видеоролики для детей)."; "MiniplayerDesc" = "Принудительно активирует миниплеер для видео, в которых изначально не был предназначен (например, видеоролики для детей).";
"PortraitFullscreen" = "Портретный полноэкранный режим";
"PortraitFullscreenDesc" = "Активирует поддержку портретного полноэкранного режима.";
"CopyWithTimestamp" = "Ссылки с временными отметками";
"CopyWithTimestampDesc" = "Позволяет скопировать ссылку на видео с временной отметкой в буфер обмена нажатием на кнопку паузы.";
"DisableAutoplay" = "Запретить автовоспроизведение"; "DisableAutoplay" = "Запретить автовоспроизведение";
"DisableAutoplayDesc" = "Принудительно запрещает автовоспроизведение видео при его открытии."; "DisableAutoplayDesc" = "Принудительно запрещает автовоспроизведение видео при его открытии.";
"DisableAutoCaptions" = "Запретить автоматические субтитры";
"DisableAutoCaptionsDesc" = "Отключает включенные по умолчанию субтитры";
"NoContentWarning" = "Пропускать предупреждения"; "NoContentWarning" = "Пропускать предупреждения";
"NoContentWarningDesc" = "Пропускает предупреждения, всплывающие перед воспроизведением некоторого контента."; "NoContentWarningDesc" = "Пропускает предупреждения, всплывающие перед воспроизведением некоторого контента.";
"ClassicQuality" = "Классический выбор качества"; "ClassicQuality" = "Классический выбор качества";
@@ -63,7 +71,7 @@
"NoHintsDesc" = "Скрывает подсказки от авторов видео, появляющиеся в правом верхнем углу."; "NoHintsDesc" = "Скрывает подсказки от авторов видео, появляющиеся в правом верхнем углу.";
"NoFreeZoom" = "Отключить жесты для зума"; "NoFreeZoom" = "Отключить жесты для зума";
"NoFreeZoomDesc" = "Отключает жесты приближения для нового зума."; "NoFreeZoomDesc" = "Отключает жесты приближения для нового зума.";
"AutoFullscreen" = "Воспроизводить в полноэкранном режиме"; "AutoFullscreen" = "Открывать в полноэкранном режиме";
"AutoFullscreenDesc" = "Автоматически воспроизводит ролики в полноэкранном режиме."; "AutoFullscreenDesc" = "Автоматически воспроизводит ролики в полноэкранном режиме.";
"ExitFullscreen" = "Автовыход из полноэкранного режима"; "ExitFullscreen" = "Автовыход из полноэкранного режима";
"ExitFullscreenDesc" = "Выходит из полноэкранного режима по окончанию воспроизведения."; "ExitFullscreenDesc" = "Выходит из полноэкранного режима по окончанию воспроизведения.";
@@ -73,8 +81,12 @@
"Tabbar" = "Панель вкладок"; "Tabbar" = "Панель вкладок";
"RemoveLabels" = "Скрыть названия"; "RemoveLabels" = "Скрыть названия";
"RemoveLabelsDesc" = "Скрывает названия вкладок."; "RemoveLabelsDesc" = "Скрывает названия вкладок.";
"RemoveIndicators" = "Скрыть индикаторы";
"RemoveIndicatorsDesc" = "Скрывает индикаторы вкладок.";
"ReExplore" = "Вкладка «Навигация» вместо «Shorts»"; "ReExplore" = "Вкладка «Навигация» вместо «Shorts»";
"ReExploreDesc" = "Заменяет вкладку «Shorts» на привычную нам «Навигацию»."; "ReExploreDesc" = "Заменяет вкладку «Shorts» на привычную нам «Навигацию».";
"AddExplore" = "Добавить вкладку «Навигация»";
"AddExploreDesc" = "Добавляет вкладку «Навигация» в панель вкладок.";
"HideShortsTab" = "Скрыть «Shorts»"; "HideShortsTab" = "Скрыть «Shorts»";
"HideShortsTabDesc" = "Скрывает вкладку «Shorts» с панели вкладок."; "HideShortsTabDesc" = "Скрывает вкладку «Shorts» с панели вкладок.";
"HideSubscriptionsTab" = "Скрыть «Подписки»"; "HideSubscriptionsTab" = "Скрыть «Подписки»";
@@ -85,10 +97,16 @@
"HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок."; "HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок.";
"Shorts" = "Настройки Shorts"; "Shorts" = "Настройки Shorts";
"ShortsOnlyMode" = "Режим Shorts";
"ShortsOnlyModeDesc" = "Ограничивает функциональность YouTube до отображения видеороликов Shorts";
"HideShorts" = "Скрыть видеоролики Shorts"; "HideShorts" = "Скрыть видеоролики Shorts";
"HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)"; "HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)";
"ShortsProgress" = "Показывать прогресс-бар"; "ShortsProgress" = "Показывать прогресс-бар";
"ShortsProgressDesc" = "Отображает прогресс-бар в плеере Shorts."; "ShortsProgressDesc" = "Отображает прогресс-бар в плеере Shorts.";
"PinchToFullscreenShorts" = "Полноэкранный режим щипком";
"PinchToFullscreenShortsDesc" = "Скрывает панель вкладок, тем самым отображает Shorts на весь экран.";
"ShortsToRegular" = "Shorts как обычные видео";
"ShortsToRegularDesc" = "Воспроизводит видеоролики Shorts в обычном проигрывателе.";
"ResumeShorts" = "Всегда запускать с Главной страницы"; "ResumeShorts" = "Всегда запускать с Главной страницы";
"ResumeShortsDesc" = "Предотвращает запуск видеороликов Shorts при открытии YouTube. Это происходит, если закрыть YouTube при просмотре Shorts."; "ResumeShortsDesc" = "Предотвращает запуск видеороликов Shorts при открытии YouTube. Это происходит, если закрыть YouTube при просмотре Shorts.";
"HideShortsLogo" = "Скрыть логотип Shorts"; "HideShortsLogo" = "Скрыть логотип Shorts";
@@ -115,6 +133,8 @@
"HideShortsAvatarsDesc" = "Скрывает аватарку пользователя в правом нижнем углу."; "HideShortsAvatarsDesc" = "Скрывает аватарку пользователя в правом нижнем углу.";
"HideShortsThanks" = "Скрыть «Суперспасибо»"; "HideShortsThanks" = "Скрыть «Суперспасибо»";
"HideShortsThanksDesc" = "Скрывает кнопку отправки доната (суперспасибо) с плеера Shorts."; "HideShortsThanksDesc" = "Скрывает кнопку отправки доната (суперспасибо) с плеера Shorts.";
"HideShortsSource" = "Скрыть источник Shorts";
"HideShortsSourceDesc" = "Скрывает источники Shorts под названием канала.";
"HideShortsChannelName" = "Скрыть название канала"; "HideShortsChannelName" = "Скрыть название канала";
"HideShortsChannelNameDesc" = "Скрывает название канала и кнопку «Подписаться» с плеера Shorts."; "HideShortsChannelNameDesc" = "Скрывает название канала и кнопку «Подписаться» с плеера Shorts.";
"HideShortsDescription" = "Скрыть описание ролика"; "HideShortsDescription" = "Скрыть описание ролика";
@@ -123,10 +143,30 @@
"HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера."; "HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера.";
"Other" = "Другие настройки"; "Other" = "Другие настройки";
"CopyPostText" = "Копировать текст постов";
"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием.";
"SavePostImage" = "Сохранять изображения постов";
"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним.";
"SaveProfilePhoto" = "Сохранять фото профиля";
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
"FixAlbums" = "Исправить отображение обложек";
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
"RemovePlayNext" = "Убрать «Добавить в начало очереди»"; "RemovePlayNext" = "Убрать «Добавить в начало очереди»";
"RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео."; "RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео.";
"NoContinueWatching" = "Отключить «Продолжить просмотр»"; "NoContinueWatching" = "Отключить «Продолжить просмотр»";
"NoContinueWatchingDesc" = "Удаляет блок «Продолжить просмотр» содержащий недосмотренные видео с Главной страницы."; "NoContinueWatchingDesc" = "Удаляет блок «Продолжить просмотр» содержащий недосмотренные видео с Главной страницы.";
"NoSearchHistory" = "Скрыть историю поиска";
"NoSearchHistoryDesc" = "Визуально скрывает историю поиска и подсказок. Данная опция не отменяет трекинг вашей истории поиска.";
"NoRelatedWatchNexts" = "Скрыть все видео под плеером";
"NoRelatedWatchNextsDesc" = "Скрывает все видео под плеером, оставляя только информацию о видео и раздел комментариев.";
"StickSortComments" = "Закрепить панель комментариев";
"StickSortCommentsDesc" = "Закрепляет панель сортировки комментариев, чтобы она не терялись при прокрутке.";
"HideSortComments" = "Скрыть панель комментариев";
"HideSortCommentsDesc" = "Скрывает панель сортировки комментариев.";
"PlaylistOldMinibar" = "Отображать старую панель плейлистов";
"PlaylistOldMinibarDesc" = "Заменяет новую, плавающую панель плейлистов, на старую.";
"DisableRTL" = "Запретить формат «справа налево»";
"DisableRTLDesc" = "Принудительно отображает текст в формате слева направо для языков, изначально отображающихся в формате справа налево.";
"Startup" = "Начальная страница"; "Startup" = "Начальная страница";
"Home" = "Главная"; "Home" = "Главная";
@@ -145,9 +185,16 @@
"ChineseTraditional" = "Китайская (традиционная) локализация"; "ChineseTraditional" = "Китайская (традиционная) локализация";
"French" = "Французская локализация"; "French" = "Французская локализация";
"Spanish" = "Испанская локализация"; "Spanish" = "Испанская локализация";
"Japanese" = "Японская локализация";
"Advanced" = "Расширенный режим"; "Advanced" = "Расширенный режим";
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@."; "AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
"ResetSettings" = "Сбросить настройки твика"; "ResetSettings" = "Сбросить настройки твика";
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?"; "ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
"ShortsModeTurnedOff" = "Режим Shorts был отключен";
"Yes" = "Да"; "Yes" = "Да";
"No" = "Нет"; "No" = "Нет";
"Copied" = "Скопировано в буфер обмена";
"Saved" = "Сохранено в Фото";
"Error" = "Ошибка";
@@ -37,6 +37,8 @@
"NoEndScreenCardsDesc" = "隐藏视频结尾处的片尾屏幕(缩略图)。"; "NoEndScreenCardsDesc" = "隐藏视频结尾处的片尾屏幕(缩略图)。";
"NoFullscreenActions" = "禁用全屏操作"; "NoFullscreenActions" = "禁用全屏操作";
"NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。"; "NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。";
"PersistentProgressBar" = "持续进度条";
"PersistentProgressBarDesc" = "始终在播放器中显示进度条。";
"NoRelatedVids" = "没有相关视频"; "NoRelatedVids" = "没有相关视频";
"NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。"; "NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。";
"NoPromotionCards" = "隐藏付费"; "NoPromotionCards" = "隐藏付费";
@@ -47,8 +49,14 @@
"Player" = "播放器"; "Player" = "播放器";
"Miniplayer" = "启用迷你播放器"; "Miniplayer" = "启用迷你播放器";
"MiniplayerDesc" = "启用迷你播放器来播放最初不是为其设计的视频,例如针对儿童的视频。"; "MiniplayerDesc" = "启用迷你播放器来播放最初不是为其设计的视频,例如针对儿童的视频。";
"PortraitFullscreen" = "竖屏全屏模式";
"PortraitFullscreenDesc" = "启用竖屏全屏模式支持。";
"CopyWithTimestamp" = "复制带时间戳的链接";
"CopyWithTimestampDesc" = "允许通过按下暂停按钮将带有时间戳的链接复制到剪贴板。";
"DisableAutoplay" = "禁用自动播放视频"; "DisableAutoplay" = "禁用自动播放视频";
"DisableAutoplayDesc" = "打开后防止视频自动播放。"; "DisableAutoplayDesc" = "打开后防止视频自动播放。";
"DisableAutoCaptions" = "禁用自动字幕";
"DisableAutoCaptionsDesc" = "防止自动激活字幕。";
"NoContentWarning" = "跳过内容警告"; "NoContentWarning" = "跳过内容警告";
"NoContentWarningDesc" = "跳过敏感内容警告消息。"; "NoContentWarningDesc" = "跳过敏感内容警告消息。";
"ClassicQuality" = "经典视频质量"; "ClassicQuality" = "经典视频质量";
@@ -73,8 +81,12 @@
"Tabbar" = "选项卡栏"; "Tabbar" = "选项卡栏";
"RemoveLabels" = "移除标签"; "RemoveLabels" = "移除标签";
"RemoveLabelsDesc" = "删除选项卡标签。"; "RemoveLabelsDesc" = "删除选项卡标签。";
"RemoveIndicators" = "删除指示器";
"RemoveIndicatorsDesc" = "删除选项卡“红点”指示。";
"ReExplore" = "“短视频”替换为“探索”"; "ReExplore" = "“短视频”替换为“探索”";
"ReExploreDesc" = "在旧版本 YouTube 中将“短视频”选项卡替换为“探索”。"; "ReExploreDesc" = "在旧版本 YouTube 中将“短视频”选项卡替换为“探索”。";
"AddExplore" = "添加“探索”选项卡";
"AddExploreDesc" = "将“探索”选项卡添加到底部选项卡栏。";
"HideShortsTab" = "隐藏短视频"; "HideShortsTab" = "隐藏短视频";
"HideShortsTabDesc" = "从选项卡栏中隐藏短视频。"; "HideShortsTabDesc" = "从选项卡栏中隐藏短视频。";
"HideSubscriptionsTab" = "隐藏订阅内容"; "HideSubscriptionsTab" = "隐藏订阅内容";
@@ -85,10 +97,16 @@
"HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库。"; "HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库。";
"Shorts" = "短视频"; "Shorts" = "短视频";
"ShortsOnlyMode" = "仅短视频模式";
"ShortsOnlyModeDesc" = "将 YouTube 功能限制为只能观看短视频。";
"HideShorts" = "隐藏短视频"; "HideShorts" = "隐藏短视频";
"HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。"; "HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。";
"ShortsProgress" = "启用进度条"; "ShortsProgress" = "启用进度条";
"ShortsProgressDesc" = "在短视频播放器中显示进度条。"; "ShortsProgressDesc" = "在短视频播放器中显示进度条。";
"PinchToFullscreenShorts" = "捏合至全屏";
"PinchToFullscreenShortsDesc" = "通过捏合和捏合手势管理播放界面,以全屏模式显示短视频。";
"ShortsToRegular" = "常规短视频";
"ShortsToRegularDesc" = "像打开普通视频一样打开短视频。";
"ResumeShorts" = "不要从短视频开始"; "ResumeShorts" = "不要从短视频开始";
"ResumeShortsDesc" = "防止在打开应用程序时首先启动短视频,如果在观看短视频时关闭,就会发生这种情况。"; "ResumeShortsDesc" = "防止在打开应用程序时首先启动短视频,如果在观看短视频时关闭,就会发生这种情况。";
"HideShortsLogo" = "隐藏短视频Logo"; "HideShortsLogo" = "隐藏短视频Logo";
@@ -115,18 +133,40 @@
"HideShortsAvatarsDesc" = "隐藏右下角的发布者个人资料头像。"; "HideShortsAvatarsDesc" = "隐藏右下角的发布者个人资料头像。";
"HideShortsThanks" = "隐藏捐赠按钮"; "HideShortsThanks" = "隐藏捐赠按钮";
"HideShortsThanksDesc" = "从短视频播放器中隐藏捐赠按钮。"; "HideShortsThanksDesc" = "从短视频播放器中隐藏捐赠按钮。";
"HideShortsSource" = "隐藏短视频来源";
"HideShortsSourceDesc" = "在频道名称下隐藏短视频来源。";
"HideShortsChannelName" = "隐藏发布者名称"; "HideShortsChannelName" = "隐藏发布者名称";
"HideShortsChannelNameDesc" = "从短视频播放器中隐藏发布者名称和订阅按钮。"; "HideShortsChannelNameDesc" = "从短视频播放器中隐藏发布者名称和订阅按钮。";
"HideShortsDescription" = "隐藏说明"; "HideShortsDescription" = "隐藏文案";
"HideShortsDescriptionDesc" = "在频道名称下隐藏短视频描述。"; "HideShortsDescriptionDesc" = "隐藏短视频下方的视频文案。";
"HideShortsAudioTrack" = "隐藏音频音轨"; "HideShortsAudioTrack" = "隐藏音轨";
"HideShortsAudioTrackDesc" = "短视频描述下隐藏音频音轨。"; "HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
"Other" = "其他"; "Other" = "其他";
"CopyPostText" = "复制社区帖子文本";
"CopyPostTextDesc" = "长按社区帖子文本复制到剪贴板。";
"SavePostImage" = "保存社区帖子图片";
"SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。";
"SaveProfilePhoto" = "保存个人资料图片";
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
"FixAlbums" = "修复封面";
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
"RemovePlayNext" = "删除“播放队列中的下一个”"; "RemovePlayNext" = "删除“播放队列中的下一个”";
"RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。"; "RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。";
"NoContinueWatching" = "删除“继续观看”"; "NoContinueWatching" = "删除“继续观看”";
"NoContinueWatchingDesc" = "从首页中删除包含未完成视频的“继续观看”部分。"; "NoContinueWatchingDesc" = "从首页中删除包含未完成视频的“继续观看”部分。";
"NoSearchHistory" = "隐藏搜索历史记录";
"NoSearchHistoryDesc" = "直观地隐藏搜索历史记录和建议。注意:搜索历史记录仍然可以在其他YouTube客户端中访问。";
"NoRelatedWatchNexts" = "隐藏播放器下的所有视频";
"NoRelatedWatchNextsDesc" = "隐藏播放器下方的所有视频,仅保留视频信息和评论部分。";
"StickSortComments" = "固定评论排序";
"StickSortCommentsDesc" = "固定评论顶部排序功能按钮(热门、时间),滚动时不会消失。";
"HideSortComments" = "隐藏评论排序";
"HideSortCommentsDesc" = "隐藏评论排序功能,使它永远不会出现。";
"PlaylistOldMinibar" = "旧播放列表";
"PlaylistOldMinibarDesc" = "将新的浮动播放列表面板替换为旧的浮动播放列表面板。";
"DisableRTL" = "禁用 RTL 格式";
"DisableRTLDesc" = "对于最初以从右到左 (RTL) 显示的语言,强制以从左到右 (LTR) 格式显示文本。";
"Startup" = "启动页"; "Startup" = "启动页";
"Home" = "首页"; "Home" = "首页";
@@ -141,13 +181,20 @@
"About" = "关于"; "About" = "关于";
"Credits" = "信息"; "Credits" = "信息";
"Developer" = "YTLite开发者"; "Developer" = "YTLite开发者";
"ChineseSimplified" = "Chinese (Simplified) localization"; "ChineseSimplified" = "中文(简体)本地化";
"ChineseTraditional" = "Chinese (Traditional) localization"; "ChineseTraditional" = "中文(繁体)本地化";
"French" = "French localization"; "French" = "法语本地化";
"Spanish" = "Spanish localization"; "Spanish" = "西班牙语本地化";
"Japanese" = "日语本地化";
"Advanced" = "高级模式"; "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设置"; "ResetSettings" = "重置YTLite设置";
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?"; "ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
"ShortsModeTurnedOff" = "仅短视频模式已关闭";
"Yes" = "是"; "Yes" = "是";
"No" = "不"; "No" = "不";
"Copied" = "已复制到剪贴板";
"Saved" = "已保存到照片";
"Error" = "错误";
@@ -4,7 +4,7 @@
"BackgroundPlayback" = "背景播放"; "BackgroundPlayback" = "背景播放";
"BackgroundPlaybackDesc" = "啟用背景播放"; "BackgroundPlaybackDesc" = "啟用背景播放";
"Navbar" = "上方導覽列"; "Navbar" = "頂部導覽列";
"RemoveCast" = "隱藏投放按鈕"; "RemoveCast" = "隱藏投放按鈕";
"RemoveCastDesc" = "從導覽列隱藏投放按鈕"; "RemoveCastDesc" = "從導覽列隱藏投放按鈕";
"RemoveNotifications" = "隱藏通知按鈕"; "RemoveNotifications" = "隱藏通知按鈕";
@@ -29,15 +29,17 @@
"NoHUDMsgsDesc" = "隱藏播放器中的所有功能。例如:開啟/關閉 CC、開啟循環播放...等"; "NoHUDMsgsDesc" = "隱藏播放器中的所有功能。例如:開啟/關閉 CC、開啟循環播放...等";
"HidePrevNext" = "隱藏上一部和下一部按鈕"; "HidePrevNext" = "隱藏上一部和下一部按鈕";
"HidePrevNextDesc" = "隱藏播放器中上一部和下一部影片按鈕"; "HidePrevNextDesc" = "隱藏播放器中上一部和下一部影片按鈕";
"ReplacePrevNext" = "替換快轉和倒轉按鈕"; "ReplacePrevNext" = "取代快轉和倒轉按鈕";
"ReplacePrevNextDesc" = "將播放器中的上一部和下一部影片按鈕替換為快轉和倒轉按鈕"; "ReplacePrevNextDesc" = "將播放器中的上一部和下一部影片按鈕取代為快轉和倒轉按鈕";
"NoDarkBg" = "移除深色背景"; "NoDarkBg" = "移除深色背景";
"NoDarkBgDesc" = "移除播放器中的深色背景"; "NoDarkBgDesc" = "移除播放器中的深色背景";
"NoEndScreenCards" = "隱藏片尾懸停影片"; "NoEndScreenCards" = "隱藏片尾懸停影片";
"NoEndScreenCardsDesc" = "隱藏當影片結束時的懸停影片(縮圖)"; "NoEndScreenCardsDesc" = "隱藏當影片結束時的懸停影片(縮圖)";
"NoFullscreenActions" = "停用全螢幕操作"; "NoFullscreenActions" = "停用全螢幕操作";
"NoFullscreenActionsDesc" = "在全螢幕模式下停用操作面板"; "NoFullscreenActionsDesc" = "在全螢幕模式下停用操作面板";
"NoRelatedVids" = "沒有相關影片"; "PersistentProgressBar" = "固定進度條";
"PersistentProgressBarDesc" = "總是在播放器中顯示進度條";
"NoRelatedVids" = "隱藏相關影片";
"NoRelatedVidsDesc" = "移除全螢幕模式向上滑動時所出現的相關影片"; "NoRelatedVidsDesc" = "移除全螢幕模式向上滑動時所出現的相關影片";
"NoPromotionCards" = "隱藏付費推廣"; "NoPromotionCards" = "隱藏付費推廣";
"NoPromotionCardsDesc" = "在付費推廣的影片中隱藏「付費推廣」"; "NoPromotionCardsDesc" = "在付費推廣的影片中隱藏「付費推廣」";
@@ -47,8 +49,14 @@
"Player" = "播放器"; "Player" = "播放器";
"Miniplayer" = "啟用迷你播放器"; "Miniplayer" = "啟用迷你播放器";
"MiniplayerDesc" = "對於原本不支援迷你播放器的影片(例如針對兒童的影片),啟用迷你播放器"; "MiniplayerDesc" = "對於原本不支援迷你播放器的影片(例如針對兒童的影片),啟用迷你播放器";
"PortraitFullscreen" = "直向全螢幕模式";
"PortraitFullscreenDesc" = "啟用直向全螢幕模式";
"CopyWithTimestamp" = "複製時間標記連結";
"CopyWithTimestampDesc" = "透過按下暫停按鈕,將帶有時間標記的連結複製到剪貼簿";
"DisableAutoplay" = "停用自動播放"; "DisableAutoplay" = "停用自動播放";
"DisableAutoplayDesc" = "在打開應用程式後防止自動播放影片"; "DisableAutoplayDesc" = "在打開應用程式後防止自動播放影片";
"DisableAutoCaptions" = "停用自動字幕";
"DisableAutoCaptionsDesc" = "防止字幕自動啟用";
"NoContentWarning" = "略過內容警告"; "NoContentWarning" = "略過內容警告";
"NoContentWarningDesc" = "略過敏感內容警告訊息"; "NoContentWarningDesc" = "略過敏感內容警告訊息";
"ClassicQuality" = "舊版本影片畫質"; "ClassicQuality" = "舊版本影片畫質";
@@ -71,10 +79,14 @@
"NoDoubleTap2SeekDesc" = "停用點兩下手勢進行快轉"; "NoDoubleTap2SeekDesc" = "停用點兩下手勢進行快轉";
"Tabbar" = "下方標籤欄"; "Tabbar" = "下方標籤欄";
"RemoveLabels" = "移除標籤文字"; "RemoveLabels" = "移除文字";
"RemoveLabelsDesc" = "移除標籤文字"; "RemoveLabelsDesc" = "移除標籤文字";
"ReExplore" = "將Shorts替換為探索"; "RemoveIndicators" = "刪除標記";
"ReExploreDesc" = "在舊版YouTube上顯示「探索」而非「Shorts」"; "RemoveIndicatorsDesc" = "刪除標籤通知標記";
"ReExplore" = "用探索取代Shorts分頁";
"ReExploreDesc" = "如同舊版YouTube一樣顯示「探索」而非「Shorts」";
"AddExplore" = "新增探索標籤";
"AddExploreDesc" = "在下方標籤欄新增探索標籤";
"HideShortsTab" = "隱藏Shorts"; "HideShortsTab" = "隱藏Shorts";
"HideShortsTabDesc" = "從標籤欄中隱藏Shorts標籤"; "HideShortsTabDesc" = "從標籤欄中隱藏Shorts標籤";
"HideSubscriptionsTab" = "隱藏訂閱內容"; "HideSubscriptionsTab" = "隱藏訂閱內容";
@@ -85,10 +97,16 @@
"HideLibraryTabDesc" = "從標籤欄中隱藏媒體庫標籤"; "HideLibraryTabDesc" = "從標籤欄中隱藏媒體庫標籤";
"Shorts" = "Shorts"; "Shorts" = "Shorts";
"ShortsOnlyMode" = "只看Shorts模式";
"ShortsOnlyModeDesc" = "限制YouTube功能只能觀看Shorts影片";
"HideShorts" = "隱藏Shorts影片"; "HideShorts" = "隱藏Shorts影片";
"HideShortsDesc" = "從首頁、推薦...等,隱藏Shorts影片(不適用於觀看紀錄)"; "HideShortsDesc" = "從首頁、推薦...等,隱藏Shorts影片(不適用於觀看紀錄)";
"ShortsProgress" = "啟用時間進度條"; "ShortsProgress" = "啟用時間進度條";
"ShortsProgressDesc" = "在Shorts底部顯示進度條"; "ShortsProgressDesc" = "在Shorts底部顯示進度條";
"PinchToFullscreenShorts" = "捏合切換全螢幕";
"PinchToFullscreenShortsDesc" = "透過兩指縮放手勢,控制覆蓋層的顯示,讓Shorts以全螢幕模式播放";
"ShortsToRegular" = "Shorts轉為一般影片";
"ShortsToRegularDesc" = "將Shorts作為一般影片開啟";
"ResumeShorts" = "不要從Shorts開始"; "ResumeShorts" = "不要從Shorts開始";
"ResumeShortsDesc" = "防止重新開啟應用程式時從Shorts開始播放,如果在觀看Shorts時關閉,就會發生這種情況"; "ResumeShortsDesc" = "防止重新開啟應用程式時從Shorts開始播放,如果在觀看Shorts時關閉,就會發生這種情況";
"HideShortsLogo" = "隱藏Shorts圖示"; "HideShortsLogo" = "隱藏Shorts圖示";
@@ -115,6 +133,8 @@
"HideShortsAvatarsDesc" = "隱藏右下角的頻道圖片"; "HideShortsAvatarsDesc" = "隱藏右下角的頻道圖片";
"HideShortsThanks" = "隱藏超級感謝按鈕"; "HideShortsThanks" = "隱藏超級感謝按鈕";
"HideShortsThanksDesc" = "從Shorts中隱藏超級感謝 (贊助) 按鈕"; "HideShortsThanksDesc" = "從Shorts中隱藏超級感謝 (贊助) 按鈕";
"HideShortsSource" = "隱藏Shorts來源";
"HideShortsSourceDesc" = "在頻道名稱下隱藏Shorts來源";
"HideShortsChannelName" = "隱藏頻道名稱"; "HideShortsChannelName" = "隱藏頻道名稱";
"HideShortsChannelNameDesc" = "從Shorts中隱藏頻道名稱和訂閱按鈕"; "HideShortsChannelNameDesc" = "從Shorts中隱藏頻道名稱和訂閱按鈕";
"HideShortsDescription" = "隱藏描述"; "HideShortsDescription" = "隱藏描述";
@@ -123,10 +143,30 @@
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效"; "HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
"Other" = "其它"; "Other" = "其它";
"CopyPostText" = "複製社群貼文文字";
"CopyPostTextDesc" = "長按社群貼文文字複製到剪貼簿";
"SavePostImage" = "儲存社群貼文圖片";
"SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用";
"SaveProfilePhoto" = "儲存個人檔案照片";
"SaveProfilePhotoDesc" = "長按個人檔案照片儲存到照片應用";
"FixAlbums" = "修復封面";
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
"RemovePlayNext" = "移除「播放下一個」"; "RemovePlayNext" = "移除「播放下一個」";
"RemovePlayNextDesc" = "從選單移除「播放下一個」"; "RemovePlayNextDesc" = "從選單移除「播放下一個」";
"NoContinueWatching" = "移除「繼續觀看」"; "NoContinueWatching" = "移除「繼續觀看」";
"NoContinueWatchingDesc" = "從首頁中移除包含未完成影片的「繼續觀看」部分"; "NoContinueWatchingDesc" = "從首頁中移除包含未完成影片的「繼續觀看」部分";
"NoSearchHistory" = "隱藏搜尋記錄";
"NoSearchHistoryDesc" = "視覺上隱藏搜尋歷史紀錄和建議。注意:您的搜尋紀錄仍然可在其它 YouTube 客戶端中存取";
"NoRelatedWatchNexts" = "隱藏播放器下的所有影片";
"NoRelatedWatchNextsDesc" = "只留下影片資訊和留言區域";
"StickSortComments" = "固定留言排序";
"StickSortCommentsDesc" = "將留言排序(熱門、最新)功能固定,這樣在滾動時就不會消失";
"HideSortComments" = "隱藏留言排序";
"HideSortCommentsDesc" = "隱藏留言排序(熱門、最新)功能,將永不顯示";
"PlaylistOldMinibar" = "舊版播放清單";
"PlaylistOldMinibarDesc" = "將新版的浮動播放清單面板替換為舊版";
"DisableRTL" = "停用RTL格式";
"DisableRTLDesc" = "強制將初始顯示從右到左(RTL)格式的語言,改為從左到右(LTR)顯示";
"Startup" = "啟動頁面"; "Startup" = "啟動頁面";
"Home" = "首頁"; "Home" = "首頁";
@@ -141,13 +181,20 @@
"About" = "關於"; "About" = "關於";
"Credits" = "貢獻"; "Credits" = "貢獻";
"Developer" = "YTLite開發者"; "Developer" = "YTLite開發者";
"ChineseSimplified" = "Chinese (Simplified) localization"; "ChineseSimplified" = "簡體中文在地化";
"ChineseTraditional" = "Chinese (Traditional) localization"; "ChineseTraditional" = "繁體中文在地化";
"French" = "French localization"; "French" = "法文在地化";
"Spanish" = "Spanish localization"; "Spanish" = "西班牙文在地化";
"Japanese" = "日本語本地化";
"Advanced" = "進階模式"; "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使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
"ResetSettings" = "重置YTLite設定"; "ResetSettings" = "重置YTLite設定";
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?"; "ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
"ShortsModeTurnedOff" = "已關閉「只看Shorts模式」";
"Yes" = "是"; "Yes" = "是";
"No" = "否"; "No" = "否";
"Copied" = "已複製到剪貼簿";
"Saved" = "已儲存到照片應用";
"Error" = "發生錯誤";
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.