v2.6
This commit is contained in:
@@ -5,8 +5,8 @@ endif
|
||||
DEBUG=0
|
||||
FINALPACKAGE=1
|
||||
ARCHS = arm64
|
||||
PACKAGE_VERSION = 2.5
|
||||
TARGET := iphone:clang:latest:11.0
|
||||
PACKAGE_VERSION = 2.6
|
||||
TARGET := iphone:clang:latest:13.0
|
||||
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
|
||||
|
||||
+39
-1
@@ -6,6 +6,23 @@
|
||||
|
||||
static const NSInteger YTLiteSection = 789;
|
||||
|
||||
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
|
||||
%hook YTAppSettingsPresentationData
|
||||
+ (NSArray *)settingsCategoryOrder {
|
||||
@@ -266,9 +283,11 @@ 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(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject),
|
||||
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
|
||||
createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, selfObject),
|
||||
createSwitchItem(LOC(@"CopyCommentText"), LOC(@"CopyCommentTextDesc"), @"copyCommentText", &kCopyCommentText, 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),
|
||||
@@ -415,6 +434,23 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
||||
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"];
|
||||
@@ -438,12 +474,14 @@ 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, 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];
|
||||
|
||||
BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)];
|
||||
|
||||
@@ -110,9 +110,11 @@ BOOL kRemoveShorts;
|
||||
BOOL kRemoveSubscriptions;
|
||||
BOOL kRemoveUploads;
|
||||
BOOL kRemoveLibrary;
|
||||
BOOL kCopyVideoInfo;
|
||||
BOOL kCopyPostText;
|
||||
BOOL kSavePostImage;
|
||||
BOOL kSaveProfilePhoto;
|
||||
BOOL kCopyCommentText;
|
||||
BOOL kSavePost;
|
||||
BOOL kFixAlbums;
|
||||
BOOL kRemovePlayNext;
|
||||
@@ -137,6 +139,10 @@ int kPivotIndex;
|
||||
@interface YTPivotBarView : UIView
|
||||
@end
|
||||
|
||||
@interface YTLightweightQTMButton ()
|
||||
@property (nonatomic, assign, readwrite, getter=isShouldRaiseOnTouch) BOOL shouldRaiseOnTouch;
|
||||
@end
|
||||
|
||||
@interface YTQTMButton ()
|
||||
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
|
||||
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
|
||||
@@ -193,7 +199,13 @@ int kPivotIndex;
|
||||
@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;
|
||||
@@ -207,6 +219,37 @@ int kPivotIndex;
|
||||
- (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
|
||||
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
||||
@end
|
||||
@@ -241,15 +284,32 @@ int kPivotIndex;
|
||||
@interface YTELMView : UIView
|
||||
@end
|
||||
|
||||
@interface ASNetworkImageNode : NSObject
|
||||
@interface ASNodeAncestryEnumerator : NSEnumerator
|
||||
@property (atomic, assign, readonly) NSMutableArray *allObjects;
|
||||
@end
|
||||
|
||||
@interface ASDisplayNode : NSObject
|
||||
@property (atomic, assign, readonly) ASNodeAncestryEnumerator *supernodes;
|
||||
@end
|
||||
|
||||
@interface ELMContainerNode : ASDisplayNode
|
||||
@property (nonatomic, strong, readwrite) NSString *copiedComment;
|
||||
@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) ASNetworkImageNode *keepalive_node;
|
||||
@property (nonatomic, strong, readwrite) ASDisplayNode *keepalive_node;
|
||||
- (void)copyText:(UILongPressGestureRecognizer *)sender;
|
||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender;
|
||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
|
||||
- (void)copyComment:(UILongPressGestureRecognizer *)sender;
|
||||
@end
|
||||
|
||||
@interface MLHAMQueuePlayer : NSObject
|
||||
|
||||
@@ -280,8 +280,7 @@
|
||||
%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
|
||||
|
||||
@@ -638,27 +637,43 @@ static BOOL isOverlayShown = YES;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook ELMContainerNode
|
||||
%property (nonatomic, strong) NSString *copiedComment;
|
||||
%end
|
||||
|
||||
%hook _ASDisplayView
|
||||
- (void)setKeepalive_node:(id)arg1 {
|
||||
%orig;
|
||||
|
||||
NSString *description = [self description];
|
||||
if (kCopyPostText && [description containsString:@"ELMExpandableTextNode-View"]) {
|
||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(copyText:)];
|
||||
NSArray *gesturesInfo = @[
|
||||
@{@"selector": @"copyText:", @"text": @"ELMExpandableTextNode-View", @"key": @(kCopyPostText)},
|
||||
@{@"selector": @"saveImage:", @"text": @"YTImageZoomNode-View", @"key": @(kSavePostImage)},
|
||||
@{@"selector": @"savePFP:", @"text": @"ELMImageNode-View", @"key": @(kSaveProfilePhoto)},
|
||||
@{@"selector": @"copyComment:", @"text": @"id.ui.comment_cell", @"key": @(kCopyCommentText)}
|
||||
];
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if (kSavePostImage && [description containsString:@"YTImageZoomNode-View"]) {
|
||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(saveImage:)];
|
||||
longPress.minimumPressDuration = 0.3;
|
||||
[self addGestureRecognizer:longPress];
|
||||
}
|
||||
if ([[self description] containsString:@"id.comment.content.label"]) {
|
||||
ASTextNode *textNode = (ASTextNode *)self.keepalive_node;
|
||||
ASDisplayNode *displayNode = (ASDisplayNode *)self.keepalive_node;
|
||||
|
||||
if (kSaveProfilePhoto && [description containsString:@"ELMImageNode-View"] && [description containsString:@"eml.avatar"]) {
|
||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(savePFP:)];
|
||||
longPress.minimumPressDuration = 0.3;
|
||||
[self addGestureRecognizer:longPress];
|
||||
NSMutableArray *allObjects = displayNode.supernodes.allObjects;
|
||||
for (ELMContainerNode *containerNode in allObjects) {
|
||||
if ([containerNode.description containsString:@"id.ui.comment_cell"]) {
|
||||
containerNode.copiedComment = textNode.attributedText.string;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -666,7 +681,8 @@ static BOOL isOverlayShown = YES;
|
||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
|
||||
NSString *URLString = self.keepalive_node.URL.absoluteString;
|
||||
ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node;
|
||||
NSString *URLString = imageNode.URL.absoluteString;
|
||||
if (URLString) {
|
||||
NSRange sizeRange = [URLString rangeOfString:@"=s"];
|
||||
if (sizeRange.location != NSNotFound) {
|
||||
@@ -692,8 +708,7 @@ static BOOL isOverlayShown = YES;
|
||||
%new
|
||||
- (void)copyText:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
||||
pasteboard.string = self.accessibilityLabel;
|
||||
[UIPasteboard generalPasteboard].string = self.accessibilityLabel;
|
||||
|
||||
UIResponder *responder = self.nextResponder;
|
||||
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
||||
@@ -705,7 +720,8 @@ static BOOL isOverlayShown = YES;
|
||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
|
||||
NSURL *imageURL = self.keepalive_node.URL;
|
||||
ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node;
|
||||
NSURL *imageURL = imageNode.URL;
|
||||
if (imageURL) {
|
||||
NSString *URLString = imageURL.absoluteString;
|
||||
|
||||
@@ -743,6 +759,18 @@ static BOOL isOverlayShown = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
- (void)copyComment:(UILongPressGestureRecognizer *)sender {
|
||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||
ELMContainerNode *containerNode = (ELMContainerNode *)self.keepalive_node;
|
||||
[UIPasteboard generalPasteboard].string = containerNode.copiedComment;
|
||||
|
||||
UIResponder *responder = self.nextResponder;
|
||||
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
||||
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:responder] send];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// Remove Tabs
|
||||
@@ -847,6 +875,8 @@ BOOL isTabSelected = NO;
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
%orig;
|
||||
|
||||
isOverlayShown = YES;
|
||||
|
||||
if (kShortsOnlyMode) {
|
||||
[self.navigationController.parentViewController hidePivotBar];
|
||||
}
|
||||
@@ -854,7 +884,7 @@ BOOL isTabSelected = NO;
|
||||
%end
|
||||
|
||||
%hook YTAppViewController
|
||||
- (void)showPivotBar { if (!kShortsOnlyMode) %orig;} ;
|
||||
- (void)showPivotBar { if (!kShortsOnlyMode) %orig; }
|
||||
%end
|
||||
|
||||
%hook YTReelWatchRootViewController
|
||||
@@ -867,6 +897,58 @@ BOOL isTabSelected = NO;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTEngagementPanelView
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
|
||||
if ([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 (kCopyVideoInfo && self.headerView && self.headerView.closeButton && ![self.headerView viewWithTag:999]) {
|
||||
[self.headerView addSubview:copyInfoButton];
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[copyInfoButton.trailingAnchor constraintEqualToAnchor:self.headerView.closeButton.leadingAnchor],
|
||||
[copyInfoButton.centerYAnchor constraintEqualToAnchor:self.headerView.closeButton.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
|
||||
|
||||
// Disable Right-To-Left Formatting
|
||||
%hook NSParagraphStyle
|
||||
+ (NSWritingDirection)defaultWritingDirectionForLanguage:(id)lang { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; }
|
||||
@@ -973,9 +1055,11 @@ static void reloadPrefs() {
|
||||
kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO;
|
||||
kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES;
|
||||
kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO;
|
||||
kCopyVideoInfo = [prefs[@"copyVideoInfo"] boolValue] ?: NO;
|
||||
kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO;
|
||||
kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO;
|
||||
kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO;
|
||||
kCopyCommentText = [prefs[@"copyCommentText"] boolValue] ?: NO;
|
||||
kFixAlbums = [prefs[@"fixAlbums"] boolValue] ?: NO;
|
||||
kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO;
|
||||
kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO;
|
||||
@@ -1057,9 +1141,11 @@ static void reloadPrefs() {
|
||||
@"removeSubscriptions" : @(kRemoveSubscriptions),
|
||||
@"removeUploads" : @(kRemoveUploads),
|
||||
@"removeLibrary" : @(kRemoveLibrary),
|
||||
@"copyVideoInfo" : @(kCopyVideoInfo),
|
||||
@"copyPostText" : @(kCopyPostText),
|
||||
@"savePostImage" : @(kSavePostImage),
|
||||
@"saveProfilePhoto" : @(kSaveProfilePhoto),
|
||||
@"copyCommentText" : @(kCopyCommentText),
|
||||
@"fixAlbums" : @(kFixAlbums),
|
||||
@"removePlayNext" : @(kRemovePlayNext),
|
||||
@"noContinueWatching" : @(kNoContinueWatching),
|
||||
|
||||
@@ -143,12 +143,16 @@
|
||||
"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.";
|
||||
"CopyPostText" = "Copy community posts text";
|
||||
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
||||
"SavePostImage" = "Save image from community posts";
|
||||
"SavePostImageDesc" = "Saves community post image to the Photos app by long tap.";
|
||||
"SaveProfilePhoto" = "Save profile picture";
|
||||
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
||||
"CopyCommentText" = "Copy comments text";
|
||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||
"FixAlbums" = "Fix covers";
|
||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
||||
"RemovePlayNext" = "Remove \"Play next in queue\"";
|
||||
@@ -177,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";
|
||||
@@ -188,6 +194,7 @@
|
||||
"Japanese" = "Japanese 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.";
|
||||
@@ -195,6 +202,11 @@
|
||||
"Yes" = "Yes";
|
||||
"No" = "No";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copied to clipboard";
|
||||
"Saved" = "Saved to Photos";
|
||||
"Done" = "Done";
|
||||
"Error" = "Error";
|
||||
@@ -143,12 +143,16 @@
|
||||
"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.";
|
||||
"CopyPostText" = "Copia el texto de las publicaciones de la comunidad";
|
||||
"CopyPostTextDesc" = "Copia el texto de los posts de la comunidad al portapapeles mediante pulsación larga";
|
||||
"SavePostImage" = "Guardar imagen de las entradas de la comunidad";
|
||||
"SavePostImageDesc" = "Guarda la imagen de las publicaciones de la comunidad en la aplicación Fotos con un toque prolongado";
|
||||
"SaveProfilePhoto" = "Guardar foto de perfil";
|
||||
"SaveProfilePhotoDesc" = "Guarda la imagen de perfil en la aplicación Fotos con un toque prolongado";
|
||||
"CopyCommentText" = "Copy comments text";
|
||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||
"FixAlbums" = "Arreglar portadas";
|
||||
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
|
||||
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
|
||||
@@ -177,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";
|
||||
@@ -188,13 +194,19 @@
|
||||
"Japanese" = "Traducción: Japonés";
|
||||
"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."
|
||||
"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";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copiado al portapapeles";
|
||||
"Done" = "Done";
|
||||
"Saved" = "Guardado en Fotos";
|
||||
"Error" = "Error";
|
||||
@@ -143,12 +143,16 @@
|
||||
"HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts.";
|
||||
|
||||
"Other" = "Autre";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"CopyPostText" = "Copier le texte des publications de la communauté";
|
||||
"CopyPostTextDesc" = "Copie le texte des publications de la communauté dans le presse-papiers en appuyant longuement.";
|
||||
"SavePostImage" = "Enregistrer l'image des publications de la communauté";
|
||||
"SavePostImageDesc" = "Enregistre l'image des publications de la communauté dans l'application Photos en appuyant longuement.";
|
||||
"SaveProfilePhoto" = "Enregistrer la photo de profil";
|
||||
"SaveProfilePhotoDesc" = "Enregistre la photo de profil dans l'application Photos en appuyant longuement.";
|
||||
"CopyCommentText" = "Copy comments text";
|
||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard 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\"";
|
||||
@@ -177,6 +181,8 @@
|
||||
"Warning" = "Avertissement";
|
||||
"TabIsHidden" = "L'onglet masqué ne peut pas être sélectionné comme page de démarrage";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "Version";
|
||||
"About" = "À propos";
|
||||
"Credits" = "Crédits";
|
||||
@@ -188,6 +194,7 @@
|
||||
"Japanese" = "Localisation japonaise";
|
||||
"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" = "Clear 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.";
|
||||
@@ -195,6 +202,11 @@
|
||||
"Yes" = "Oui";
|
||||
"No" = "Non";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copié dans le presse-papiers";
|
||||
"Saved" = "Enregistré dans Photos";
|
||||
"Done" = "Done";
|
||||
"Error" = "Erreur";
|
||||
@@ -143,12 +143,16 @@
|
||||
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
||||
|
||||
"Other" = "その他";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"CopyPostText" = "Copy community posts text";
|
||||
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
||||
"SavePostImage" = "Save community posts image";
|
||||
"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap.";
|
||||
"SaveProfilePhoto" = "Save profile picture";
|
||||
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
||||
"CopyCommentText" = "Copy comments text";
|
||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||
"FixAlbums" = "Fix covers";
|
||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
||||
"RemovePlayNext" = "\"次に再生\"を削除";
|
||||
@@ -177,6 +181,8 @@
|
||||
"Warning" = "警告";
|
||||
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "バージョン";
|
||||
"About" = "About";
|
||||
"Credits" = "クレジット";
|
||||
@@ -188,6 +194,7 @@
|
||||
"Japanese" = "日本語翻訳";
|
||||
"Advanced" = "アドバンスモード";
|
||||
"AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます";
|
||||
"ClearCache" = "Clear cache";
|
||||
"ResetSettings" = "YTLiteの設定をリセット";
|
||||
"ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、アプリが終了します。\n\n続行してもよろしいですか?";
|
||||
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
|
||||
@@ -195,6 +202,11 @@
|
||||
"Yes" = "はい";
|
||||
"No" = "いいえ";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "Copied to clipboard";
|
||||
"Saved" = "Saved to Photos";
|
||||
"Done" = "Done";
|
||||
"Error" = "Error";
|
||||
@@ -143,12 +143,16 @@
|
||||
"HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера.";
|
||||
|
||||
"Other" = "Другие настройки";
|
||||
"CopyVideoInfo" = "Копировать информацию о видео";
|
||||
"CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео.";
|
||||
"CopyPostText" = "Копировать текст постов";
|
||||
"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием.";
|
||||
"SavePostImage" = "Сохранять изображения постов";
|
||||
"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним.";
|
||||
"SaveProfilePhoto" = "Сохранять фото профиля";
|
||||
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
|
||||
"CopyCommentText" = "Копировать текст комментариев";
|
||||
"CopyCommentTextDesc" = "Копирует текст комментариев в буфер обмена долгим нажатием.";
|
||||
"FixAlbums" = "Исправить отображение обложек";
|
||||
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
|
||||
"RemovePlayNext" = "Убрать «Добавить в начало очереди»";
|
||||
@@ -177,6 +181,8 @@
|
||||
"Warning" = "Внимание";
|
||||
"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы";
|
||||
|
||||
"DonateViaPayPal" = "Задонатить на PayPal";
|
||||
"SupportViaGhSponsors" = "Поддержать разработку в Github Sponsors";
|
||||
"Version" = "Версия";
|
||||
"About" = "О твике";
|
||||
"Credits" = "Авторы";
|
||||
@@ -188,6 +194,7 @@
|
||||
"Japanese" = "Японская локализация";
|
||||
"Advanced" = "Расширенный режим";
|
||||
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
|
||||
"ClearCache" = "Очистить кеш";
|
||||
"ResetSettings" = "Сбросить настройки твика";
|
||||
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
|
||||
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
|
||||
@@ -195,6 +202,11 @@
|
||||
"Yes" = "Да";
|
||||
"No" = "Нет";
|
||||
|
||||
"SelectAction" = "Выберите действие";
|
||||
"CopyTitle" = "Скопировать название";
|
||||
"CopyDescription" = "Скопировать описание";
|
||||
"Cancel" = "Отмена";
|
||||
"Copied" = "Скопировано в буфер обмена";
|
||||
"Saved" = "Сохранено в Фото";
|
||||
"Done" = "Готово";
|
||||
"Error" = "Ошибка";
|
||||
@@ -143,12 +143,16 @@
|
||||
"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
|
||||
|
||||
"Other" = "其他";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"CopyPostText" = "复制社区帖子文本";
|
||||
"CopyPostTextDesc" = "长按社区帖子文本复制到剪贴板。";
|
||||
"SavePostImage" = "保存社区帖子图片";
|
||||
"SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。";
|
||||
"SaveProfilePhoto" = "保存个人资料图片";
|
||||
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
|
||||
"CopyCommentText" = "Copy comments text";
|
||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||
"FixAlbums" = "修复封面";
|
||||
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
|
||||
"RemovePlayNext" = "删除“播放队列中的下一个”";
|
||||
@@ -177,6 +181,8 @@
|
||||
"Warning" = "警告";
|
||||
"TabIsHidden" = "无法选择隐藏选项卡作为启动页。";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "版本";
|
||||
"About" = "关于";
|
||||
"Credits" = "信息";
|
||||
@@ -188,6 +194,7 @@
|
||||
"Japanese" = "日语本地化";
|
||||
"Advanced" = "高级模式";
|
||||
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
||||
"ClearCache" = "Clear cache";
|
||||
"ResetSettings" = "重置YTLite设置";
|
||||
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
|
||||
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
|
||||
@@ -195,6 +202,11 @@
|
||||
"Yes" = "是";
|
||||
"No" = "不";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "已复制到剪贴板";
|
||||
"Saved" = "已保存到照片";
|
||||
"Done" = "Done";
|
||||
"Error" = "错误";
|
||||
@@ -143,12 +143,16 @@
|
||||
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
|
||||
|
||||
"Other" = "其它";
|
||||
"CopyVideoInfo" = "Copy video information";
|
||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||
"CopyPostText" = "複製社群貼文文字";
|
||||
"CopyPostTextDesc" = "長按社群貼文文字複製到剪貼簿";
|
||||
"SavePostImage" = "儲存社群貼文圖片";
|
||||
"SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用";
|
||||
"SaveProfilePhoto" = "儲存個人檔案照片";
|
||||
"SaveProfilePhotoDesc" = "長按個人檔案照片儲存到照片應用";
|
||||
"CopyCommentText" = "Copy comments text";
|
||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||
"FixAlbums" = "修復封面";
|
||||
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
|
||||
"RemovePlayNext" = "移除「播放下一個」";
|
||||
@@ -177,6 +181,8 @@
|
||||
"Warning" = "警告";
|
||||
"TabIsHidden" = "無法將隱藏的標籤選為啟動頁面";
|
||||
|
||||
"DonateViaPayPal" = "Donate via PayPal";
|
||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||
"Version" = "版本";
|
||||
"About" = "關於";
|
||||
"Credits" = "貢獻";
|
||||
@@ -188,6 +194,7 @@
|
||||
"Japanese" = "日本語本地化";
|
||||
"Advanced" = "進階模式";
|
||||
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
||||
"ClearCache" = "Clear cache";
|
||||
"ResetSettings" = "重置YTLite設定";
|
||||
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
|
||||
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
|
||||
@@ -195,6 +202,11 @@
|
||||
"Yes" = "是";
|
||||
"No" = "否";
|
||||
|
||||
"SelectAction" = "Select action";
|
||||
"CopyTitle" = "Copy title";
|
||||
"CopyDescription" = "Copy description";
|
||||
"Cancel" = "Cancel";
|
||||
"Copied" = "已複製到剪貼簿";
|
||||
"Saved" = "已儲存到照片應用";
|
||||
"Done" = "Done";
|
||||
"Error" = "發生錯誤";
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user