diff --git a/Makefile b/Makefile index e8d7408a..69701b01 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ endif DEBUG=0 FINALPACKAGE=1 ARCHS = arm64 -PACKAGE_VERSION = 2.6.1 +PACKAGE_VERSION = 2.6.2 TARGET := iphone:clang:latest:13.0 include $(THEOS)/makefiles/common.mk diff --git a/Settings.x b/Settings.x index 62484a80..e04ffa3e 100644 --- a/Settings.x +++ b/Settings.x @@ -284,7 +284,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ createSwitchItem(LOC(@"CopyVideoInfo"), LOC(@"CopyVideoInfoDesc"), @"copyVideoInfo", &kCopyVideoInfo, selfObject), - createSwitchItem(LOC(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject), + createSwitchItem(LOC(@"PostManager"), LOC(@"PostManagerDesc"), @"postManager", &kPostManager, selfObject), createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject), createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, selfObject), createSwitchItem(LOC(@"CopyCommentText"), LOC(@"CopyCommentTextDesc"), @"copyCommentText", &kCopyCommentText, selfObject), diff --git a/YTLite.h b/YTLite.h index e22280ee..4075f4a4 100644 --- a/YTLite.h +++ b/YTLite.h @@ -111,7 +111,7 @@ BOOL kRemoveSubscriptions; BOOL kRemoveUploads; BOOL kRemoveLibrary; BOOL kCopyVideoInfo; -BOOL kCopyPostText; +BOOL kPostManager; BOOL kSavePostImage; BOOL kSaveProfilePhoto; BOOL kCopyCommentText; @@ -289,14 +289,20 @@ int kPivotIndex; @end @interface ASDisplayNode : NSObject +@property (nonatomic, assign, readonly) UIViewController *closestViewController; @property (atomic, assign, readonly) ASNodeAncestryEnumerator *supernodes; @property (atomic, copy, readwrite) NSArray *yogaChildren; +@property (atomic) CALayer *layer; @end @interface ELMContainerNode : ASDisplayNode @property (nonatomic, strong, readwrite) NSString *copiedComment; @end +@interface ELMExpandableTextNode : ASDisplayNode +@property (atomic, assign, readonly) ASDisplayNode *currentTextNode; +@end + @interface ASNetworkImageNode : ASDisplayNode @property (atomic, copy, readwrite) NSURL *URL; @end @@ -307,7 +313,7 @@ int kPivotIndex; @interface _ASDisplayView : UIView @property (nonatomic, strong, readwrite) ASDisplayNode *keepalive_node; -- (void)copyText:(UILongPressGestureRecognizer *)sender; +- (void)postManager:(UILongPressGestureRecognizer *)sender; - (void)saveImage:(UILongPressGestureRecognizer *)sender; - (void)savePFP:(UILongPressGestureRecognizer *)sender; - (void)copyComment:(UILongPressGestureRecognizer *)sender; diff --git a/YTLite.x b/YTLite.x index 2cba2167..d0b3f0e5 100644 --- a/YTLite.x +++ b/YTLite.x @@ -645,9 +645,8 @@ static BOOL isOverlayShown = YES; - (void)didLoad { %orig; - ASTextNode *textNode = (ASTextNode *)self; - if (kCopyCommentText && [[self valueForKey:@"_accessibilityIdentifier"] isEqualToString:@"id.comment.content.label"]) { + ASTextNode *textNode = (ASTextNode *)self; NSString *comment = textNode.attributedText.string; NSMutableArray *allObjects = self.supernodes.allObjects; @@ -658,15 +657,77 @@ static BOOL isOverlayShown = YES; } } } + + if (kPostManager && [self isKindOfClass:NSClassFromString(@"ELMExpandableTextNode")]) { + ELMExpandableTextNode *expandableTextNode = (ELMExpandableTextNode *)self; + ASTextNode *textNode = (ASTextNode *)expandableTextNode.currentTextNode; + + NSString *text = textNode.attributedText.string; + + NSMutableArray *allObjects = self.supernodes.allObjects; + for (ELMContainerNode *containerNode in allObjects) { + if ([containerNode.description containsString:@"id.ui.backstage.original_post"] && text) { + containerNode.copiedComment = text; + break; + } + } + } } %end +static void downloadImageFromURL(UIResponder *responder, NSURL *URL) { + NSString *URLString = URL.absoluteString; + + if (kFixAlbums && [URLString hasPrefix:@"https://yt3."]) { + URLString = [URLString stringByReplacingOccurrencesOfString:@"https://yt3." withString:@"https://yt4."]; + } + + NSURL *downloadURL = nil; + if ([URLString containsString:@"c-fcrop"]) { + NSRange croppedURL = [URLString rangeOfString:@"c-fcrop"]; + if (croppedURL.location != NSNotFound) { + NSString *newURL = [URLString stringByReplacingOccurrencesOfString:[URLString substringFromIndex:croppedURL.location] withString:@"nd-v1"]; + downloadURL = [NSURL URLWithString:newURL]; + } + } else { + downloadURL = URL; + } + + NSURLSession *session = [NSURLSession sharedSession]; + [[session dataTaskWithURL:downloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (data) { + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ + PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; + [request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil]; + } completionHandler:^(BOOL success, NSError *error) { + [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send]; + }]; + } else { + [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send]; + } + }] resume]; +} + +static void genImageFromLayer(CALayer *layer, UIColor *backgroundColor, void (^completionHandler)(UIImage *)) { + UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0.0); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context, backgroundColor.CGColor); + CGContextFillRect(context, CGRectMake(0, 0, layer.frame.size.width, layer.frame.size.height)); + [layer renderInContext:context]; + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + if (completionHandler) { + completionHandler(image); + } +} + %hook _ASDisplayView - (void)setKeepalive_node:(id)arg1 { %orig; NSArray *gesturesInfo = @[ - @{@"selector": @"copyText:", @"text": @"ELMExpandableTextNode-View", @"key": @(kCopyPostText)}, + @{@"selector": @"postManager:", @"text": @"id.ui.backstage.original_post", @"key": @(kPostManager)}, @{@"selector": @"saveImage:", @"text": @"YTImageZoomNode-View", @"key": @(kSavePostImage)}, @{@"selector": @"savePFP:", @"text": @"ELMImageNode-View", @"key": @(kSaveProfilePhoto)}, @{@"selector": @"copyComment:", @"text": @"id.ui.comment_cell", @"key": @(kCopyCommentText)} @@ -713,13 +774,46 @@ static BOOL isOverlayShown = YES; } %new -- (void)copyText:(UILongPressGestureRecognizer *)sender { +- (void)postManager:(UILongPressGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { - [UIPasteboard generalPasteboard].string = self.accessibilityLabel; + ELMContainerNode *nodeForLayer = (ELMContainerNode *)self.keepalive_node.yogaChildren[0]; + ELMContainerNode *containerNode = (ELMContainerNode *)self.keepalive_node; + NSString *text = containerNode.copiedComment; + CALayer *layer = nodeForLayer.layer; + UIColor *backgroundColor = containerNode.closestViewController.view.backgroundColor; - UIResponder *responder = self.nextResponder; - while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; - if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:responder] send]; + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:LOC(@"SelectAction") message:nil preferredStyle:UIAlertControllerStyleActionSheet]; + alertController.view.tintColor = [UIColor labelColor]; + + [alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyPostText") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { + if (text) { + [UIPasteboard generalPasteboard].string = text; + [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send]; + } + }]]; + + [alertController addAction:[UIAlertAction actionWithTitle:LOC(@"SavePostAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { + genImageFromLayer(layer, backgroundColor, ^(UIImage *image) { + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ + PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAssetFromImage:image]; + request.creationDate = [NSDate date]; + } completionHandler:^(BOOL success, NSError *error) { + NSString *message = success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription]; + [[%c(YTToastResponderEvent) eventWithMessage:message firstResponder:containerNode.closestViewController] send]; + }]; + }); + }]]; + + [alertController addAction:[UIAlertAction actionWithTitle:LOC(@"CopyPostAsImage") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { + genImageFromLayer(layer, backgroundColor, ^(UIImage *image) { + [UIPasteboard generalPasteboard].image = image; + [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:containerNode.closestViewController] send]; + }); + }]]; + + [alertController addAction:[UIAlertAction actionWithTitle:LOC(@"Cancel") style:UIAlertActionStyleCancel handler:nil]]; + + [containerNode.closestViewController presentViewController:alertController animated:YES completion:nil]; } } @@ -729,41 +823,11 @@ static BOOL isOverlayShown = YES; ASNetworkImageNode *imageNode = (ASNetworkImageNode *)self.keepalive_node; NSURL *imageURL = imageNode.URL; - if (imageURL) { - NSString *URLString = imageURL.absoluteString; - - if (kFixAlbums && [URLString hasPrefix:@"https://yt3."]) { - URLString = [URLString stringByReplacingOccurrencesOfString:@"https://yt3." withString:@"https://yt4."]; - } - NSURL *downloadURL = nil; - if ([URLString containsString:@"c-fcrop"]) { - NSRange croppedURL = [URLString rangeOfString:@"c-fcrop"]; - if (croppedURL.location != NSNotFound) { - NSString *newURL = [URLString stringByReplacingOccurrencesOfString:[URLString substringFromIndex:croppedURL.location] withString:@"nd-v1"]; - downloadURL = [NSURL URLWithString:newURL]; - } - } else { - downloadURL = imageURL; - } - - UIResponder *responder = self.nextResponder; - while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; + UIResponder *responder = self.nextResponder; + while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; - NSURLSession *session = [NSURLSession sharedSession]; - [[session dataTaskWithURL:downloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (data) { - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; - [request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil]; - } completionHandler:^(BOOL success, NSError *error) { - if (responder) [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send]; - }]; - } else { - if (responder) [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send]; - } - }] resume]; - } + if (imageURL) downloadImageFromURL(responder, imageURL); } } @@ -1067,7 +1131,7 @@ static void reloadPrefs() { kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES; kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO; kCopyVideoInfo = [prefs[@"copyVideoInfo"] boolValue] ?: NO; - kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO; + kPostManager = [prefs[@"postManager"] boolValue] ?: NO; kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO; kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO; kCopyCommentText = [prefs[@"copyCommentText"] boolValue] ?: NO; @@ -1153,7 +1217,7 @@ static void reloadPrefs() { @"removeUploads" : @(kRemoveUploads), @"removeLibrary" : @(kRemoveLibrary), @"copyVideoInfo" : @(kCopyVideoInfo), - @"copyPostText" : @(kCopyPostText), + @"postManager" : @(kPostManager), @"savePostImage" : @(kSavePostImage), @"saveProfilePhoto" : @(kSaveProfilePhoto), @"copyCommentText" : @(kCopyCommentText), diff --git a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings index 7174861a..13a3ab86 100644 --- a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "Other"; "CopyVideoInfo" = "Copy video information"; "CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel."; -"CopyPostText" = "Copy community posts text"; -"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"PostManager" = "Save post information"; +"PostManagerDesc" = "Allows to copy post text and save post as image by long tap."; "SavePostImage" = "Save image from community posts"; "SavePostImageDesc" = "Saves community post image to the Photos app by long tap."; "SaveProfilePhoto" = "Save profile picture"; @@ -206,6 +206,9 @@ "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"; "Saved" = "Saved to Photos"; diff --git a/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings index 29d88171..48017c60 100644 --- a/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "Otro"; "CopyVideoInfo" = "Copy video information"; "CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel."; -"CopyPostText" = "Copia el texto de las publicaciones de la comunidad"; -"CopyPostTextDesc" = "Copia el texto de los posts de la comunidad al portapapeles mediante pulsación larga"; +"PostManager" = "Save post information"; +"PostManagerDesc" = "Allows to copy post text and save post as image by long tap."; "SavePostImage" = "Guardar imagen de las entradas de la comunidad"; "SavePostImageDesc" = "Guarda la imagen de las publicaciones de la comunidad en la aplicación Fotos con un toque prolongado"; "SaveProfilePhoto" = "Guardar foto de perfil"; @@ -206,6 +206,9 @@ "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"; "Done" = "Done"; diff --git a/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings index bd38d218..c384aa65 100644 --- a/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "Autre"; "CopyVideoInfo" = "Copier les informations vidéo"; "CopyVideoInfoDesc" = "Ajout d'un bouton permettant de copier le titre et la description de la vidéo dans le panneau Description de la vidéo."; -"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."; +"PostManager" = "Save post information"; +"PostManagerDesc" = "Allows to copy post text and save post as image by long tap."; "SavePostImage" = "Enregistrer l'image des publications de la communauté"; "SavePostImageDesc" = "Enregistre l'image des publications de la communauté dans l'application Photos en appuyant longuement."; "SaveProfilePhoto" = "Enregistrer la photo de profil"; @@ -206,6 +206,9 @@ "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"; "Saved" = "Enregistré dans Photos"; diff --git a/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings index bc20ae16..513a916d 100644 --- a/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "その他"; "CopyVideoInfo" = "Copy video information"; "CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel."; -"CopyPostText" = "Copy community posts text"; -"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"PostManager" = "Save post information"; +"PostManagerDesc" = "Allows to copy post text and save post as image by long tap."; "SavePostImage" = "Save community posts image"; "SavePostImageDesc" = "Saves community posts image to the Photos app by long tap."; "SaveProfilePhoto" = "Save profile picture"; @@ -206,6 +206,9 @@ "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"; "Saved" = "Saved to Photos"; diff --git a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings index 8499a066..6100ca1c 100644 --- a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "Другие настройки"; "CopyVideoInfo" = "Копировать информацию о видео"; "CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео."; -"CopyPostText" = "Копировать текст постов"; -"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием."; +"PostManager" = "Сохранять информацию с постов"; +"PostManagerDesc" = "Позволяет скопировать текст из поста или сохранить пост как фото долгим нажатием по нему."; "SavePostImage" = "Сохранять изображения постов"; "SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним."; "SaveProfilePhoto" = "Сохранять фото профиля"; @@ -206,6 +206,9 @@ "SelectAction" = "Выберите действие"; "CopyTitle" = "Скопировать название"; "CopyDescription" = "Скопировать описание"; +"CopyPostText" = "Копировать текст поста"; +"SavePostAsImage" = "Сохранить пост как фото"; +"CopyPostAsImage" = "Скопировать пост как фото"; "Cancel" = "Отмена"; "Copied" = "Скопировано в буфер обмена"; "Saved" = "Сохранено в Фото"; diff --git a/layout/Library/Application Support/YTLite.bundle/vi.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/vi.lproj/Localizable.strings index 7aadc133..02fcdd8d 100644 --- a/layout/Library/Application Support/YTLite.bundle/vi.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/vi.lproj/Localizable.strings @@ -145,8 +145,8 @@ "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."; -"CopyPostText" = "Sao chép văn bản bài đăng trên cộng đồng"; -"CopyPostTextDesc" = "Sao chép văn bản bài đăng của cộng đồng vào bảng tạm bằng cách nhấn giữ."; +"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ơ"; @@ -206,6 +206,9 @@ "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"; diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings index d472d323..28eb3e98 100644 --- a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "其他"; "CopyVideoInfo" = "复制视频信息"; "CopyVideoInfoDesc" = "添加按钮从“视频说明”面板中复制视频的标题和描述。"; -"CopyPostText" = "复制社区帖子文本"; -"CopyPostTextDesc" = "长按社区帖子文本复制到剪贴板。"; +"PostManager" = "Save post information"; +"PostManagerDesc" = "Allows to copy post text and save post as image by long tap."; "SavePostImage" = "保存社区帖子图片"; "SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。"; "SaveProfilePhoto" = "保存个人资料图片"; @@ -192,7 +192,7 @@ "French" = "法语本地化"; "Spanish" = "西班牙语本地化"; "Japanese" = "日语本地化"; -"Vietnamese" = "Vietnamese localization"; +"Vietnamese" = "越南语本地化"; "Advanced" = "高级模式"; "AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。"; "ClearCache" = "清除缓存"; @@ -206,8 +206,11 @@ "SelectAction" = "选择操作"; "CopyTitle" = "复制标题"; "CopyDescription" = "复制描述"; +"CopyPostText" = "Copy post text"; +"SavePostAsImage" = "Save post as image"; +"CopyPostAsImage" = "Copy post as image"; "Cancel" = "取消"; "Copied" = "已复制到剪贴板"; "Saved" = "已保存到照片"; "Done" = "完成"; -"Error" = "错误"; +"Error" = "错误"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings index 46c3d356..66f57e45 100644 --- a/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings @@ -145,8 +145,8 @@ "Other" = "其它"; "CopyVideoInfo" = "複製影片資訊"; "CopyVideoInfoDesc" = "新增按鈕將影片標題和說明,複製到影片說明欄"; -"CopyPostText" = "複製社群貼文文字"; -"CopyPostTextDesc" = "長按社群貼文文字複製到剪貼簿"; +"PostManager" = "Save post information"; +"PostManagerDesc" = "Allows to copy post text and save post as image by long tap."; "SavePostImage" = "儲存社群貼文圖片"; "SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用"; "SaveProfilePhoto" = "儲存個人檔案照片"; @@ -206,6 +206,9 @@ "SelectAction" = "選擇動作"; "CopyTitle" = "複製標題"; "CopyDescription" = "複製說明"; +"CopyPostText" = "Copy post text"; +"SavePostAsImage" = "Save post as image"; +"CopyPostAsImage" = "Copy post as image"; "Cancel" = "取消"; "Copied" = "已複製到剪貼簿"; "Saved" = "已儲存到照片應用"; diff --git a/packages/com.dvntm.ytlite_2.6.2_iphoneos-arm.deb b/packages/com.dvntm.ytlite_2.6.2_iphoneos-arm.deb new file mode 100644 index 00000000..e47c7a71 Binary files /dev/null and b/packages/com.dvntm.ytlite_2.6.2_iphoneos-arm.deb differ diff --git a/packages/com.dvntm.ytlite_2.6.2_iphoneos-arm64.deb b/packages/com.dvntm.ytlite_2.6.2_iphoneos-arm64.deb new file mode 100644 index 00000000..6310477e Binary files /dev/null and b/packages/com.dvntm.ytlite_2.6.2_iphoneos-arm64.deb differ