Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a43e1b9b3 | ||
|
|
f7d567bf5d | ||
|
|
4921d95073 | ||
|
|
87cdca4867 | ||
|
|
f96d397f3b | ||
|
|
74baf844be | ||
|
|
df95227b88 | ||
|
|
66e7e35798 | ||
|
|
3e67c85de9 | ||
|
|
dae1714bcc | ||
|
|
343f40dac3 | ||
|
|
7eafc3de7d | ||
|
|
33b0125e9b | ||
|
|
9d8f74c8cb | ||
|
|
6bb405092d | ||
|
|
8da024261d | ||
|
|
a2771e7d52 | ||
|
|
e3b1507e7a | ||
|
|
d4bc6a5859 | ||
|
|
256c9f54cd |
@@ -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.2
|
||||||
TARGET := iphone:clang:latest:11.0
|
TARGET := iphone:clang:latest:13.0
|
||||||
|
|
||||||
include $(THEOS)/makefiles/common.mk
|
include $(THEOS)/makefiles/common.mk
|
||||||
|
|
||||||
|
|||||||
+44
-2
@@ -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(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject),
|
createSwitchItem(LOC(@"CopyVideoInfo"), LOC(@"CopyVideoInfoDesc"), @"copyVideoInfo", &kCopyVideoInfo, selfObject),
|
||||||
|
createSwitchItem(LOC(@"PostManager"), LOC(@"PostManagerDesc"), @"postManager", &kPostManager, selfObject),
|
||||||
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
|
createSwitchItem(LOC(@"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),
|
||||||
@@ -411,10 +430,31 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
|||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/SKEIDs"]];
|
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/SKEIDs"]];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *hiepvk = [%c(YTSettingsSectionItem) itemWithTitle:@"Hiepvk" titleDescription:LOC(@"Vietnamese") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/hiepvk"]];
|
||||||
|
}];
|
||||||
|
|
||||||
YTSettingsSectionItem *dayanch96 = [%c(YTSettingsSectionItem) itemWithTitle:@"Dayanch96" titleDescription:LOC(@"Developer") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
YTSettingsSectionItem *dayanch96 = [%c(YTSettingsSectionItem) itemWithTitle:@"Dayanch96" titleDescription:LOC(@"Developer") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]];
|
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *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 +478,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, hiepvk, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), cache, reset];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
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 kCopyPostText;
|
BOOL kCopyVideoInfo;
|
||||||
|
BOOL kPostManager;
|
||||||
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,39 @@ 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 (nonatomic, assign, readonly) UIViewController *closestViewController;
|
||||||
|
@property (atomic, assign, readonly) ASNodeAncestryEnumerator *supernodes;
|
||||||
|
@property (atomic, copy, readwrite) NSArray *yogaChildren;
|
||||||
|
@property (atomic) CALayer *layer;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ELMContainerNode : ASDisplayNode
|
||||||
|
@property (nonatomic, strong, readwrite) NSString *copiedComment;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ELMExpandableTextNode : ASDisplayNode
|
||||||
|
@property (atomic, assign, readonly) ASDisplayNode *currentTextNode;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ASNetworkImageNode : ASDisplayNode
|
||||||
@property (atomic, copy, readwrite) NSURL *URL;
|
@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)postManager:(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,111 @@ static BOOL isOverlayShown = YES;
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
%hook ELMContainerNode
|
||||||
|
%property (nonatomic, strong) NSString *copiedComment;
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASDisplayNode
|
||||||
|
- (void)didLoad {
|
||||||
|
%orig;
|
||||||
|
|
||||||
|
if (kCopyCommentText && [[self valueForKey:@"_accessibilityIdentifier"] isEqualToString:@"id.comment.content.label"]) {
|
||||||
|
ASTextNode *textNode = (ASTextNode *)self;
|
||||||
|
NSString *comment = textNode.attributedText.string;
|
||||||
|
|
||||||
|
NSMutableArray *allObjects = self.supernodes.allObjects;
|
||||||
|
for (ELMContainerNode *containerNode in allObjects) {
|
||||||
|
if ([containerNode.description containsString:@"id.ui.comment_cell"] && comment) {
|
||||||
|
containerNode.copiedComment = comment;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kPostManager && [self isKindOfClass:NSClassFromString(@"ELMExpandableTextNode")]) {
|
||||||
|
ELMExpandableTextNode *expandableTextNode = (ELMExpandableTextNode *)self;
|
||||||
|
ASTextNode *textNode = (ASTextNode *)expandableTextNode.currentTextNode;
|
||||||
|
|
||||||
|
NSString *text = textNode.attributedText.string;
|
||||||
|
|
||||||
|
NSMutableArray *allObjects = self.supernodes.allObjects;
|
||||||
|
for (ELMContainerNode *containerNode in allObjects) {
|
||||||
|
if ([containerNode.description containsString:@"id.ui.backstage.original_post"] && text) {
|
||||||
|
containerNode.copiedComment = text;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
static void downloadImageFromURL(UIResponder *responder, NSURL *URL) {
|
||||||
|
NSString *URLString = URL.absoluteString;
|
||||||
|
|
||||||
|
if (kFixAlbums && [URLString hasPrefix:@"https://yt3."]) {
|
||||||
|
URLString = [URLString stringByReplacingOccurrencesOfString:@"https://yt3." withString:@"https://yt4."];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSURL *downloadURL = nil;
|
||||||
|
if ([URLString containsString:@"c-fcrop"]) {
|
||||||
|
NSRange croppedURL = [URLString rangeOfString:@"c-fcrop"];
|
||||||
|
if (croppedURL.location != NSNotFound) {
|
||||||
|
NSString *newURL = [URLString stringByReplacingOccurrencesOfString:[URLString substringFromIndex:croppedURL.location] withString:@"nd-v1"];
|
||||||
|
downloadURL = [NSURL URLWithString:newURL];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
downloadURL = URL;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSURLSession *session = [NSURLSession sharedSession];
|
||||||
|
[[session dataTaskWithURL:downloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||||
|
if (data) {
|
||||||
|
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
|
||||||
|
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
|
||||||
|
[request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil];
|
||||||
|
} completionHandler:^(BOOL success, NSError *error) {
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
||||||
|
}];
|
||||||
|
} else {
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
||||||
|
}
|
||||||
|
}] resume];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void genImageFromLayer(CALayer *layer, UIColor *backgroundColor, void (^completionHandler)(UIImage *)) {
|
||||||
|
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0.0);
|
||||||
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||||
|
CGContextSetFillColorWithColor(context, backgroundColor.CGColor);
|
||||||
|
CGContextFillRect(context, CGRectMake(0, 0, layer.frame.size.width, layer.frame.size.height));
|
||||||
|
[layer renderInContext:context];
|
||||||
|
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
|
||||||
|
UIGraphicsEndImageContext();
|
||||||
|
|
||||||
|
if (completionHandler) {
|
||||||
|
completionHandler(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
%hook _ASDisplayView
|
%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": @"postManager:", @"text": @"id.ui.backstage.original_post", @"key": @(kPostManager)},
|
||||||
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)}
|
||||||
}
|
];
|
||||||
|
|
||||||
if (kSavePostImage && [description containsString:@"YTImageZoomNode-View"]) {
|
for (NSDictionary *gestureInfo in gesturesInfo) {
|
||||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(saveImage:)];
|
SEL selector = NSSelectorFromString(gestureInfo[@"selector"]);
|
||||||
longPress.minimumPressDuration = 0.3;
|
|
||||||
[self addGestureRecognizer:longPress];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kSaveProfilePhoto && [description containsString:@"ELMImageNode-View"] && [description containsString:@"eml.avatar"]) {
|
if ([gestureInfo[@"key"] boolValue] && [[self description] containsString:gestureInfo[@"text"]]) {
|
||||||
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(savePFP:)];
|
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:selector];
|
||||||
longPress.minimumPressDuration = 0.3;
|
longPress.minimumPressDuration = 0.3;
|
||||||
[self addGestureRecognizer:longPress];
|
[self addGestureRecognizer:longPress];
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -666,7 +749,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) {
|
||||||
@@ -690,14 +774,46 @@ static BOOL isOverlayShown = YES;
|
|||||||
}
|
}
|
||||||
|
|
||||||
%new
|
%new
|
||||||
- (void)copyText:(UILongPressGestureRecognizer *)sender {
|
- (void)postManager:(UILongPressGestureRecognizer *)sender {
|
||||||
if (sender.state == UIGestureRecognizerStateBegan) {
|
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
ELMContainerNode *nodeForLayer = (ELMContainerNode *)self.keepalive_node.yogaChildren[0];
|
||||||
pasteboard.string = self.accessibilityLabel;
|
ELMContainerNode *containerNode = (ELMContainerNode *)self.keepalive_node;
|
||||||
|
NSString *text = containerNode.copiedComment;
|
||||||
|
CALayer *layer = nodeForLayer.layer;
|
||||||
|
UIColor *backgroundColor = containerNode.closestViewController.view.backgroundColor;
|
||||||
|
|
||||||
UIResponder *responder = self.nextResponder;
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:LOC(@"SelectAction") message:nil preferredStyle:UIAlertControllerStyleActionSheet];
|
||||||
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
alertController.view.tintColor = [UIColor labelColor];
|
||||||
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:responder] send];
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyPostText") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
if (text) {
|
||||||
|
[UIPasteboard generalPasteboard].string = text;
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send];
|
||||||
|
}
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"SavePostAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
genImageFromLayer(layer, backgroundColor, ^(UIImage *image) {
|
||||||
|
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
|
||||||
|
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAssetFromImage:image];
|
||||||
|
request.creationDate = [NSDate date];
|
||||||
|
} completionHandler:^(BOOL success, NSError *error) {
|
||||||
|
NSString *message = success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription];
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:message firstResponder:containerNode.closestViewController] send];
|
||||||
|
}];
|
||||||
|
});
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyPostAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
genImageFromLayer(layer, backgroundColor, ^(UIImage *image) {
|
||||||
|
[UIPasteboard generalPasteboard].image = image;
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send];
|
||||||
|
});
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"Cancel") style:UIAlertActionStyleCancel handler:nil]];
|
||||||
|
|
||||||
|
[containerNode.closestViewController presentViewController:alertController animated:YES completion:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -705,41 +821,28 @@ 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;
|
||||||
if (imageURL) {
|
NSURL *imageURL = imageNode.URL;
|
||||||
NSString *URLString = imageURL.absoluteString;
|
|
||||||
|
|
||||||
if (kFixAlbums && [URLString hasPrefix:@"https://yt3."]) {
|
|
||||||
URLString = [URLString stringByReplacingOccurrencesOfString:@"https://yt3." withString:@"https://yt4."];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSURL *downloadURL = nil;
|
|
||||||
if ([URLString containsString:@"c-fcrop"]) {
|
|
||||||
NSRange croppedURL = [URLString rangeOfString:@"c-fcrop"];
|
|
||||||
if (croppedURL.location != NSNotFound) {
|
|
||||||
NSString *newURL = [URLString stringByReplacingOccurrencesOfString:[URLString substringFromIndex:croppedURL.location] withString:@"nd-v1"];
|
|
||||||
downloadURL = [NSURL URLWithString:newURL];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
downloadURL = imageURL;
|
|
||||||
}
|
|
||||||
|
|
||||||
UIResponder *responder = self.nextResponder;
|
UIResponder *responder = self.nextResponder;
|
||||||
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
||||||
|
|
||||||
NSURLSession *session = [NSURLSession sharedSession];
|
if (imageURL) downloadImageFromURL(responder, imageURL);
|
||||||
[[session dataTaskWithURL:downloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
|
||||||
if (data) {
|
|
||||||
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
|
|
||||||
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
|
|
||||||
[request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil];
|
|
||||||
} completionHandler:^(BOOL success, NSError *error) {
|
|
||||||
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
|
||||||
}];
|
|
||||||
} else {
|
|
||||||
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send];
|
|
||||||
}
|
}
|
||||||
}] resume];
|
}
|
||||||
|
|
||||||
|
%new
|
||||||
|
- (void)copyComment:(UILongPressGestureRecognizer *)sender {
|
||||||
|
if (sender.state == UIGestureRecognizerStateBegan) {
|
||||||
|
ELMContainerNode *containerNode = (ELMContainerNode *)self.keepalive_node;
|
||||||
|
NSString *comment = containerNode.copiedComment;
|
||||||
|
|
||||||
|
if (comment) {
|
||||||
|
[UIPasteboard generalPasteboard].string = comment;
|
||||||
|
|
||||||
|
UIResponder *responder = self.nextResponder;
|
||||||
|
while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder;
|
||||||
|
if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:responder] send];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -847,6 +950,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 +959,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 +972,58 @@ BOOL isTabSelected = NO;
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
%hook YTEngagementPanelView
|
||||||
|
- (void)layoutSubviews {
|
||||||
|
%orig;
|
||||||
|
|
||||||
|
if (kCopyVideoInfo && [self.panelIdentifier.identifierString isEqualToString:@"video-description-ep-identifier"]) {
|
||||||
|
YTQTMButton *copyInfoButton = [%c(YTQTMButton) iconButton];
|
||||||
|
copyInfoButton.accessibilityLabel = LOC(@"CopyVideoInfo");
|
||||||
|
[copyInfoButton setTag:999];
|
||||||
|
[copyInfoButton enableNewTouchFeedback];
|
||||||
|
[copyInfoButton setImage:[UIImage imageNamed:@"yt_outline_copy_24pt" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil] forState:UIControlStateNormal];
|
||||||
|
[copyInfoButton setTintColor:[UIColor labelColor]];
|
||||||
|
[copyInfoButton setTranslatesAutoresizingMaskIntoConstraints:false];
|
||||||
|
[copyInfoButton addTarget:self action:@selector(didTapCopyInfoButton:) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
|
||||||
|
if (self.headerView && ![self.headerView viewWithTag:999]) {
|
||||||
|
[self.headerView addSubview:copyInfoButton];
|
||||||
|
|
||||||
|
[NSLayoutConstraint activateConstraints:@[
|
||||||
|
[copyInfoButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-48],
|
||||||
|
[copyInfoButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
|
||||||
|
[copyInfoButton.widthAnchor constraintEqualToConstant:40.0],
|
||||||
|
[copyInfoButton.heightAnchor constraintEqualToConstant:40.0],
|
||||||
|
]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%new
|
||||||
|
- (void)didTapCopyInfoButton:(UIButton *)sender {
|
||||||
|
YTPlayerViewController *playerVC = self.resizeDelegate.parentViewController.parentViewController.parentViewController.playerViewController;
|
||||||
|
NSString *title = playerVC.playerResponse.playerData.videoDetails.title;
|
||||||
|
NSString *shortDescription = playerVC.playerResponse.playerData.videoDetails.shortDescription;
|
||||||
|
|
||||||
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:LOC(@"SelectAction") message:nil preferredStyle:UIAlertControllerStyleActionSheet];
|
||||||
|
alertController.view.tintColor = [UIColor labelColor];
|
||||||
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyTitle") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
[UIPasteboard generalPasteboard].string = title;
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:self.resizeDelegate] send];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyDescription") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
[UIPasteboard generalPasteboard].string = shortDescription;
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:self.resizeDelegate] send];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[alertController addAction:[UIAlertAction actionWithTitle:LOC(@"Cancel") style:UIAlertActionStyleCancel handler:nil]];
|
||||||
|
|
||||||
|
[self.resizeDelegate presentViewController:alertController animated:YES completion:nil];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
// 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 +1130,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;
|
||||||
kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO;
|
kCopyVideoInfo = [prefs[@"copyVideoInfo"] boolValue] ?: NO;
|
||||||
|
kPostManager = [prefs[@"postManager"] 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 +1216,11 @@ static void reloadPrefs() {
|
|||||||
@"removeSubscriptions" : @(kRemoveSubscriptions),
|
@"removeSubscriptions" : @(kRemoveSubscriptions),
|
||||||
@"removeUploads" : @(kRemoveUploads),
|
@"removeUploads" : @(kRemoveUploads),
|
||||||
@"removeLibrary" : @(kRemoveLibrary),
|
@"removeLibrary" : @(kRemoveLibrary),
|
||||||
@"copyPostText" : @(kCopyPostText),
|
@"copyVideoInfo" : @(kCopyVideoInfo),
|
||||||
|
@"postManager" : @(kPostManager),
|
||||||
@"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";
|
||||||
"CopyPostText" = "Copy community posts text";
|
"CopyVideoInfo" = "Copy video information";
|
||||||
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"SavePostImage" = "Save image from community posts";
|
"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";
|
||||||
@@ -186,8 +192,10 @@
|
|||||||
"French" = "French localization";
|
"French" = "French localization";
|
||||||
"Spanish" = "Spanish localization";
|
"Spanish" = "Spanish localization";
|
||||||
"Japanese" = "Japanese localization";
|
"Japanese" = "Japanese localization";
|
||||||
|
"Vietnamese" = "Vietnamese 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 +203,14 @@
|
|||||||
"Yes" = "Yes";
|
"Yes" = "Yes";
|
||||||
"No" = "No";
|
"No" = "No";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"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";
|
||||||
"CopyPostText" = "Copia el texto de las publicaciones de la comunidad";
|
"CopyVideoInfo" = "Copy video information";
|
||||||
"CopyPostTextDesc" = "Copia el texto de los posts de la comunidad al portapapeles mediante pulsación larga";
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"SavePostImage" = "Guardar imagen de las entradas de la comunidad";
|
"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";
|
||||||
@@ -186,15 +192,25 @@
|
|||||||
"French" = "Traducción: Frances";
|
"French" = "Traducción: Frances";
|
||||||
"Spanish" = "Traducción: Español";
|
"Spanish" = "Traducción: Español";
|
||||||
"Japanese" = "Traducción: Japonés";
|
"Japanese" = "Traducción: Japonés";
|
||||||
|
"Vietnamese" = "Vietnamese localization";
|
||||||
"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";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"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";
|
||||||
"CopyPostText" = "Copier le texte des publications de la communauté";
|
"CopyVideoInfo" = "Copier les informations vidéo";
|
||||||
"CopyPostTextDesc" = "Copie le texte des publications de la communauté dans le presse-papiers en appuyant longuement.";
|
"CopyVideoInfoDesc" = "Ajout d'un bouton permettant de copier le titre et la description de la vidéo dans le panneau Description de la vidéo.";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"SavePostImage" = "Enregistrer l'image des publications de la communauté";
|
"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" = "Copier le texte des commentaires";
|
||||||
|
"CopyCommentTextDesc" = "Copie le texte des commentaires dans le presse-papiers par un appui long.";
|
||||||
"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\"";
|
||||||
@@ -159,7 +163,7 @@
|
|||||||
"NoSearchHistoryDesc" = "Masque visuellement l'historique de recherche et les suggestions. Note : Votre historique de recherche sera toujours accessible dans vos autres clients YouTube.";
|
"NoSearchHistoryDesc" = "Masque visuellement l'historique de recherche et les suggestions. Note : Votre historique de recherche sera toujours accessible dans vos autres clients YouTube.";
|
||||||
"NoRelatedWatchNexts" = "Masquer toutes les vidéos sous le lecteur";
|
"NoRelatedWatchNexts" = "Masquer toutes les vidéos sous le lecteur";
|
||||||
"NoRelatedWatchNextsDesc" = "Masque toutes les vidéos sous le lecteur, ne laissant que les informations sur la vidéo et la section des commentaires.";
|
"NoRelatedWatchNextsDesc" = "Masque toutes les vidéos sous le lecteur, ne laissant que les informations sur la vidéo et la section des commentaires.";
|
||||||
"StickSortComments" = "Épingler l'en-tête des commentaires";\
|
"StickSortComments" = "Épingler l'en-tête des commentaires";
|
||||||
"StickSortCommentsDesc" = "Épingle l'en-tête de tri des commentaires (Meilleurs, Plus récents) pour qu'il ne disparaisse pas pendant le défilement.";
|
"StickSortCommentsDesc" = "Épingle l'en-tête de tri des commentaires (Meilleurs, Plus récents) pour qu'il ne disparaisse pas pendant le défilement.";
|
||||||
"HideSortComments" = "Masquer l'en-tête des commentaires";
|
"HideSortComments" = "Masquer l'en-tête des commentaires";
|
||||||
"HideSortCommentsDesc" = "Masque l'en-tête de tri des commentaires (Meilleurs, Plus récents) pour qu'il n'apparaisse jamais.";
|
"HideSortCommentsDesc" = "Masque l'en-tête de tri des commentaires (Meilleurs, Plus récents) pour qu'il n'apparaisse jamais.";
|
||||||
@@ -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" = "Faire un don via PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Soutenir le développement via les sponsors Github";
|
||||||
"Version" = "Version";
|
"Version" = "Version";
|
||||||
"About" = "À propos";
|
"About" = "À propos";
|
||||||
"Credits" = "Crédits";
|
"Credits" = "Crédits";
|
||||||
@@ -186,8 +192,10 @@
|
|||||||
"French" = "Localisation française";
|
"French" = "Localisation française";
|
||||||
"Spanish" = "Localisation espagnole";
|
"Spanish" = "Localisation espagnole";
|
||||||
"Japanese" = "Localisation japonaise";
|
"Japanese" = "Localisation japonaise";
|
||||||
|
"Vietnamese" = "Localisation vietnamienne";
|
||||||
"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" = "Effacer le 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 +203,14 @@
|
|||||||
"Yes" = "Oui";
|
"Yes" = "Oui";
|
||||||
"No" = "Non";
|
"No" = "Non";
|
||||||
|
|
||||||
|
"SelectAction" = "Sélectionner une action";
|
||||||
|
"CopyTitle" = "Copier le titre";
|
||||||
|
"CopyDescription" = "Copier la description";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"Cancel" = "Annuler";
|
||||||
"Copied" = "Copié dans le presse-papiers";
|
"Copied" = "Copié dans le presse-papiers";
|
||||||
"Saved" = "Enregistré dans Photos";
|
"Saved" = "Enregistré dans Photos";
|
||||||
|
"Done" = "Terminé";
|
||||||
"Error" = "Erreur";
|
"Error" = "Erreur";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
||||||
|
|
||||||
"Other" = "その他";
|
"Other" = "その他";
|
||||||
"CopyPostText" = "Copy community posts text";
|
"CopyVideoInfo" = "Copy video information";
|
||||||
"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap.";
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"SavePostImage" = "Save community posts image";
|
"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" = "クレジット";
|
||||||
@@ -186,8 +192,10 @@
|
|||||||
"French" = "フランス語翻訳";
|
"French" = "フランス語翻訳";
|
||||||
"Spanish" = "スペイン語翻訳";
|
"Spanish" = "スペイン語翻訳";
|
||||||
"Japanese" = "日本語翻訳";
|
"Japanese" = "日本語翻訳";
|
||||||
|
"Vietnamese" = "Vietnamese localization";
|
||||||
"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 +203,14 @@
|
|||||||
"Yes" = "はい";
|
"Yes" = "はい";
|
||||||
"No" = "いいえ";
|
"No" = "いいえ";
|
||||||
|
|
||||||
|
"SelectAction" = "Select action";
|
||||||
|
"CopyTitle" = "Copy title";
|
||||||
|
"CopyDescription" = "Copy description";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"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" = "Другие настройки";
|
||||||
"CopyPostText" = "Копировать текст постов";
|
"CopyVideoInfo" = "Копировать информацию о видео";
|
||||||
"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием.";
|
"CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео.";
|
||||||
|
"PostManager" = "Сохранять информацию с постов";
|
||||||
|
"PostManagerDesc" = "Позволяет скопировать текст из поста или сохранить пост как фото долгим нажатием по нему.";
|
||||||
"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" = "Авторы";
|
||||||
@@ -186,8 +192,10 @@
|
|||||||
"French" = "Французская локализация";
|
"French" = "Французская локализация";
|
||||||
"Spanish" = "Испанская локализация";
|
"Spanish" = "Испанская локализация";
|
||||||
"Japanese" = "Японская локализация";
|
"Japanese" = "Японская локализация";
|
||||||
|
"Vietnamese" = "Вьетнамская локализация";
|
||||||
"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 +203,14 @@
|
|||||||
"Yes" = "Да";
|
"Yes" = "Да";
|
||||||
"No" = "Нет";
|
"No" = "Нет";
|
||||||
|
|
||||||
|
"SelectAction" = "Выберите действие";
|
||||||
|
"CopyTitle" = "Скопировать название";
|
||||||
|
"CopyDescription" = "Скопировать описание";
|
||||||
|
"CopyPostText" = "Копировать текст поста";
|
||||||
|
"SavePostAsImage" = "Сохранить пост как фото";
|
||||||
|
"CopyPostAsImage" = "Скопировать пост как фото";
|
||||||
|
"Cancel" = "Отмена";
|
||||||
"Copied" = "Скопировано в буфер обмена";
|
"Copied" = "Скопировано в буфер обмена";
|
||||||
"Saved" = "Сохранено в Фото";
|
"Saved" = "Сохранено в Фото";
|
||||||
|
"Done" = "Готово";
|
||||||
"Error" = "Ошибка";
|
"Error" = "Ошибка";
|
||||||
@@ -0,0 +1,216 @@
|
|||||||
|
"General" = "Chung";
|
||||||
|
"RemoveAds" = "Loại bỏ các quảng cáo";
|
||||||
|
"RemoveAdsDesc" = "Loại bỏ quảng cáo trong ứng dụng.";
|
||||||
|
"BackgroundPlayback" = "Phát lại ở chế độ nền";
|
||||||
|
"BackgroundPlaybackDesc" = "Cho phép phát lại ở chế độ nền.";
|
||||||
|
|
||||||
|
"Navbar" = "Thanh điều hướng";
|
||||||
|
"RemoveCast" = "Ẩn nút Cast";
|
||||||
|
"RemoveCastDesc" = "Ẩn nút Cast khỏi thanh Điều hướng.";
|
||||||
|
"RemoveNotifications" = "Ẩn nút Thông báo";
|
||||||
|
"RemoveNotificationsDesc" = "Ẩn nút Thông báo khỏi thanh Điều hướng.";
|
||||||
|
"RemoveSearch" = "Ẩn nút Tìm kiếm";
|
||||||
|
"RemoveSearchDesc" = "Ẩn nút Tìm kiếm khỏi thanh Điều hướng.";
|
||||||
|
"RemoveVoiceSearch" = "Ẩn nút tìm kiếm bằng giọng nói";
|
||||||
|
"RemoveVoiceSearchDesc" = "Ẩn nút tìm kiếm bằng giọng nói khỏi thanh Điều hướng.";
|
||||||
|
"StickyNavbar" = "Thanh điều hướng cố định";
|
||||||
|
"StickyNavbarDesc" = "Ghim thanh Điều hướng để nó vẫn hiển thị khi cuộn xuống.";
|
||||||
|
"NoSubbar" = "Ẩn thanh phụ";
|
||||||
|
"NoSubbarDesc" = "Ẩn Thanh phụ (Tất cả, Mới đối với bạn, Trực tiếp, v.v.) dưới thanh Điều hướng.";
|
||||||
|
"NoYTLogo" = "Xóa biểu tượng YouTube";
|
||||||
|
"NoYTLogoDesc" = "Xóa logo YouTube trong thanh Điều hướng.";
|
||||||
|
|
||||||
|
"Overlay" = "Lớp phủ";
|
||||||
|
"HideAutoplay" = "Ẩn công tắc Tự động phát";
|
||||||
|
"HideAutoplayDesc" = "Ẩn công tắc Tự động phát khỏi lớp phủ.";
|
||||||
|
"HideSubs" = "Ẩn nút phụ đề";
|
||||||
|
"HideSubsDesc" = "Ẩn nút Phụ đề khỏi lớp phủ.";
|
||||||
|
"NoHUDMsgs" = "Ẩn tin nhắn HUD";
|
||||||
|
"NoHUDMsgsDesc" = "Ẩn tất cả các thông báo tính năng từ người chơi. Ví dụ: CC được bật/tắt, Vòng lặp video được bật, v.v.";
|
||||||
|
"HidePrevNext" = "Ẩn nút Trước và Tiếp theo";
|
||||||
|
"HidePrevNextDesc" = "Ẩn các nút Trước và Tiếp theo khỏi lớp phủ video.";
|
||||||
|
"ReplacePrevNext" = "Nút tua đi và tua lại nhanh";
|
||||||
|
"ReplacePrevNextDesc" = "Thay thế các nút Trước và Tiếp theo thành nút tua đi và tua lại nhanh trong lớp phủ video.";
|
||||||
|
"NoDarkBg" = "Xóa nền tối";
|
||||||
|
"NoDarkBgDesc" = "Loại bỏ nền tối của lớp phủ.";
|
||||||
|
"NoEndScreenCards" = "Ẩn video dạng thumbnails";
|
||||||
|
"NoEndScreenCardsDesc" = "Ẩn thumbnail của các video đề xuất, xuất hiện ở cuối video.";
|
||||||
|
"NoFullscreenActions" = "Vô hiệu hóa các hành động toàn màn hình";
|
||||||
|
"NoFullscreenActionsDesc" = "Vô hiệu hóa bảng hành động ở chế độ toàn màn hình.";
|
||||||
|
"PersistentProgressBar" = "Thanh tiến trình liên tục";
|
||||||
|
"PersistentProgressBarDesc" = "Luôn hiển thị thanh tiến trình trong trình phát.";
|
||||||
|
"NoRelatedVids" = "Không có video liên quan trong lớp phủ";
|
||||||
|
"NoRelatedVidsDesc" = "Xóa các video liên quan được hiển thị trong lớp phủ bằng cách vuốt lên.";
|
||||||
|
"NoPromotionCards" = "Ẩn thẻ Quảng cáo trả phí";
|
||||||
|
"NoPromotionCardsDesc" = "Ẩn thẻ \"Bao gồm quảng cáo trả phí\" trong các video có quảng cáo.";
|
||||||
|
"NoWatermarks" = "Ẩn hình mờ";
|
||||||
|
"NoWatermarksDesc" = "Ẩn hình mờ kênh khỏi trình phát.";
|
||||||
|
|
||||||
|
"Player" = "Trình phát";
|
||||||
|
"Miniplayer" = "Bật trình phát mini";
|
||||||
|
"MiniplayerDesc" = "Bật trình phát mini cho các video ban đầu không được thiết kế cho trình phát đó, chẳng hạn như các video dành cho trẻ em.";
|
||||||
|
"PortraitFullscreen" = "Chế độ toàn màn hình dọc";
|
||||||
|
"PortraitFullscreenDesc" = "Cho phép hỗ trợ chế độ toàn màn hình dọc.";
|
||||||
|
"CopyWithTimestamp" = "Sao chép các liên kết có dấu thời gian";
|
||||||
|
"CopyWithTimestampDesc" = "Cho phép sao chép liên kết có dấu thời gian vào bảng tạm bằng cách nhấn nút tạm dừng.";
|
||||||
|
"DisableAutoplay" = "Tắt video Tự động phát";
|
||||||
|
"DisableAutoplayDesc" = "Ngăn chặn phát lại video sau khi mở.";
|
||||||
|
"DisableAutoCaptions" = "Tắt phụ đề tự động";
|
||||||
|
"DisableAutoCaptionsDesc" = "Ngăn chặn việc tự động kích hoạt phụ đề.";
|
||||||
|
"NoContentWarning" = "Bỏ qua cảnh báo nội dung";
|
||||||
|
"NoContentWarningDesc" = "Bỏ qua thông báo cảnh báo nội dung nhạy cảm.";
|
||||||
|
"ClassicQuality" = "Chất lượng video cổ điển";
|
||||||
|
"ClassicQualityDesc" = "Mang lại menu lựa chọn chất lượng video cổ điển.";
|
||||||
|
"ExtraSpeedOptions" = "Bổ sung tùy chọn tốc độ";
|
||||||
|
"ExtraSpeedOptionsDesc" = "Thêm nhiều tùy chọn tốc độ phát lại video vào menu trình phát.";
|
||||||
|
"DontSnap2Chapter" = "Tắt tính năng chuyển sang tập tiếp theo";
|
||||||
|
"DontSnap2ChapterDesc" = "Vô hiệu hóa việc chuyển sang tập tiếp theo bằng cử chỉ nhấn đúp.";
|
||||||
|
"RedProgressBar" = "Thanh tiến trình màu đỏ";
|
||||||
|
"RedProgressBarDesc" = "Mang lại thanh tiến trình màu đỏ.";
|
||||||
|
"NoHints" = "Tắt gợi ý";
|
||||||
|
"NoHintsDesc" = "Tắt gợi ý của tác giả xuất hiện ở góc trên bên phải trong khi phát lại.";
|
||||||
|
"NoFreeZoom" = "Tắt cử chỉ thu phóng";
|
||||||
|
"NoFreeZoomDesc" = "Tắt các cử chỉ thu phóng mới.";
|
||||||
|
"AutoFullscreen" = "Phát video ở chế độ toàn màn hình";
|
||||||
|
"AutoFullscreenDesc" = "Tự động phát video ở chế độ toàn màn hình.";
|
||||||
|
"ExitFullscreen" = "Thoát chế độ toàn màn hình khi hoàn tất";
|
||||||
|
"ExitFullscreenDesc" = "Thoát khỏi chế độ toàn màn hình khi kết thúc phát video.";
|
||||||
|
"NoDoubleTap2Seek" = "Tắt tính năng nhấn đúp để tìm kiếm";
|
||||||
|
"NoDoubleTap2SeekDesc" = "Tắt cử chỉ nhấn đúp để tìm kiếm.";
|
||||||
|
|
||||||
|
"Tabbar" = "Thanh tab";
|
||||||
|
"RemoveLabels" = "Xóa nhãn";
|
||||||
|
"RemoveLabelsDesc" = "Loại bỏ nhãn tab.";
|
||||||
|
"RemoveIndicators" = "Xóa chỉ báo";
|
||||||
|
"RemoveIndicatorsDesc" = "Loại bỏ các chỉ báo tab.";
|
||||||
|
"ReExplore" = "Thay thế tab Shorts bằng tab Khám phá";
|
||||||
|
"ReExploreDesc" = "Hiển thị tab Khám phá thay vì tab Shorts như trên các phiên bản YouTube cũ.";
|
||||||
|
"AddExplore" = "Thêm tab Khám phá";
|
||||||
|
"AddExploreDesc" = "Thêm tab Khám phá vào thanh Tab.";
|
||||||
|
"HideShortsTab" = "Ẩn tab Shorts";
|
||||||
|
"HideShortsTabDesc" = "Ẩn tab Shorts khỏi thanh Tab.";
|
||||||
|
"HideSubscriptionsTab" = "Ẩn tab Đăng ký";
|
||||||
|
"HideSubscriptionsTabDesc" = "Ẩn tab Đăng ký khỏi thanh Tab.";
|
||||||
|
"HideUploadButton" = "Ẩn nút Tải lên";
|
||||||
|
"HideUploadButtonDesc" = "Ẩn nút Tải lên khỏi thanh Tab.";
|
||||||
|
"HideLibraryTab" = "Ẩn tab Thư viện";
|
||||||
|
"HideLibraryTabDesc" = "Ẩn tab Thư viện khỏi thanh Tab.";
|
||||||
|
|
||||||
|
"Shorts" = "Shorts";
|
||||||
|
"ShortsOnlyMode" = "Chế độ chỉ dành cho Short";
|
||||||
|
"ShortsOnlyModeDesc" = "Giới hạn chức năng của YouTube chỉ ở chế độ Short.";
|
||||||
|
"HideShorts" = "Ẩn Shorts";
|
||||||
|
"HideShortsDesc" = "Ẩn Shorts khỏi Trang chủ, Được đề xuất, v.v. (Không áp dụng cho Lịch sử xem)";
|
||||||
|
"ShortsProgress" = "Bật thanh tiến trình";
|
||||||
|
"ShortsProgressDesc" = "Hiển thị thanh tiến trình trong lớp phủ Shorts.";
|
||||||
|
"PinchToFullscreenShorts" = "Chụm vào toàn màn hình";
|
||||||
|
"PinchToFullscreenShortsDesc" = "Quản lý khả năng hiển thị của lớp phủ bằng cử chỉ chụm vào và kéo ra, hiển thị Shorts ở chế độ toàn màn hình.";
|
||||||
|
"ShortsToRegular" = "Từ Shorts đến video thông thường";
|
||||||
|
"ShortsToRegularDesc" = "Mở Shorts như video thông thường.";
|
||||||
|
"ResumeShorts" = "Đừng bắt đầu từ tab Shorts";
|
||||||
|
"ResumeShortsDesc" = "Ngăn chặn việc bắt đầu từ Shorts ở ứng dụng đang mở, điều này xảy ra nếu YouTube bị đóng trong khi xem Shorts.";
|
||||||
|
"HideShortsLogo" = "Ẩn biểu tượng Shorts";
|
||||||
|
"HideShortsLogoDesc" = "Ẩn biểu tượng Shorts ở góc trên cùng bên trái.";
|
||||||
|
"HideShortsSearch" = "Ẩn nút Tìm kiếm";
|
||||||
|
"HideShortsSearchDesc" = "Ẩn nút Tìm kiếm khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsCamera" = "Ẩn nút Máy ảnh";
|
||||||
|
"HideShortsCameraDesc" = "Ẩn nút Máy ảnh khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsMore" = "Ẩn nút Thêm (⋮)";
|
||||||
|
"HideShortsMoreDesc" = "Ẩn nút Thêm (⋮) khỏi lớp phủ Shorts. Nó cũng có thể truy cập được bằng cách nhấn và giữ màn hình.";
|
||||||
|
"HideShortsSubscriptions" = "Ẩn nút Đăng ký";
|
||||||
|
"HideShortsSubscriptionsDesc" = "Ẩn nút Đăng ký xuất hiện khi Shorts bị tạm dừng.";
|
||||||
|
"HideShortsLike" = "Ẩn nút Thích";
|
||||||
|
"HideShortsLikeDesc" = "Ẩn nút Thích khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsDislike" = "Ẩn nút Không thích";
|
||||||
|
"HideShortsDislikeDesc" = "Ẩn nút Không thích khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsComments" = "Ẩn nút bình luận";
|
||||||
|
"HideShortsCommentsDesc" = "Ẩn nút bình luận khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsRemix" = "Ẩn nút phối lại";
|
||||||
|
"HideShortsRemixDesc" = "Ẩn nút Phối lại khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsShare" = "Ẩn nút Chia sẻ";
|
||||||
|
"HideShortsShareDesc" = "Ẩn nút Chia sẻ khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsAvatars" = "Ẩn hình đại diện kênh";
|
||||||
|
"HideShortsAvatarsDesc" = "Ẩn hình đại diện kênh ở góc dưới bên phải.";
|
||||||
|
"HideShortsThanks" = "Ẩn nút Superthanks";
|
||||||
|
"HideShortsThanksDesc" = "Ẩn nút Superthanks (Quyên góp) khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsSource" = "Ẩn nguồn Shorts";
|
||||||
|
"HideShortsSourceDesc" = "Ẩn nguồn Shorts dưới tên kênh.";
|
||||||
|
"HideShortsChannelName" = "Ẩn tên kênh";
|
||||||
|
"HideShortsChannelNameDesc" = "Ẩn tên kênh và nút đăng ký khỏi lớp phủ Shorts.";
|
||||||
|
"HideShortsDescription" = "Ẩn mô tả";
|
||||||
|
"HideShortsDescriptionDesc" = "Ẩn phần mô tả Shorts dưới tên kênh.";
|
||||||
|
"HideShortsAudioTrack" = "Ẩn AudioTrack";
|
||||||
|
"HideShortsAudioTrackDesc" = "Ẩn AudioTrack trong phần mô tả Shorts.";
|
||||||
|
|
||||||
|
"Other" = "Khác";
|
||||||
|
"CopyVideoInfo" = "Sao chép thông tin video";
|
||||||
|
"CopyVideoInfoDesc" = "Thêm nút để sao chép tiêu đề và mô tả video vào bảng Mô tả Video.";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
|
"SavePostImage" = "Lưu hình ảnh từ bài đăng trên cộng đồng";
|
||||||
|
"SavePostImageDesc" = "Lưu hình ảnh bài đăng của cộng đồng vào ứng dụng Ảnh bằng cách nhấn giữ.";
|
||||||
|
"SaveProfilePhoto" = "Lưu ảnh hồ sơ";
|
||||||
|
"SaveProfilePhotoDesc" = "Lưu ảnh hồ sơ vào ứng dụng Ảnh bằng cách nhấn và giữ.";
|
||||||
|
"CopyCommentText" = "Sao chép văn bản bình luận";
|
||||||
|
"CopyCommentTextDesc" = "Sao chép văn bản nhận xét vào clipboard bằng cách nhấn giữ.";
|
||||||
|
"FixAlbums" = "Sửa Albums";
|
||||||
|
"FixAlbumsDesc" = "Sửa lỗi hiển thị Albums cho người dùng Nga.";
|
||||||
|
"RemovePlayNext" = "Xóa \"Chơi tiếp theo trong hàng đợi\"";
|
||||||
|
"RemovePlayNextDesc" = "Xóa tùy chọn \"Chơi tiếp theo trong hàng đợi\" khỏi menu.";
|
||||||
|
"NoContinueWatching" = "Xóa \"Tiếp tục xem\"";
|
||||||
|
"NoContinueWatchingDesc" = "Xóa phần \"Tiếp tục xem\" chứa các video chưa xem hết khỏi Trang chủ.";
|
||||||
|
"NoSearchHistory" = "Ẩn lịch sử tìm kiếm";
|
||||||
|
"NoSearchHistoryDesc" = "Ẩn lịch sử tìm kiếm và đề xuất một cách trực quan. Lưu ý: Lịch sử tìm kiếm của bạn vẫn có thể truy cập được trong các ứng dụng YouTube khác.";
|
||||||
|
"NoRelatedWatchNexts" = "Ẩn tất cả video dưới trình phát";
|
||||||
|
"NoRelatedWatchNextsDesc" = "Ẩn tất cả video bên dưới trình phát, chỉ để lại phần thông tin video và nhận xét.";
|
||||||
|
"StickSortComments" = "Dán tiêu đề bình luận";
|
||||||
|
"StickSortCommentsDesc" = "Ghim sắp xếp tiêu đề nhận xét (Hàng đầu, Mới nhất) để nó không biến mất khi cuộn.";
|
||||||
|
"HideSortComments" = "Ẩn tiêu đề bình luận";
|
||||||
|
"HideSortCommentsDesc" = "Ẩn tiêu đề nhận xét sắp xếp (Hàng đầu, Mới nhất) để nó không bao giờ xuất hiện.";
|
||||||
|
"PlaylistOldMinibar" = "Danh sách phát mini bar cũ";
|
||||||
|
"PlaylistOldMinibarDesc" = "Thay thế bảng điều khiển danh sách phát nổi mới bằng bảng điều khiển cũ.";
|
||||||
|
"DisableRTL" = "Tắt định dạng RTL";
|
||||||
|
"DisableRTLDesc" = "Hiển thị mạnh mẽ văn bản ở định dạng từ trái sang phải (LTR) cho các ngôn ngữ ban đầu được hiển thị ở định dạng từ phải sang trái (RTL).";
|
||||||
|
|
||||||
|
"Startup" = "Trang khởi động";
|
||||||
|
"Home" = "Trang chủ";
|
||||||
|
"Explore" = "Khám phá";
|
||||||
|
"ShortsTab" = "Shorts";
|
||||||
|
"Subscriptions" = "Đăng ký";
|
||||||
|
"Library" = "Thư viện";
|
||||||
|
"Warning" = "Cảnh báo";
|
||||||
|
"TabIsHidden" = "Không thể chọn Tab ẩn làm trang khởi động";
|
||||||
|
|
||||||
|
"DonateViaPayPal" = "Quyên góp qua PayPal";
|
||||||
|
"SupportViaGhSponsors" = "Hỗ trợ phát triển thông qua Github";
|
||||||
|
"Version" = "Phiên bản";
|
||||||
|
"About" = "Giới thiệu";
|
||||||
|
"Credits" = "Credits";
|
||||||
|
"Developer" = "Nhà phát triển YTLite";
|
||||||
|
"ChineseSimplified" = "Tiếng Trung (giản thể)";
|
||||||
|
"ChineseTraditional" = "Tiếng Trung (phồn thể)";
|
||||||
|
"French" = "Tiếng Pháp";
|
||||||
|
"Spanish" = "Tiếng Tây Ban Nha";
|
||||||
|
"Japanese" = "Tiếng Nhật";
|
||||||
|
"Vietnamese" = "Tiếng Việt";
|
||||||
|
"Advanced" = "Chế độ nâng cao";
|
||||||
|
"AdvancedModeReminder" = "Bạn có muốn kích hoạt Chế độ nâng cao cho YTLite không?\n\nChế độ này cung cấp hơn 50 tùy chọn bổ sung để tùy chỉnh và tối ưu hóa trải nghiệm YouTube của bạn. Bạn có thể Bật/Tắt nó sau từ Cài đặt → %@ → %@ → %@.";
|
||||||
|
"ClearCache" = "Xóa bộ nhớ đệm";
|
||||||
|
"ResetSettings" = "Đặt lại cài đặt YTLite";
|
||||||
|
"ResetMessage" = "Tùy chọn này sẽ đặt lại cài đặt YTLite về mặc định và đóng YouTube.\n\nBạn có chắc chắn muốn tiếp tục không?";
|
||||||
|
"ShortsOnlyWarning" = "Bạn có chắc chắn muốn kích hoạt chế độ này?\n\nỞ chế độ này, bạn sẽ chỉ có thể xem video Shorts và không thể làm gì khác.\n\nBạn có thể tắt Chế độ chỉ Shorts bằng cách nhấn và giữ bằng hai ngón tay trong trình phát Shorts.";
|
||||||
|
"ShortsModeTurnedOff" = "Chế độ chỉ dành cho Shorts đã bị tắt";
|
||||||
|
"Yes" = "Có";
|
||||||
|
"No" = "Không";
|
||||||
|
|
||||||
|
"SelectAction" = "Chọn hành động";
|
||||||
|
"CopyTitle" = "Sao chép tiêu đề";
|
||||||
|
"CopyDescription" = "Sao chép mô tả";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"Cancel" = "Hủy bỏ";
|
||||||
|
"Copied" = "Sao chép vào clipboard";
|
||||||
|
"Saved" = "Đã lưu vào Ảnh";
|
||||||
|
"Done" = "Xong";
|
||||||
|
"Error" = "Lỗi";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
|
"HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。";
|
||||||
|
|
||||||
"Other" = "其他";
|
"Other" = "其他";
|
||||||
"CopyPostText" = "复制社区帖子文本";
|
"CopyVideoInfo" = "复制视频信息";
|
||||||
"CopyPostTextDesc" = "长按社区帖子文本复制到剪贴板。";
|
"CopyVideoInfoDesc" = "添加按钮从“视频说明”面板中复制视频的标题和描述。";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"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 赞助支持开发";
|
||||||
"Version" = "版本";
|
"Version" = "版本";
|
||||||
"About" = "关于";
|
"About" = "关于";
|
||||||
"Credits" = "信息";
|
"Credits" = "信息";
|
||||||
@@ -186,8 +192,10 @@
|
|||||||
"French" = "法语本地化";
|
"French" = "法语本地化";
|
||||||
"Spanish" = "西班牙语本地化";
|
"Spanish" = "西班牙语本地化";
|
||||||
"Japanese" = "日语本地化";
|
"Japanese" = "日语本地化";
|
||||||
|
"Vietnamese" = "越南语本地化";
|
||||||
"Advanced" = "高级模式";
|
"Advanced" = "高级模式";
|
||||||
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
||||||
|
"ClearCache" = "清除缓存";
|
||||||
"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 +203,14 @@
|
|||||||
"Yes" = "是";
|
"Yes" = "是";
|
||||||
"No" = "不";
|
"No" = "不";
|
||||||
|
|
||||||
|
"SelectAction" = "选择操作";
|
||||||
|
"CopyTitle" = "复制标题";
|
||||||
|
"CopyDescription" = "复制描述";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"Cancel" = "取消";
|
||||||
"Copied" = "已复制到剪贴板";
|
"Copied" = "已复制到剪贴板";
|
||||||
"Saved" = "已保存到照片";
|
"Saved" = "已保存到照片";
|
||||||
|
"Done" = "完成";
|
||||||
"Error" = "错误";
|
"Error" = "错误";
|
||||||
@@ -143,12 +143,16 @@
|
|||||||
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
|
"HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效";
|
||||||
|
|
||||||
"Other" = "其它";
|
"Other" = "其它";
|
||||||
"CopyPostText" = "複製社群貼文文字";
|
"CopyVideoInfo" = "複製影片資訊";
|
||||||
"CopyPostTextDesc" = "長按社群貼文文字複製到剪貼簿";
|
"CopyVideoInfoDesc" = "新增按鈕將影片標題和說明,複製到影片說明欄";
|
||||||
|
"PostManager" = "Save post information";
|
||||||
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"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贊助支持開發";
|
||||||
"Version" = "版本";
|
"Version" = "版本";
|
||||||
"About" = "關於";
|
"About" = "關於";
|
||||||
"Credits" = "貢獻";
|
"Credits" = "貢獻";
|
||||||
@@ -185,9 +191,11 @@
|
|||||||
"ChineseTraditional" = "繁體中文在地化";
|
"ChineseTraditional" = "繁體中文在地化";
|
||||||
"French" = "法文在地化";
|
"French" = "法文在地化";
|
||||||
"Spanish" = "西班牙文在地化";
|
"Spanish" = "西班牙文在地化";
|
||||||
"Japanese" = "日本語本地化";
|
"Japanese" = "日本語在地化";
|
||||||
|
"Vietnamese" = "越南語在地化";
|
||||||
"Advanced" = "進階模式";
|
"Advanced" = "進階模式";
|
||||||
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
||||||
|
"ClearCache" = "清除快取";
|
||||||
"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 +203,14 @@
|
|||||||
"Yes" = "是";
|
"Yes" = "是";
|
||||||
"No" = "否";
|
"No" = "否";
|
||||||
|
|
||||||
|
"SelectAction" = "選擇動作";
|
||||||
|
"CopyTitle" = "複製標題";
|
||||||
|
"CopyDescription" = "複製說明";
|
||||||
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SavePostAsImage" = "Save post as image";
|
||||||
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"Cancel" = "取消";
|
||||||
"Copied" = "已複製到剪貼簿";
|
"Copied" = "已複製到剪貼簿";
|
||||||
"Saved" = "已儲存到照片應用";
|
"Saved" = "已儲存到照片應用";
|
||||||
|
"Done" = "Done";
|
||||||
"Error" = "發生錯誤";
|
"Error" = "發生錯誤";
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user