v2.6
This commit is contained in:
@@ -5,8 +5,8 @@ endif
|
|||||||
DEBUG=0
|
DEBUG=0
|
||||||
FINALPACKAGE=1
|
FINALPACKAGE=1
|
||||||
ARCHS = arm64
|
ARCHS = arm64
|
||||||
PACKAGE_VERSION = 2.5
|
PACKAGE_VERSION = 2.6
|
||||||
TARGET := iphone:clang:latest:11.0
|
TARGET := iphone:clang:latest:13.0
|
||||||
|
|
||||||
include $(THEOS)/makefiles/common.mk
|
include $(THEOS)/makefiles/common.mk
|
||||||
|
|
||||||
|
|||||||
+39
-1
@@ -6,6 +6,23 @@
|
|||||||
|
|
||||||
static const NSInteger YTLiteSection = 789;
|
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
|
// Settings
|
||||||
%hook YTAppSettingsPresentationData
|
%hook YTAppSettingsPresentationData
|
||||||
+ (NSArray *)settingsCategoryOrder {
|
+ (NSArray *)settingsCategoryOrder {
|
||||||
@@ -266,9 +283,11 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
|||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
createSwitchItem(LOC(@"CopyVideoInfo"), LOC(@"CopyVideoInfoDesc"), @"copyVideoInfo", &kCopyVideoInfo, selfObject),
|
||||||
createSwitchItem(LOC(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject),
|
createSwitchItem(LOC(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject),
|
||||||
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
|
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
|
||||||
createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, 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(@"FixAlbums"), LOC(@"FixAlbumsDesc"), @"fixAlbums", &kFixAlbums, selfObject),
|
||||||
createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject),
|
createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject),
|
||||||
createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject),
|
createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject),
|
||||||
@@ -415,6 +434,23 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
|||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]];
|
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) {
|
YTSettingsSectionItem *reset = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
||||||
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
|
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));
|
return @(OS_STRINGIFY(TWEAK_VERSION));
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[ps, miro, lillie, dayanch96, stalker, clement, balackburn, decibelios, 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]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
[sectionItems addObject:paypal];
|
||||||
|
[sectionItems addObject:ghSponsors];
|
||||||
[sectionItems addObject:version];
|
[sectionItems addObject:version];
|
||||||
|
|
||||||
BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)];
|
BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)];
|
||||||
|
|||||||
@@ -110,9 +110,11 @@ BOOL kRemoveShorts;
|
|||||||
BOOL kRemoveSubscriptions;
|
BOOL kRemoveSubscriptions;
|
||||||
BOOL kRemoveUploads;
|
BOOL kRemoveUploads;
|
||||||
BOOL kRemoveLibrary;
|
BOOL kRemoveLibrary;
|
||||||
|
BOOL kCopyVideoInfo;
|
||||||
BOOL kCopyPostText;
|
BOOL kCopyPostText;
|
||||||
BOOL kSavePostImage;
|
BOOL kSavePostImage;
|
||||||
BOOL kSaveProfilePhoto;
|
BOOL kSaveProfilePhoto;
|
||||||
|
BOOL kCopyCommentText;
|
||||||
BOOL kSavePost;
|
BOOL kSavePost;
|
||||||
BOOL kFixAlbums;
|
BOOL kFixAlbums;
|
||||||
BOOL kRemovePlayNext;
|
BOOL kRemovePlayNext;
|
||||||
@@ -137,6 +139,10 @@ int kPivotIndex;
|
|||||||
@interface YTPivotBarView : UIView
|
@interface YTPivotBarView : UIView
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface YTLightweightQTMButton ()
|
||||||
|
@property (nonatomic, assign, readwrite, getter=isShouldRaiseOnTouch) BOOL shouldRaiseOnTouch;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface YTQTMButton ()
|
@interface YTQTMButton ()
|
||||||
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
|
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
|
||||||
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
|
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
|
||||||
@@ -193,7 +199,13 @@ int kPivotIndex;
|
|||||||
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface YTIVideoDetails ()
|
||||||
|
@property (nonatomic, copy, readwrite) NSString *title;
|
||||||
|
@property (nonatomic, copy, readwrite) NSString *shortDescription;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface YTPlayerViewController (YTAFS)
|
@interface YTPlayerViewController (YTAFS)
|
||||||
|
@property (nonatomic, assign, readonly) YTPlayerResponse *playerResponse;
|
||||||
@property (nonatomic, weak, readwrite) UIViewController *parentViewController;
|
@property (nonatomic, weak, readwrite) UIViewController *parentViewController;
|
||||||
@property (readonly, nonatomic) NSString *contentVideoID;
|
@property (readonly, nonatomic) NSString *contentVideoID;
|
||||||
- (void)setActiveCaptionTrack:(id)arg1;
|
- (void)setActiveCaptionTrack:(id)arg1;
|
||||||
@@ -207,6 +219,37 @@ int kPivotIndex;
|
|||||||
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture;
|
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture;
|
||||||
@end
|
@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
|
@interface YTSegmentableInlinePlayerBarView
|
||||||
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
||||||
@end
|
@end
|
||||||
@@ -241,15 +284,32 @@ int kPivotIndex;
|
|||||||
@interface YTELMView : UIView
|
@interface YTELMView : UIView
|
||||||
@end
|
@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;
|
@property (atomic, copy, readwrite) NSURL *URL;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface ASTextNode : ASDisplayNode
|
||||||
|
@property (atomic, copy, readwrite) NSAttributedString *attributedText;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface _ASDisplayView : UIView
|
@interface _ASDisplayView : UIView
|
||||||
@property (nonatomic, strong, readwrite) ASNetworkImageNode *keepalive_node;
|
@property (nonatomic, strong, readwrite) ASDisplayNode *keepalive_node;
|
||||||
- (void)copyText:(UILongPressGestureRecognizer *)sender;
|
- (void)copyText:(UILongPressGestureRecognizer *)sender;
|
||||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender;
|
- (void)saveImage:(UILongPressGestureRecognizer *)sender;
|
||||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
|
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
|
||||||
|
- (void)copyComment:(UILongPressGestureRecognizer *)sender;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface MLHAMQueuePlayer : NSObject
|
@interface MLHAMQueuePlayer : NSObject
|
||||||
|
|||||||
@@ -280,8 +280,7 @@
|
|||||||
%hook YTVideoQualitySwitchControllerFactory
|
%hook YTVideoQualitySwitchControllerFactory
|
||||||
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
||||||
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
||||||
if (kClassicQuality) return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
return kClassicQuality && originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
||||||
return %orig;
|
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
@@ -638,27 +637,43 @@ static BOOL isOverlayShown = YES;
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
%hook ELMContainerNode
|
||||||
|
%property (nonatomic, strong) NSString *copiedComment;
|
||||||
|
%end
|
||||||
|
|
||||||
%hook _ASDisplayView
|
%hook _ASDisplayView
|
||||||
- (void)setKeepalive_node:(id)arg1 {
|
- (void)setKeepalive_node:(id)arg1 {
|
||||||
%orig;
|
%orig;
|
||||||
|
|
||||||
NSString *description = [self description];
|
NSArray *gesturesInfo = @[
|
||||||
if (kCopyPostText && [description containsString:@"ELMExpandableTextNode-View"]) {
|
@{@"selector": @"copyText:", @"text": @"ELMExpandableTextNode-View", @"key": @(kCopyPostText)},
|
||||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(copyText:)];
|
@{@"selector": @"saveImage:", @"text": @"YTImageZoomNode-View", @"key": @(kSavePostImage)},
|
||||||
longPress.minimumPressDuration = 0.3;
|
@{@"selector": @"savePFP:", @"text": @"ELMImageNode-View", @"key": @(kSaveProfilePhoto)},
|
||||||
[self addGestureRecognizer:longPress];
|
@{@"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"]) {
|
if ([[self description] containsString:@"id.comment.content.label"]) {
|
||||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(saveImage:)];
|
ASTextNode *textNode = (ASTextNode *)self.keepalive_node;
|
||||||
longPress.minimumPressDuration = 0.3;
|
ASDisplayNode *displayNode = (ASDisplayNode *)self.keepalive_node;
|
||||||
[self addGestureRecognizer:longPress];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kSaveProfilePhoto && [description containsString:@"ELMImageNode-View"] && [description containsString:@"eml.avatar"]) {
|
NSMutableArray *allObjects = displayNode.supernodes.allObjects;
|
||||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(savePFP:)];
|
for (ELMContainerNode *containerNode in allObjects) {
|
||||||
longPress.minimumPressDuration = 0.3;
|
if ([containerNode.description containsString:@"id.ui.comment_cell"]) {
|
||||||
[self addGestureRecognizer:longPress];
|
containerNode.copiedComment = textNode.attributedText.string;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -666,7 +681,8 @@ static BOOL isOverlayShown = YES;
|
|||||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender {
|
- (void)savePFP:(UILongPressGestureRecognizer *)sender {
|
||||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||||
|
|
||||||
NSString *URLString = self.keepalive_node.URL.absoluteString;
|
ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node;
|
||||||
|
NSString *URLString = imageNode.URL.absoluteString;
|
||||||
if (URLString) {
|
if (URLString) {
|
||||||
NSRange sizeRange = [URLString rangeOfString:@"=s"];
|
NSRange sizeRange = [URLString rangeOfString:@"=s"];
|
||||||
if (sizeRange.location != NSNotFound) {
|
if (sizeRange.location != NSNotFound) {
|
||||||
@@ -692,8 +708,7 @@ static BOOL isOverlayShown = YES;
|
|||||||
%new
|
%new
|
||||||
- (void)copyText:(UILongPressGestureRecognizer *)sender {
|
- (void)copyText:(UILongPressGestureRecognizer *)sender {
|
||||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
[UIPasteboard generalPasteboard].string = self.accessibilityLabel;
|
||||||
pasteboard.string = self.accessibilityLabel;
|
|
||||||
|
|
||||||
UIResponder *responder = self.nextResponder;
|
UIResponder *responder = self.nextResponder;
|
||||||
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
||||||
@@ -705,7 +720,8 @@ static BOOL isOverlayShown = YES;
|
|||||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender {
|
- (void)saveImage:(UILongPressGestureRecognizer *)sender {
|
||||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||||
|
|
||||||
NSURL *imageURL = self.keepalive_node.URL;
|
ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node;
|
||||||
|
NSURL *imageURL = imageNode.URL;
|
||||||
if (imageURL) {
|
if (imageURL) {
|
||||||
NSString *URLString = imageURL.absoluteString;
|
NSString *URLString = imageURL.absoluteString;
|
||||||
|
|
||||||
@@ -734,7 +750,7 @@ static BOOL isOverlayShown = YES;
|
|||||||
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
|
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
|
||||||
[request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil];
|
[request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil];
|
||||||
} completionHandler:^(BOOL success, NSError *error) {
|
} completionHandler:^(BOOL success, NSError *error) {
|
||||||
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
||||||
}];
|
}];
|
||||||
} else {
|
} else {
|
||||||
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
||||||
@@ -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
|
%end
|
||||||
|
|
||||||
// Remove Tabs
|
// Remove Tabs
|
||||||
@@ -847,6 +875,8 @@ BOOL isTabSelected = NO;
|
|||||||
- (void)viewDidAppear:(BOOL)animated {
|
- (void)viewDidAppear:(BOOL)animated {
|
||||||
%orig;
|
%orig;
|
||||||
|
|
||||||
|
isOverlayShown = YES;
|
||||||
|
|
||||||
if (kShortsOnlyMode) {
|
if (kShortsOnlyMode) {
|
||||||
[self.navigationController.parentViewController hidePivotBar];
|
[self.navigationController.parentViewController hidePivotBar];
|
||||||
}
|
}
|
||||||
@@ -854,7 +884,7 @@ BOOL isTabSelected = NO;
|
|||||||
%end
|
%end
|
||||||
|
|
||||||
%hook YTAppViewController
|
%hook YTAppViewController
|
||||||
- (void)showPivotBar { if (!kShortsOnlyMode) %orig;} ;
|
- (void)showPivotBar { if (!kShortsOnlyMode) %orig; }
|
||||||
%end
|
%end
|
||||||
|
|
||||||
%hook YTReelWatchRootViewController
|
%hook YTReelWatchRootViewController
|
||||||
@@ -867,6 +897,58 @@ BOOL isTabSelected = NO;
|
|||||||
}
|
}
|
||||||
%end
|
%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
|
// Disable Right-To-Left Formatting
|
||||||
%hook NSParagraphStyle
|
%hook NSParagraphStyle
|
||||||
+ (NSWritingDirection)defaultWritingDirectionForLanguage:(id)lang { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; }
|
+ (NSWritingDirection)defaultWritingDirectionForLanguage:(id)lang { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; }
|
||||||
@@ -973,9 +1055,11 @@ static void reloadPrefs() {
|
|||||||
kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO;
|
kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO;
|
||||||
kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES;
|
kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES;
|
||||||
kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO;
|
kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO;
|
||||||
|
kCopyVideoInfo = [prefs[@"copyVideoInfo"] boolValue] ?: NO;
|
||||||
kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO;
|
kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO;
|
||||||
kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO;
|
kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO;
|
||||||
kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO;
|
kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO;
|
||||||
|
kCopyCommentText = [prefs[@"copyCommentText"] boolValue] ?: NO;
|
||||||
kFixAlbums = [prefs[@"fixAlbums"] boolValue] ?: NO;
|
kFixAlbums = [prefs[@"fixAlbums"] boolValue] ?: NO;
|
||||||
kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO;
|
kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO;
|
||||||
kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO;
|
kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO;
|
||||||
@@ -1057,9 +1141,11 @@ static void reloadPrefs() {
|
|||||||
@"removeSubscriptions" : @(kRemoveSubscriptions),
|
@"removeSubscriptions" : @(kRemoveSubscriptions),
|
||||||
@"removeUploads" : @(kRemoveUploads),
|
@"removeUploads" : @(kRemoveUploads),
|
||||||
@"removeLibrary" : @(kRemoveLibrary),
|
@"removeLibrary" : @(kRemoveLibrary),
|
||||||
|
@"copyVideoInfo" : @(kCopyVideoInfo),
|
||||||
@"copyPostText" : @(kCopyPostText),
|
@"copyPostText" : @(kCopyPostText),
|
||||||
@"savePostImage" : @(kSavePostImage),
|
@"savePostImage" : @(kSavePostImage),
|
||||||
@"saveProfilePhoto" : @(kSaveProfilePhoto),
|
@"saveProfilePhoto" : @(kSaveProfilePhoto),
|
||||||
|
@"copyCommentText" : @(kCopyCommentText),
|
||||||
@"fixAlbums" : @(kFixAlbums),
|
@"fixAlbums" : @(kFixAlbums),
|
||||||
@"removePlayNext" : @(kRemovePlayNext),
|
@"removePlayNext" : @(kRemovePlayNext),
|
||||||
@"noContinueWatching" : @(kNoContinueWatching),
|
@"noContinueWatching" : @(kNoContinueWatching),
|
||||||
|
|||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description.";
|
"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description.";
|
||||||
|
|
||||||
"Other" = "Other";
|
"Other" = "Other";
|
||||||
|
"CopyVideoInfo" = "Copy video information";
|
||||||
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
"CopyPostText" = "Copy community posts text";
|
"CopyPostText" = "Copy community posts text";
|
||||||
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
||||||
"SavePostImage" = "Save image from community posts";
|
"SavePostImage" = "Save image from community posts";
|
||||||
"SavePostImageDesc" = "Saves community post image to the Photos app by long tap.";
|
"SavePostImageDesc" = "Saves community post image to the Photos app by long tap.";
|
||||||
"SaveProfilePhoto" = "Save profile picture";
|
"SaveProfilePhoto" = "Save profile picture";
|
||||||
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
"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";
|
"FixAlbums" = "Fix covers";
|
||||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
||||||
"RemovePlayNext" = "Remove \"Play next in queue\"";
|
"RemovePlayNext" = "Remove \"Play next in queue\"";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "Warning";
|
"Warning" = "Warning";
|
||||||
"TabIsHidden" = "Hidden tab cannot be selected as startup page";
|
"TabIsHidden" = "Hidden tab cannot be selected as startup page";
|
||||||
|
|
||||||
|
"DonateViaPayPal" = "Donate via PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||||
"Version" = "Version";
|
"Version" = "Version";
|
||||||
"About" = "About";
|
"About" = "About";
|
||||||
"Credits" = "Credits";
|
"Credits" = "Credits";
|
||||||
@@ -188,6 +194,7 @@
|
|||||||
"Japanese" = "Japanese localization";
|
"Japanese" = "Japanese localization";
|
||||||
"Advanced" = "Advanced mode";
|
"Advanced" = "Advanced mode";
|
||||||
"AdvancedModeReminder" = "Would you like to activate Advanced mode for YTLite?\n\nThis mode provides more than 50 additional options to customize and optimize your YouTube experience. You can enable/disable it later from Settings → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "Would you like to activate Advanced mode for YTLite?\n\nThis mode provides more than 50 additional options to customize and optimize your YouTube experience. You can enable/disable it later from Settings → %@ → %@ → %@.";
|
||||||
|
"ClearCache" = "Clear cache";
|
||||||
"ResetSettings" = "Reset YTLite settings";
|
"ResetSettings" = "Reset YTLite settings";
|
||||||
"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?";
|
"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?";
|
||||||
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
|
"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";
|
"Yes" = "Yes";
|
||||||
"No" = "No";
|
"No" = "No";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"Cancel" = "Cancel";
|
||||||
"Copied" = "Copied to clipboard";
|
"Copied" = "Copied to clipboard";
|
||||||
"Saved" = "Saved to Photos";
|
"Saved" = "Saved to Photos";
|
||||||
|
"Done" = "Done";
|
||||||
"Error" = "Error";
|
"Error" = "Error";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts.";
|
"HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts.";
|
||||||
|
|
||||||
"Other" = "Otro";
|
"Other" = "Otro";
|
||||||
|
"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";
|
"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";
|
"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";
|
"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";
|
"SavePostImageDesc" = "Guarda la imagen de las publicaciones de la comunidad en la aplicación Fotos con un toque prolongado";
|
||||||
"SaveProfilePhoto" = "Guardar foto de perfil";
|
"SaveProfilePhoto" = "Guardar foto de perfil";
|
||||||
"SaveProfilePhotoDesc" = "Guarda la imagen de perfil en la aplicación Fotos con un toque prolongado";
|
"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";
|
"FixAlbums" = "Arreglar portadas";
|
||||||
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
|
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
|
||||||
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
|
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "Advertencia";
|
"Warning" = "Advertencia";
|
||||||
"TabIsHidden" = "No se puede seleccionar una pestaña oculta como página de inicio";
|
"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";
|
"Version" = "Versión";
|
||||||
"About" = "Acerca de";
|
"About" = "Acerca de";
|
||||||
"Credits" = "Créditos";
|
"Credits" = "Créditos";
|
||||||
@@ -188,13 +194,19 @@
|
|||||||
"Japanese" = "Traducción: Japonés";
|
"Japanese" = "Traducción: Japonés";
|
||||||
"Advanced" = "Modo avanzado";
|
"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 → %@ → %@ → %@.";
|
"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";
|
"ResetSettings" = "Restablecer configuración de YTLite";
|
||||||
"ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?";
|
"ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?";
|
||||||
"ShortsOnlyWarning" = "¿Estás seguro de que quieres activar este modo?\n\nEn este modo, sólo podrás ver Shorts y no podrás hacer nada más.\n\nPuedes desactivar el modo sólo Shorts realizando una pulsación larga con dos dedos en el reproductor de Shorts."
|
"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";
|
"ShortsModeTurnedOff" = "Se ha desactivado el modo de sólo Shorts";
|
||||||
"Yes" = "Sí";
|
"Yes" = "Sí";
|
||||||
"No" = "No";
|
"No" = "No";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"Cancel" = "Cancel";
|
||||||
"Copied" = "Copiado al portapapeles";
|
"Copied" = "Copiado al portapapeles";
|
||||||
|
"Done" = "Done";
|
||||||
"Saved" = "Guardado en Fotos";
|
"Saved" = "Guardado en Fotos";
|
||||||
"Error" = "Error";
|
"Error" = "Error";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts.";
|
"HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts.";
|
||||||
|
|
||||||
"Other" = "Autre";
|
"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é";
|
"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.";
|
"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é";
|
"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.";
|
"SavePostImageDesc" = "Enregistre l'image des publications de la communauté dans l'application Photos en appuyant longuement.";
|
||||||
"SaveProfilePhoto" = "Enregistrer la photo de profil";
|
"SaveProfilePhoto" = "Enregistrer la photo de profil";
|
||||||
"SaveProfilePhotoDesc" = "Enregistre la photo de profil dans l'application Photos en appuyant longuement.";
|
"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";
|
"FixAlbums" = "Réparer les couvertures";
|
||||||
"FixAlbumsDesc" = "Répare l'affichage des couvertures pour les utilisateurs de Russie.";
|
"FixAlbumsDesc" = "Répare l'affichage des couvertures pour les utilisateurs de Russie.";
|
||||||
"RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\"";
|
"RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\"";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "Avertissement";
|
"Warning" = "Avertissement";
|
||||||
"TabIsHidden" = "L'onglet masqué ne peut pas être sélectionné comme page de démarrage";
|
"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";
|
"Version" = "Version";
|
||||||
"About" = "À propos";
|
"About" = "À propos";
|
||||||
"Credits" = "Crédits";
|
"Credits" = "Crédits";
|
||||||
@@ -188,6 +194,7 @@
|
|||||||
"Japanese" = "Localisation japonaise";
|
"Japanese" = "Localisation japonaise";
|
||||||
"Advanced" = "Mode avancé";
|
"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 → %@ → %@ → %@.";
|
"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";
|
"ResetSettings" = "Réinitialiser les paramètres YTLite";
|
||||||
"ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?";
|
"ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?";
|
||||||
"ShortsOnlyWarning" = "Êtes-vous sûr de vouloir activer ce mode?\n\nDans ce mode, vous ne pourrez regarder que des vidéos Shorts et vous ne pourrez rien d'autre faire.\n\nVous pouvez désactiver le mode Shorts Only en appuyant longuement avec deux doigts dans le lecteur Shorts.";
|
"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";
|
"Yes" = "Oui";
|
||||||
"No" = "Non";
|
"No" = "Non";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"Cancel" = "Cancel";
|
||||||
"Copied" = "Copié dans le presse-papiers";
|
"Copied" = "Copié dans le presse-papiers";
|
||||||
"Saved" = "Enregistré dans Photos";
|
"Saved" = "Enregistré dans Photos";
|
||||||
|
"Done" = "Done";
|
||||||
"Error" = "Erreur";
|
"Error" = "Erreur";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
||||||
|
|
||||||
"Other" = "その他";
|
"Other" = "その他";
|
||||||
|
"CopyVideoInfo" = "Copy video information";
|
||||||
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
"CopyPostText" = "Copy community posts text";
|
"CopyPostText" = "Copy community posts text";
|
||||||
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
||||||
"SavePostImage" = "Save community posts image";
|
"SavePostImage" = "Save community posts image";
|
||||||
"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap.";
|
"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap.";
|
||||||
"SaveProfilePhoto" = "Save profile picture";
|
"SaveProfilePhoto" = "Save profile picture";
|
||||||
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
"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";
|
"FixAlbums" = "Fix covers";
|
||||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
||||||
"RemovePlayNext" = "\"次に再生\"を削除";
|
"RemovePlayNext" = "\"次に再生\"を削除";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "警告";
|
"Warning" = "警告";
|
||||||
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
|
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
|
||||||
|
|
||||||
|
"DonateViaPayPal" = "Donate via PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||||
"Version" = "バージョン";
|
"Version" = "バージョン";
|
||||||
"About" = "About";
|
"About" = "About";
|
||||||
"Credits" = "クレジット";
|
"Credits" = "クレジット";
|
||||||
@@ -188,6 +194,7 @@
|
|||||||
"Japanese" = "日本語翻訳";
|
"Japanese" = "日本語翻訳";
|
||||||
"Advanced" = "アドバンスモード";
|
"Advanced" = "アドバンスモード";
|
||||||
"AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます";
|
"AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます";
|
||||||
|
"ClearCache" = "Clear cache";
|
||||||
"ResetSettings" = "YTLiteの設定をリセット";
|
"ResetSettings" = "YTLiteの設定をリセット";
|
||||||
"ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、アプリが終了します。\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.";
|
"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";
|
"Copied" = "Copied to clipboard";
|
||||||
"Saved" = "Saved to Photos";
|
"Saved" = "Saved to Photos";
|
||||||
|
"Done" = "Done";
|
||||||
"Error" = "Error";
|
"Error" = "Error";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера.";
|
"HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера.";
|
||||||
|
|
||||||
"Other" = "Другие настройки";
|
"Other" = "Другие настройки";
|
||||||
|
"CopyVideoInfo" = "Копировать информацию о видео";
|
||||||
|
"CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео.";
|
||||||
"CopyPostText" = "Копировать текст постов";
|
"CopyPostText" = "Копировать текст постов";
|
||||||
"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием.";
|
"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием.";
|
||||||
"SavePostImage" = "Сохранять изображения постов";
|
"SavePostImage" = "Сохранять изображения постов";
|
||||||
"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним.";
|
"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним.";
|
||||||
"SaveProfilePhoto" = "Сохранять фото профиля";
|
"SaveProfilePhoto" = "Сохранять фото профиля";
|
||||||
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
|
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
|
||||||
|
"CopyCommentText" = "Копировать текст комментариев";
|
||||||
|
"CopyCommentTextDesc" = "Копирует текст комментариев в буфер обмена долгим нажатием.";
|
||||||
"FixAlbums" = "Исправить отображение обложек";
|
"FixAlbums" = "Исправить отображение обложек";
|
||||||
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
|
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
|
||||||
"RemovePlayNext" = "Убрать «Добавить в начало очереди»";
|
"RemovePlayNext" = "Убрать «Добавить в начало очереди»";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "Внимание";
|
"Warning" = "Внимание";
|
||||||
"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы";
|
"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы";
|
||||||
|
|
||||||
|
"DonateViaPayPal" = "Задонатить на PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Поддержать разработку в Github Sponsors";
|
||||||
"Version" = "Версия";
|
"Version" = "Версия";
|
||||||
"About" = "О твике";
|
"About" = "О твике";
|
||||||
"Credits" = "Авторы";
|
"Credits" = "Авторы";
|
||||||
@@ -188,6 +194,7 @@
|
|||||||
"Japanese" = "Японская локализация";
|
"Japanese" = "Японская локализация";
|
||||||
"Advanced" = "Расширенный режим";
|
"Advanced" = "Расширенный режим";
|
||||||
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
|
||||||
|
"ClearCache" = "Очистить кеш";
|
||||||
"ResetSettings" = "Сбросить настройки твика";
|
"ResetSettings" = "Сбросить настройки твика";
|
||||||
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
|
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
|
||||||
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
|
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
|
||||||
@@ -195,6 +202,11 @@
|
|||||||
"Yes" = "Да";
|
"Yes" = "Да";
|
||||||
"No" = "Нет";
|
"No" = "Нет";
|
||||||
|
|
||||||
|
"SelectAction" = "Выберите действие";
|
||||||
|
"CopyTitle" = "Скопировать название";
|
||||||
|
"CopyDescription" = "Скопировать описание";
|
||||||
|
"Cancel" = "Отмена";
|
||||||
"Copied" = "Скопировано в буфер обмена";
|
"Copied" = "Скопировано в буфер обмена";
|
||||||
"Saved" = "Сохранено в Фото";
|
"Saved" = "Сохранено в Фото";
|
||||||
|
"Done" = "Готово";
|
||||||
"Error" = "Ошибка";
|
"Error" = "Ошибка";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
|
"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
|
||||||
|
|
||||||
"Other" = "其他";
|
"Other" = "其他";
|
||||||
|
"CopyVideoInfo" = "Copy video information";
|
||||||
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
"CopyPostText" = "复制社区帖子文本";
|
"CopyPostText" = "复制社区帖子文本";
|
||||||
"CopyPostTextDesc" = "长按社区帖子文本复制到剪贴板。";
|
"CopyPostTextDesc" = "长按社区帖子文本复制到剪贴板。";
|
||||||
"SavePostImage" = "保存社区帖子图片";
|
"SavePostImage" = "保存社区帖子图片";
|
||||||
"SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。";
|
"SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。";
|
||||||
"SaveProfilePhoto" = "保存个人资料图片";
|
"SaveProfilePhoto" = "保存个人资料图片";
|
||||||
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
|
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
|
||||||
|
"CopyCommentText" = "Copy comments text";
|
||||||
|
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||||
"FixAlbums" = "修复封面";
|
"FixAlbums" = "修复封面";
|
||||||
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
|
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
|
||||||
"RemovePlayNext" = "删除“播放队列中的下一个”";
|
"RemovePlayNext" = "删除“播放队列中的下一个”";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "警告";
|
"Warning" = "警告";
|
||||||
"TabIsHidden" = "无法选择隐藏选项卡作为启动页。";
|
"TabIsHidden" = "无法选择隐藏选项卡作为启动页。";
|
||||||
|
|
||||||
|
"DonateViaPayPal" = "Donate via PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||||
"Version" = "版本";
|
"Version" = "版本";
|
||||||
"About" = "关于";
|
"About" = "关于";
|
||||||
"Credits" = "信息";
|
"Credits" = "信息";
|
||||||
@@ -188,6 +194,7 @@
|
|||||||
"Japanese" = "日语本地化";
|
"Japanese" = "日语本地化";
|
||||||
"Advanced" = "高级模式";
|
"Advanced" = "高级模式";
|
||||||
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
||||||
|
"ClearCache" = "Clear cache";
|
||||||
"ResetSettings" = "重置YTLite设置";
|
"ResetSettings" = "重置YTLite设置";
|
||||||
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
|
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
|
||||||
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
|
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
|
||||||
@@ -195,6 +202,11 @@
|
|||||||
"Yes" = "是";
|
"Yes" = "是";
|
||||||
"No" = "不";
|
"No" = "不";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"Cancel" = "Cancel";
|
||||||
"Copied" = "已复制到剪贴板";
|
"Copied" = "已复制到剪贴板";
|
||||||
"Saved" = "已保存到照片";
|
"Saved" = "已保存到照片";
|
||||||
"Error" = "错误";
|
"Done" = "Done";
|
||||||
|
"Error" = "错误";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
|
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
|
||||||
|
|
||||||
"Other" = "其它";
|
"Other" = "其它";
|
||||||
|
"CopyVideoInfo" = "Copy video information";
|
||||||
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
"CopyPostText" = "複製社群貼文文字";
|
"CopyPostText" = "複製社群貼文文字";
|
||||||
"CopyPostTextDesc" = "長按社群貼文文字複製到剪貼簿";
|
"CopyPostTextDesc" = "長按社群貼文文字複製到剪貼簿";
|
||||||
"SavePostImage" = "儲存社群貼文圖片";
|
"SavePostImage" = "儲存社群貼文圖片";
|
||||||
"SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用";
|
"SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用";
|
||||||
"SaveProfilePhoto" = "儲存個人檔案照片";
|
"SaveProfilePhoto" = "儲存個人檔案照片";
|
||||||
"SaveProfilePhotoDesc" = "長按個人檔案照片儲存到照片應用";
|
"SaveProfilePhotoDesc" = "長按個人檔案照片儲存到照片應用";
|
||||||
|
"CopyCommentText" = "Copy comments text";
|
||||||
|
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
||||||
"FixAlbums" = "修復封面";
|
"FixAlbums" = "修復封面";
|
||||||
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
|
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
|
||||||
"RemovePlayNext" = "移除「播放下一個」";
|
"RemovePlayNext" = "移除「播放下一個」";
|
||||||
@@ -177,6 +181,8 @@
|
|||||||
"Warning" = "警告";
|
"Warning" = "警告";
|
||||||
"TabIsHidden" = "無法將隱藏的標籤選為啟動頁面";
|
"TabIsHidden" = "無法將隱藏的標籤選為啟動頁面";
|
||||||
|
|
||||||
|
"DonateViaPayPal" = "Donate via PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
||||||
"Version" = "版本";
|
"Version" = "版本";
|
||||||
"About" = "關於";
|
"About" = "關於";
|
||||||
"Credits" = "貢獻";
|
"Credits" = "貢獻";
|
||||||
@@ -188,6 +194,7 @@
|
|||||||
"Japanese" = "日本語本地化";
|
"Japanese" = "日本語本地化";
|
||||||
"Advanced" = "進階模式";
|
"Advanced" = "進階模式";
|
||||||
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
||||||
|
"ClearCache" = "Clear cache";
|
||||||
"ResetSettings" = "重置YTLite設定";
|
"ResetSettings" = "重置YTLite設定";
|
||||||
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
|
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
|
||||||
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
|
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
|
||||||
@@ -195,6 +202,11 @@
|
|||||||
"Yes" = "是";
|
"Yes" = "是";
|
||||||
"No" = "否";
|
"No" = "否";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"Cancel" = "Cancel";
|
||||||
"Copied" = "已複製到剪貼簿";
|
"Copied" = "已複製到剪貼簿";
|
||||||
"Saved" = "已儲存到照片應用";
|
"Saved" = "已儲存到照片應用";
|
||||||
|
"Done" = "Done";
|
||||||
"Error" = "發生錯誤";
|
"Error" = "發生錯誤";
|
||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user