Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe3a942de0 | ||
|
|
123215f372 | ||
|
|
07fc0b98c3 | ||
|
|
537f828731 | ||
|
|
8218578734 | ||
|
|
fe6b509b3b | ||
|
|
8f72d70029 | ||
|
|
07a13df097 | ||
|
|
9a43e1b9b3 | ||
|
|
f7d567bf5d | ||
|
|
4921d95073 | ||
|
|
87cdca4867 | ||
|
|
f96d397f3b | ||
|
|
74baf844be | ||
|
|
df95227b88 | ||
|
|
66e7e35798 | ||
|
|
3e67c85de9 | ||
|
|
dae1714bcc | ||
|
|
343f40dac3 | ||
|
|
7eafc3de7d | ||
|
|
33b0125e9b | ||
|
|
9d8f74c8cb | ||
|
|
6bb405092d | ||
|
|
8da024261d | ||
|
|
a2771e7d52 | ||
|
|
e3b1507e7a | ||
|
|
d4bc6a5859 | ||
|
|
256c9f54cd | ||
|
|
44436a0d1c | ||
|
|
cccd5adb58 | ||
|
|
db8cf75f07 | ||
|
|
43af06cf1b | ||
|
|
6cadf005c0 | ||
|
|
8f272f567d | ||
|
|
7ea704af46 | ||
|
|
6efa3c74c9 | ||
|
|
3337bd2dd4 | ||
|
|
870e7ba5b4 | ||
|
|
5b24103c2e | ||
|
|
1abb4894ca | ||
|
|
1b18429bd2 | ||
|
|
58d9c4411f | ||
|
|
66802f049e | ||
|
|
7f829f8768 | ||
|
|
057815f3f0 | ||
|
|
3a64da39d6 | ||
|
|
06606c26a8 | ||
|
|
2d36a15054 |
@@ -5,8 +5,8 @@ endif
|
||||
DEBUG=0
|
||||
FINALPACKAGE=1
|
||||
ARCHS = arm64
|
||||
PACKAGE_VERSION = 2.4
|
||||
TARGET := iphone:clang:latest:11.0
|
||||
PACKAGE_VERSION = 2.6.3
|
||||
TARGET := iphone:clang:latest:13.0
|
||||
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
|
||||
|
||||
+105
-28
@@ -6,17 +6,21 @@
|
||||
|
||||
static const NSInteger YTLiteSection = 789;
|
||||
|
||||
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;
|
||||
static NSString *GetCacheSize() {
|
||||
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
|
||||
NSArray *filesArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:cachePath error:nil];
|
||||
|
||||
unsigned long long int folderSize = 0;
|
||||
for (NSString *fileName in filesArray) {
|
||||
NSString *filePath = [cachePath stringByAppendingPathComponent:fileName];
|
||||
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
|
||||
folderSize += [fileAttributes fileSize];
|
||||
}
|
||||
|
||||
NSByteCountFormatter *formatter = [[NSByteCountFormatter alloc] init];
|
||||
formatter.countStyle = NSByteCountFormatterCountStyleFile;
|
||||
|
||||
return [formatter stringFromByteCount:folderSize];
|
||||
}
|
||||
|
||||
// Settings
|
||||
@@ -66,12 +70,30 @@ NSBundle *YTLiteBundle() {
|
||||
|
||||
static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleDescription, NSString *key, BOOL *value, id selfObject) {
|
||||
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
|
||||
Class YTAlertViewClass = %c(YTAlertView);
|
||||
YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:title
|
||||
titleDescription:titleDescription
|
||||
accessibilityIdentifier:nil
|
||||
switchOn:*value
|
||||
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;
|
||||
}
|
||||
settingItemId:0];
|
||||
@@ -150,6 +172,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject),
|
||||
createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"endScreenCards", &kEndScreenCards, 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(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject),
|
||||
createSwitchItem(LOC(@"NoWatermarks"), LOC(@"NoWatermarksDesc"), @"noWatermarks", &kNoWatermarks, selfObject)
|
||||
@@ -172,6 +195,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
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(@"DisableAutoCaptions"), LOC(@"DisableAutoCaptionsDesc"), @"disableAutoCaptions", &kDisableAutoCaptions, selfObject),
|
||||
createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject),
|
||||
createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject),
|
||||
createSwitchItem(LOC(@"ExtraSpeedOptions"), LOC(@"ExtraSpeedOptionsDesc"), @"extraSpeedOptions", &kExtraSpeedOptions, selfObject),
|
||||
@@ -197,8 +221,11 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
}
|
||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||
createSwitchItem(LOC(@"ShortsOnlyMode"), LOC(@"ShortsOnlyModeDesc"), @"shortsOnlyMode", &kShortsOnlyMode, selfObject),
|
||||
createSwitchItem(LOC(@"HideShorts"), LOC(@"HideShortsDesc"), @"hideShorts", &kHideShorts, 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(@"HideShortsLogo"), LOC(@"HideShortsLogoDesc"), @"hideShortsLogo", &kHideShortsLogo, selfObject),
|
||||
createSwitchItem(LOC(@"HideShortsSearch"), LOC(@"HideShortsSearchDesc"), @"hideShortsSearch", &kHideShortsSearch, selfObject),
|
||||
@@ -212,6 +239,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
createSwitchItem(LOC(@"HideShortsShare"), LOC(@"HideShortsShareDesc"), @"hideShortsShare", &kHideShortsShare, selfObject),
|
||||
createSwitchItem(LOC(@"HideShortsAvatars"), LOC(@"HideShortsAvatarsDesc"), @"hideShortsAvatars", &kHideShortsAvatars, 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(@"HideShortsDescription"), LOC(@"HideShortsDescriptionDesc"), @"hideShortsDescription", &kHideShortsDescription, selfObject),
|
||||
createSwitchItem(LOC(@"HideShortsAudioTrack"), LOC(@"HideShortsAudioTrackDesc"), @"hideShortsAudioTrack", &kHideShortsAudioTrack, selfObject),
|
||||
@@ -234,6 +262,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
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(@"AddExplore"), LOC(@"AddExploreDesc"), @"addExplore", &kAddExplore, selfObject),
|
||||
createSwitchItem(LOC(@"HideShortsTab"), LOC(@"HideShortsTabDesc"), @"removeShorts", &kRemoveShorts, selfObject),
|
||||
createSwitchItem(LOC(@"HideSubscriptionsTab"), LOC(@"HideSubscriptionsTabDesc"), @"removeSubscriptions", &kRemoveSubscriptions, selfObject),
|
||||
createSwitchItem(LOC(@"HideUploadButton"), LOC(@"HideUploadButtonDesc"), @"removeUploads", &kRemoveUploads, selfObject),
|
||||
@@ -254,6 +283,12 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
}
|
||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||
createSwitchItem(LOC(@"CopyVideoInfo"), LOC(@"CopyVideoInfoDesc"), @"copyVideoInfo", &kCopyVideoInfo, selfObject),
|
||||
createSwitchItem(LOC(@"PostManager"), LOC(@"PostManagerDesc"), @"postManager", &kPostManager, selfObject),
|
||||
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
|
||||
createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, selfObject),
|
||||
createSwitchItem(LOC(@"CommentManager"), LOC(@"CommentManagerDesc"), @"commentManager", &kCommentManager, selfObject),
|
||||
createSwitchItem(LOC(@"FixAlbums"), LOC(@"FixAlbumsDesc"), @"fixAlbums", &kFixAlbums, selfObject),
|
||||
createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject),
|
||||
createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject),
|
||||
createSwitchItem(LOC(@"NoSearchHistory"), LOC(@"NoSearchHistoryDesc"), @"noSearchHistory", &kNoSearchHistory, selfObject),
|
||||
@@ -277,10 +312,12 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
detailTextBlock:^NSString *() {
|
||||
switch (kPivotIndex) {
|
||||
case 1:
|
||||
return LOC(@"ShortsTab");
|
||||
return LOC(@"Explore");
|
||||
case 2:
|
||||
return LOC(@"Subscriptions");
|
||||
return LOC(@"ShortsTab");
|
||||
case 3:
|
||||
return LOC(@"Subscriptions");
|
||||
case 4:
|
||||
return LOC(@"Library");
|
||||
case 0:
|
||||
default:
|
||||
@@ -295,6 +332,20 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
||||
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) {
|
||||
if (kRemoveShorts) {
|
||||
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
|
||||
@@ -303,7 +354,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
[alertView show];
|
||||
return NO;
|
||||
} else {
|
||||
kPivotIndex = 1;
|
||||
kPivotIndex = 2;
|
||||
[settingsViewController reloadData];
|
||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
||||
return YES;
|
||||
@@ -317,7 +368,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
[alertView show];
|
||||
return NO;
|
||||
} else {
|
||||
kPivotIndex = 2;
|
||||
kPivotIndex = 3;
|
||||
[settingsViewController reloadData];
|
||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
||||
return YES;
|
||||
@@ -331,7 +382,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
[alertView show];
|
||||
return NO;
|
||||
} else {
|
||||
kPivotIndex = 3;
|
||||
kPivotIndex = 4;
|
||||
[settingsViewController reloadData];
|
||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
||||
return YES;
|
||||
@@ -379,10 +430,31 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/SKEIDs"]];
|
||||
}];
|
||||
|
||||
YTSettingsSectionItem *hiepvk = [%c(YTSettingsSectionItem) itemWithTitle:@"Hiepvk" titleDescription:LOC(@"Vietnamese") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/hiepvk"]];
|
||||
}];
|
||||
|
||||
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/"]];
|
||||
}];
|
||||
|
||||
YTSettingsSectionItem *paypal = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"DonateViaPayPal") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:^NSString *() { return @"♡"; } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://paypal.me/Dayanch96/"]];
|
||||
}];
|
||||
|
||||
YTSettingsSectionItem *ghSponsors = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"SupportViaGhSponsors") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:^NSString *() { return @"♡"; } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/sponsors/dayanch96"]];
|
||||
}];
|
||||
|
||||
YTSettingsSectionItem *cache = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ClearCache") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:^NSString *() { return GetCacheSize(); } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
|
||||
[[NSFileManager defaultManager] removeItemAtPath:cachePath error:nil];
|
||||
});
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Done") firstResponder:[self parentResponder]] send];
|
||||
return YES;
|
||||
}];
|
||||
|
||||
YTSettingsSectionItem *reset = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
||||
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
|
||||
@@ -406,15 +478,20 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
return @(OS_STRINGIFY(TWEAK_VERSION));
|
||||
}
|
||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||
NSArray <YTSettingsSectionItem *> *rows = @[ps, miro, lillie, dayanch96, stalker, clement, balackburn, decibelios, skeids, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), reset];
|
||||
NSArray <YTSettingsSectionItem *> *rows = @[ps, miro, lillie, dayanch96, stalker, clement, balackburn, decibelios, skeids, hiepvk, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), cache, reset];
|
||||
|
||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||
[settingsViewController pushViewController:picker];
|
||||
return YES;
|
||||
}];
|
||||
[sectionItems addObject:paypal];
|
||||
[sectionItems addObject:ghSponsors];
|
||||
[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 {
|
||||
@@ -435,15 +512,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(), ^{
|
||||
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
||||
[prefs setObject:@(YES) forKey:@"advancedMode"];
|
||||
[prefs writeToFile:prefsPath atomically:NO];
|
||||
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
|
||||
}
|
||||
actionTitle:LOC(@"Yes")
|
||||
cancelTitle:LOC(@"No")];
|
||||
alertView.title = @"YTLite";
|
||||
alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")];
|
||||
[alertView show];
|
||||
[prefs setObject:@(YES) forKey:@"advancedMode"];
|
||||
[prefs writeToFile:prefsPath atomically:NO];
|
||||
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
|
||||
}
|
||||
actionTitle:LOC(@"Yes")
|
||||
cancelTitle:LOC(@"No")];
|
||||
alertView.title = @"YTLite";
|
||||
alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")];
|
||||
[alertView show];
|
||||
});
|
||||
}
|
||||
}
|
||||
+24
-16
@@ -71,31 +71,39 @@ static NSString *accessGroupID() {
|
||||
}
|
||||
%end
|
||||
|
||||
%hook NSBundle
|
||||
- (NSString *)bundleIdentifier {
|
||||
BOOL isSelf() {
|
||||
NSArray *address = [NSThread callStackReturnAddresses];
|
||||
Dl_info info = {0};
|
||||
if (dladdr((void *)[address[2] longLongValue], &info) == 0)
|
||||
return %orig;
|
||||
if (dladdr((void *)[address[2] longLongValue], &info) == 0) return NO;
|
||||
NSString *path = [NSString stringWithUTF8String:info.dli_fname];
|
||||
if ([path hasPrefix:NSBundle.mainBundle.bundlePath])
|
||||
return YT_BUNDLE_ID;
|
||||
return %orig;
|
||||
return [path hasPrefix:NSBundle.mainBundle.bundlePath];
|
||||
}
|
||||
|
||||
%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 {
|
||||
if (!isSelf())
|
||||
return %orig;
|
||||
if ([key isEqualToString:@"CFBundleIdentifier"])
|
||||
return YT_BUNDLE_ID;
|
||||
if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"])
|
||||
return YT_NAME;
|
||||
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
|
||||
|
||||
// Fix login for YouTube 18.13.2 and higher
|
||||
@@ -133,6 +141,6 @@ static NSString *accessGroupID() {
|
||||
%end
|
||||
|
||||
%ctor {
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath:[[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]])
|
||||
%init(gSideloading);
|
||||
BOOL isAppStoreApp = [[NSFileManager defaultManager] fileExistsAtPath:[[NSBundle mainBundle] appStoreReceiptURL].path];
|
||||
if (!isAppStoreApp) %init(gSideloading);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <rootless.h>
|
||||
#import <Photos/Photos.h>
|
||||
#import "../YouTubeHeader/YTAlertView.h"
|
||||
#import "../YouTubeHeader/YTIGuideResponse.h"
|
||||
#import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
|
||||
#import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h"
|
||||
@@ -8,6 +10,7 @@
|
||||
#import "../YouTubeHeader/YTIBrowseRequest.h"
|
||||
#import "../YouTubeHeader/YTISectionListRenderer.h"
|
||||
#import "../YouTubeHeader/YTQTMButton.h"
|
||||
#import "../YouTubeHeader/YTIButtonRenderer.h"
|
||||
#import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
||||
#import "../YouTubeHeader/YTPlayerViewController.h"
|
||||
#import "../YouTubeHeader/YTWatchController.h"
|
||||
@@ -19,12 +22,25 @@
|
||||
#import "../YouTubeHeader/YTSettingsPickerViewController.h"
|
||||
#import "../YouTubeHeader/YTUIUtils.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) {
|
||||
NSBundle *tweakBundle = YTLiteBundle();
|
||||
return [tweakBundle localizedStringForKey:key value:nil table:nil];
|
||||
return [YTLiteBundle() localizedStringForKey:key value:nil table:nil];
|
||||
}
|
||||
|
||||
BOOL kNoAds;
|
||||
@@ -44,6 +60,7 @@ BOOL kReplacePrevNext;
|
||||
BOOL kNoDarkBg;
|
||||
BOOL kEndScreenCards;
|
||||
BOOL kNoFullscreenActions;
|
||||
BOOL kPersistentProgressBar;
|
||||
BOOL kNoRelatedVids;
|
||||
BOOL kNoPromotionCards;
|
||||
BOOL kNoWatermarks;
|
||||
@@ -51,6 +68,7 @@ BOOL kMiniplayer;
|
||||
BOOL kPortraitFullscreen;
|
||||
BOOL kCopyWithTimestamp;
|
||||
BOOL kDisableAutoplay;
|
||||
BOOL kDisableAutoCaptions;
|
||||
BOOL kNoContentWarning;
|
||||
BOOL kClassicQuality;
|
||||
BOOL kExtraSpeedOptions;
|
||||
@@ -61,8 +79,11 @@ BOOL kNoFreeZoom;
|
||||
BOOL kAutoFullscreen;
|
||||
BOOL kExitFullscreen;
|
||||
BOOL kNoDoubleTapToSeek;
|
||||
BOOL kShortsOnlyMode;
|
||||
BOOL kHideShorts;
|
||||
BOOL kShortsProgress;
|
||||
BOOL kPinchToFullscreenShorts;
|
||||
BOOL kShortsToRegular;
|
||||
BOOL kResumeShorts;
|
||||
BOOL kHideShortsLogo;
|
||||
BOOL kHideShortsSearch;
|
||||
@@ -76,6 +97,7 @@ BOOL kHideShortsRemix;
|
||||
BOOL kHideShortsShare;
|
||||
BOOL kHideShortsAvatars;
|
||||
BOOL kHideShortsThanks;
|
||||
BOOL kHideShortsSource;
|
||||
BOOL kHideShortsChannelName;
|
||||
BOOL kHideShortsDescription;
|
||||
BOOL kHideShortsAudioTrack;
|
||||
@@ -83,10 +105,18 @@ BOOL kHideShortsPromoCards;
|
||||
BOOL kRemoveLabels;
|
||||
BOOL kRemoveIndicators;
|
||||
BOOL kReExplore;
|
||||
BOOL kAddExplore;
|
||||
BOOL kRemoveShorts;
|
||||
BOOL kRemoveSubscriptions;
|
||||
BOOL kRemoveUploads;
|
||||
BOOL kRemoveLibrary;
|
||||
BOOL kCopyVideoInfo;
|
||||
BOOL kPostManager;
|
||||
BOOL kSavePostImage;
|
||||
BOOL kSaveProfilePhoto;
|
||||
BOOL kCommentManager;
|
||||
BOOL kSavePost;
|
||||
BOOL kFixAlbums;
|
||||
BOOL kRemovePlayNext;
|
||||
BOOL kNoContinueWatching;
|
||||
BOOL kNoSearchHistory;
|
||||
@@ -109,11 +139,17 @@ int kPivotIndex;
|
||||
@interface YTPivotBarView : UIView
|
||||
@end
|
||||
|
||||
@interface YTPivotBarItemView : UIView
|
||||
@interface YTLightweightQTMButton ()
|
||||
@property (nonatomic, assign, readwrite, getter=isShouldRaiseOnTouch) BOOL shouldRaiseOnTouch;
|
||||
@end
|
||||
|
||||
@interface YTPivotBarViewController : UIViewController
|
||||
- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier;
|
||||
@interface YTQTMButton ()
|
||||
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
|
||||
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
|
||||
@end
|
||||
|
||||
@interface YTPivotBarItemView : UIView
|
||||
@property (nonatomic, strong, readwrite) YTQTMButton *navigationButton;
|
||||
@end
|
||||
|
||||
@interface YTRightNavigationButtons : UIView
|
||||
@@ -121,10 +157,7 @@ int kPivotIndex;
|
||||
@property (nonatomic, strong) YTQTMButton *searchButton;
|
||||
@end
|
||||
|
||||
@interface YTSearchView : UIView
|
||||
@end
|
||||
|
||||
@interface YTSearchBarView : UIView
|
||||
@interface YTSearchViewController : UIViewController
|
||||
@end
|
||||
|
||||
@interface YTNavigationBarTitleView : UIView
|
||||
@@ -133,8 +166,88 @@ int kPivotIndex;
|
||||
@interface YTChipCloudCell : UICollectionViewCell
|
||||
@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 YTIVideoDetails ()
|
||||
@property (nonatomic, copy, readwrite) NSString *title;
|
||||
@property (nonatomic, copy, readwrite) NSString *shortDescription;
|
||||
@end
|
||||
|
||||
@interface YTPlayerViewController (YTAFS)
|
||||
@property (nonatomic, assign, readonly) YTPlayerResponse *playerResponse;
|
||||
@property (nonatomic, weak, readwrite) UIViewController *parentViewController;
|
||||
@property (readonly, nonatomic) NSString *contentVideoID;
|
||||
- (void)setActiveCaptionTrack:(id)arg1;
|
||||
- (void)shortsToRegular;
|
||||
- (void)autoFullscreen;
|
||||
- (void)turnOffCaptions;
|
||||
@end
|
||||
|
||||
@interface YTPlayerView : UIView
|
||||
@property (nonatomic, weak, readwrite) YTPlayerViewController *playerViewDelegate;
|
||||
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture;
|
||||
@end
|
||||
|
||||
@interface YTEngagementPanelIdentifier : NSObject
|
||||
@property (nonatomic, copy, readonly) NSString *identifierString;
|
||||
@end
|
||||
|
||||
@interface YTEngagementPanelHeaderView : UIView
|
||||
@property (nonatomic, assign, readonly) YTQTMButton *closeButton;
|
||||
@end
|
||||
|
||||
@interface YTWatchViewController : UIViewController
|
||||
@property (nonatomic, weak, readwrite) YTPlayerViewController *playerViewController;
|
||||
@end
|
||||
|
||||
@interface YTEngagementPanelContainerController : UIViewController
|
||||
@property (nonatomic, weak, readwrite) YTWatchViewController *parentViewController;
|
||||
@end
|
||||
|
||||
@interface YTEngagementPanelNavigationController : UIViewController
|
||||
@property (nonatomic, weak, readwrite) YTEngagementPanelContainerController *parentViewController;
|
||||
@end
|
||||
|
||||
@interface YTMainAppEngagementPanelViewController : UIViewController
|
||||
@property (nonatomic, weak, readwrite) YTEngagementPanelNavigationController *parentViewController;
|
||||
@end
|
||||
|
||||
@interface YTEngagementPanelView : UIView
|
||||
@property (nonatomic, weak, readwrite) YTMainAppEngagementPanelViewController *resizeDelegate;
|
||||
@property (nonatomic, copy, readwrite) YTEngagementPanelIdentifier *panelIdentifier;
|
||||
@property (nonatomic, assign, readonly) YTEngagementPanelHeaderView *headerView;
|
||||
- (void)didTapCopyInfoButton:(UIButton *)sender;
|
||||
@end
|
||||
|
||||
@interface YTSegmentableInlinePlayerBarView
|
||||
@@ -159,19 +272,51 @@ int kPivotIndex;
|
||||
- (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath;
|
||||
@end
|
||||
|
||||
@interface YTReelWatchPlaybackOverlayView : UIView
|
||||
@end
|
||||
// @interface YTReelWatchPlaybackOverlayView : UIView
|
||||
// @end
|
||||
|
||||
@interface YTReelTransparentStackView : UIView
|
||||
@end
|
||||
// @interface YTReelWatchHeaderView : UIView
|
||||
// @end
|
||||
|
||||
@interface YTReelWatchHeaderView : UIView
|
||||
@interface YTReelTransparentStackView : UIStackView
|
||||
@end
|
||||
|
||||
@interface YTELMView : UIView
|
||||
@end
|
||||
|
||||
@interface ASNodeAncestryEnumerator : NSEnumerator
|
||||
@property (atomic, assign, readonly) NSMutableArray *allObjects;
|
||||
@end
|
||||
|
||||
@interface ASDisplayNode : NSObject
|
||||
@property (nonatomic, assign, readonly) UIViewController *closestViewController;
|
||||
@property (atomic, assign, readonly) ASNodeAncestryEnumerator *supernodes;
|
||||
@property (atomic, copy, readwrite) NSArray *yogaChildren;
|
||||
@property (atomic) CALayer *layer;
|
||||
@end
|
||||
|
||||
@interface ELMContainerNode : ASDisplayNode
|
||||
@property (nonatomic, strong, readwrite) NSString *copiedComment;
|
||||
@end
|
||||
|
||||
@interface ELMExpandableTextNode : ASDisplayNode
|
||||
@property (atomic, assign, readonly) ASDisplayNode *currentTextNode;
|
||||
@end
|
||||
|
||||
@interface ASNetworkImageNode : ASDisplayNode
|
||||
@property (atomic, copy, readwrite) NSURL *URL;
|
||||
@end
|
||||
|
||||
@interface ASTextNode : ASDisplayNode
|
||||
@property (atomic, copy, readwrite) NSAttributedString *attributedText;
|
||||
@end
|
||||
|
||||
@interface _ASDisplayView : UIView
|
||||
@property (nonatomic, strong, readwrite) ASDisplayNode *keepalive_node;
|
||||
- (void)postManager:(UILongPressGestureRecognizer *)sender;
|
||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender;
|
||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
|
||||
- (void)commentManager:(UILongPressGestureRecognizer *)sender;
|
||||
@end
|
||||
|
||||
@interface MLHAMQueuePlayer : NSObject
|
||||
@@ -191,14 +336,6 @@ int kPivotIndex;
|
||||
- (void)broadcastRateChange:(float)rate;
|
||||
@end
|
||||
|
||||
@interface YTAlertView : UIView
|
||||
@property (nonatomic, copy, readwrite) NSString *title;
|
||||
@property (nonatomic, copy, readwrite) NSString *subtitle;
|
||||
+ (instancetype)infoDialog;
|
||||
+ (instancetype)confirmationDialogWithAction:(void (^)(void))action actionTitle:(NSString *)actionTitle cancelTitle:(NSString *)cancelTitle;
|
||||
- (void)show;
|
||||
@end
|
||||
|
||||
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
||||
@property (readonly, nonatomic) CGFloat mediaTime;
|
||||
@property (readonly, nonatomic) NSString *videoID;
|
||||
|
||||
@@ -32,11 +32,21 @@
|
||||
- (NSData *)elementData {
|
||||
if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) return nil;
|
||||
|
||||
NSArray *adDescriptions = @[@"brand_promo", @"product_carousel", @"product_engagement_panel", @"product_item", @"text_search_ad", @"text_image_button_layout", @"carousel_headered_layout", @"carousel_footered_layout", @"square_image_layout", @"landscape_image_wide_button_layout", @"feed_ad_metadata"];
|
||||
NSString *description = [self description];
|
||||
if (([adDescriptions containsObject:description] && kNoAds) || ([description containsString:@"inline_shorts"] && kHideShorts)) {
|
||||
|
||||
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"];
|
||||
if (kNoAds && [ads containsObject:description]) {
|
||||
return [NSData data];
|
||||
} return %orig;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -105,42 +115,29 @@
|
||||
%hook YTRightNavigationButtons
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
if (kNoCast && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) self.subviews[1].hidden = YES; // Hide icon immediately
|
||||
|
||||
if (kNoNotifsButton) self.notificationButton.hidden = YES;
|
||||
if (kNoSearchButton) self.searchButton.hidden = YES;
|
||||
|
||||
NSInteger moreButtonIndex = -1;
|
||||
for (NSInteger i = 0; i < self.subviews.count; i++) {
|
||||
UIView *subview = self.subviews[i];
|
||||
if ([subview.accessibilityIdentifier isEqualToString:@"id.settings.overflow.button"]) {
|
||||
moreButtonIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (moreButtonIndex != -1 && moreButtonIndex < self.subviews.count - 1 && kNoVoiceSearchButton) {
|
||||
UIView *voiceButton = self.subviews[moreButtonIndex + 1];
|
||||
voiceButton.hidden = YES;
|
||||
for (UIView *subview in self.subviews) {
|
||||
if (kNoVoiceSearchButton && [subview.accessibilityLabel isEqualToString:NSLocalizedString(@"search.voice.access", nil)]) subview.hidden = YES;
|
||||
if (kNoCast && [subview.accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) subview.hidden = YES;
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTSearchView
|
||||
- (void)layoutSubviews {
|
||||
%hook YTSearchViewController
|
||||
- (void)viewDidLoad {
|
||||
%orig;
|
||||
// Hide Search History
|
||||
if (kNoSearchHistory && self.subviews.count > 1) self.subviews[1].hidden = YES;
|
||||
// Hide Voice Search Button
|
||||
if (kNoVoiceSearchButton && self.subviews.count > 0) {
|
||||
UIView *firstSubview = self.subviews.firstObject;
|
||||
for (UIView *subview in firstSubview.subviews) {
|
||||
if ([NSStringFromClass([subview class]) isEqualToString:@"UIView"]) {
|
||||
[subview setValue:@(1) forKey:@"hidden"];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (kNoVoiceSearchButton) [self setValue:@(NO) forKey:@"_isVoiceSearchAllowed"];
|
||||
}
|
||||
|
||||
- (void)setSuggestions:(id)arg1 { if (!kNoSearchHistory) %orig; }
|
||||
%end
|
||||
|
||||
%hook YTPersonalizedSuggestionsCacheProvider
|
||||
- (id)activeCache { return kNoSearchHistory ? nil : %orig; }
|
||||
%end
|
||||
|
||||
// Remove Videos Section Under Player
|
||||
@@ -151,14 +148,13 @@
|
||||
}
|
||||
%end
|
||||
|
||||
// Hide YouTube Logo
|
||||
%hook YTNavigationBarTitleView
|
||||
- (void)layoutSubviews { %orig; if (kNoYTLogo && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.yoodle.logo"]) self.subviews[1].hidden = YES; }
|
||||
%end
|
||||
|
||||
// Stick Navigation bar
|
||||
%hook YTHeaderView
|
||||
- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : NO; }
|
||||
// Stick Navigation bar
|
||||
- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : %orig; }
|
||||
|
||||
// Hide YouTube Logo
|
||||
- (void)setCustomTitleView:(UIView *)customTitleView { if (!kNoYTLogo) %orig; }
|
||||
- (void)setTitle:(NSString *)title { kNoYTLogo ? %orig(@"") : %orig; }
|
||||
%end
|
||||
|
||||
// Remove Subbar
|
||||
@@ -190,7 +186,6 @@
|
||||
- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { return kNoHUDMsgs ? nil : %orig; }
|
||||
%end
|
||||
|
||||
|
||||
%hook YTColdConfig
|
||||
// Hide Next & Previous buttons
|
||||
- (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : %orig; }
|
||||
@@ -248,11 +243,19 @@
|
||||
- (void)setPaidContentWithPlayerData:(id)data { if (!kNoPromotionCards) %orig; }
|
||||
%end
|
||||
|
||||
%hook YTInlinePlayerBarContainerView
|
||||
- (void)setPlayerBarAlpha:(CGFloat)alpha { kPersistentProgressBar ? %orig(1.0) : %orig; }
|
||||
%end
|
||||
|
||||
// Remove Watermarks
|
||||
%hook YTAnnotationsViewController
|
||||
- (void)loadFeaturedChannelWatermark { if (!kNoWatermarks) %orig; }
|
||||
%end
|
||||
|
||||
%hook YTMainAppVideoPlayerOverlayView
|
||||
- (BOOL)isWatermarkEnabled { return kNoWatermarks ? NO : %orig; }
|
||||
%end
|
||||
|
||||
// Forcibly Enable Miniplayer
|
||||
%hook YTWatchMiniBarViewController
|
||||
- (void)updateMiniBarPlayerStateFromRenderer { if (!kMiniplayer) %orig; }
|
||||
@@ -270,15 +273,14 @@
|
||||
|
||||
// Skip Content Warning (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L452-L454)
|
||||
%hook YTPlayabilityResolutionUserActionUIController
|
||||
- (void)showConfirmAlert { if (kNoContentWarning) [self confirmAlertDidPressConfirm]; }
|
||||
- (void)showConfirmAlert { kNoContentWarning ? [self confirmAlertDidPressConfirm] : %orig; }
|
||||
%end
|
||||
|
||||
// Classic Video Quality (https://github.com/PoomSmart/YTClassicVideoQuality)
|
||||
%hook YTVideoQualitySwitchControllerFactory
|
||||
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
||||
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
||||
if (kClassicQuality) return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
||||
return %orig;
|
||||
return kClassicQuality && originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -374,7 +376,10 @@
|
||||
%hook YTPlayerViewController
|
||||
- (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 {
|
||||
%orig;
|
||||
|
||||
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
|
||||
@@ -382,6 +387,21 @@
|
||||
YTWatchController *watchController = [self valueForKey:@"_UIDelegate"];
|
||||
[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
|
||||
|
||||
// Exit Fullscreen on Finish
|
||||
@@ -458,7 +478,7 @@
|
||||
if ([cell respondsToSelector:@selector(node)]) {
|
||||
NSString *idToRemove = [[cell node] accessibilityIdentifier];
|
||||
if ([idToRemove isEqualToString:@"statement_banner.view"] ||
|
||||
(([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"] || [idToRemove isEqualToString:@"eml.inline_shorts"]) && kHideShorts)) {
|
||||
(([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"]) && kHideShorts)) {
|
||||
[self removeCellsAtIndexPath:indexPath];
|
||||
}
|
||||
}
|
||||
@@ -487,6 +507,11 @@
|
||||
- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; }
|
||||
%end
|
||||
|
||||
%hook YTShortsPlayerViewController
|
||||
- (BOOL)shouldAlwaysEnablePlayerBar { return kShortsProgress ? YES : NO; }
|
||||
- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; }
|
||||
%end
|
||||
|
||||
%hook YTColdConfig
|
||||
- (BOOL)iosEnableVideoPlayerScrubber { return kShortsProgress ? YES : NO; }
|
||||
- (BOOL)mobileShortsTabInlined { return kShortsProgress ? YES : NO; }
|
||||
@@ -512,16 +537,7 @@
|
||||
- (void)setViewCommentButton:(id)arg1 { if (!kHideShortsComments) %orig; }
|
||||
- (void)setRemixButton:(id)arg1 { if (!kHideShortsRemix) %orig; }
|
||||
- (void)setShareButton:(id)arg1 { if (!kHideShortsShare) %orig; }
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
|
||||
for (UIView *subview in self.subviews) {
|
||||
if (kHideShortsAvatars && [NSStringFromClass([subview class]) isEqualToString:@"YTELMView"]) {
|
||||
subview.hidden = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
- (void)setNativePivotButton:(id)arg1 { if (!kHideShortsAvatars) %orig; }
|
||||
%end
|
||||
|
||||
%hook YTReelHeaderView
|
||||
@@ -531,31 +547,331 @@
|
||||
%hook YTReelTransparentStackView
|
||||
- (void)layoutSubviews {
|
||||
%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
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
if (kHideShortsDescription && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.reels_smv_player_title_label"]) self.subviews[2].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;
|
||||
for (YTQTMButton *button in self.subviews) {
|
||||
if ([button respondsToSelector:@selector(buttonRenderer)]) {
|
||||
if (kHideShortsSearch && button.buttonRenderer.icon.iconType == 1045) button.hidden = YES;
|
||||
if (kHideShortsCamera && button.buttonRenderer.icon.iconType == 1046) button.hidden = YES;
|
||||
if (kHideShortsMore && button.buttonRenderer.icon.iconType == 1047) button.hidden = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
%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;
|
||||
}];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%hook _ASDisplayView
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
if (kHideShortsThanks && [self.accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.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 ELMContainerNode
|
||||
%property (nonatomic, strong) NSString *copiedComment;
|
||||
%end
|
||||
|
||||
%hook ASDisplayNode
|
||||
- (void)setFrame:(CGRect)frame {
|
||||
%orig;
|
||||
|
||||
if (kCommentManager && [[self valueForKey:@"_accessibilityIdentifier"] isEqualToString:@"id.comment.content.label"]) {
|
||||
ASTextNode *textNode = (ASTextNode *)self;
|
||||
NSString *comment = textNode.attributedText.string;
|
||||
|
||||
NSMutableArray *allObjects = self.supernodes.allObjects;
|
||||
for (ELMContainerNode *containerNode in allObjects) {
|
||||
if ([containerNode.description containsString:@"id.ui.comment_cell"] && comment) {
|
||||
containerNode.copiedComment = comment;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (kPostManager && [self isKindOfClass:NSClassFromString(@"ELMExpandableTextNode")]) {
|
||||
ELMExpandableTextNode *expandableTextNode = (ELMExpandableTextNode *)self;
|
||||
ASTextNode *textNode = (ASTextNode *)expandableTextNode.currentTextNode;
|
||||
NSString *text = textNode.attributedText.string;
|
||||
|
||||
NSMutableArray *allObjects = self.supernodes.allObjects;
|
||||
for (ELMContainerNode *containerNode in allObjects) {
|
||||
if ([containerNode.description containsString:@"id.ui.backstage.original_post"] && text) {
|
||||
containerNode.copiedComment = text;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
static void downloadImageFromURL(UIResponder *responder, NSURL *URL) {
|
||||
NSString *URLString = URL.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 = URL;
|
||||
}
|
||||
|
||||
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) {
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
||||
}];
|
||||
} else {
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
||||
}
|
||||
}] resume];
|
||||
}
|
||||
|
||||
static void genImageFromLayer(CALayer *layer, UIColor *backgroundColor, void (^completionHandler)(UIImage *)) {
|
||||
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0.0);
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
CGContextSetFillColorWithColor(context, backgroundColor.CGColor);
|
||||
CGContextFillRect(context, CGRectMake(0, 0, layer.frame.size.width, layer.frame.size.height));
|
||||
[layer renderInContext:context];
|
||||
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
|
||||
UIGraphicsEndImageContext();
|
||||
|
||||
if (completionHandler) {
|
||||
completionHandler(image);
|
||||
}
|
||||
}
|
||||
|
||||
%hook _ASDisplayView
|
||||
- (void)setKeepalive_node:(id)arg1 {
|
||||
%orig;
|
||||
|
||||
NSArray *gesturesInfo = @[
|
||||
@{@"selector": @"postManager:", @"text": @"id.ui.backstage.original_post", @"key": @(kPostManager)},
|
||||
@{@"selector": @"saveImage:", @"text": @"YTImageZoomNode-View", @"key": @(kSavePostImage)},
|
||||
@{@"selector": @"savePFP:", @"text": @"ELMImageNode-View", @"key": @(kSaveProfilePhoto)},
|
||||
@{@"selector": @"commentManager:", @"text": @"id.ui.comment_cell", @"key": @(kCommentManager)}
|
||||
];
|
||||
|
||||
for (NSDictionary *gestureInfo in gesturesInfo) {
|
||||
SEL selector = NSSelectorFromString(gestureInfo[@"selector"]);
|
||||
|
||||
if ([gestureInfo[@"key"] boolValue] && [[self description] containsString:gestureInfo[@"text"]]) {
|
||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:selector];
|
||||
longPress.minimumPressDuration = 0.3;
|
||||
[self addGestureRecognizer:longPress];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
|
||||
ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node;
|
||||
NSString *URLString = imageNode.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)postManager:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
ELMContainerNode *nodeForLayer = (ELMContainerNode *)self.keepalive_node.yogaChildren[0];
|
||||
ELMContainerNode *containerNode = (ELMContainerNode *)self.keepalive_node;
|
||||
NSString *text = containerNode.copiedComment;
|
||||
CALayer *layer = nodeForLayer.layer;
|
||||
UIColor *backgroundColor = containerNode.closestViewController.view.backgroundColor;
|
||||
|
||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:LOC(@"SelectAction") message:nil preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
alertController.view.tintColor = [UIColor labelColor];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyPostText") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
if (text) {
|
||||
[UIPasteboard generalPasteboard].string = text;
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send];
|
||||
}
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"SavePostAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
genImageFromLayer(layer, backgroundColor, ^(UIImage *image) {
|
||||
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
|
||||
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAssetFromImage:image];
|
||||
request.creationDate = [NSDate date];
|
||||
} completionHandler:^(BOOL success, NSError *error) {
|
||||
NSString *message = success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription];
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:message firstResponder:containerNode.closestViewController] send];
|
||||
}];
|
||||
});
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyPostAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
genImageFromLayer(layer, backgroundColor, ^(UIImage *image) {
|
||||
[UIPasteboard generalPasteboard].image = image;
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send];
|
||||
});
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"Cancel") style:UIAlertActionStyleCancel handler:nil]];
|
||||
|
||||
[containerNode.closestViewController presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
|
||||
ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node;
|
||||
NSURL *imageURL = imageNode.URL;
|
||||
|
||||
UIResponder *responder = self.nextResponder;
|
||||
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
||||
|
||||
if (imageURL) downloadImageFromURL(responder, imageURL);
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
- (void)commentManager:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
ELMContainerNode *containerNode = (ELMContainerNode *)self.keepalive_node;
|
||||
NSString *comment = containerNode.copiedComment;
|
||||
|
||||
CALayer *layer = self.layer;
|
||||
UIColor *backgroundColor = containerNode.closestViewController.view.backgroundColor;
|
||||
|
||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:LOC(@"SelectAction") message:nil preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
alertController.view.tintColor = [UIColor labelColor];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyCommentText") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
if (comment) {
|
||||
[UIPasteboard generalPasteboard].string = comment;
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send];
|
||||
}
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"SaveCommentAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
genImageFromLayer(layer, backgroundColor, ^(UIImage *image) {
|
||||
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
|
||||
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAssetFromImage:image];
|
||||
request.creationDate = [NSDate date];
|
||||
} completionHandler:^(BOOL success, NSError *error) {
|
||||
NSString *message = success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription];
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:message firstResponder:containerNode.closestViewController] send];
|
||||
}];
|
||||
});
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyCommentAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
genImageFromLayer(layer, backgroundColor, ^(UIImage *image) {
|
||||
[UIPasteboard generalPasteboard].image = image;
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send];
|
||||
});
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"Cancel") style:UIAlertActionStyleCancel handler:nil]];
|
||||
|
||||
[containerNode.closestViewController presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -565,59 +881,39 @@
|
||||
NSMutableArray <YTIPivotBarSupportedRenderers *> *items = [renderer itemsArray];
|
||||
|
||||
NSDictionary *identifiersToRemove = @{
|
||||
@"FEshorts": @(kRemoveShorts),
|
||||
@"FEsubscriptions": @(kRemoveSubscriptions),
|
||||
@"FEuploads": @(kRemoveUploads),
|
||||
@"FElibrary": @(kRemoveLibrary)
|
||||
@"FEshorts": @[@(kRemoveShorts), @(kReExplore)],
|
||||
@"FEsubscriptions": @[@(kRemoveSubscriptions)],
|
||||
@"FEuploads": @[@(kRemoveUploads)],
|
||||
@"FElibrary": @[@(kRemoveLibrary)]
|
||||
};
|
||||
|
||||
for (NSString *identifier in identifiersToRemove) {
|
||||
BOOL shouldRemoveItem = [identifiersToRemove[identifier] boolValue];
|
||||
NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
|
||||
NSArray *removeValues = identifiersToRemove[identifier];
|
||||
BOOL shouldRemoveItem = [removeValues containsObject:@(YES)];
|
||||
|
||||
NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderer, NSUInteger idx, BOOL *stop) {
|
||||
if ([identifier isEqualToString:@"FEuploads"]) {
|
||||
return shouldRemoveItem && [[[renderers pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier];
|
||||
return shouldRemoveItem && [[[renderer pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier];
|
||||
} else {
|
||||
return shouldRemoveItem && [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier];
|
||||
return shouldRemoveItem && [[[renderer pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier];
|
||||
}
|
||||
}];
|
||||
|
||||
if (index != NSNotFound) {
|
||||
[items removeObjectAtIndex:index];
|
||||
}
|
||||
} %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Replace Shorts with Explore tab (https://github.com/PoomSmart/YTReExplore)
|
||||
static void replaceTab(YTIGuideResponse *response) {
|
||||
NSMutableArray <YTIGuideResponseSupportedRenderers *> *renderers = [response itemsArray];
|
||||
for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) {
|
||||
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];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
|
||||
return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]];
|
||||
}];
|
||||
|
||||
%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);
|
||||
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
|
||||
|
||||
@@ -628,76 +924,13 @@ static void replaceTab(YTIGuideResponse *response) {
|
||||
%end
|
||||
|
||||
// Hide Tab Labels
|
||||
BOOL hasHomeBar = NO;
|
||||
CGFloat pivotBarViewHeight;
|
||||
|
||||
%hook YTPivotBarView
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
pivotBarViewHeight = self.frame.size.height;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTPivotBarItemView
|
||||
- (void)layoutSubviews {
|
||||
- (void)setRenderer:(YTIPivotBarRenderer *)renderer {
|
||||
%orig;
|
||||
|
||||
CGFloat pivotBarAccessibilityControlWidth;
|
||||
|
||||
if (kRemoveLabels) {
|
||||
for (UIView *subview in self.subviews) {
|
||||
if ([subview isKindOfClass:objc_lookUpClass("YTPivotBarItemViewAccessibilityControl")]) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
[self.navigationButton setTitle:@"" forState:UIControlStateNormal];
|
||||
[self.navigationButton setSizeWithPaddingAndInsets:NO];
|
||||
}
|
||||
}
|
||||
%end
|
||||
@@ -706,21 +939,24 @@ CGFloat pivotBarViewHeight;
|
||||
BOOL isTabSelected = NO;
|
||||
%hook YTPivotBarViewController
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
%orig();
|
||||
%orig;
|
||||
|
||||
if (!isTabSelected) {
|
||||
if (!isTabSelected && !kShortsOnlyMode) {
|
||||
NSString *pivotIdentifier;
|
||||
switch (kPivotIndex) {
|
||||
case 0:
|
||||
pivotIdentifier = @"FEwhat_to_watch";
|
||||
break;
|
||||
case 1:
|
||||
pivotIdentifier = @"FEshorts";
|
||||
pivotIdentifier = @"FEexplore";
|
||||
break;
|
||||
case 2:
|
||||
pivotIdentifier = @"FEsubscriptions";
|
||||
pivotIdentifier = @"FEshorts";
|
||||
break;
|
||||
case 3:
|
||||
pivotIdentifier = @"FEsubscriptions";
|
||||
break;
|
||||
case 4:
|
||||
pivotIdentifier = @"FElibrary";
|
||||
break;
|
||||
default:
|
||||
@@ -729,6 +965,89 @@ BOOL isTabSelected = NO;
|
||||
[self selectItemWithPivotIdentifier:pivotIdentifier];
|
||||
isTabSelected = YES;
|
||||
}
|
||||
|
||||
if (kShortsOnlyMode) {
|
||||
[self selectItemWithPivotIdentifier:@"FEshorts"];
|
||||
[self.parentViewController hidePivotBar];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTTabsViewController
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
%orig;
|
||||
|
||||
isOverlayShown = YES;
|
||||
|
||||
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
|
||||
|
||||
%hook YTEngagementPanelView
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
|
||||
if (kCopyVideoInfo && [self.panelIdentifier.identifierString isEqualToString:@"video-description-ep-identifier"]) {
|
||||
YTQTMButton *copyInfoButton = [%c(YTQTMButton) iconButton];
|
||||
copyInfoButton.accessibilityLabel = LOC(@"CopyVideoInfo");
|
||||
[copyInfoButton setTag:999];
|
||||
[copyInfoButton enableNewTouchFeedback];
|
||||
[copyInfoButton setImage:[UIImage imageNamed:@"yt_outline_copy_24pt" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil] forState:UIControlStateNormal];
|
||||
[copyInfoButton setTintColor:[UIColor labelColor]];
|
||||
[copyInfoButton setTranslatesAutoresizingMaskIntoConstraints:false];
|
||||
[copyInfoButton addTarget:self action:@selector(didTapCopyInfoButton:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
if (self.headerView && ![self.headerView viewWithTag:999]) {
|
||||
[self.headerView addSubview:copyInfoButton];
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[copyInfoButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-48],
|
||||
[copyInfoButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
|
||||
[copyInfoButton.widthAnchor constraintEqualToConstant:40.0],
|
||||
[copyInfoButton.heightAnchor constraintEqualToConstant:40.0],
|
||||
]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
- (void)didTapCopyInfoButton:(UIButton *)sender {
|
||||
YTPlayerViewController *playerVC = self.resizeDelegate.parentViewController.parentViewController.parentViewController.playerViewController;
|
||||
NSString *title = playerVC.playerResponse.playerData.videoDetails.title;
|
||||
NSString *shortDescription = playerVC.playerResponse.playerData.videoDetails.shortDescription;
|
||||
|
||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:LOC(@"SelectAction") message:nil preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
alertController.view.tintColor = [UIColor labelColor];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyTitle") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
[UIPasteboard generalPasteboard].string = title;
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:self.resizeDelegate] send];
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyDescription") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
[UIPasteboard generalPasteboard].string = shortDescription;
|
||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:self.resizeDelegate] send];
|
||||
}]];
|
||||
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"Cancel") style:UIAlertActionStyleCancel handler:nil]];
|
||||
|
||||
[self.resizeDelegate presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -738,6 +1057,35 @@ BOOL isTabSelected = NO;
|
||||
+ (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
|
||||
|
||||
static void reloadPrefs() {
|
||||
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"];
|
||||
NSDictionary *prefs = [NSDictionary dictionaryWithContentsOfFile:path];
|
||||
@@ -759,6 +1107,7 @@ static void reloadPrefs() {
|
||||
kNoDarkBg = [prefs[@"noDarkBg"] boolValue] ?: NO;
|
||||
kEndScreenCards = [prefs[@"endScreenCards"] boolValue] ?: NO;
|
||||
kNoFullscreenActions = [prefs[@"noFullscreenActions"] boolValue] ?: NO;
|
||||
kPersistentProgressBar = [prefs[@"persistentProgressBar"] boolValue] ?: NO;
|
||||
kNoRelatedVids = [prefs[@"noRelatedVids"] boolValue] ?: NO;
|
||||
kNoPromotionCards = [prefs[@"noPromotionCards"] boolValue] ?: NO;
|
||||
kNoWatermarks = [prefs[@"noWatermarks"] boolValue] ?: NO;
|
||||
@@ -766,6 +1115,7 @@ static void reloadPrefs() {
|
||||
kPortraitFullscreen = [prefs[@"portraitFullscreen"] boolValue] ?: NO;
|
||||
kCopyWithTimestamp = [prefs[@"copyWithTimestamp"] boolValue] ?: NO;
|
||||
kDisableAutoplay = [prefs[@"disableAutoplay"] boolValue] ?: NO;
|
||||
kDisableAutoCaptions = [prefs[@"disableAutoCaptions"] boolValue] ?: NO;
|
||||
kNoContentWarning = [prefs[@"noContentWarning"] boolValue] ?: NO;
|
||||
kClassicQuality = [prefs[@"classicQuality"] boolValue] ?: NO;
|
||||
kExtraSpeedOptions = [prefs[@"extraSpeedOptions"] boolValue] ?: NO;
|
||||
@@ -776,8 +1126,11 @@ static void reloadPrefs() {
|
||||
kAutoFullscreen = [prefs[@"autoFullscreen"] boolValue] ?: NO;
|
||||
kExitFullscreen = [prefs[@"exitFullscreen"] boolValue] ?: NO;
|
||||
kNoDoubleTapToSeek = [prefs[@"noDoubleTapToSeek"] boolValue] ?: NO;
|
||||
kShortsOnlyMode = [prefs[@"shortsOnlyMode"] boolValue] ?: NO;
|
||||
kHideShorts = [prefs[@"hideShorts"] boolValue] ?: NO;
|
||||
kShortsProgress = [prefs[@"shortsProgress"] boolValue] ?: NO;
|
||||
kPinchToFullscreenShorts = [prefs[@"pinchToFullscreenShorts"] boolValue] ?: NO;
|
||||
kShortsToRegular = [prefs[@"shortsToRegular"] boolValue] ?: NO;
|
||||
kResumeShorts = [prefs[@"resumeShorts"] boolValue] ?: NO;
|
||||
kHideShortsLogo = [prefs[@"hideShortsLogo"] boolValue] ?: NO;
|
||||
kHideShortsSearch = [prefs[@"hideShortsSearch"] boolValue] ?: NO;
|
||||
@@ -791,6 +1144,7 @@ static void reloadPrefs() {
|
||||
kHideShortsShare = [prefs[@"hideShortsShare"] boolValue] ?: NO;
|
||||
kHideShortsAvatars = [prefs[@"hideShortsAvatars"] boolValue] ?: NO;
|
||||
kHideShortsThanks = [prefs[@"hideShortsThanks"] boolValue] ?: NO;
|
||||
kHideShortsSource = [prefs[@"hideShortsSource"] boolValue] ?: NO;
|
||||
kHideShortsChannelName = [prefs[@"hideShortsChannelName"] boolValue] ?: NO;
|
||||
kHideShortsDescription = [prefs[@"hideShortsDescription"] boolValue] ?: NO;
|
||||
kHideShortsAudioTrack = [prefs[@"hideShortsAudioTrack"] boolValue] ?: NO;
|
||||
@@ -798,10 +1152,17 @@ static void reloadPrefs() {
|
||||
kRemoveLabels = [prefs[@"removeLabels"] boolValue] ?: NO;
|
||||
kRemoveIndicators = [prefs[@"removeIndicators"] boolValue] ?: NO;
|
||||
kReExplore = [prefs[@"reExplore"] boolValue] ?: NO;
|
||||
kAddExplore = [prefs[@"addExplore"] boolValue] ?: NO;
|
||||
kRemoveShorts = [prefs[@"removeShorts"] boolValue] ?: NO;
|
||||
kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO;
|
||||
kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES;
|
||||
kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO;
|
||||
kCopyVideoInfo = [prefs[@"copyVideoInfo"] boolValue] ?: NO;
|
||||
kPostManager = [prefs[@"postManager"] boolValue] ?: NO;
|
||||
kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO;
|
||||
kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO;
|
||||
kCommentManager = [prefs[@"commentManager"] boolValue] ?: NO;
|
||||
kFixAlbums = [prefs[@"fixAlbums"] boolValue] ?: NO;
|
||||
kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO;
|
||||
kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO;
|
||||
kNoSearchHistory = [prefs[@"noSearchHistory"] boolValue] ?: NO;
|
||||
@@ -832,6 +1193,7 @@ static void reloadPrefs() {
|
||||
@"noDarkBg" : @(kNoDarkBg),
|
||||
@"endScreenCards" : @(kEndScreenCards),
|
||||
@"noFullscreenActions" : @(kNoFullscreenActions),
|
||||
@"persistentProgressBar" : @(kPersistentProgressBar),
|
||||
@"noRelatedVids" : @(kNoRelatedVids),
|
||||
@"noPromotionCards" : @(kNoPromotionCards),
|
||||
@"noWatermarks" : @(kNoWatermarks),
|
||||
@@ -839,6 +1201,7 @@ static void reloadPrefs() {
|
||||
@"portraitFullscreen" : @(kPortraitFullscreen),
|
||||
@"copyWithTimestamp" : @(kCopyWithTimestamp),
|
||||
@"disableAutoplay" : @(kDisableAutoplay),
|
||||
@"disableAutoCaptions" : @(kDisableAutoCaptions),
|
||||
@"noContentWarning" : @(kNoContentWarning),
|
||||
@"classicQuality" : @(kClassicQuality),
|
||||
@"extraSpeedOptions" : @(kExtraSpeedOptions),
|
||||
@@ -849,8 +1212,11 @@ static void reloadPrefs() {
|
||||
@"autoFullscreen" : @(kAutoFullscreen),
|
||||
@"exitFullscreen" : @(kExitFullscreen),
|
||||
@"noDoubleTapToSeek" : @(kNoDoubleTapToSeek),
|
||||
@"shortsOnlyMode" : @(kShortsOnlyMode),
|
||||
@"hideShorts" : @(kHideShorts),
|
||||
@"shortsProgress" : @(kShortsProgress),
|
||||
@"pinchToFullscreenShorts" : @(kPinchToFullscreenShorts),
|
||||
@"shortsToRegular" : @(kShortsToRegular),
|
||||
@"resumeShorts" : @(kResumeShorts),
|
||||
@"hideShortsLogo" : @(kHideShortsLogo),
|
||||
@"hideShortsSearch" : @(kHideShortsSearch),
|
||||
@@ -864,6 +1230,7 @@ static void reloadPrefs() {
|
||||
@"hideShortsShare" : @(kHideShortsShare),
|
||||
@"hideShortsAvatars" : @(kHideShortsAvatars),
|
||||
@"hideShortsThanks" : @(kHideShortsThanks),
|
||||
@"hideShortsSource" : @(kHideShortsSource),
|
||||
@"hideShortsChannelName" : @(kHideShortsChannelName),
|
||||
@"hideShortsDescription" : @(kHideShortsDescription),
|
||||
@"hideShortsAudioTrack" : @(kHideShortsAudioTrack),
|
||||
@@ -871,10 +1238,17 @@ static void reloadPrefs() {
|
||||
@"removeLabels" : @(kRemoveLabels),
|
||||
@"removeIndicators" : @(kRemoveIndicators),
|
||||
@"reExplore" : @(kReExplore),
|
||||
@"addExplore" : @(kAddExplore),
|
||||
@"removeShorts" : @(kRemoveShorts),
|
||||
@"removeSubscriptions" : @(kRemoveSubscriptions),
|
||||
@"removeUploads" : @(kRemoveUploads),
|
||||
@"removeLibrary" : @(kRemoveLibrary),
|
||||
@"copyVideoInfo" : @(kCopyVideoInfo),
|
||||
@"postManager" : @(kPostManager),
|
||||
@"savePostImage" : @(kSavePostImage),
|
||||
@"saveProfilePhoto" : @(kSaveProfilePhoto),
|
||||
@"commentManager" : @(kCommentManager),
|
||||
@"fixAlbums" : @(kFixAlbums),
|
||||
@"removePlayNext" : @(kRemovePlayNext),
|
||||
@"noContinueWatching" : @(kNoContinueWatching),
|
||||
@"noSearchHistory" : @(kNoSearchHistory),
|
||||
@@ -896,6 +1270,15 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin
|
||||
}
|
||||
|
||||
%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);
|
||||
reloadPrefs();
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
"NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos.";
|
||||
"NoFullscreenActions" = "Disable fullscreen actions";
|
||||
"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";
|
||||
"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up.";
|
||||
"NoPromotionCards" = "Hide Paid Promotion cards";
|
||||
@@ -53,6 +55,8 @@
|
||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||
"DisableAutoplay" = "Disable Autoplay videos";
|
||||
"DisableAutoplayDesc" = "Prevents video playback after opening.";
|
||||
"DisableAutoCaptions" = "Disable auto captions";
|
||||
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
|
||||
"NoContentWarning" = "Skip content warning";
|
||||
"NoContentWarningDesc" = "Skips sensitive content warning message.";
|
||||
"ClassicQuality" = "Classic video quality";
|
||||
@@ -81,20 +85,28 @@
|
||||
"RemoveIndicatorsDesc" = "Removes tab indicators.";
|
||||
"ReExplore" = "Replace Shorts tab with Explore tab";
|
||||
"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";
|
||||
"HideShortsTabDesc" = "Hides Shorts tab from the Tab bar";
|
||||
"HideShortsTabDesc" = "Hides Shorts tab from the Tab bar.";
|
||||
"HideSubscriptionsTab" = "Hide Subscriptions tab";
|
||||
"HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar";
|
||||
"HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar.";
|
||||
"HideUploadButton" = "Hide Upload button";
|
||||
"HideUploadButtonDesc" = "Hides Upload button from the Tab bar";
|
||||
"HideUploadButtonDesc" = "Hides Upload button from the Tab bar.";
|
||||
"HideLibraryTab" = "Hide Library tab";
|
||||
"HideLibraryTabDesc" = "Hides Library tab from the Tab bar";
|
||||
"HideLibraryTabDesc" = "Hides Library tab from the Tab bar.";
|
||||
|
||||
"Shorts" = "Shorts";
|
||||
"ShortsOnlyMode" = "Shorts Only Mode";
|
||||
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
|
||||
"HideShorts" = "Hide Shorts videos";
|
||||
"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)";
|
||||
"ShortsProgress" = "Enable progress bar";
|
||||
"ShortsProgressDesc" = "Displays progress bar in the Shorts overlay.";
|
||||
"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";
|
||||
"ResumeShortsDesc" = "Prevents starting from Shorts videos at the opening app, which happens if YouTube was closed while watching Shorts.";
|
||||
"HideShortsLogo" = "Hide Shorts logo";
|
||||
@@ -121,6 +133,8 @@
|
||||
"HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner.";
|
||||
"HideShortsThanks" = "Hide Superthanks button";
|
||||
"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";
|
||||
"HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay.";
|
||||
"HideShortsDescription" = "Hide Description";
|
||||
@@ -129,6 +143,18 @@
|
||||
"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description.";
|
||||
|
||||
"Other" = "Other";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"PostManager" = "Save post information";
|
||||
"PostManagerDesc" = "Allows to copy post text and save post as image 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.";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||
"FixAlbums" = "Fix covers";
|
||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
||||
"RemovePlayNext" = "Remove \"Play next in queue\"";
|
||||
"RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu.";
|
||||
"NoContinueWatching" = "Remove \"Continue watching\"";
|
||||
@@ -155,6 +181,8 @@
|
||||
"Warning" = "Warning";
|
||||
"TabIsHidden" = "Hidden tab cannot be selected as startup page";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "Version";
|
||||
"About" = "About";
|
||||
"Credits" = "Credits";
|
||||
@@ -164,9 +192,28 @@
|
||||
"French" = "French localization";
|
||||
"Spanish" = "Spanish localization";
|
||||
"Japanese" = "Japanese localization";
|
||||
"Vietnamese" = "Vietnamese localization";
|
||||
"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 → %@ → %@ → %@.";
|
||||
"ClearCache" = "Clear cache";
|
||||
"ResetSettings" = "Reset YTLite settings";
|
||||
"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";
|
||||
"No" = "No";
|
||||
"No" = "No";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"CopyPostText" = "Copy post text";
|
||||
"SavePostAsImage" = "Save post as image";
|
||||
"CopyPostAsImage" = "Copy post as image";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copied to clipboard";
|
||||
"Saved" = "Saved to Photos";
|
||||
"Done" = "Done";
|
||||
"Error" = "Error";
|
||||
@@ -37,6 +37,8 @@
|
||||
"NoEndScreenCardsDesc" = "Oculta las tarjetas emergentes de fin de pantalla (miniaturas) al final de los vídeos.";
|
||||
"NoFullscreenActions" = "Desactivar acciones en 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";
|
||||
"NoRelatedVidsDesc" = "Elimina los vídeos relacionados que se muestran en la superposición al deslizar hacia arriba.";
|
||||
"NoPromotionCards" = "Ocultar tarjetas de promoción pagada";
|
||||
@@ -49,10 +51,12 @@
|
||||
"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" = "Copy timestamped links";
|
||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||
"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";
|
||||
"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";
|
||||
"NoContentWarningDesc" = "Omite el mensaje de advertencia de contenido sensible.";
|
||||
"ClassicQuality" = "Calidad de vídeo clásica";
|
||||
@@ -77,10 +81,12 @@
|
||||
"Tabbar" = "Barra de pestañas";
|
||||
"RemoveLabels" = "Eliminar etiquetas";
|
||||
"RemoveLabelsDesc" = "Elimina las etiquetas de las pestañas.";
|
||||
"RemoveIndicators" = "Remove indicators";
|
||||
"RemoveIndicatorsDesc" = "Removes tab indicators.";
|
||||
"RemoveIndicators" = "Eliminar indicadores";
|
||||
"RemoveIndicatorsDesc" = "Elimina los indicadores de pestaña.";
|
||||
"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.";
|
||||
"AddExplore" = "Añadir pestaña Explorar";
|
||||
"AddExploreDesc" = "Añade la pestaña Explorar a la barra de pestañas.";
|
||||
"HideShortsTab" = "Ocultar pestaña Shorts";
|
||||
"HideShortsTabDesc" = "Oculta la pestaña Shorts de la barra de pestañas.";
|
||||
"HideSubscriptionsTab" = "Ocultar pestaña Suscripciones";
|
||||
@@ -91,10 +97,16 @@
|
||||
"HideLibraryTabDesc" = "Oculta la pestaña Biblioteca de la barra de pestañas.";
|
||||
|
||||
"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";
|
||||
"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";
|
||||
"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";
|
||||
"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";
|
||||
@@ -121,6 +133,8 @@
|
||||
"HideShortsAvatarsDesc" = "Oculta la imagen de perfil en la esquina inferior derecha.";
|
||||
"HideShortsThanks" = "Ocultar botón de Supergracias";
|
||||
"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";
|
||||
"HideShortsChannelNameDesc" = "Oculta el nombre del canal y el botón de Suscribirse en la superposición de Shorts.";
|
||||
"HideShortsDescription" = "Ocultar descripción";
|
||||
@@ -129,6 +143,18 @@
|
||||
"HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts.";
|
||||
|
||||
"Other" = "Otro";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"PostManager" = "Save post information";
|
||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||
"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";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||
"FixAlbums" = "Arreglar portadas";
|
||||
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
|
||||
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
|
||||
"RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú.";
|
||||
"NoContinueWatching" = "Eliminar \"Continuar viendo\"";
|
||||
@@ -155,6 +181,8 @@
|
||||
"Warning" = "Advertencia";
|
||||
"TabIsHidden" = "No se puede seleccionar una pestaña oculta como página de inicio";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "Versión";
|
||||
"About" = "Acerca de";
|
||||
"Credits" = "Créditos";
|
||||
@@ -164,9 +192,28 @@
|
||||
"French" = "Traducción: Frances";
|
||||
"Spanish" = "Traducción: Español";
|
||||
"Japanese" = "Traducción: Japonés";
|
||||
"Vietnamese" = "Vietnamese localization";
|
||||
"Advanced" = "Modo avanzado";
|
||||
"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 → %@ → %@ → %@.";
|
||||
"ClearCache" = "Clear cache";
|
||||
"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?";
|
||||
"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í";
|
||||
"No" = "No";
|
||||
"No" = "No";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"CopyPostText" = "Copy post text";
|
||||
"SavePostAsImage" = "Save post as image";
|
||||
"CopyPostAsImage" = "Copy post as image";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copiado al portapapeles";
|
||||
"Done" = "Done";
|
||||
"Saved" = "Guardado en Fotos";
|
||||
"Error" = "Error";
|
||||
@@ -37,6 +37,8 @@
|
||||
"NoEndScreenCardsDesc" = "Masque les cartes de fin d'écran (vignettes) à la fin des vidéos.";
|
||||
"NoFullscreenActions" = "Désactiver les actions en 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";
|
||||
"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";
|
||||
@@ -49,10 +51,12 @@
|
||||
"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" = "Copy timestamped links";
|
||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||
"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";
|
||||
"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";
|
||||
"NoContentWarningDesc" = "Ignore le message d'avertissement de contenu sensible.";
|
||||
"ClassicQuality" = "Qualité vidéo classique";
|
||||
@@ -77,10 +81,12 @@
|
||||
"Tabbar" = "Barre d'onglets";
|
||||
"RemoveLabels" = "Supprimer les sous-titres";
|
||||
"RemoveLabelsDesc" = "Supprime les sous-titres des onglets.";
|
||||
"RemoveIndicators" = "Remove indicators";
|
||||
"RemoveIndicatorsDesc" = "Removes tab indicators.";
|
||||
"RemoveIndicators" = "Supprimer les indicateurs";
|
||||
"RemoveIndicatorsDesc" = "Supprime les indicateurs d'onglets.";
|
||||
"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.";
|
||||
"AddExplore" = "Ajouter l'onglet Explorer";
|
||||
"AddExploreDesc" = "Ajoute l'onglet Explorer à la barre d'onglets.";
|
||||
"HideShortsTab" = "Masquer l'onglet Shorts";
|
||||
"HideShortsTabDesc" = "Masque l'onglet Shorts de la barre d'onglets";
|
||||
"HideSubscriptionsTab" = "Masquer l'onglet Abonnements";
|
||||
@@ -91,10 +97,16 @@
|
||||
"HideLibraryTabDesc" = "Masque l'onglet Bibliothèque de la barre d'onglets";
|
||||
|
||||
"Shorts" = "Shorts";
|
||||
"ShortsOnlyMode" = "Mode Shorts uniquement";
|
||||
"ShortsOnlyModeDesc" = "Limite les fonctionnalités de YouTube à la visualisation des Shorts uniquement.";
|
||||
"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)";
|
||||
"ShortsProgress" = "Activer la barre de progression";
|
||||
"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";
|
||||
"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";
|
||||
@@ -121,6 +133,8 @@
|
||||
"HideShortsAvatarsDesc" = "Masque la photo de profil dans le coin inférieur droit.";
|
||||
"HideShortsThanks" = "Masquer le bouton Superthanks";
|
||||
"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";
|
||||
"HideShortsChannelNameDesc" = "Masque le nom de la chaîne et le bouton S'abonner de l'overlay Shorts.";
|
||||
"HideShortsDescription" = "Masquer la description";
|
||||
@@ -129,6 +143,18 @@
|
||||
"HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts.";
|
||||
|
||||
"Other" = "Autre";
|
||||
"CopyVideoInfo" = "Copier les informations vidéo";
|
||||
"CopyVideoInfoDesc" = "Ajout d'un bouton permettant de copier le titre et la description de la vidéo dans le panneau Description de la vidéo.";
|
||||
"PostManager" = "Save post information";
|
||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||
"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.";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||
"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\"";
|
||||
"RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu.";
|
||||
"NoContinueWatching" = "Supprimer \"Continuer à regarder\"";
|
||||
@@ -137,7 +163,7 @@
|
||||
"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";\
|
||||
"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.";
|
||||
@@ -155,6 +181,8 @@
|
||||
"Warning" = "Avertissement";
|
||||
"TabIsHidden" = "L'onglet masqué ne peut pas être sélectionné comme page de démarrage";
|
||||
|
||||
"DonateViaPayPal" = "Faire un don via PayPal";
|
||||
"SupportViaGhSponsors" = "Soutenir le développement via les sponsors Github";
|
||||
"Version" = "Version";
|
||||
"About" = "À propos";
|
||||
"Credits" = "Crédits";
|
||||
@@ -164,9 +192,28 @@
|
||||
"French" = "Localisation française";
|
||||
"Spanish" = "Localisation espagnole";
|
||||
"Japanese" = "Localisation japonaise";
|
||||
"Vietnamese" = "Localisation vietnamienne";
|
||||
"Advanced" = "Mode avancé";
|
||||
"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 → %@ → %@ → %@.";
|
||||
"ClearCache" = "Effacer le cache";
|
||||
"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 ?";
|
||||
"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";
|
||||
"No" = "Non";
|
||||
"No" = "Non";
|
||||
|
||||
"SelectAction" = "Sélectionner une action";
|
||||
"CopyTitle" = "Copier le titre";
|
||||
"CopyDescription" = "Copier la description";
|
||||
"CopyPostText" = "Copy post text";
|
||||
"SavePostAsImage" = "Save post as image";
|
||||
"CopyPostAsImage" = "Copy post as image";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "Annuler";
|
||||
"Copied" = "Copié dans le presse-papiers";
|
||||
"Saved" = "Enregistré dans Photos";
|
||||
"Done" = "Terminé";
|
||||
"Error" = "Erreur";
|
||||
@@ -13,12 +13,12 @@
|
||||
"RemoveSearchDesc" = "ナビゲーションバーから検索ボタンを非表示にします";
|
||||
"RemoveVoiceSearch" = "音声検索ボタンを非表示";
|
||||
"RemoveVoiceSearchDesc" = "ナビゲーションバーから音声検索ボタンを非表示にします";
|
||||
"StickyNavbar" = "固定ナビゲーションバー";
|
||||
"StickyNavbarDesc" = "スクロールしてもナビゲーションバーが表示されたままになるように固定します";
|
||||
"StickyNavbar" = "ナビゲーションバーを固定";
|
||||
"StickyNavbarDesc" = "スクロール中もナビゲーションバーを固定して表示します";
|
||||
"NoSubbar" = "サブバーを非表示";
|
||||
"NoSubbarDesc" = "ナビゲーションバーの下にあるサブバー(全て,音楽,ライブなど)を非表示にします";
|
||||
"NoSubbarDesc" = "ナビゲーションバーの下にあるサブバー(すべて,音楽,ライブ など)を非表示にします";
|
||||
"NoYTLogo" = "YouTubeロゴを削除";
|
||||
"NoYTLogoDesc" = "ナビゲーションバーのYouTubeロゴを削除します";
|
||||
"NoYTLogoDesc" = "ナビゲーションバーのYouTubeロゴを非表示にします";
|
||||
|
||||
"Overlay" = "オーバーレイ";
|
||||
"HideAutoplay" = "自動再生スイッチを非表示";
|
||||
@@ -26,45 +26,49 @@
|
||||
"HideSubs" = "字幕ボタンを非表示";
|
||||
"HideSubsDesc" = "オーバーレイから字幕ボタンを非表示にします";
|
||||
"NoHUDMsgs" = "HUDメッセージを非表示";
|
||||
"NoHUDMsgsDesc" = "プレイヤーからすべての機能メッセージを非表示にします。例:CCをオン/オフにする,ビデオループがオンになっているなど";
|
||||
"HidePrevNext" = "前へ,次へボタンを非表示";
|
||||
"HidePrevNextDesc" = "オーバーレイから前へ、次へのビデオボタンを非表示にします";
|
||||
"ReplacePrevNext" = "早送り、巻き戻しボタンに置き換え";
|
||||
"ReplacePrevNextDesc" = "オーバーレイの前へ,次へのビデオボタンを早送り,巻き戻しボタンに置き換えます";
|
||||
"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" = "プレイヤーからチャンネルの透かしを非表示にします";
|
||||
"NoWatermarksDesc" = "プレーヤーからチャンネルのウォーターマークを非表示にします";
|
||||
|
||||
"Player" = "プレイヤー";
|
||||
"Miniplayer" = "ミニプレイヤーを有効化";
|
||||
"MiniplayerDesc" = "ミニプレイヤーに対応していない動画(子供向けの動画など)でもミニプレイヤーを有効にします";
|
||||
"Player" = "プレーヤー";
|
||||
"Miniplayer" = "ミニプレーヤーを有効化";
|
||||
"MiniplayerDesc" = "ミニプレーヤーに対応していない動画(子供向けの動画など)でもミニプレーヤーを有効にします";
|
||||
"PortraitFullscreen" = "縦画面フルスクリーンモード";
|
||||
"PortraitFullscreenDesc" = "縦画面フルスクリーンモードをサポートします";
|
||||
"CopyWithTimestamp" = "Copy timestamped links";
|
||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||
"CopyWithTimestamp" = "タイムスタンプ付きリンクをコピー";
|
||||
"CopyWithTimestampDesc" = "一時停止ボタンを押すことで、タイムスタンプ付きリンクをクリップボードにコピーできます";
|
||||
"DisableAutoplay" = "自動再生を無効化";
|
||||
"DisableAutoplayDesc" = "アプリを開いた後に動画の自動再生を防止します";
|
||||
"DisableAutoCaptions" = "Disable auto captions";
|
||||
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
|
||||
"NoContentWarning" = "コンテンツ警告をスキップ";
|
||||
"NoContentWarningDesc" = "不適切なコンテンツの警告メッセージをスキップします";
|
||||
"ClassicQuality" = "クラシックなビデオ品質";
|
||||
"ClassicQualityDesc" = "クラシックなビデオ品質選択メニューを復元します";
|
||||
"ExtraSpeedOptions" = "追加の再生速度オプション";
|
||||
"ExtraSpeedOptionsDesc" = "プレイヤーメニューに追加の再生速度オプションを追加します";
|
||||
"ExtraSpeedOptions" = "再生速度の追加オプション";
|
||||
"ExtraSpeedOptionsDesc" = "プレーヤーメニューに追加の再生速度オプションを追加します";
|
||||
"DontSnap2Chapter" = "チャプターへのスナップを無効化";
|
||||
"DontSnap2ChapterDesc" = "ダブルタップジェスチャーで次のエピソードへスキップするのを無効にします";
|
||||
"RedProgressBar" = "赤いプログレスバー";
|
||||
"RedProgressBarDesc" = "赤いプログレスバーバーを復元します";
|
||||
"RedProgressBarDesc" = "赤いプログレスバーを復元します";
|
||||
"NoHints" = "ヒントを無効化";
|
||||
"NoHintsDesc" = "プレイバック中に作者によるヒントを右上隅に表示するのを無効にします";
|
||||
"NoHintsDesc" = "再生中に右上に表示される投稿者のヒントを無効にします";
|
||||
"NoFreeZoom" = "フリーズームジェスチャーを無効化";
|
||||
"NoFreeZoomDesc" = "新しいフリーズームジェスチャーを無効にします";
|
||||
"AutoFullscreen" = "動画をフルスクリーンで再生";
|
||||
@@ -77,10 +81,12 @@
|
||||
"Tabbar" = "タブバー";
|
||||
"RemoveLabels" = "ラベルを削除";
|
||||
"RemoveLabelsDesc" = "タブラベルを削除します";
|
||||
"RemoveIndicators" = "Remove indicators";
|
||||
"RemoveIndicatorsDesc" = "Removes tab indicators.";
|
||||
"RemoveIndicators" = "インジケーターを削除";
|
||||
"RemoveIndicatorsDesc" = "タブインジケーターを削除します";
|
||||
"ReExplore" = "ショートタブを探索タブに置き換え";
|
||||
"ReExploreDesc" = "古いYouTubeバージョンのように、ショートタブの代わりに探索タブを表示します";
|
||||
"AddExplore" = "Add Explore tab";
|
||||
"AddExploreDesc" = "Adds Explore tab to the Tab bar.";
|
||||
"HideShortsTab" = "ショートタブを非表示";
|
||||
"HideShortsTabDesc" = "タブバーからショートタブを非表示にします";
|
||||
"HideSubscriptionsTab" = "登録チャンネルタブを非表示";
|
||||
@@ -91,12 +97,18 @@
|
||||
"HideLibraryTabDesc" = "タブバーからライブラリタブを非表示にします";
|
||||
|
||||
"Shorts" = "ショート";
|
||||
"ShortsOnlyMode" = "Shorts Only Mode";
|
||||
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
|
||||
"HideShorts" = "ショート動画を非表示";
|
||||
"HideShortsDesc" = "ホームページ、おすすめなどからショート動画を非表示にします(視聴履歴には適用されません)";
|
||||
"HideShortsDesc" = "ホーム, おすすめなどからショート動画を非表示にします(視聴履歴には適用されません)";
|
||||
"ShortsProgress" = "プログレスバーを有効化";
|
||||
"ShortsProgressDesc" = "ショートオーバーレイに進行バーを表示します";
|
||||
"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" = "YouTubeがショートを視聴中にアプリを閉じた場合でも、ショート動画からの再開を防止します";
|
||||
"ResumeShortsDesc" = "ショートを視聴中にアプリを閉じた場合でも、ショートからの再開を防止します";
|
||||
"HideShortsLogo" = "ショートロゴを非表示";
|
||||
"HideShortsLogoDesc" = "左上隅のショートロゴを非表示にします";
|
||||
"HideShortsSearch" = "検索ボタンを非表示";
|
||||
@@ -105,8 +117,8 @@
|
||||
"HideShortsCameraDesc" = "ショートオーバーレイからカメラボタンを非表示にします";
|
||||
"HideShortsMore" = "その他(⋮)ボタンを非表示";
|
||||
"HideShortsMoreDesc" = "ショートオーバーレイからその他(⋮)ボタンを非表示にします。画面の長押しでアクセスも可能です";
|
||||
"HideShortsSubscriptions" = "サブスクリプションボタンを非表示";
|
||||
"HideShortsSubscriptionsDesc" = "ショートが一時停止されたときに表示されるサブスクリプションボタンを非表示にします";
|
||||
"HideShortsSubscriptions" = "チャンネル登録ボタンを非表示";
|
||||
"HideShortsSubscriptionsDesc" = "ショートが一時停止されたときに表示されるチャンネル登録ボタンを非表示にします";
|
||||
"HideShortsLike" = "いいねボタンを非表示";
|
||||
"HideShortsLikeDesc" = "ショートオーバーレイからいいねボタンを非表示にします";
|
||||
"HideShortsDislike" = "低評価ボタンを非表示";
|
||||
@@ -121,22 +133,36 @@
|
||||
"HideShortsAvatarsDesc" = "右下隅のプロフィール画像を非表示にします";
|
||||
"HideShortsThanks" = "スーパーサンクスボタンを非表示";
|
||||
"HideShortsThanksDesc" = "ショートオーバーレイからスーパーサンクス(寄付)ボタンを非表示にします";
|
||||
"HideShortsSource" = "Hide Shorts Source";
|
||||
"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name.";
|
||||
"HideShortsChannelName" = "チャンネル名を非表示";
|
||||
"HideShortsChannelNameDesc" = "ショートオーバーレイからチャンネル名とサブスクリプションボタンを非表示にします";
|
||||
"HideShortsChannelNameDesc" = "ショートオーバーレイからチャンネル名とチャンネル登録ボタンを非表示にします";
|
||||
"HideShortsDescription" = "説明を非表示";
|
||||
"HideShortsDescriptionDesc" = "チャンネル名の下に表示されるショートの説明を非表示にします";
|
||||
"HideShortsAudioTrack" = "オーディオトラックを非表示";
|
||||
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
||||
|
||||
"Other" = "その他";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"PostManager" = "Save post information";
|
||||
"PostManagerDesc" = "Allows to copy post text and save post as image 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.";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image 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" = "プレイヤー下に表示されるすべての動画を非表示にし、ビデオ情報とコメントセクションのみにします";
|
||||
"NoRelatedWatchNexts" = "プレーヤー下のすべての動画を非表示";
|
||||
"NoRelatedWatchNextsDesc" = "プレーヤー下に表示されるすべての動画を非表示にし、動画情報とコメントセクションのみにします";
|
||||
"StickSortComments" = "コメントヘッダーを固定";
|
||||
"StickSortCommentsDesc" = "コメントのソートヘッダー(トップ,最新)をスクロールしても消えないように固定します";
|
||||
"HideSortComments" = "コメントヘッダーを非表示";
|
||||
@@ -150,11 +176,13 @@
|
||||
"Home" = "ホーム";
|
||||
"Explore" = "探索";
|
||||
"ShortsTab" = "ショート";
|
||||
"Subscriptions" = "サブスクリプション";
|
||||
"Subscriptions" = "登録チャンネル";
|
||||
"Library" = "ライブラリ";
|
||||
"Warning" = "警告";
|
||||
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "バージョン";
|
||||
"About" = "About";
|
||||
"Credits" = "クレジット";
|
||||
@@ -164,9 +192,28 @@
|
||||
"French" = "フランス語翻訳";
|
||||
"Spanish" = "スペイン語翻訳";
|
||||
"Japanese" = "日本語翻訳";
|
||||
"Vietnamese" = "Vietnamese localization";
|
||||
"Advanced" = "アドバンスモード";
|
||||
"AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます";
|
||||
"ClearCache" = "Clear cache";
|
||||
"ResetSettings" = "YTLiteの設定をリセット";
|
||||
"ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、YouTubeが終了します。\n\n続行してもよろしいですか?";
|
||||
"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" = "いいえ";
|
||||
"No" = "いいえ";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"CopyPostText" = "Copy post text";
|
||||
"SavePostAsImage" = "Save post as image";
|
||||
"CopyPostAsImage" = "Copy post as image";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copied to clipboard";
|
||||
"Saved" = "Saved to Photos";
|
||||
"Done" = "Done";
|
||||
"Error" = "Error";
|
||||
@@ -37,6 +37,8 @@
|
||||
"NoEndScreenCardsDesc" = "Скрывает эскизы, отображаемые по окончанию видеоролика.";
|
||||
"NoFullscreenActions" = "Отключить панель действий";
|
||||
"NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера.";
|
||||
"PersistentProgressBar" = "Всегда отображать прогресс-бар";
|
||||
"PersistentProgressBarDesc" = "Всегда отображает прогресс-бар внутри плеера.";
|
||||
"NoRelatedVids" = "Скрыть рекомендации в оверлее";
|
||||
"NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере.";
|
||||
"NoPromotionCards" = "Скрыть сообщение «Есть реклама»";
|
||||
@@ -49,10 +51,12 @@
|
||||
"MiniplayerDesc" = "Принудительно активирует миниплеер для видео, в которых изначально не был предназначен (например, видеоролики для детей).";
|
||||
"PortraitFullscreen" = "Портретный полноэкранный режим";
|
||||
"PortraitFullscreenDesc" = "Активирует поддержку портретного полноэкранного режима.";
|
||||
"CopyWithTimestamp" = "Ссылки с временной отметкой";
|
||||
"CopyWithTimestamp" = "Ссылки с временными отметками";
|
||||
"CopyWithTimestampDesc" = "Позволяет скопировать ссылку на видео с временной отметкой в буфер обмена нажатием на кнопку паузы.";
|
||||
"DisableAutoplay" = "Запретить автовоспроизведение";
|
||||
"DisableAutoplayDesc" = "Принудительно запрещает автовоспроизведение видео при его открытии.";
|
||||
"DisableAutoCaptions" = "Запретить автоматические субтитры";
|
||||
"DisableAutoCaptionsDesc" = "Отключает включенные по умолчанию субтитры";
|
||||
"NoContentWarning" = "Пропускать предупреждения";
|
||||
"NoContentWarningDesc" = "Пропускает предупреждения, всплывающие перед воспроизведением некоторого контента.";
|
||||
"ClassicQuality" = "Классический выбор качества";
|
||||
@@ -81,6 +85,8 @@
|
||||
"RemoveIndicatorsDesc" = "Скрывает индикаторы вкладок.";
|
||||
"ReExplore" = "Вкладка «Навигация» вместо «Shorts»";
|
||||
"ReExploreDesc" = "Заменяет вкладку «Shorts» на привычную нам «Навигацию».";
|
||||
"AddExplore" = "Добавить вкладку «Навигация»";
|
||||
"AddExploreDesc" = "Добавляет вкладку «Навигация» в панель вкладок.";
|
||||
"HideShortsTab" = "Скрыть «Shorts»";
|
||||
"HideShortsTabDesc" = "Скрывает вкладку «Shorts» с панели вкладок.";
|
||||
"HideSubscriptionsTab" = "Скрыть «Подписки»";
|
||||
@@ -91,10 +97,16 @@
|
||||
"HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок.";
|
||||
|
||||
"Shorts" = "Настройки Shorts";
|
||||
"ShortsOnlyMode" = "Режим Shorts";
|
||||
"ShortsOnlyModeDesc" = "Ограничивает функциональность YouTube до отображения видеороликов Shorts";
|
||||
"HideShorts" = "Скрыть видеоролики Shorts";
|
||||
"HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)";
|
||||
"ShortsProgress" = "Показывать прогресс-бар";
|
||||
"ShortsProgressDesc" = "Отображает прогресс-бар в плеере Shorts.";
|
||||
"PinchToFullscreenShorts" = "Полноэкранный режим щипком";
|
||||
"PinchToFullscreenShortsDesc" = "Скрывает панель вкладок, тем самым отображает Shorts на весь экран.";
|
||||
"ShortsToRegular" = "Shorts как обычные видео";
|
||||
"ShortsToRegularDesc" = "Воспроизводит видеоролики Shorts в обычном проигрывателе.";
|
||||
"ResumeShorts" = "Всегда запускать с Главной страницы";
|
||||
"ResumeShortsDesc" = "Предотвращает запуск видеороликов Shorts при открытии YouTube. Это происходит, если закрыть YouTube при просмотре Shorts.";
|
||||
"HideShortsLogo" = "Скрыть логотип Shorts";
|
||||
@@ -121,6 +133,8 @@
|
||||
"HideShortsAvatarsDesc" = "Скрывает аватарку пользователя в правом нижнем углу.";
|
||||
"HideShortsThanks" = "Скрыть «Суперспасибо»";
|
||||
"HideShortsThanksDesc" = "Скрывает кнопку отправки доната (суперспасибо) с плеера Shorts.";
|
||||
"HideShortsSource" = "Скрыть источник Shorts";
|
||||
"HideShortsSourceDesc" = "Скрывает источники Shorts под названием канала.";
|
||||
"HideShortsChannelName" = "Скрыть название канала";
|
||||
"HideShortsChannelNameDesc" = "Скрывает название канала и кнопку «Подписаться» с плеера Shorts.";
|
||||
"HideShortsDescription" = "Скрыть описание ролика";
|
||||
@@ -129,6 +143,20 @@
|
||||
"HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера.";
|
||||
|
||||
"Other" = "Другие настройки";
|
||||
"CopyVideoInfo" = "Копировать информацию о видео";
|
||||
"CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео.";
|
||||
"PostManager" = "Сохранять информацию с постов";
|
||||
"PostManagerDesc" = "Позволяет скопировать текст из поста или сохранить пост как фото долгим нажатием по нему.";
|
||||
"SavePostImage" = "Сохранять изображения постов";
|
||||
"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним.";
|
||||
"SaveProfilePhoto" = "Сохранять фото профиля";
|
||||
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
|
||||
"CopyCommentText" = "Копировать текст комментариев";
|
||||
"CopyCommentTextDesc" = "Копирует текст комментариев в буфер обмена долгим нажатием.";
|
||||
"CommentManager" = "Сохранять информацию с комментариев";
|
||||
"CommentManagerDesc" = "Позволяет скопировать текст из комментария или сохранить комментарий как фото долгим нажатием по нему.";
|
||||
"FixAlbums" = "Исправить отображение обложек";
|
||||
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
|
||||
"RemovePlayNext" = "Убрать «Добавить в начало очереди»";
|
||||
"RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео.";
|
||||
"NoContinueWatching" = "Отключить «Продолжить просмотр»";
|
||||
@@ -155,6 +183,8 @@
|
||||
"Warning" = "Внимание";
|
||||
"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы";
|
||||
|
||||
"DonateViaPayPal" = "Задонатить на PayPal";
|
||||
"SupportViaGhSponsors" = "Поддержать разработку в Github Sponsors";
|
||||
"Version" = "Версия";
|
||||
"About" = "О твике";
|
||||
"Credits" = "Авторы";
|
||||
@@ -164,9 +194,28 @@
|
||||
"French" = "Французская локализация";
|
||||
"Spanish" = "Испанская локализация";
|
||||
"Japanese" = "Японская локализация";
|
||||
"Vietnamese" = "Вьетнамская локализация";
|
||||
"Advanced" = "Расширенный режим";
|
||||
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
|
||||
"ClearCache" = "Очистить кеш";
|
||||
"ResetSettings" = "Сбросить настройки твика";
|
||||
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
|
||||
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
|
||||
"ShortsModeTurnedOff" = "Режим Shorts был отключен";
|
||||
"Yes" = "Да";
|
||||
"No" = "Нет";
|
||||
|
||||
"SelectAction" = "Выберите действие";
|
||||
"CopyTitle" = "Скопировать название";
|
||||
"CopyDescription" = "Скопировать описание";
|
||||
"CopyPostText" = "Скопировать текст поста";
|
||||
"SavePostAsImage" = "Сохранить пост как фото";
|
||||
"CopyPostAsImage" = "Скопировать пост как фото";
|
||||
"CopyCommentText" = "Скопировать текст комментария";
|
||||
"SaveCommentAsImage" = "Сохранить комментарий как фото";
|
||||
"CopyCommentAsImage" = "Скопировать комментарий как фото";
|
||||
"Cancel" = "Отмена";
|
||||
"Copied" = "Скопировано в буфер обмена";
|
||||
"Saved" = "Сохранено в Фото";
|
||||
"Done" = "Готово";
|
||||
"Error" = "Ошибка";
|
||||
@@ -0,0 +1,219 @@
|
||||
"General" = "Chung";
|
||||
"RemoveAds" = "Loại bỏ các quảng cáo";
|
||||
"RemoveAdsDesc" = "Loại bỏ quảng cáo trong ứng dụng.";
|
||||
"BackgroundPlayback" = "Phát lại ở chế độ nền";
|
||||
"BackgroundPlaybackDesc" = "Cho phép phát lại ở chế độ nền.";
|
||||
|
||||
"Navbar" = "Thanh điều hướng";
|
||||
"RemoveCast" = "Ẩn nút Cast";
|
||||
"RemoveCastDesc" = "Ẩn nút Cast khỏi thanh Điều hướng.";
|
||||
"RemoveNotifications" = "Ẩn nút Thông báo";
|
||||
"RemoveNotificationsDesc" = "Ẩn nút Thông báo khỏi thanh Điều hướng.";
|
||||
"RemoveSearch" = "Ẩn nút Tìm kiếm";
|
||||
"RemoveSearchDesc" = "Ẩn nút Tìm kiếm khỏi thanh Điều hướng.";
|
||||
"RemoveVoiceSearch" = "Ẩn nút tìm kiếm bằng giọng nói";
|
||||
"RemoveVoiceSearchDesc" = "Ẩn nút tìm kiếm bằng giọng nói khỏi thanh Điều hướng.";
|
||||
"StickyNavbar" = "Thanh điều hướng cố định";
|
||||
"StickyNavbarDesc" = "Ghim thanh Điều hướng để nó vẫn hiển thị khi cuộn xuống.";
|
||||
"NoSubbar" = "Ẩn thanh phụ";
|
||||
"NoSubbarDesc" = "Ẩn Thanh phụ (Tất cả, Mới đối với bạn, Trực tiếp, v.v.) dưới thanh Điều hướng.";
|
||||
"NoYTLogo" = "Xóa biểu tượng YouTube";
|
||||
"NoYTLogoDesc" = "Xóa logo YouTube trong thanh Điều hướng.";
|
||||
|
||||
"Overlay" = "Lớp phủ";
|
||||
"HideAutoplay" = "Ẩn nút Tự động phát";
|
||||
"HideAutoplayDesc" = "Ẩn nút Tự động phát trong trình phát video.";
|
||||
"HideSubs" = "Ẩn nút phụ đề";
|
||||
"HideSubsDesc" = "Ẩn nút Phụ đề khỏi lớp phủ.";
|
||||
"NoHUDMsgs" = "Ẩn thông báo HUD";
|
||||
"NoHUDMsgsDesc" = "Ẩn tất cả các thông báo tính năng từ người chơi. Ví dụ: CC được bật/tắt, Vòng lặp video được bật, v.v.";
|
||||
"HidePrevNext" = "Ẩn nút Trước và Tiếp theo";
|
||||
"HidePrevNextDesc" = "Ẩn các nút Trước và Tiếp theo khỏi lớp phủ video.";
|
||||
"ReplacePrevNext" = "Nút tua đi và tua lại nhanh";
|
||||
"ReplacePrevNextDesc" = "Thay thế các nút Trước và Tiếp theo thành nút tua đi và tua lại nhanh trong lớp phủ video.";
|
||||
"NoDarkBg" = "Xóa nền tối";
|
||||
"NoDarkBgDesc" = "Loại bỏ nền tối của lớp phủ.";
|
||||
"NoEndScreenCards" = "Ẩn video dạng thumbnails";
|
||||
"NoEndScreenCardsDesc" = "Ẩn thumbnail của các video đề xuất, xuất hiện ở cuối video.";
|
||||
"NoFullscreenActions" = "Vô hiệu hóa các hành động toàn màn hình";
|
||||
"NoFullscreenActionsDesc" = "Vô hiệu hóa bảng hành động ở chế độ toàn màn hình.";
|
||||
"PersistentProgressBar" = "Thanh tiến trình liên tục";
|
||||
"PersistentProgressBarDesc" = "Luôn hiển thị thanh tiến trình trong trình phát.";
|
||||
"NoRelatedVids" = "Không có video liên quan trong lớp phủ";
|
||||
"NoRelatedVidsDesc" = "Xóa các video liên quan được hiển thị trong lớp phủ bằng cách vuốt lên.";
|
||||
"NoPromotionCards" = "Ẩn thẻ Quảng cáo trả phí";
|
||||
"NoPromotionCardsDesc" = "Ẩn thẻ \"Bao gồm quảng cáo trả phí\" trong các video có quảng cáo.";
|
||||
"NoWatermarks" = "Ẩn watermark của kênh";
|
||||
"NoWatermarksDesc" = "Ẩn watermark của kênh trong video. Yêu cầu khởi động lại ứng dụng.";
|
||||
|
||||
"Player" = "Trình phát";
|
||||
"Miniplayer" = "Cho phép sử dụng trình phát thu nhỏ với mọi video";
|
||||
"MiniplayerDesc" = "Cho phép sử dụng trình phát thu nhỏ với mọi video ban đầu không được thiết kế cho trình phát đó, chẳng hạn như các video dành cho trẻ em.";
|
||||
"PortraitFullscreen" = "Chế độ toàn màn hình dọc";
|
||||
"PortraitFullscreenDesc" = "Cho phép hỗ trợ chế độ toàn màn hình dọc.";
|
||||
"CopyWithTimestamp" = "Sao chép các liên kết có dấu thời gian";
|
||||
"CopyWithTimestampDesc" = "Cho phép sao chép liên kết có dấu thời gian vào bảng tạm bằng cách nhấn nút tạm dừng.";
|
||||
"DisableAutoplay" = "Tắt video Tự động phát";
|
||||
"DisableAutoplayDesc" = "Ngăn chặn phát lại video sau khi mở.";
|
||||
"DisableAutoCaptions" = "Tắt chú thích tự động";
|
||||
"DisableAutoCaptionsDesc" = "Ngăn chặn việc tự động kích hoạt chú thích.";
|
||||
"NoContentWarning" = "Bỏ qua cảnh báo nội dung";
|
||||
"NoContentWarningDesc" = "Bỏ qua thông báo cảnh báo nội dung nhạy cảm.";
|
||||
"ClassicQuality" = "Chất lượng video cổ điển";
|
||||
"ClassicQualityDesc" = "Mang lại menu lựa chọn chất lượng video cổ điển.";
|
||||
"ExtraSpeedOptions" = "Bổ sung tùy chọn tốc độ";
|
||||
"ExtraSpeedOptionsDesc" = "Thêm nhiều tùy chọn tốc độ phát video vào menu trình phát.";
|
||||
"DontSnap2Chapter" = "Tắt tự động chuyển tới chương";
|
||||
"DontSnap2ChapterDesc" = "Tắt tính năng tự động chuyển tới chương gần nhất khi tua video.";
|
||||
"RedProgressBar" = "Thanh tiến trình màu đỏ";
|
||||
"RedProgressBarDesc" = "Mang lại thanh tiến trình màu đỏ.";
|
||||
"NoHints" = "Tắt gợi ý";
|
||||
"NoHintsDesc" = "Tắt gợi ý của tác giả xuất hiện ở góc trên bên phải trong khi phát lại.";
|
||||
"NoFreeZoom" = "Tắt tính năng chạm để thu phóng";
|
||||
"NoFreeZoomDesc" = "Tắt tính năng chạm để thu phóng";
|
||||
"AutoFullscreen" = "Phát video ở chế độ toàn màn hình";
|
||||
"AutoFullscreenDesc" = "Tự động phát video ở chế độ toàn màn hình.";
|
||||
"ExitFullscreen" = "Thoát chế độ toàn màn hình khi hoàn tất";
|
||||
"ExitFullscreenDesc" = "Thoát khỏi chế độ toàn màn hình khi kết thúc phát video.";
|
||||
"NoDoubleTap2Seek" = "Tắt tình năng chạm 2 lần để tua";
|
||||
"NoDoubleTap2SeekDesc" = "Tắt tình năng chạm 2 lần để tua";
|
||||
|
||||
"Tabbar" = "Thanh tab";
|
||||
"RemoveLabels" = "Xóa nhãn";
|
||||
"RemoveLabelsDesc" = "Loại bỏ nhãn tab.";
|
||||
"RemoveIndicators" = "Xóa chỉ báo";
|
||||
"RemoveIndicatorsDesc" = "Loại bỏ các chỉ báo tab.";
|
||||
"ReExplore" = "Thay thế tab Shorts bằng tab Khám phá";
|
||||
"ReExploreDesc" = "Hiển thị tab Khám phá thay vì tab Shorts như trên các phiên bản YouTube cũ.";
|
||||
"AddExplore" = "Thêm tab Khám phá";
|
||||
"AddExploreDesc" = "Thêm tab Khám phá vào thanh Tab.";
|
||||
"HideShortsTab" = "Ẩn tab Shorts";
|
||||
"HideShortsTabDesc" = "Ẩn tab Shorts khỏi thanh Tab.";
|
||||
"HideSubscriptionsTab" = "Ẩn tab Đăng ký";
|
||||
"HideSubscriptionsTabDesc" = "Ẩn tab Đăng ký khỏi thanh Tab.";
|
||||
"HideUploadButton" = "Ẩn nút Tải lên";
|
||||
"HideUploadButtonDesc" = "Ẩn nút Tải lên khỏi thanh Tab.";
|
||||
"HideLibraryTab" = "Ẩn tab Thư viện";
|
||||
"HideLibraryTabDesc" = "Ẩn tab Thư viện khỏi thanh Tab.";
|
||||
|
||||
"Shorts" = "Shorts";
|
||||
"ShortsOnlyMode" = "Chế độ chỉ dành cho Short";
|
||||
"ShortsOnlyModeDesc" = "Giới hạn chức năng của YouTube chỉ ở chế độ Short.";
|
||||
"HideShorts" = "Ẩn Shorts";
|
||||
"HideShortsDesc" = "Ẩn Shorts khỏi Trang chủ, Được đề xuất, v.v. (Không áp dụng cho Lịch sử xem)";
|
||||
"ShortsProgress" = "Bật thanh tiến trình";
|
||||
"ShortsProgressDesc" = "Hiển thị thanh tiến trình trong lớp phủ Shorts.";
|
||||
"PinchToFullscreenShorts" = "Chụm vào toàn màn hình";
|
||||
"PinchToFullscreenShortsDesc" = "Quản lý khả năng hiển thị của lớp phủ bằng cử chỉ chụm vào và kéo ra, hiển thị Shorts ở chế độ toàn màn hình.";
|
||||
"ShortsToRegular" = "Từ Shorts đến video thông thường";
|
||||
"ShortsToRegularDesc" = "Mở Shorts như video thông thường.";
|
||||
"ResumeShorts" = "Tắt tính năng tự động tiếp tục Shorts";
|
||||
"ResumeShortsDesc" = "Nếu bạn thoát YouTube trong khi đang xem video Shorts, video Shorts đó sẽ không tự động phát khi bạn mở lại YouTube.";
|
||||
"HideShortsLogo" = "Ẩn biểu tượng Shorts";
|
||||
"HideShortsLogoDesc" = "Ẩn biểu tượng Shorts ở góc trên cùng bên trái.";
|
||||
"HideShortsSearch" = "Ẩn nút Tìm kiếm";
|
||||
"HideShortsSearchDesc" = "Ẩn nút Tìm kiếm khỏi lớp phủ Shorts.";
|
||||
"HideShortsCamera" = "Ẩn nút Máy ảnh";
|
||||
"HideShortsCameraDesc" = "Ẩn nút Máy ảnh khỏi lớp phủ Shorts.";
|
||||
"HideShortsMore" = "Ẩn nút Thêm (⋮)";
|
||||
"HideShortsMoreDesc" = "Ẩn nút Thêm (⋮) khỏi lớp phủ Shorts. Nó cũng có thể truy cập được bằng cách nhấn và giữ màn hình.";
|
||||
"HideShortsSubscriptions" = "Ẩn nút Đăng ký";
|
||||
"HideShortsSubscriptionsDesc" = "Ẩn nút Đăng ký xuất hiện khi Shorts bị tạm dừng.";
|
||||
"HideShortsLike" = "Ẩn nút Thích";
|
||||
"HideShortsLikeDesc" = "Ẩn nút Thích khỏi lớp phủ Shorts.";
|
||||
"HideShortsDislike" = "Ẩn nút Không thích";
|
||||
"HideShortsDislikeDesc" = "Ẩn nút Không thích khỏi lớp phủ Shorts.";
|
||||
"HideShortsComments" = "Ẩn nút bình luận";
|
||||
"HideShortsCommentsDesc" = "Ẩn nút bình luận khỏi lớp phủ Shorts.";
|
||||
"HideShortsRemix" = "Ẩn nút phối lại";
|
||||
"HideShortsRemixDesc" = "Ẩn nút Phối lại khỏi lớp phủ Shorts.";
|
||||
"HideShortsShare" = "Ẩn nút Chia sẻ";
|
||||
"HideShortsShareDesc" = "Ẩn nút Chia sẻ khỏi lớp phủ Shorts.";
|
||||
"HideShortsAvatars" = "Ẩn hình đại diện kênh";
|
||||
"HideShortsAvatarsDesc" = "Ẩn hình đại diện kênh ở góc dưới bên phải.";
|
||||
"HideShortsThanks" = "Ẩn nút Superthanks";
|
||||
"HideShortsThanksDesc" = "Ẩn nút Superthanks (Quyên góp) khỏi lớp phủ Shorts.";
|
||||
"HideShortsSource" = "Ẩn nguồn Shorts";
|
||||
"HideShortsSourceDesc" = "Ẩn nguồn Shorts dưới tên kênh.";
|
||||
"HideShortsChannelName" = "Ẩn tên kênh";
|
||||
"HideShortsChannelNameDesc" = "Ẩn tên kênh và nút đăng ký khỏi lớp phủ Shorts.";
|
||||
"HideShortsDescription" = "Ẩn mô tả";
|
||||
"HideShortsDescriptionDesc" = "Ẩn phần mô tả Shorts dưới tên kênh.";
|
||||
"HideShortsAudioTrack" = "Ẩn AudioTrack";
|
||||
"HideShortsAudioTrackDesc" = "Ẩn AudioTrack trong phần mô tả Shorts.";
|
||||
|
||||
"Other" = "Khác";
|
||||
"CopyVideoInfo" = "Sao chép thông tin video";
|
||||
"CopyVideoInfoDesc" = "Thêm nút để sao chép tiêu đề và mô tả video vào bảng Mô tả Video.";
|
||||
"PostManager" = "Lưu bài viết";
|
||||
"PostManagerDesc" = "Cho phép sao chép văn bản bài viết và lưu bài viết dưới dạng hình ảnh bằng cách nhấn giữ.";
|
||||
"SavePostImage" = "Lưu hình ảnh từ bài viết trên cộng đồng";
|
||||
"SavePostImageDesc" = "Lưu hình ảnh bài viết của cộng đồng vào ứng dụng Ảnh bằng cách nhấn giữ.";
|
||||
"SaveProfilePhoto" = "Lưu ảnh hồ sơ";
|
||||
"SaveProfilePhotoDesc" = "Lưu ảnh hồ sơ vào ứng dụng Ảnh bằng cách nhấn và giữ.";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||
"FixAlbums" = "Sửa Albums";
|
||||
"FixAlbumsDesc" = "Sửa lỗi hiển thị Albums cho người dùng Nga.";
|
||||
"RemovePlayNext" = "Xóa \"Phát tiếp theo trong danh sách chờ\"";
|
||||
"RemovePlayNextDesc" = "Xóa tùy chọn \"Phát tiếp theo trong danh sách chờ\" khỏi menu.";
|
||||
"NoContinueWatching" = "Xóa \"Tiếp tục xem\"";
|
||||
"NoContinueWatchingDesc" = "Xóa phần \"Tiếp tục xem\" chứa các video chưa xem hết khỏi Trang chủ.";
|
||||
"NoSearchHistory" = "Ẩn lịch sử tìm kiếm";
|
||||
"NoSearchHistoryDesc" = "Ẩn lịch sử tìm kiếm và đề xuất một cách trực quan. Lưu ý: Lịch sử tìm kiếm của bạn vẫn có thể truy cập được trong các ứng dụng YouTube khác.";
|
||||
"NoRelatedWatchNexts" = "Ẩn tất cả video dưới trình phát";
|
||||
"NoRelatedWatchNextsDesc" = "Ẩn tất cả video bên dưới trình phát, chỉ để lại phần thông tin video và nhận xét.";
|
||||
"StickSortComments" = "Dán tiêu đề bình luận";
|
||||
"StickSortCommentsDesc" = "Ghim sắp xếp tiêu đề nhận xét (Hàng đầu, Mới nhất) để nó không biến mất khi cuộn.";
|
||||
"HideSortComments" = "Ẩn bình luận";
|
||||
"HideSortCommentsDesc" = "Ẩn bình luận Short, sắp xếp (Hàng đầu, Mới nhất) để nó không bao giờ xuất hiện.";
|
||||
"PlaylistOldMinibar" = "Danh sách phát mini bar cũ";
|
||||
"PlaylistOldMinibarDesc" = "Thay thế bảng điều khiển danh sách phát nổi mới bằng bảng điều khiển cũ.";
|
||||
"DisableRTL" = "Tắt định dạng RTL";
|
||||
"DisableRTLDesc" = "Hiển thị mạnh mẽ văn bản ở định dạng từ trái sang phải (LTR) cho các ngôn ngữ ban đầu được hiển thị ở định dạng từ phải sang trái (RTL).";
|
||||
|
||||
"Startup" = "Trang khởi động";
|
||||
"Home" = "Trang chủ";
|
||||
"Explore" = "Khám phá";
|
||||
"ShortsTab" = "Shorts";
|
||||
"Subscriptions" = "Đăng ký";
|
||||
"Library" = "Thư viện";
|
||||
"Warning" = "Cảnh báo";
|
||||
"TabIsHidden" = "Không thể chọn Tab ẩn làm trang khởi động";
|
||||
|
||||
"DonateViaPayPal" = "Quyên góp qua PayPal";
|
||||
"SupportViaGhSponsors" = "Hỗ trợ phát triển thông qua Github";
|
||||
"Version" = "Phiên bản";
|
||||
"About" = "Giới thiệu";
|
||||
"Credits" = "Credits";
|
||||
"Developer" = "Nhà phát triển YTLite";
|
||||
"ChineseSimplified" = "Tiếng Trung (giản thể)";
|
||||
"ChineseTraditional" = "Tiếng Trung (phồn thể)";
|
||||
"French" = "Tiếng Pháp";
|
||||
"Spanish" = "Tiếng Tây Ban Nha";
|
||||
"Japanese" = "Tiếng Nhật";
|
||||
"Vietnamese" = "Tiếng Việt";
|
||||
"Advanced" = "Chế độ nâng cao";
|
||||
"AdvancedModeReminder" = "Bạn có muốn kích hoạt Chế độ nâng cao cho YTLite không?\n\nChế độ này cung cấp hơn 50 tùy chọn bổ sung để tùy chỉnh và tối ưu hóa trải nghiệm YouTube của bạn. Bạn có thể Bật/Tắt nó sau từ Cài đặt → %@ → %@ → %@.";
|
||||
"ClearCache" = "Xóa bộ nhớ đệm";
|
||||
"ResetSettings" = "Đặt lại cài đặt YTLite";
|
||||
"ResetMessage" = "Tùy chọn này sẽ đặt lại cài đặt YTLite về mặc định và đóng YouTube.\n\nBạn có chắc chắn muốn tiếp tục không?";
|
||||
"ShortsOnlyWarning" = "Bạn có chắc chắn muốn kích hoạt chế độ này?\n\nỞ chế độ này, bạn sẽ chỉ có thể xem video Shorts và không thể làm gì khác.\n\nBạn có thể tắt Chế độ chỉ Shorts bằng cách nhấn và giữ bằng hai ngón tay trong trình phát Shorts.";
|
||||
"ShortsModeTurnedOff" = "Chế độ chỉ dành cho Shorts đã bị tắt";
|
||||
"Yes" = "Có";
|
||||
"No" = "Không";
|
||||
|
||||
"SelectAction" = "Chọn hành động";
|
||||
"CopyTitle" = "Sao chép tiêu đề";
|
||||
"CopyDescription" = "Sao chép mô tả";
|
||||
"CopyPostText" = "Sao chép văn bản bài viết";
|
||||
"SavePostAsImage" = "Lưu bài viết dưới dạng hình ảnh";
|
||||
"CopyPostAsImage" = "Sao chép bài viết dưới dạng hình ảnh";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "Hủy bỏ";
|
||||
"Copied" = "Sao chép vào clipboard";
|
||||
"Saved" = "Đã lưu vào Ảnh";
|
||||
"Done" = "Xong";
|
||||
"Error" = "Lỗi";
|
||||
@@ -37,6 +37,8 @@
|
||||
"NoEndScreenCardsDesc" = "隐藏视频结尾处的片尾屏幕(缩略图)。";
|
||||
"NoFullscreenActions" = "禁用全屏操作";
|
||||
"NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。";
|
||||
"PersistentProgressBar" = "持续进度条";
|
||||
"PersistentProgressBarDesc" = "始终在播放器中显示进度条。";
|
||||
"NoRelatedVids" = "没有相关视频";
|
||||
"NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。";
|
||||
"NoPromotionCards" = "隐藏付费";
|
||||
@@ -49,10 +51,12 @@
|
||||
"MiniplayerDesc" = "启用迷你播放器来播放最初不是为其设计的视频,例如针对儿童的视频。";
|
||||
"PortraitFullscreen" = "竖屏全屏模式";
|
||||
"PortraitFullscreenDesc" = "启用竖屏全屏模式支持。";
|
||||
"CopyWithTimestamp" = "Copy timestamped links";
|
||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||
"CopyWithTimestamp" = "复制带时间戳的链接";
|
||||
"CopyWithTimestampDesc" = "允许通过按下暂停按钮将带有时间戳的链接复制到剪贴板。";
|
||||
"DisableAutoplay" = "禁用自动播放视频";
|
||||
"DisableAutoplayDesc" = "打开后防止视频自动播放。";
|
||||
"DisableAutoCaptions" = "禁用自动字幕";
|
||||
"DisableAutoCaptionsDesc" = "防止自动激活字幕。";
|
||||
"NoContentWarning" = "跳过内容警告";
|
||||
"NoContentWarningDesc" = "跳过敏感内容警告消息。";
|
||||
"ClassicQuality" = "经典视频质量";
|
||||
@@ -77,10 +81,12 @@
|
||||
"Tabbar" = "选项卡栏";
|
||||
"RemoveLabels" = "移除标签";
|
||||
"RemoveLabelsDesc" = "删除选项卡标签。";
|
||||
"RemoveIndicators" = "Remove indicators";
|
||||
"RemoveIndicatorsDesc" = "Removes tab indicators.";
|
||||
"RemoveIndicators" = "删除指示器";
|
||||
"RemoveIndicatorsDesc" = "删除选项卡“红点”指示。";
|
||||
"ReExplore" = "“短视频”替换为“探索”";
|
||||
"ReExploreDesc" = "在旧版本 YouTube 中将“短视频”选项卡替换为“探索”。";
|
||||
"AddExplore" = "添加“探索”选项卡";
|
||||
"AddExploreDesc" = "将“探索”选项卡添加到底部选项卡栏。";
|
||||
"HideShortsTab" = "隐藏短视频";
|
||||
"HideShortsTabDesc" = "从选项卡栏中隐藏短视频。";
|
||||
"HideSubscriptionsTab" = "隐藏订阅内容";
|
||||
@@ -91,10 +97,16 @@
|
||||
"HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库。";
|
||||
|
||||
"Shorts" = "短视频";
|
||||
"ShortsOnlyMode" = "仅短视频模式";
|
||||
"ShortsOnlyModeDesc" = "将 YouTube 功能限制为只能观看短视频。";
|
||||
"HideShorts" = "隐藏短视频";
|
||||
"HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。";
|
||||
"ShortsProgress" = "启用进度条";
|
||||
"ShortsProgressDesc" = "在短视频播放器中显示进度条。";
|
||||
"PinchToFullscreenShorts" = "捏合至全屏";
|
||||
"PinchToFullscreenShortsDesc" = "通过捏合和捏合手势管理播放界面,以全屏模式显示短视频。";
|
||||
"ShortsToRegular" = "常规短视频";
|
||||
"ShortsToRegularDesc" = "像打开普通视频一样打开短视频。";
|
||||
"ResumeShorts" = "不要从短视频开始";
|
||||
"ResumeShortsDesc" = "防止在打开应用程序时首先启动短视频,如果在观看短视频时关闭,就会发生这种情况。";
|
||||
"HideShortsLogo" = "隐藏短视频Logo";
|
||||
@@ -121,6 +133,8 @@
|
||||
"HideShortsAvatarsDesc" = "隐藏右下角的发布者个人资料头像。";
|
||||
"HideShortsThanks" = "隐藏捐赠按钮";
|
||||
"HideShortsThanksDesc" = "从短视频播放器中隐藏捐赠按钮。";
|
||||
"HideShortsSource" = "隐藏短视频来源";
|
||||
"HideShortsSourceDesc" = "在频道名称下隐藏短视频来源。";
|
||||
"HideShortsChannelName" = "隐藏发布者名称";
|
||||
"HideShortsChannelNameDesc" = "从短视频播放器中隐藏发布者名称和订阅按钮。";
|
||||
"HideShortsDescription" = "隐藏文案";
|
||||
@@ -129,6 +143,18 @@
|
||||
"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
|
||||
|
||||
"Other" = "其他";
|
||||
"CopyVideoInfo" = "复制视频信息";
|
||||
"CopyVideoInfoDesc" = "添加按钮从“视频说明”面板中复制视频的标题和描述。";
|
||||
"PostManager" = "保存帖子信息";
|
||||
"PostManagerDesc" = "允许通过长按复制帖子文本并将帖子另存为图片。";
|
||||
"SavePostImage" = "保存社区帖子图片";
|
||||
"SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。";
|
||||
"SaveProfilePhoto" = "保存个人资料图片";
|
||||
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||
"FixAlbums" = "修复封面";
|
||||
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
|
||||
"RemovePlayNext" = "删除“播放队列中的下一个”";
|
||||
"RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。";
|
||||
"NoContinueWatching" = "删除“继续观看”";
|
||||
@@ -155,6 +181,8 @@
|
||||
"Warning" = "警告";
|
||||
"TabIsHidden" = "无法选择隐藏选项卡作为启动页。";
|
||||
|
||||
"DonateViaPayPal" = "PayPal 赞助";
|
||||
"SupportViaGhSponsors" = "通过 Github 赞助支持开发";
|
||||
"Version" = "版本";
|
||||
"About" = "关于";
|
||||
"Credits" = "信息";
|
||||
@@ -164,9 +192,28 @@
|
||||
"French" = "法语本地化";
|
||||
"Spanish" = "西班牙语本地化";
|
||||
"Japanese" = "日语本地化";
|
||||
"Vietnamese" = "越南语本地化";
|
||||
"Advanced" = "高级模式";
|
||||
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
||||
"ClearCache" = "清除缓存";
|
||||
"ResetSettings" = "重置YTLite设置";
|
||||
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
|
||||
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
|
||||
"ShortsModeTurnedOff" = "仅短视频模式已关闭";
|
||||
"Yes" = "是";
|
||||
"No" = "不";
|
||||
|
||||
"SelectAction" = "选择操作";
|
||||
"CopyTitle" = "复制标题";
|
||||
"CopyDescription" = "复制描述";
|
||||
"CopyPostText" = "复制帖子文本";
|
||||
"SavePostAsImage" = "帖子另存为图片";
|
||||
"CopyPostAsImage" = "帖子作为图片复制";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "取消";
|
||||
"Copied" = "已复制到剪贴板";
|
||||
"Saved" = "已保存到照片";
|
||||
"Done" = "完成";
|
||||
"Error" = "错误";
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
"NoEndScreenCardsDesc" = "隱藏當影片結束時的懸停影片(縮圖)";
|
||||
"NoFullscreenActions" = "停用全螢幕操作";
|
||||
"NoFullscreenActionsDesc" = "在全螢幕模式下停用操作面板";
|
||||
"PersistentProgressBar" = "固定進度條";
|
||||
"PersistentProgressBarDesc" = "總是在播放器中顯示進度條";
|
||||
"NoRelatedVids" = "隱藏相關影片";
|
||||
"NoRelatedVidsDesc" = "移除全螢幕模式向上滑動時所出現的相關影片";
|
||||
"NoPromotionCards" = "隱藏付費推廣";
|
||||
@@ -49,10 +51,12 @@
|
||||
"MiniplayerDesc" = "對於原本不支援迷你播放器的影片(例如針對兒童的影片),啟用迷你播放器";
|
||||
"PortraitFullscreen" = "直向全螢幕模式";
|
||||
"PortraitFullscreenDesc" = "啟用直向全螢幕模式";
|
||||
"CopyWithTimestamp" = "Copy timestamped links";
|
||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||
"CopyWithTimestamp" = "複製時間標記連結";
|
||||
"CopyWithTimestampDesc" = "透過按下暫停按鈕,將帶有時間標記的連結複製到剪貼簿";
|
||||
"DisableAutoplay" = "停用自動播放";
|
||||
"DisableAutoplayDesc" = "在打開應用程式後防止自動播放影片";
|
||||
"DisableAutoCaptions" = "停用自動字幕";
|
||||
"DisableAutoCaptionsDesc" = "防止字幕自動啟用";
|
||||
"NoContentWarning" = "略過內容警告";
|
||||
"NoContentWarningDesc" = "略過敏感內容警告訊息";
|
||||
"ClassicQuality" = "舊版本影片畫質";
|
||||
@@ -61,8 +65,8 @@
|
||||
"ExtraSpeedOptionsDesc" = "在播放速度選單中添加更多選項";
|
||||
"DontSnap2Chapter" = "停用跳轉到章節";
|
||||
"DontSnap2ChapterDesc" = "停用點兩下手勢跳轉到下一集";
|
||||
"RedProgressBar" = "紅色進度欄";
|
||||
"RedProgressBarDesc" = "恢復紅色的進度欄";
|
||||
"RedProgressBar" = "紅色進度條";
|
||||
"RedProgressBarDesc" = "恢復紅色的進度條";
|
||||
"NoHints" = "停用提示";
|
||||
"NoHintsDesc" = "在播放過程中出現在右上角的作者提示";
|
||||
"NoFreeZoom" = "停用自由縮放手勢";
|
||||
@@ -75,12 +79,14 @@
|
||||
"NoDoubleTap2SeekDesc" = "停用點兩下手勢進行快轉";
|
||||
|
||||
"Tabbar" = "下方標籤欄";
|
||||
"RemoveLabels" = "移除標籤文字";
|
||||
"RemoveLabels" = "移除文字";
|
||||
"RemoveLabelsDesc" = "移除標籤文字";
|
||||
"RemoveIndicators" = "Remove indicators";
|
||||
"RemoveIndicatorsDesc" = "Removes tab indicators.";
|
||||
"RemoveIndicators" = "刪除標記";
|
||||
"RemoveIndicatorsDesc" = "刪除標籤通知標記";
|
||||
"ReExplore" = "用探索取代Shorts分頁";
|
||||
"ReExploreDesc" = "如同舊版YouTube一樣顯示「探索」而非「Shorts」";
|
||||
"AddExplore" = "新增探索標籤";
|
||||
"AddExploreDesc" = "在下方標籤欄新增探索標籤";
|
||||
"HideShortsTab" = "隱藏Shorts";
|
||||
"HideShortsTabDesc" = "從標籤欄中隱藏Shorts標籤";
|
||||
"HideSubscriptionsTab" = "隱藏訂閱內容";
|
||||
@@ -91,10 +97,16 @@
|
||||
"HideLibraryTabDesc" = "從標籤欄中隱藏媒體庫標籤";
|
||||
|
||||
"Shorts" = "Shorts";
|
||||
"ShortsOnlyMode" = "只看Shorts模式";
|
||||
"ShortsOnlyModeDesc" = "限制YouTube功能只能觀看Shorts影片";
|
||||
"HideShorts" = "隱藏Shorts影片";
|
||||
"HideShortsDesc" = "從首頁、推薦...等,隱藏Shorts影片(不適用於觀看紀錄)";
|
||||
"ShortsProgress" = "啟用時間進度條";
|
||||
"ShortsProgressDesc" = "在Shorts底部顯示進度條";
|
||||
"PinchToFullscreenShorts" = "捏合切換全螢幕";
|
||||
"PinchToFullscreenShortsDesc" = "透過兩指縮放手勢,控制覆蓋層的顯示,讓Shorts以全螢幕模式播放";
|
||||
"ShortsToRegular" = "Shorts轉為一般影片";
|
||||
"ShortsToRegularDesc" = "將Shorts作為一般影片開啟";
|
||||
"ResumeShorts" = "不要從Shorts開始";
|
||||
"ResumeShortsDesc" = "防止重新開啟應用程式時從Shorts開始播放,如果在觀看Shorts時關閉,就會發生這種情況";
|
||||
"HideShortsLogo" = "隱藏Shorts圖示";
|
||||
@@ -121,6 +133,8 @@
|
||||
"HideShortsAvatarsDesc" = "隱藏右下角的頻道圖片";
|
||||
"HideShortsThanks" = "隱藏超級感謝按鈕";
|
||||
"HideShortsThanksDesc" = "從Shorts中隱藏超級感謝 (贊助) 按鈕";
|
||||
"HideShortsSource" = "隱藏Shorts來源";
|
||||
"HideShortsSourceDesc" = "在頻道名稱下隱藏Shorts來源";
|
||||
"HideShortsChannelName" = "隱藏頻道名稱";
|
||||
"HideShortsChannelNameDesc" = "從Shorts中隱藏頻道名稱和訂閱按鈕";
|
||||
"HideShortsDescription" = "隱藏描述";
|
||||
@@ -129,12 +143,24 @@
|
||||
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
|
||||
|
||||
"Other" = "其它";
|
||||
"CopyVideoInfo" = "複製影片資訊";
|
||||
"CopyVideoInfoDesc" = "新增按鈕將影片標題和說明,複製到影片說明欄";
|
||||
"PostManager" = "儲存貼文資訊";
|
||||
"PostManagerDesc" = "長按可以複製貼文內容或將貼文儲存為圖片";
|
||||
"SavePostImage" = "儲存社群貼文圖片";
|
||||
"SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用";
|
||||
"SaveProfilePhoto" = "儲存個人檔案照片";
|
||||
"SaveProfilePhotoDesc" = "長按個人檔案照片儲存到照片應用";
|
||||
"CommentManager" = "Save comment information";
|
||||
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||
"FixAlbums" = "修復封面";
|
||||
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
|
||||
"RemovePlayNext" = "移除「播放下一個」";
|
||||
"RemovePlayNextDesc" = "從選單移除「播放下一個」";
|
||||
"NoContinueWatching" = "移除「繼續觀看」";
|
||||
"NoContinueWatchingDesc" = "從首頁中移除包含未完成影片的「繼續觀看」部分";
|
||||
"NoSearchHistory" = "隱藏搜尋記錄";
|
||||
"NoSearchHistoryDesc" = "視覺上隱藏搜尋歷史紀錄和建議。注意:您的搜尋紀錄仍然可在其它 YouTube 客戶端中存取";
|
||||
"NoSearchHistoryDesc" = "視覺上隱藏搜尋歷史紀錄和建議。注意:您的搜尋紀錄仍然可在其它YouTube客戶端中存取";
|
||||
"NoRelatedWatchNexts" = "隱藏播放器下的所有影片";
|
||||
"NoRelatedWatchNextsDesc" = "只留下影片資訊和留言區域";
|
||||
"StickSortComments" = "固定留言排序";
|
||||
@@ -155,6 +181,8 @@
|
||||
"Warning" = "警告";
|
||||
"TabIsHidden" = "無法將隱藏的標籤選為啟動頁面";
|
||||
|
||||
"DonateViaPayPal" = "透過PayPal贊助";
|
||||
"SupportViaGhSponsors" = "透過Github贊助支持開發";
|
||||
"Version" = "版本";
|
||||
"About" = "關於";
|
||||
"Credits" = "貢獻";
|
||||
@@ -163,10 +191,29 @@
|
||||
"ChineseTraditional" = "繁體中文在地化";
|
||||
"French" = "法文在地化";
|
||||
"Spanish" = "西班牙文在地化";
|
||||
"Japanese" = "日本語本地化";
|
||||
"Japanese" = "日本語在地化";
|
||||
"Vietnamese" = "越南語在地化";
|
||||
"Advanced" = "進階模式";
|
||||
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
||||
"ClearCache" = "清除快取";
|
||||
"ResetSettings" = "重置YTLite設定";
|
||||
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
|
||||
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
|
||||
"ShortsModeTurnedOff" = "已關閉「只看Shorts模式」";
|
||||
"Yes" = "是";
|
||||
"No" = "否";
|
||||
|
||||
"SelectAction" = "選擇動作";
|
||||
"CopyTitle" = "複製標題";
|
||||
"CopyDescription" = "複製說明";
|
||||
"CopyPostText" = "複製貼文內容";
|
||||
"SavePostAsImage" = "貼文儲存為圖片";
|
||||
"CopyPostAsImage" = "複製貼文為圖片";
|
||||
"CopyCommentText" = "Copy comment text";
|
||||
"SaveCommentAsImage" = "Save comment as image";
|
||||
"CopyCommentAsImage" = "Copy comment as image";
|
||||
"Cancel" = "取消";
|
||||
"Copied" = "已複製到剪貼簿";
|
||||
"Saved" = "已儲存到照片應用";
|
||||
"Done" = "Done";
|
||||
"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.
Reference in New Issue
Block a user