Merge branch 'YTLitePlus:main' into main
This commit is contained in:
commit
e5cd356b2b
24 changed files with 1072 additions and 672 deletions
2
Makefile
2
Makefile
|
|
@ -27,7 +27,7 @@ SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tw
|
||||||
include $(THEOS_MAKE_PATH)/aggregate.mk
|
include $(THEOS_MAKE_PATH)/aggregate.mk
|
||||||
|
|
||||||
YTLITE_PATH = Tweaks/YTLite
|
YTLITE_PATH = Tweaks/YTLite
|
||||||
YTLITE_VERSION := $(shell wget -qO- "https://github.com/dayanch96/YTLite/releases/latest" | grep -o -E '/tag/v[^"]+' | head -n 1 | sed 's/\/tag\/v//')
|
YTLITE_VERSION := 5.0.1
|
||||||
YTLITE_DEB = $(YTLITE_PATH)/com.dvntm.ytlite_$(YTLITE_VERSION)_iphoneos-arm64.deb
|
YTLITE_DEB = $(YTLITE_PATH)/com.dvntm.ytlite_$(YTLITE_VERSION)_iphoneos-arm64.deb
|
||||||
YTLITE_DYLIB = $(YTLITE_PATH)/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib
|
YTLITE_DYLIB = $(YTLITE_PATH)/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib
|
||||||
YTLITE_BUNDLE = $(YTLITE_PATH)/var/jb/Library/Application\ Support/YTLite.bundle
|
YTLITE_BUNDLE = $(YTLITE_PATH)/var/jb/Library/Application\ Support/YTLite.bundle
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
|
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
|
||||||
#import "../Tweaks/YouTubeHeader/YTUIUtils.h"
|
#import "../Tweaks/YouTubeHeader/YTUIUtils.h"
|
||||||
#import "../Tweaks/YouTubeHeader/YTSettingsPickerViewController.h"
|
#import "../Tweaks/YouTubeHeader/YTSettingsPickerViewController.h"
|
||||||
|
#import "SettingsKeys.h"
|
||||||
// #import "AppIconOptionsController.h"
|
// #import "AppIconOptionsController.h"
|
||||||
|
|
||||||
// Basic switch item
|
// Basic switch item
|
||||||
|
|
@ -41,23 +42,10 @@ static int appVersionSpoofer() {
|
||||||
|
|
||||||
@interface YTSettingsSectionItemManager (YTLitePlus)
|
@interface YTSettingsSectionItemManager (YTLitePlus)
|
||||||
- (void)updateYTLitePlusSectionWithEntry:(id)entry;
|
- (void)updateYTLitePlusSectionWithEntry:(id)entry;
|
||||||
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls;
|
|
||||||
- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller;
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
extern NSBundle *YTLitePlusBundle();
|
extern NSBundle *YTLitePlusBundle();
|
||||||
|
|
||||||
// Keys for "Copy Settings" button (for: YTLitePlus)
|
|
||||||
NSArray *copyKeys = @[
|
|
||||||
/* MAIN Controls Keys 1/2 */ @"enableShareButton_enabled", @"enableSaveToButton_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled", @"hideRightPanel_enabled", @"hideHeatwaves_enabled", @"disableAmbientModePortrait_enabled",
|
|
||||||
/* MAIN Controls Keys 2/2 */ @"disableAmbientModeFullscreen_enabled", @"fullscreenToTheRight_enabled", @"seekAnywhere_enabled", @"YTTapToSeek_enabled", @"disablePullToFull_enabled", @"alwaysShowRemainingTime_enabled", @"disableRemainingTime_enabled", @"disableEngagementOverlay_enabled",
|
|
||||||
/* MAIN App Overlay Keys 1/2 */ @"disableAccountSection_enabled", @"disableAutoplaySection_enabled", @"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled", @"disableNotificationsSection_enabled",
|
|
||||||
/* MAIN App Overlay Keys 2/2 */ @"disableManageAllHistorySection_enabled", @"disableYourDataInYouTubeSection_enabled", @"disablePrivacySection_enabled", @"disableLiveChatSection_enabled",
|
|
||||||
/* MAIN Playback Keys */ @"inline_muted_playback_enabled",
|
|
||||||
/* MAIN Misc Keys */ @"newSettingsUI_enabled", @"ytStartupAnimation_enabled", @"ytNoModernUI_enabled", @"iPadLayout_enabled", @"iPhoneLayout_enabled", @"castConfirm_enabled", @"bigYTMiniPlayer_enabled", @"hideCastButton_enabled", @"hideSponsorBlockButton_enabled", @"hideHomeTab_enabled", @"fixCasting_enabled", @"flex_enabled", @"enableVersionSpoofer_enabled",
|
|
||||||
/* TWEAK YTUHD Keys */ @"EnableVP9", @"AllVP9"
|
|
||||||
];
|
|
||||||
|
|
||||||
// Add both YTLite and YTLitePlus to YouGroupSettings
|
// Add both YTLite and YTLitePlus to YouGroupSettings
|
||||||
static const NSInteger YTLitePlusSection = 788;
|
static const NSInteger YTLitePlusSection = 788;
|
||||||
static const NSInteger YTLiteSection = 789;
|
static const NSInteger YTLiteSection = 789;
|
||||||
|
|
@ -115,19 +103,24 @@ static const NSInteger YTLiteSection = 789;
|
||||||
}];
|
}];
|
||||||
[sectionItems addObject:main];
|
[sectionItems addObject:main];
|
||||||
|
|
||||||
|
# pragma mark - Copy and Paste Settings
|
||||||
YTSettingsSectionItem *copySettings = [%c(YTSettingsSectionItem)
|
YTSettingsSectionItem *copySettings = [%c(YTSettingsSectionItem)
|
||||||
itemWithTitle:LOC(@"COPY_SETTINGS")
|
itemWithTitle:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"EXPORT_SETTINGS") : LOC(@"COPY_SETTINGS")
|
||||||
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"COPY_SETTINGS_DESC_2") : LOC(@"COPY_SETTINGS_DESC")
|
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"EXPORT_SETTINGS_DESC") : LOC(@"COPY_SETTINGS_DESC")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:nil
|
||||||
detailTextBlock:nil
|
detailTextBlock:nil
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
if (IS_ENABLED(@"switchCopyandPasteFunctionality_enabled")) {
|
if (IS_ENABLED(@"switchCopyandPasteFunctionality_enabled")) {
|
||||||
// Export Settings functionality
|
// Export Settings functionality
|
||||||
NSURL *tempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"exported_settings.txt"]];
|
NSURL *tempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"YTLitePlusSettings.txt"]];
|
||||||
NSMutableString *settingsString = [NSMutableString string];
|
NSMutableString *settingsString = [NSMutableString string];
|
||||||
for (NSString *key in copyKeys) {
|
for (NSString *key in NSUserDefaultsCopyKeys) {
|
||||||
id value = [[NSUserDefaults standardUserDefaults] objectForKey:key];
|
id value = [[NSUserDefaults standardUserDefaults] objectForKey:key];
|
||||||
if (value) {
|
id defaultValue = NSUserDefaultsCopyKeysDefaults[key];
|
||||||
|
|
||||||
|
// Only include the setting if it is different from the default value
|
||||||
|
// If no default value is found, include it by default
|
||||||
|
if (value && (!defaultValue || ![value isEqual:defaultValue])) {
|
||||||
[settingsString appendFormat:@"%@: %@\n", key, value];
|
[settingsString appendFormat:@"%@: %@\n", key, value];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -140,23 +133,41 @@ static const NSInteger YTLiteSection = 789;
|
||||||
// Copy Settings functionality (DEFAULT - Copies to Clipboard)
|
// Copy Settings functionality (DEFAULT - Copies to Clipboard)
|
||||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||||
NSMutableString *settingsString = [NSMutableString string];
|
NSMutableString *settingsString = [NSMutableString string];
|
||||||
for (NSString *key in copyKeys) {
|
for (NSString *key in NSUserDefaultsCopyKeys) {
|
||||||
if ([userDefaults objectForKey:key]) {
|
id value = [userDefaults objectForKey:key];
|
||||||
NSString *value = [userDefaults objectForKey:key];
|
id defaultValue = NSUserDefaultsCopyKeysDefaults[key];
|
||||||
|
|
||||||
|
// Only include the setting if it is different from the default value
|
||||||
|
// If no default value is found, include it by default
|
||||||
|
if (value && (!defaultValue || ![value isEqual:defaultValue])) {
|
||||||
[settingsString appendFormat:@"%@: %@\n", key, value];
|
[settingsString appendFormat:@"%@: %@\n", key, value];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[[UIPasteboard generalPasteboard] setString:settingsString];
|
[[UIPasteboard generalPasteboard] setString:settingsString];
|
||||||
// Show a confirmation message or perform some other action here
|
// Show a confirmation message or perform some other action here
|
||||||
|
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings copied"]];
|
||||||
|
|
||||||
|
// Show an option to export YouTube Plus settings
|
||||||
|
UIAlertController *exportAlert = [UIAlertController alertControllerWithTitle:@"Export Settings"
|
||||||
|
message:@"Note: This feature cannot save iSponsorBlock and most YouTube settings.\n\nWould you like to also export your YouTube Plus Settings?"
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
|
||||||
|
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Export" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
// Export YouTube Plus Settings functionality
|
||||||
|
[%c(YTLUserDefaults) exportYtlSettings];
|
||||||
|
}]];
|
||||||
|
// Present the alert from the root view controller
|
||||||
|
[settingsViewController presentViewController:exportAlert animated:YES completion:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
[sectionItems addObject:copySettings];
|
[sectionItems addObject:copySettings];
|
||||||
|
|
||||||
YTSettingsSectionItem *pasteSettings = [%c(YTSettingsSectionItem)
|
YTSettingsSectionItem *pasteSettings = [%c(YTSettingsSectionItem)
|
||||||
itemWithTitle:LOC(@"PASTE_SETTINGS")
|
itemWithTitle:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"IMPORT_SETTINGS") : LOC(@"PASTE_SETTINGS")
|
||||||
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"PASTE_SETTINGS_DESC_2") : LOC(@"PASTE_SETTINGS_DESC")
|
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"IMPORT_SETTINGS_DESC") : LOC(@"PASTE_SETTINGS_DESC")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:nil
|
||||||
detailTextBlock:nil
|
detailTextBlock:nil
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
|
@ -166,7 +177,6 @@ static const NSInteger YTLiteSection = 789;
|
||||||
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
|
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
|
||||||
documentPicker.allowsMultipleSelection = NO;
|
documentPicker.allowsMultipleSelection = NO;
|
||||||
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
|
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
|
||||||
return YES;
|
|
||||||
} else {
|
} else {
|
||||||
// Paste Settings functionality (DEFAULT - Pastes from Clipboard)
|
// Paste Settings functionality (DEFAULT - Pastes from Clipboard)
|
||||||
UIAlertController *confirmPasteAlert = [UIAlertController alertControllerWithTitle:LOC(@"PASTE_SETTINGS_ALERT") message:nil preferredStyle:UIAlertControllerStyleAlert];
|
UIAlertController *confirmPasteAlert = [UIAlertController alertControllerWithTitle:LOC(@"PASTE_SETTINGS_ALERT") message:nil preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
|
@ -182,41 +192,26 @@ static const NSInteger YTLiteSection = 789;
|
||||||
NSString *value = components[1];
|
NSString *value = components[1];
|
||||||
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
|
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[settingsViewController reloadData];
|
[settingsViewController reloadData];
|
||||||
// Show a confirmation message or perform some other action here
|
// Show a confirmation toast
|
||||||
|
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings applied"]];
|
||||||
|
// Show a reminder to import YouTube Plus settings as well
|
||||||
|
UIAlertController *reminderAlert = [UIAlertController alertControllerWithTitle:@"Reminder"
|
||||||
|
message:@"Remember to import your YouTube Plus settings as well"
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
[reminderAlert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
|
||||||
|
[settingsViewController presentViewController:reminderAlert animated:YES completion:nil];
|
||||||
}
|
}
|
||||||
}]];
|
}]];
|
||||||
[settingsViewController presentViewController:confirmPasteAlert animated:YES completion:nil];
|
[settingsViewController presentViewController:confirmPasteAlert animated:YES completion:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
[sectionItems addObject:pasteSettings];
|
[sectionItems addObject:pasteSettings];
|
||||||
|
|
||||||
YTSettingsSectionItem *videoPlayer = [%c(YTSettingsSectionItem)
|
|
||||||
itemWithTitle:LOC(@"VIDEO_PLAYER")
|
|
||||||
titleDescription:LOC(@"VIDEO_PLAYER_DESC")
|
|
||||||
accessibilityIdentifier:nil
|
|
||||||
detailTextBlock:nil
|
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
// Access the current view controller
|
|
||||||
UIViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
|
||||||
if (settingsViewController) {
|
|
||||||
// Present the video picker
|
|
||||||
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeMovie, (NSString *)kUTTypeVideo] inMode:UIDocumentPickerModeImport];
|
|
||||||
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
|
|
||||||
documentPicker.allowsMultipleSelection = NO;
|
|
||||||
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
|
|
||||||
} else {
|
|
||||||
NSLog(@"settingsViewController is nil");
|
|
||||||
}
|
|
||||||
|
|
||||||
return YES; // Return YES to indicate that the action was handled
|
|
||||||
}
|
|
||||||
];
|
|
||||||
[sectionItems addObject:videoPlayer];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
YTSettingsSectionItem *appIcon = [%c(YTSettingsSectionItem)
|
YTSettingsSectionItem *appIcon = [%c(YTSettingsSectionItem)
|
||||||
itemWithTitle:LOC(@"CHANGE_APP_ICON")
|
itemWithTitle:LOC(@"CHANGE_APP_ICON")
|
||||||
|
|
@ -397,9 +392,11 @@ static const NSInteger YTLiteSection = 789;
|
||||||
createSectionGestureSelector(@"BOTTOM_SECTION", @"playerGestureBottomSelection"),
|
createSectionGestureSelector(@"BOTTOM_SECTION", @"playerGestureBottomSelection"),
|
||||||
// Pickers for configuration settings
|
// Pickers for configuration settings
|
||||||
deadzonePicker,
|
deadzonePicker,
|
||||||
sensitivityPicker
|
sensitivityPicker,
|
||||||
|
// Toggle for haptic feedback
|
||||||
|
BASIC_SWITCH(LOC(@"PLAYER_GESTURES_HAPTIC_FEEDBACK"), nil, @"playerGesturesHapticFeedback_enabled"),
|
||||||
];
|
];
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Player Gestures (Beta)") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"PLAYER_GESTURES_TITLE") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
@ -652,6 +649,7 @@ static const NSInteger YTLiteSection = 789;
|
||||||
BASIC_SWITCH(LOC(@"CAST_CONFIRM"), LOC(@"CAST_CONFIRM_DESC"), @"castConfirm_enabled"),
|
BASIC_SWITCH(LOC(@"CAST_CONFIRM"), LOC(@"CAST_CONFIRM_DESC"), @"castConfirm_enabled"),
|
||||||
BASIC_SWITCH(LOC(@"NEW_MINIPLAYER_STYLE"), LOC(@"NEW_MINIPLAYER_STYLE_DESC"), @"bigYTMiniPlayer_enabled"),
|
BASIC_SWITCH(LOC(@"NEW_MINIPLAYER_STYLE"), LOC(@"NEW_MINIPLAYER_STYLE_DESC"), @"bigYTMiniPlayer_enabled"),
|
||||||
BASIC_SWITCH(LOC(@"HIDE_CAST_BUTTON"), LOC(@"HIDE_CAST_BUTTON_DESC"), @"hideCastButton_enabled"),
|
BASIC_SWITCH(LOC(@"HIDE_CAST_BUTTON"), LOC(@"HIDE_CAST_BUTTON_DESC"), @"hideCastButton_enabled"),
|
||||||
|
BASIC_SWITCH(LOC(@"VIDEO_PLAYER_BUTTON"), LOC(@"VIDEO_PLAYER_BUTTON_DESC"), @"videoPlayerButton_enabled"),
|
||||||
BASIC_SWITCH(LOC(@"HIDE_SPONSORBLOCK_BUTTON"), LOC(@"HIDE_SPONSORBLOCK_BUTTON_DESC"), @"hideSponsorBlockButton_enabled"),
|
BASIC_SWITCH(LOC(@"HIDE_SPONSORBLOCK_BUTTON"), LOC(@"HIDE_SPONSORBLOCK_BUTTON_DESC"), @"hideSponsorBlockButton_enabled"),
|
||||||
BASIC_SWITCH(LOC(@"HIDE_HOME_TAB"), LOC(@"HIDE_HOME_TAB_DESC"), @"hideHomeTab_enabled"),
|
BASIC_SWITCH(LOC(@"HIDE_HOME_TAB"), LOC(@"HIDE_HOME_TAB_DESC"), @"hideHomeTab_enabled"),
|
||||||
BASIC_SWITCH(LOC(@"FIX_CASTING"), LOC(@"FIX_CASTING_DESC"), @"fixCasting_enabled"),
|
BASIC_SWITCH(LOC(@"FIX_CASTING"), LOC(@"FIX_CASTING_DESC"), @"fixCasting_enabled"),
|
||||||
|
|
@ -682,27 +680,55 @@ static const NSInteger YTLiteSection = 789;
|
||||||
// Implement the delegate method for document picker
|
// Implement the delegate method for document picker
|
||||||
%new
|
%new
|
||||||
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
|
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
|
||||||
NSURL *pickedURL = [urls firstObject];
|
if (urls.count > 0) {
|
||||||
|
NSURL *pickedURL = [urls firstObject];
|
||||||
if (pickedURL) {
|
NSError *error;
|
||||||
// Use AVPlayerViewController to play the video
|
// Check which mode the document picker is in
|
||||||
AVPlayer *player = [AVPlayer playerWithURL:pickedURL];
|
if (controller.documentPickerMode == UIDocumentPickerModeImport) {
|
||||||
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
|
// Import mode: Handle the import of settings from a text file
|
||||||
playerViewController.player = player;
|
NSString *fileType = [pickedURL resourceValuesForKeys:@[NSURLTypeIdentifierKey] error:&error][NSURLTypeIdentifierKey];
|
||||||
|
|
||||||
UIViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
if (UTTypeConformsTo((__bridge CFStringRef)fileType, kUTTypePlainText)) {
|
||||||
if (settingsViewController) {
|
NSString *fileContents = [NSString stringWithContentsOfURL:pickedURL encoding:NSUTF8StringEncoding error:nil];
|
||||||
[settingsViewController presentViewController:playerViewController animated:YES completion:^{
|
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
|
||||||
[player play];
|
for (NSString *line in lines) {
|
||||||
}];
|
NSArray *components = [line componentsSeparatedByString:@": "];
|
||||||
|
if (components.count == 2) {
|
||||||
|
NSString *key = components[0];
|
||||||
|
NSString *value = components[1];
|
||||||
|
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Reload settings view after importing
|
||||||
|
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
// Show a confirmation message or perform some other action here
|
||||||
|
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings applied"]];
|
||||||
|
// Show a reminder to import YouTube Plus settings as well
|
||||||
|
UIAlertController *reminderAlert = [UIAlertController alertControllerWithTitle:@"Reminder"
|
||||||
|
message:@"Remember to import your YouTube Plus settings as well"
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
[reminderAlert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
|
||||||
|
[settingsViewController presentViewController:reminderAlert animated:YES completion:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (controller.documentPickerMode == UIDocumentPickerModeExportToService || controller.documentPickerMode == UIDocumentPickerModeMoveToService) {
|
||||||
|
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings saved"]];
|
||||||
|
// Export mode: Display a reminder to save YouTube Plus settings
|
||||||
|
UIAlertController *exportAlert = [UIAlertController alertControllerWithTitle:@"Export Settings"
|
||||||
|
message:@"Note: This feature cannot save iSponsorBlock and most YouTube settings.\n\nWould you like to also export your YouTube Plus Settings?"
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
|
||||||
|
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Export" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||||
|
// Export YouTube Plus Settings functionality
|
||||||
|
[%c(YTLUserDefaults) exportYtlSettings];
|
||||||
|
}]];
|
||||||
|
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
||||||
|
// Present the alert from the root view controller
|
||||||
|
[settingsViewController presentViewController:exportAlert animated:YES completion:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%new
|
|
||||||
- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
|
|
||||||
// Handle cancellation if needed
|
|
||||||
NSLog(@"Document picker was cancelled");
|
|
||||||
}
|
|
||||||
|
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
|
|
||||||
55
Source/SettingsKeys.h
Normal file
55
Source/SettingsKeys.h
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
#import "../YTLitePlus.h"
|
||||||
|
|
||||||
|
// Keys for "Copy Settings" button (for: YTLitePlus)
|
||||||
|
// In alphabetical order for tweaks after YTLitePlus
|
||||||
|
NSArray *NSUserDefaultsCopyKeys = @[
|
||||||
|
// YTLitePlus - gathered using get_keys.py
|
||||||
|
@"YTTapToSeek_enabled", @"alwaysShowRemainingTime_enabled", @"bigYTMiniPlayer_enabled", @"castConfirm_enabled",
|
||||||
|
@"disableAccountSection_enabled", @"disableAmbientModeFullscreen_enabled",
|
||||||
|
@"disableAmbientModePortrait_enabled", @"disableAutoplaySection_enabled", @"disableCollapseButton_enabled",
|
||||||
|
@"disableEngagementOverlay_enabled", @"disableLiveChatSection_enabled",
|
||||||
|
@"disableManageAllHistorySection_enabled", @"disableNotificationsSection_enabled",
|
||||||
|
@"disablePrivacySection_enabled", @"disablePullToFull_enabled", @"disableRemainingTime_enabled",
|
||||||
|
@"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled",
|
||||||
|
@"disableYourDataInYouTubeSection_enabled", @"enableSaveToButton_enabled", @"enableShareButton_enabled",
|
||||||
|
@"enableVersionSpoofer_enabled", @"fixCasting_enabled", @"flex_enabled", @"fullscreenToTheRight_enabled",
|
||||||
|
@"hideAutoplayMiniPreview_enabled", @"hideCastButton_enabled", @"hideHUD_enabled", @"hideHeatwaves_enabled",
|
||||||
|
@"hideHomeTab_enabled", @"hidePreviewCommentSection_enabled", @"hideRightPanel_enabled",
|
||||||
|
@"hideSpeedToast_enabled", @"hideSponsorBlockButton_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled",
|
||||||
|
@"iPadLayout_enabled", @"iPhoneLayout_enabled", @"inline_muted_playback_enabled", @"lowContrastMode_enabled",
|
||||||
|
@"newSettingsUI_enabled", @"oledKeyBoard_enabled", @"playerGesturesHapticFeedback_enabled",
|
||||||
|
@"playerGestures_enabled", @"seekAnywhere_enabled", @"switchCopyandPasteFunctionality_enabled",
|
||||||
|
@"videoPlayerButton_enabled", @"ytNoModernUI_enabled", @"ytStartupAnimation_enabled",
|
||||||
|
// DEMC - https://github.com/therealFoxster/DontEatMyContent/blob/master/Tweak.h
|
||||||
|
@"DEMC_enabled", @"DEMC_colorViewsEnabled", @"DEMC_safeAreaConstant", @"DEMC_disableAmbientMode",
|
||||||
|
@"DEMC_limitZoomToFill", @"DEMC_enableForAllVideos",
|
||||||
|
// iSponsorBlock cannot be exported using this method - it is also being removed in v5
|
||||||
|
// Return-YouTube-Dislike - https://github.com/PoomSmart/Return-YouTube-Dislikes/blob/main/TweakSettings.h
|
||||||
|
@"RYD-ENABLED", @"RYD-VOTE-SUBMISSION", @"RYD-EXACT-LIKE-NUMBER", @"RYD-EXACT-NUMBER",
|
||||||
|
// All YTVideoOverlay Tweaks - https://github.com/PoomSmart/YTVideoOverlay/blob/0fc6d29d1aa9e75f8c13d675daec9365f753d45e/Tweak.x#L28C1-L41C84
|
||||||
|
@"YTVideoOverlay-YouLoop-Enabled", @"YTVideoOverlay-YouTimeStamp-Enabled", @"YTVideoOverlay-YouMute-Enabled",
|
||||||
|
@"YTVideoOverlay-YouQuality-Enabled", @"YTVideoOverlay-YouLoop-Position", @"YTVideoOverlay-YouTimeStamp-Position",
|
||||||
|
@"YTVideoOverlay-YouMute-Position", @"YTVideoOverlay-YouQuality-Position",
|
||||||
|
// YouPiP - https://github.com/PoomSmart/YouPiP/blob/main/Header.h
|
||||||
|
@"YouPiPPosition", @"CompatibilityModeKey", @"PiPActivationMethodKey", @"PiPActivationMethod2Key",
|
||||||
|
@"NoMiniPlayerPiPKey", @"NonBackgroundableKey",
|
||||||
|
// YTABConfig cannot be reasonably exported using this method
|
||||||
|
// YTHoldForSpeed will be removed in v5
|
||||||
|
// YouTube Plus / YTLite cannot be exported using this method
|
||||||
|
// YTUHD - https://github.com/PoomSmart/YTUHD/blob/master/Header.h
|
||||||
|
@"EnableVP9", @"AllVP9",
|
||||||
|
// Useful YouTube Keys
|
||||||
|
@"inline_muted_playback_enabled",
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
// Some default values to ignore when exporting settings
|
||||||
|
NSDictionary *NSUserDefaultsCopyKeysDefaults = @{
|
||||||
|
@"fixCasting_enabled": @1,
|
||||||
|
@"inline_muted_playback_enabled": @5,
|
||||||
|
@"newSettingsUI_enabled": @1,
|
||||||
|
@"DEMC_safeAreaConstant": @21.5,
|
||||||
|
@"RYD-ENABLED": @1,
|
||||||
|
@"RYD-VOTE-SUBMISSION": @1,
|
||||||
|
// Duplicate keys are not allowed in NSDictionary. If present, only the last one will be kept.
|
||||||
|
};
|
||||||
100
Source/get_keys.py
Normal file
100
Source/get_keys.py
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
def extract_values_from_file(file_path):
|
||||||
|
"""
|
||||||
|
Extracts keys that match the pattern @\"<some_text>_enabled\" from the given file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path (str): The path to the file to be searched.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: A list of matching keys found in the file.
|
||||||
|
"""
|
||||||
|
# Define the regex pattern to match the strings that resemble the given examples
|
||||||
|
pattern = r'@\"[a-zA-Z0-9_]+_enabled\"'
|
||||||
|
matches = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Read the content of the file
|
||||||
|
with open(file_path, 'r') as file:
|
||||||
|
file_content = file.read()
|
||||||
|
|
||||||
|
# Find all matches
|
||||||
|
matches = re.findall(pattern, file_content)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error reading {file_path}: {e}")
|
||||||
|
|
||||||
|
return matches
|
||||||
|
|
||||||
|
def format_output(keys):
|
||||||
|
"""
|
||||||
|
Formats the keys with indentation and line breaks if the segment exceeds 120 characters (116 excluding indentation).
|
||||||
|
|
||||||
|
Args:
|
||||||
|
keys (list): The list of keys to be formatted.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: A formatted string with the keys.
|
||||||
|
"""
|
||||||
|
indent = " " * 4
|
||||||
|
line_length_limit = 116 # Limit excluding indentation
|
||||||
|
current_line = indent
|
||||||
|
formatted_output = ""
|
||||||
|
|
||||||
|
for key in keys:
|
||||||
|
# Check if adding the next key would exceed the line length limit
|
||||||
|
if len(current_line) + len(key) + 2 > line_length_limit: # +2 accounts for the comma and space
|
||||||
|
# Add the current line to the formatted output and start a new line
|
||||||
|
formatted_output += current_line.rstrip(", ") + ",\n"
|
||||||
|
current_line = indent # Start a new indented line
|
||||||
|
|
||||||
|
# Add the key to the current line
|
||||||
|
current_line += key + ", "
|
||||||
|
|
||||||
|
# Add the last line to the output
|
||||||
|
formatted_output += current_line.rstrip(", ") # Remove trailing comma and space from the final line
|
||||||
|
return formatted_output
|
||||||
|
|
||||||
|
def find_and_extract_keys():
|
||||||
|
"""
|
||||||
|
Recursively searches for .xm and .h files in the parent directory and extracts keys
|
||||||
|
that match the pattern @\"<some_text>_enabled\". The matching keys are then printed
|
||||||
|
with indentation and line breaks if the line exceeds 120 characters.
|
||||||
|
Ignores SettingsKeys.h
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
1. Place this script in the desired directory.
|
||||||
|
2. Run the script with the command: python extract_keys.py
|
||||||
|
3. The script will search for all .xm and .h files in the parent directory and
|
||||||
|
print any matching keys it finds.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
- The script searches the directory where it is located (the parent directory).
|
||||||
|
- It only looks for files with extensions .xm and .h.
|
||||||
|
"""
|
||||||
|
# Get the parent directory
|
||||||
|
parent_directory = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
# Store the found keys
|
||||||
|
found_keys = set() # Use a set to automatically remove duplicates
|
||||||
|
|
||||||
|
# Walk through the parent directory and find all .xm and .h files
|
||||||
|
for root, dirs, files in os.walk(parent_directory):
|
||||||
|
for file in files:
|
||||||
|
if file.endswith(('.xm', '.h')):
|
||||||
|
# Skip SettingsKeys.h
|
||||||
|
if file == "SettingsKeys.h":
|
||||||
|
continue
|
||||||
|
file_path = os.path.join(root, file)
|
||||||
|
found_keys.update(extract_values_from_file(file_path))
|
||||||
|
|
||||||
|
# Print the found keys with formatting
|
||||||
|
if found_keys:
|
||||||
|
sorted_keys = sorted(found_keys)
|
||||||
|
print(format_output(sorted_keys))
|
||||||
|
else:
|
||||||
|
print("No keys found.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
find_and_extract_keys()
|
||||||
29
YTLitePlus.h
29
YTLitePlus.h
|
|
@ -46,6 +46,9 @@
|
||||||
#import "Tweaks/YouTubeHeader/YTMainAppControlsOverlayView.h"
|
#import "Tweaks/YouTubeHeader/YTMainAppControlsOverlayView.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTMultiSizeViewController.h"
|
#import "Tweaks/YouTubeHeader/YTMultiSizeViewController.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTWatchLayerViewController.h"
|
#import "Tweaks/YouTubeHeader/YTWatchLayerViewController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTPageStyleController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTRightNavigationButtons.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTInlinePlayerBarView.h"
|
||||||
|
|
||||||
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
||||||
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
||||||
|
|
@ -127,12 +130,17 @@ typedef NS_ENUM(NSUInteger, GestureSection) {
|
||||||
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
// Hide YouTube Plus incompatibility warning popup - @bhackel
|
||||||
|
@interface HelperVC : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
// Hide Autoplay Mini Preview - @bhackel
|
// Hide Autoplay Mini Preview - @bhackel
|
||||||
@interface YTAutonavPreviewView : UIView
|
@interface YTAutonavPreviewView : UIView
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// OLED Live Chat - @bhackel
|
// OLED Live Chat - @bhackel
|
||||||
@interface YTLUserDefaults : NSUserDefaults
|
@interface YTLUserDefaults : NSUserDefaults
|
||||||
|
+ (void)exportYtlSettings;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// Hide Home Tab - @bhackel
|
// Hide Home Tab - @bhackel
|
||||||
|
|
@ -153,6 +161,10 @@ typedef NS_ENUM(NSUInteger, GestureSection) {
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// Player Gestures - @bhackel
|
// Player Gestures - @bhackel
|
||||||
|
@interface YTFineScrubberFilmstripView : UIView
|
||||||
|
@end
|
||||||
|
@interface YTFineScrubberFilmstripCollectionView : UICollectionView
|
||||||
|
@end
|
||||||
@interface YTPlayerViewController (YTLitePlus) <UIGestureRecognizerDelegate>
|
@interface YTPlayerViewController (YTLitePlus) <UIGestureRecognizerDelegate>
|
||||||
@property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture;
|
@property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture;
|
||||||
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
|
||||||
|
|
@ -162,6 +174,20 @@ typedef NS_ENUM(NSUInteger, GestureSection) {
|
||||||
@interface MPVolumeController : NSObject
|
@interface MPVolumeController : NSObject
|
||||||
@property (nonatomic, assign, readwrite) float volumeValue;
|
@property (nonatomic, assign, readwrite) float volumeValue;
|
||||||
@end
|
@end
|
||||||
|
@interface YTPlayerBarController (YTLitePlus)
|
||||||
|
- (void)didScrub:(UIPanGestureRecognizer *)gestureRecognizer;
|
||||||
|
- (void)startScrubbing;
|
||||||
|
- (void)didScrubToPoint:(CGPoint)point;
|
||||||
|
- (void)endScrubbingForSeekSource:(int)seekSource;
|
||||||
|
@end
|
||||||
|
@interface YTMainAppVideoPlayerOverlayViewController (YTLitePlus)
|
||||||
|
@property (nonatomic, strong, readwrite) YTPlayerBarController *playerBarController;
|
||||||
|
@end
|
||||||
|
@interface YTInlinePlayerBarContainerView (YTLitePlus)
|
||||||
|
@property UIPanGestureRecognizer *scrubGestureRecognizer;
|
||||||
|
@property (nonatomic, strong, readwrite) YTFineScrubberFilmstripView *fineScrubberFilmstrip;
|
||||||
|
- (CGFloat)scrubXForScrubRange:(CGFloat)scrubRange;
|
||||||
|
@end
|
||||||
|
|
||||||
// Hide Collapse Button - @arichornlover
|
// Hide Collapse Button - @arichornlover
|
||||||
@interface YTMainAppControlsOverlayView (YTLitePlus)
|
@interface YTMainAppControlsOverlayView (YTLitePlus)
|
||||||
|
|
@ -172,9 +198,10 @@ typedef NS_ENUM(NSUInteger, GestureSection) {
|
||||||
@interface MDCButton : UIButton
|
@interface MDCButton : UIButton
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTRightNavigationButtons : UIView
|
@interface YTRightNavigationButtons (YTLitePlus)
|
||||||
@property YTQTMButton *notificationButton;
|
@property YTQTMButton *notificationButton;
|
||||||
@property YTQTMButton *sponsorBlockButton;
|
@property YTQTMButton *sponsorBlockButton;
|
||||||
|
@property YTQTMButton *videoPlayerButton;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// BigYTMiniPlayer
|
// BigYTMiniPlayer
|
||||||
|
|
|
||||||
469
YTLitePlus.xm
469
YTLitePlus.xm
|
|
@ -110,12 +110,8 @@ BOOL isSelf() {
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
# pragma mark - Hide SponsorBlock Button
|
// Hide SponsorBlock Button in navigation bar
|
||||||
%hook YTRightNavigationButtons
|
%hook YTRightNavigationButtons
|
||||||
- (void)didMoveToWindow {
|
|
||||||
%orig;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)layoutSubviews {
|
- (void)layoutSubviews {
|
||||||
%orig;
|
%orig;
|
||||||
if (IsEnabled(@"hideSponsorBlockButton_enabled")) {
|
if (IsEnabled(@"hideSponsorBlockButton_enabled")) {
|
||||||
|
|
@ -174,7 +170,6 @@ BOOL isSelf() {
|
||||||
%end
|
%end
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
|
||||||
// A/B flags
|
// A/B flags
|
||||||
%hook YTColdConfig
|
%hook YTColdConfig
|
||||||
- (BOOL)respectDeviceCaptionSetting { return NO; } // YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
- (BOOL)respectDeviceCaptionSetting { return NO; } // YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||||
|
|
@ -578,16 +573,6 @@ BOOL isTabSelected = NO;
|
||||||
[self setNeedsLayout];
|
[self setNeedsLayout];
|
||||||
[self removeFromSuperview];
|
[self removeFromSuperview];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Live chat OLED dark mode - @bhackel
|
|
||||||
CGFloat alpha;
|
|
||||||
if ([[%c(YTLUserDefaults) standardUserDefaults] boolForKey:@"oledTheme"] // YTLite OLED Theme
|
|
||||||
&& [self.accessibilityIdentifier isEqualToString:@"eml.live_chat_text_message"] // Live chat text message
|
|
||||||
&& [self.backgroundColor getWhite:nil alpha:&alpha] // Check if color is grayscale and get alpha
|
|
||||||
&& alpha != 0.0) // Ignore shorts live chat
|
|
||||||
{
|
|
||||||
self.backgroundColor = [UIColor blackColor];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
|
@ -641,7 +626,7 @@ BOOL isTabSelected = NO;
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Gestures - @bhackel
|
// Gestures - @bhackel
|
||||||
%group playerGestures
|
%group gPlayerGestures
|
||||||
%hook YTWatchLayerViewController
|
%hook YTWatchLayerViewController
|
||||||
// invoked when the player view controller is either created or destroyed
|
// invoked when the player view controller is either created or destroyed
|
||||||
- (void)watchController:(YTWatchController *)watchController didSetPlayerViewController:(YTPlayerViewController *)playerViewController {
|
- (void)watchController:(YTWatchController *)watchController didSetPlayerViewController:(YTPlayerViewController *)playerViewController {
|
||||||
|
|
@ -662,14 +647,22 @@ BOOL isTabSelected = NO;
|
||||||
%hook YTPlayerViewController
|
%hook YTPlayerViewController
|
||||||
// the pan gesture that will be created and added to the player view
|
// the pan gesture that will be created and added to the player view
|
||||||
%property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture;
|
%property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture;
|
||||||
|
/**
|
||||||
|
* This method is called when the pan gesture is started, changed, or ended. It handles
|
||||||
|
* 12 different possible cases depending on the configuration: 3 zones with 4 choices
|
||||||
|
* for each zone. The zones are horizontal sections that divide the player into
|
||||||
|
* 3 equal parts. The choices are volume, brightness, seek, and disabled.
|
||||||
|
* There is also a deadzone that can be configured in the settings.
|
||||||
|
* There are 4 logical states: initial, changed in deadzone, changed, end.
|
||||||
|
*/
|
||||||
%new
|
%new
|
||||||
- (void)YTLitePlusHandlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer {
|
- (void)YTLitePlusHandlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer {
|
||||||
// Haptic feedback generator
|
// Haptic feedback generator
|
||||||
static UIImpactFeedbackGenerator *feedbackGenerator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
|
static UIImpactFeedbackGenerator *feedbackGenerator;
|
||||||
// Variables for storing initial values to be adjusted
|
// Variables for storing initial values to be adjusted
|
||||||
static float initialVolume;
|
static float initialVolume;
|
||||||
static float initialBrightness;
|
static float initialBrightness;
|
||||||
static CGFloat currentTime;
|
static CGFloat initialTime;
|
||||||
// Flag to determine if the pan gesture is valid
|
// Flag to determine if the pan gesture is valid
|
||||||
static BOOL isValidHorizontalPan = NO;
|
static BOOL isValidHorizontalPan = NO;
|
||||||
// Variable to store the section of the screen the gesture is in
|
// Variable to store the section of the screen the gesture is in
|
||||||
|
|
@ -678,62 +671,128 @@ BOOL isTabSelected = NO;
|
||||||
static CGPoint startLocation;
|
static CGPoint startLocation;
|
||||||
// Variable to track the X translation when exiting the deadzone
|
// Variable to track the X translation when exiting the deadzone
|
||||||
static CGFloat deadzoneStartingXTranslation;
|
static CGFloat deadzoneStartingXTranslation;
|
||||||
|
// Variable to track the X translation of the pan gesture after exiting the deadzone
|
||||||
|
static CGFloat adjustedTranslationX;
|
||||||
|
// Variable used to smooth out the X translation
|
||||||
|
static CGFloat smoothedTranslationX = 0;
|
||||||
|
// Constant for the filter constant to change responsiveness
|
||||||
|
// static const CGFloat filterConstant = 0.1;
|
||||||
// Constant for the deadzone radius that can be changed in the settings
|
// Constant for the deadzone radius that can be changed in the settings
|
||||||
static CGFloat deadzoneRadius = (CGFloat)GetFloat(@"playerGesturesDeadzone");
|
static CGFloat deadzoneRadius = (CGFloat)GetFloat(@"playerGesturesDeadzone");
|
||||||
// Constant for the sensitivity factor that can be changed in the settings
|
// Constant for the sensitivity factor that can be changed in the settings
|
||||||
static CGFloat sensitivityFactor = (CGFloat)GetFloat(@"playerGesturesSensitivity");
|
static CGFloat sensitivityFactor = (CGFloat)GetFloat(@"playerGesturesSensitivity");
|
||||||
|
// Objects for modifying the system volume
|
||||||
/***** Helper functions *****/
|
static MPVolumeView *volumeView;
|
||||||
// Helper function to adjust brightness
|
static UISlider *volumeViewSlider;
|
||||||
void (^adjustBrightness)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialBrightness) {
|
// Get objects that should only be initialized once
|
||||||
float newBrightness = initialBrightness + ((translationX / 1000.0) * sensitivityFactor);
|
static dispatch_once_t onceToken;
|
||||||
newBrightness = fmaxf(fminf(newBrightness, 1.0), 0.0);
|
dispatch_once(&onceToken, ^{
|
||||||
[[UIScreen mainScreen] setBrightness:newBrightness];
|
volumeView = [[MPVolumeView alloc] init];
|
||||||
};
|
|
||||||
// Helper function to adjust volume
|
|
||||||
void (^adjustVolume)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialVolume) {
|
|
||||||
float newVolume = initialVolume + ((translationX / 1000.0) * sensitivityFactor);
|
|
||||||
newVolume = fmaxf(fminf(newVolume, 1.0), 0.0);
|
|
||||||
// https://stackoverflow.com/questions/50737943/how-to-change-volume-programmatically-on-ios-11-4
|
|
||||||
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
|
|
||||||
UISlider *volumeViewSlider = nil;
|
|
||||||
for (UIView *view in volumeView.subviews) {
|
for (UIView *view in volumeView.subviews) {
|
||||||
if ([view isKindOfClass:[UISlider class]]) {
|
if ([view isKindOfClass:[UISlider class]]) {
|
||||||
volumeViewSlider = (UISlider *)view;
|
volumeViewSlider = (UISlider *)view;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
feedbackGenerator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
|
||||||
|
});
|
||||||
|
// Get objects used to seek nicely in the video player
|
||||||
|
static YTMainAppVideoPlayerOverlayViewController *mainVideoPlayerController = (YTMainAppVideoPlayerOverlayViewController *)self.childViewControllers.firstObject;
|
||||||
|
static YTPlayerBarController *playerBarController = mainVideoPlayerController.playerBarController;
|
||||||
|
static YTInlinePlayerBarContainerView *playerBar = playerBarController.playerBar;
|
||||||
|
|
||||||
|
/***** Helper functions for adjusting player state *****/
|
||||||
|
// Helper function to adjust brightness
|
||||||
|
void (^adjustBrightness)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialBrightness) {
|
||||||
|
float brightnessSensitivityFactor = 3;
|
||||||
|
float newBrightness = initialBrightness + ((translationX / 1000.0) * sensitivityFactor * brightnessSensitivityFactor);
|
||||||
|
newBrightness = fmaxf(fminf(newBrightness, 1.0), 0.0);
|
||||||
|
[[UIScreen mainScreen] setBrightness:newBrightness];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function to adjust volume
|
||||||
|
void (^adjustVolume)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialVolume) {
|
||||||
|
float volumeSensitivityFactor = 3.0;
|
||||||
|
float newVolume = initialVolume + ((translationX / 1000.0) * sensitivityFactor * volumeSensitivityFactor);
|
||||||
|
newVolume = fmaxf(fminf(newVolume, 1.0), 0.0);
|
||||||
|
// Improve smoothness - ignore if the volume is within 0.01 of the current volume
|
||||||
|
CGFloat currentVolume = [[AVAudioSession sharedInstance] outputVolume];
|
||||||
|
if (fabs(newVolume - currentVolume) < 0.01 && currentVolume > 0.01 && currentVolume < 0.99) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// https://stackoverflow.com/questions/50737943/how-to-change-volume-programmatically-on-ios-11-4
|
||||||
|
|
||||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||||
volumeViewSlider.value = newVolume;
|
volumeViewSlider.value = newVolume;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper function to adjust seek time
|
// Helper function to adjust seek time
|
||||||
void (^adjustSeek)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat currentTime) {
|
void (^adjustSeek)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialTime) {
|
||||||
// Calculate a seek fraction based on the horizontal translation
|
// Get the location in view for the current video time
|
||||||
CGFloat totalDuration = self.currentVideoTotalMediaTime;
|
CGFloat totalTime = self.currentVideoTotalMediaTime;
|
||||||
CGFloat viewWidth = self.view.bounds.size.width;
|
CGFloat videoFraction = initialTime / totalTime;
|
||||||
CGFloat seekFraction = (translationX / viewWidth);
|
CGFloat initialTimeXPosition = [playerBar scrubXForScrubRange:videoFraction];
|
||||||
// Seek to the new time based on the calculated offset
|
// Calculate the new seek X position
|
||||||
CGFloat sensitivityFactor = 1; // Adjust this value to make seeking less sensitive
|
CGFloat sensitivityFactor = 1; // Adjust this value to make seeking more/less sensitive
|
||||||
seekFraction = sensitivityFactor * seekFraction;
|
CGFloat newSeekXPosition = initialTimeXPosition + translationX * sensitivityFactor;
|
||||||
CGFloat seekTime = currentTime + totalDuration * seekFraction;
|
// Create a CGPoint using this new X position
|
||||||
[self seekToTime:seekTime];
|
CGPoint newSeekPoint = CGPointMake(newSeekXPosition, 0);
|
||||||
|
// Send this to a seek method in the player bar controller
|
||||||
|
[playerBarController didScrubToPoint:newSeekPoint];
|
||||||
};
|
};
|
||||||
// Helper function to run the selected gesture action
|
|
||||||
void (^runSelectedGesture)(NSString*, CGFloat, CGFloat, CGFloat, CGFloat)
|
// Helper function to smooth out the X translation
|
||||||
= ^(NSString *sectionKey, CGFloat translationX, CGFloat initialBrightness, CGFloat initialVolume, CGFloat currentTime) {
|
// CGFloat (^applyLowPassFilter)(CGFloat) = ^(CGFloat newTranslation) {
|
||||||
|
// smoothedTranslationX = filterConstant * newTranslation + (1 - filterConstant) * smoothedTranslationX;
|
||||||
|
// return smoothedTranslationX;
|
||||||
|
// };
|
||||||
|
|
||||||
|
/***** Helper functions for running the selected gesture *****/
|
||||||
|
// Helper function to run any setup for the selected gesture mode
|
||||||
|
void (^runSelectedGestureSetup)(NSString*) = ^(NSString *sectionKey) {
|
||||||
|
// Determine the selected gesture mode using the section key
|
||||||
|
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
|
||||||
|
// Handle the setup based on the selected mode
|
||||||
|
switch (selectedGestureMode) {
|
||||||
|
case GestureModeVolume:
|
||||||
|
initialVolume = [[AVAudioSession sharedInstance] outputVolume];
|
||||||
|
break;
|
||||||
|
case GestureModeBrightness:
|
||||||
|
initialBrightness = [UIScreen mainScreen].brightness;
|
||||||
|
break;
|
||||||
|
case GestureModeSeek:
|
||||||
|
initialTime = self.currentVideoMediaTime;
|
||||||
|
// Start a seek action
|
||||||
|
[playerBarController startScrubbing];
|
||||||
|
break;
|
||||||
|
case GestureModeDisabled:
|
||||||
|
// Do nothing if the gesture is disabled
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Show an alert if the gesture mode is invalid
|
||||||
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Invalid Gesture Mode" message:@"Please report this bug." preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
|
||||||
|
[alertController addAction:okAction];
|
||||||
|
[self presentViewController:alertController animated:YES completion:nil];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function to run the selected gesture action when the gesture changes
|
||||||
|
void (^runSelectedGestureChanged)(NSString*) = ^(NSString *sectionKey) {
|
||||||
// Determine the selected gesture mode using the section key
|
// Determine the selected gesture mode using the section key
|
||||||
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
|
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
|
||||||
// Handle the gesture action based on the selected mode
|
// Handle the gesture action based on the selected mode
|
||||||
switch (selectedGestureMode) {
|
switch (selectedGestureMode) {
|
||||||
case GestureModeVolume:
|
case GestureModeVolume:
|
||||||
adjustVolume(translationX, initialVolume);
|
adjustVolume(adjustedTranslationX, initialVolume);
|
||||||
break;
|
break;
|
||||||
case GestureModeBrightness:
|
case GestureModeBrightness:
|
||||||
adjustBrightness(translationX, initialBrightness);
|
adjustBrightness(adjustedTranslationX, initialBrightness);
|
||||||
break;
|
break;
|
||||||
case GestureModeSeek:
|
case GestureModeSeek:
|
||||||
adjustSeek(translationX, currentTime);
|
adjustSeek(adjustedTranslationX, initialTime);
|
||||||
break;
|
break;
|
||||||
case GestureModeDisabled:
|
case GestureModeDisabled:
|
||||||
// Do nothing if the gesture is disabled
|
// Do nothing if the gesture is disabled
|
||||||
|
|
@ -747,6 +806,31 @@ BOOL isTabSelected = NO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Helper function to run the selected gesture action when the gesture ends
|
||||||
|
void (^runSelectedGestureEnded)(NSString*) = ^(NSString *sectionKey) {
|
||||||
|
// Determine the selected gesture mode using the section key
|
||||||
|
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
|
||||||
|
// Handle the gesture action based on the selected mode
|
||||||
|
switch (selectedGestureMode) {
|
||||||
|
case GestureModeVolume:
|
||||||
|
break;
|
||||||
|
case GestureModeBrightness:
|
||||||
|
break;
|
||||||
|
case GestureModeSeek:
|
||||||
|
[playerBarController endScrubbingForSeekSource:0];
|
||||||
|
break;
|
||||||
|
case GestureModeDisabled:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Show an alert if the gesture mode is invalid
|
||||||
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Invalid Gesture Mode" message:@"Please report this bug." preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
|
||||||
|
[alertController addAction:okAction];
|
||||||
|
[self presentViewController:alertController animated:YES completion:nil];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
/***** End of Helper functions *****/
|
/***** End of Helper functions *****/
|
||||||
|
|
||||||
// Handle gesture based on current gesture state
|
// Handle gesture based on current gesture state
|
||||||
|
|
@ -754,37 +838,36 @@ BOOL isTabSelected = NO;
|
||||||
// Get the gesture's start position
|
// Get the gesture's start position
|
||||||
startLocation = [panGestureRecognizer locationInView:self.view];
|
startLocation = [panGestureRecognizer locationInView:self.view];
|
||||||
CGFloat viewHeight = self.view.bounds.size.height;
|
CGFloat viewHeight = self.view.bounds.size.height;
|
||||||
|
// Determine the section based on the start position by dividing the view into thirds
|
||||||
// Determine the section based on the start position
|
|
||||||
// by dividing the view into thirds
|
|
||||||
if (startLocation.y <= viewHeight / 3.0) {
|
if (startLocation.y <= viewHeight / 3.0) {
|
||||||
gestureSection = GestureSectionTop;
|
gestureSection = GestureSectionTop;
|
||||||
// Cancel the gesture if the mode is disabled
|
|
||||||
if (GetInteger(@"playerGestureTopSelection") == GestureModeDisabled) {
|
|
||||||
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (startLocation.y <= 2 * viewHeight / 3.0) {
|
} else if (startLocation.y <= 2 * viewHeight / 3.0) {
|
||||||
gestureSection = GestureSectionMiddle;
|
gestureSection = GestureSectionMiddle;
|
||||||
// Cancel the gesture if the mode is disabled
|
|
||||||
if (GetInteger(@"playerGestureMiddleSelection") == GestureModeDisabled) {
|
|
||||||
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (startLocation.y <= viewHeight) {
|
} else if (startLocation.y <= viewHeight) {
|
||||||
gestureSection = GestureSectionBottom;
|
gestureSection = GestureSectionBottom;
|
||||||
// Cancel the gesture if the mode is disabled
|
|
||||||
if (GetInteger(@"playerGestureBottomSelection") == GestureModeDisabled) {
|
|
||||||
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
gestureSection = GestureSectionInvalid;
|
gestureSection = GestureSectionInvalid;
|
||||||
}
|
}
|
||||||
|
// Cancel the gesture if the chosen mode for this section is disabled
|
||||||
|
if ( ((gestureSection == GestureSectionTop) && (GetInteger(@"playerGestureTopSelection") == GestureModeDisabled))
|
||||||
|
|| ((gestureSection == GestureSectionMiddle) && (GetInteger(@"playerGestureMiddleSelection") == GestureModeDisabled))
|
||||||
|
|| ((gestureSection == GestureSectionBottom) && (GetInteger(@"playerGestureBottomSelection") == GestureModeDisabled))) {
|
||||||
|
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Deactive the activity flag
|
// Deactive the activity flag
|
||||||
isValidHorizontalPan = NO;
|
isValidHorizontalPan = NO;
|
||||||
|
// Cancel this gesture if it has not activated after 1 second
|
||||||
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||||
|
if (!isValidHorizontalPan && panGestureRecognizer.state != UIGestureRecognizerStateEnded) {
|
||||||
|
// Cancel the gesture by setting its state to UIGestureRecognizerStateCancelled
|
||||||
|
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle changed gesture state by activating the gesture once it has exited the deadzone,
|
||||||
|
// and then adjusting the player based on the selected gesture mode
|
||||||
if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) {
|
if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) {
|
||||||
// Determine if the gesture is predominantly horizontal
|
// Determine if the gesture is predominantly horizontal
|
||||||
CGPoint translation = [panGestureRecognizer translationInView:self.view];
|
CGPoint translation = [panGestureRecognizer translationInView:self.view];
|
||||||
|
|
@ -799,12 +882,29 @@ BOOL isTabSelected = NO;
|
||||||
// If outside the deadzone, activate the pan gesture and store the initial values
|
// If outside the deadzone, activate the pan gesture and store the initial values
|
||||||
isValidHorizontalPan = YES;
|
isValidHorizontalPan = YES;
|
||||||
deadzoneStartingXTranslation = translation.x;
|
deadzoneStartingXTranslation = translation.x;
|
||||||
initialBrightness = [UIScreen mainScreen].brightness;
|
adjustedTranslationX = 0;
|
||||||
initialVolume = [[AVAudioSession sharedInstance] outputVolume];
|
smoothedTranslationX = 0;
|
||||||
currentTime = self.currentVideoMediaTime;
|
// Run the setup for the selected gesture mode
|
||||||
|
switch (gestureSection) {
|
||||||
|
case GestureSectionTop:
|
||||||
|
runSelectedGestureSetup(@"playerGestureTopSelection");
|
||||||
|
break;
|
||||||
|
case GestureSectionMiddle:
|
||||||
|
runSelectedGestureSetup(@"playerGestureMiddleSelection");
|
||||||
|
break;
|
||||||
|
case GestureSectionBottom:
|
||||||
|
runSelectedGestureSetup(@"playerGestureBottomSelection");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// If the section is invalid, cancel the gesture
|
||||||
|
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
||||||
|
break;
|
||||||
|
}
|
||||||
// Provide haptic feedback to indicate a gesture start
|
// Provide haptic feedback to indicate a gesture start
|
||||||
[feedbackGenerator prepare];
|
if (IS_ENABLED(@"playerGesturesHapticFeedback_enabled")) {
|
||||||
[feedbackGenerator impactOccurred];
|
[feedbackGenerator prepare];
|
||||||
|
[feedbackGenerator impactOccurred];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Cancel the gesture if the translation is not horizontal
|
// Cancel the gesture if the translation is not horizontal
|
||||||
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
||||||
|
|
@ -814,34 +914,72 @@ BOOL isTabSelected = NO;
|
||||||
|
|
||||||
// Handle the gesture based on the identified section
|
// Handle the gesture based on the identified section
|
||||||
if (isValidHorizontalPan) {
|
if (isValidHorizontalPan) {
|
||||||
// Adjust the X translation based on the value hit after
|
// Adjust the X translation based on the value hit after exiting the deadzone
|
||||||
// exiting the deadzone
|
adjustedTranslationX = translation.x - deadzoneStartingXTranslation;
|
||||||
CGFloat adjustedTranslationX = translation.x - deadzoneStartingXTranslation;
|
// Smooth the translation value
|
||||||
|
// adjustedTranslationX = applyLowPassFilter(adjustedTranslationX);
|
||||||
// Pass the adjusted translation to the selected gesture
|
// Pass the adjusted translation to the selected gesture
|
||||||
if (gestureSection == GestureSectionTop) {
|
switch (gestureSection) {
|
||||||
runSelectedGesture(@"playerGestureTopSelection", adjustedTranslationX, initialBrightness, initialVolume, currentTime);
|
case GestureSectionTop:
|
||||||
} else if (gestureSection == GestureSectionMiddle) {
|
runSelectedGestureChanged(@"playerGestureTopSelection");
|
||||||
runSelectedGesture(@"playerGestureMiddleSelection", adjustedTranslationX, initialBrightness, initialVolume, currentTime);
|
break;
|
||||||
} else if (gestureSection == GestureSectionBottom) {
|
case GestureSectionMiddle:
|
||||||
runSelectedGesture(@"playerGestureBottomSelection", adjustedTranslationX, initialBrightness, initialVolume, currentTime);
|
runSelectedGestureChanged(@"playerGestureMiddleSelection");
|
||||||
} else {
|
break;
|
||||||
// If the section is invalid, cancel the gesture
|
case GestureSectionBottom:
|
||||||
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
runSelectedGestureChanged(@"playerGestureBottomSelection");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// If the section is invalid, cancel the gesture
|
||||||
|
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) {
|
|
||||||
if (isValidHorizontalPan) {
|
// Handle the gesture end state by running the selected gesture mode's end action
|
||||||
// Provide haptic feedback upon successful gesture recognition
|
if (panGestureRecognizer.state == UIGestureRecognizerStateEnded && isValidHorizontalPan) {
|
||||||
[feedbackGenerator prepare];
|
switch (gestureSection) {
|
||||||
[feedbackGenerator impactOccurred];
|
case GestureSectionTop:
|
||||||
|
runSelectedGestureEnded(@"playerGestureTopSelection");
|
||||||
|
break;
|
||||||
|
case GestureSectionMiddle:
|
||||||
|
runSelectedGestureEnded(@"playerGestureMiddleSelection");
|
||||||
|
break;
|
||||||
|
case GestureSectionBottom:
|
||||||
|
runSelectedGestureEnded(@"playerGestureBottomSelection");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
// Provide haptic feedback upon successful gesture recognition
|
||||||
|
// [feedbackGenerator prepare];
|
||||||
|
// [feedbackGenerator impactOccurred];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// allow the pan gesture to be recognized simultaneously with other gestures
|
// allow the pan gesture to be recognized simultaneously with other gestures
|
||||||
%new
|
%new
|
||||||
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
|
||||||
|
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
|
||||||
|
// Do not allow this gesture to activate with the normal seek bar gesture
|
||||||
|
YTMainAppVideoPlayerOverlayViewController *mainVideoPlayerController = (YTMainAppVideoPlayerOverlayViewController *)self.childViewControllers.firstObject;
|
||||||
|
YTPlayerBarController *playerBarController = mainVideoPlayerController.playerBarController;
|
||||||
|
YTInlinePlayerBarContainerView *playerBar = playerBarController.playerBar;
|
||||||
|
if (otherGestureRecognizer == playerBar.scrubGestureRecognizer) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
// Do not allow this gesture to activate with the fine scrubber gesture
|
||||||
|
YTFineScrubberFilmstripView *fineScrubberFilmstrip = playerBar.fineScrubberFilmstrip;
|
||||||
|
if (!fineScrubberFilmstrip) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
YTFineScrubberFilmstripCollectionView *filmstripCollectionView = [fineScrubberFilmstrip valueForKey:@"_filmstripCollectionView"];
|
||||||
|
if (filmstripCollectionView && otherGestureRecognizer == filmstripCollectionView.panGestureRecognizer) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
@ -872,6 +1010,101 @@ BOOL isTabSelected = NO;
|
||||||
%end
|
%end
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// Video player button in the navigation bar - @bhackel
|
||||||
|
// This code is based on the iSponsorBlock button code
|
||||||
|
%group gVideoPlayerButton
|
||||||
|
NSInteger pageStyle = 0;
|
||||||
|
%hook YTRightNavigationButtons
|
||||||
|
%property (retain, nonatomic) YTQTMButton *videoPlayerButton;
|
||||||
|
- (NSMutableArray *)buttons {
|
||||||
|
NSMutableArray *retVal = %orig.mutableCopy;
|
||||||
|
[self.videoPlayerButton removeFromSuperview];
|
||||||
|
[self addSubview:self.videoPlayerButton];
|
||||||
|
if (!self.videoPlayerButton || pageStyle != [%c(YTPageStyleController) pageStyle]) {
|
||||||
|
self.videoPlayerButton = [%c(YTQTMButton) iconButton];
|
||||||
|
[self.videoPlayerButton enableNewTouchFeedback];
|
||||||
|
self.videoPlayerButton.frame = CGRectMake(0, 0, 40, 40);
|
||||||
|
|
||||||
|
if ([%c(YTPageStyleController) pageStyle]) { //dark mode
|
||||||
|
[self.videoPlayerButton setImage:[UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"YTLitePlusColored-128" ofType:@"png"]] forState:UIControlStateNormal];
|
||||||
|
}
|
||||||
|
else { // light mode
|
||||||
|
[self.videoPlayerButton setImage:[UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"YTLitePlusColored-128" ofType:@"png"]] forState:UIControlStateNormal];
|
||||||
|
// UIImage *image = [UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"YTLitePlusColored-128" ofType:@"png"]];
|
||||||
|
// image = [image imageWithTintColor:UIColor.blackColor renderingMode:UIImageRenderingModeAlwaysTemplate];
|
||||||
|
// [self.videoPlayerButton setImage:image forState:UIControlStateNormal];
|
||||||
|
// [self.videoPlayerButton setTintColor:UIColor.blackColor];
|
||||||
|
}
|
||||||
|
pageStyle = [%c(YTPageStyleController) pageStyle];
|
||||||
|
|
||||||
|
[self.videoPlayerButton addTarget:self action:@selector(videoPlayerButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
[retVal insertObject:self.videoPlayerButton atIndex:0];
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
- (NSMutableArray *)visibleButtons {
|
||||||
|
NSMutableArray *retVal = %orig.mutableCopy;
|
||||||
|
|
||||||
|
// fixes button overlapping yt logo on smaller devices
|
||||||
|
[self setLeadingPadding:-10];
|
||||||
|
if (self.videoPlayerButton) {
|
||||||
|
[self.videoPlayerButton removeFromSuperview];
|
||||||
|
[self addSubview:self.videoPlayerButton];
|
||||||
|
[retVal insertObject:self.videoPlayerButton atIndex:0];
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
// Method to handle the video player button press by showing a document picker
|
||||||
|
%new
|
||||||
|
- (void)videoPlayerButtonPressed:(UIButton *)sender {
|
||||||
|
// Traversing the responder chain to find the nearest UIViewController
|
||||||
|
UIResponder *responder = sender;
|
||||||
|
UIViewController *settingsViewController = nil;
|
||||||
|
while (responder) {
|
||||||
|
if ([responder isKindOfClass:[UIViewController class]]) {
|
||||||
|
settingsViewController = (UIViewController *)responder;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
responder = responder.nextResponder;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsViewController) {
|
||||||
|
// Present the video picker
|
||||||
|
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeMovie, (NSString *)kUTTypeVideo] inMode:UIDocumentPickerModeImport];
|
||||||
|
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
|
||||||
|
documentPicker.allowsMultipleSelection = NO;
|
||||||
|
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
|
||||||
|
} else {
|
||||||
|
NSLog(@"No view controller found for the sender button.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Delegate method to handle the picked video by showing the apple player
|
||||||
|
%new
|
||||||
|
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
|
||||||
|
NSURL *pickedURL = [urls firstObject];
|
||||||
|
|
||||||
|
if (pickedURL) {
|
||||||
|
// Use AVPlayerViewController to play the video
|
||||||
|
AVPlayer *player = [AVPlayer playerWithURL:pickedURL];
|
||||||
|
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
|
||||||
|
playerViewController.player = player;
|
||||||
|
|
||||||
|
// Get the root view controller
|
||||||
|
UIViewController *presentingViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
|
||||||
|
// Present the Video Player
|
||||||
|
if (presentingViewController) {
|
||||||
|
[presentingViewController presentViewController:playerViewController animated:YES completion:^{
|
||||||
|
[player play];
|
||||||
|
}];
|
||||||
|
} else {
|
||||||
|
// Handle case where no view controller was found
|
||||||
|
NSLog(@"Error: No view controller found to present AVPlayerViewController.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
// App Settings Overlay Options
|
// App Settings Overlay Options
|
||||||
%group gDisableAccountSection
|
%group gDisableAccountSection
|
||||||
%hook YTSettingsSectionItemManager
|
%hook YTSettingsSectionItemManager
|
||||||
|
|
@ -994,6 +1227,8 @@ BOOL isTabSelected = NO;
|
||||||
%init;
|
%init;
|
||||||
// Access YouGroupSettings methods
|
// Access YouGroupSettings methods
|
||||||
dlopen([[NSString stringWithFormat:@"%@/Frameworks/YouGroupSettings.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY);
|
dlopen([[NSString stringWithFormat:@"%@/Frameworks/YouGroupSettings.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY);
|
||||||
|
// Access YouTube Plus methods
|
||||||
|
dlopen([[NSString stringWithFormat:@"%@/Frameworks/YTLite.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY);
|
||||||
|
|
||||||
if (IsEnabled(@"hideCastButton_enabled")) {
|
if (IsEnabled(@"hideCastButton_enabled")) {
|
||||||
%init(gHideCastButton);
|
%init(gHideCastButton);
|
||||||
|
|
@ -1062,38 +1297,34 @@ BOOL isTabSelected = NO;
|
||||||
%init(gDisableEngagementOverlay);
|
%init(gDisableEngagementOverlay);
|
||||||
}
|
}
|
||||||
if (IsEnabled(@"playerGestures_enabled")) {
|
if (IsEnabled(@"playerGestures_enabled")) {
|
||||||
%init(playerGestures);
|
%init(gPlayerGestures);
|
||||||
|
}
|
||||||
|
if (IsEnabled(@"videoPlayerButton_enabled")) {
|
||||||
|
%init(gVideoPlayerButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change the default value of some options
|
// Change the default value of some options
|
||||||
NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys];
|
NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys];
|
||||||
if (![allKeys containsObject:@"RYD-ENABLED"]) {
|
if (![allKeys containsObject:@"YTLPDidPerformFirstRunSetup"]) {
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"];
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YTLPDidPerformFirstRunSetup"];
|
||||||
}
|
// Set iSponsorBlock to default disabled
|
||||||
if (![allKeys containsObject:@"YouPiPEnabled"]) {
|
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YouPiPEnabled"];
|
NSString *settingsPath = [documentsDirectory stringByAppendingPathComponent:@"iSponsorBlock.plist"];
|
||||||
}
|
NSMutableDictionary *settings = [NSMutableDictionary dictionary];
|
||||||
if (![allKeys containsObject:@"newSettingsUI_enabled"]) {
|
[settings setObject:@(NO) forKey:@"enabled"];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"newSettingsUI_enabled"];
|
[settings writeToFile:settingsPath atomically:YES];
|
||||||
}
|
// Set miscellaneous YTLitePlus features to enabled
|
||||||
if (![allKeys containsObject:@"fixCasting_enabled"]) {
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"fixCasting_enabled"];
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YouPiPEnabled"];
|
||||||
}
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"newSettingsUI_enabled"];
|
||||||
// Default gestures as volume, brightness, seek
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"fixCasting_enabled"];
|
||||||
if (![allKeys containsObject:@"playerGestureTopSelection"]) {
|
// Default gestures as volume, brightness, seek
|
||||||
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeVolume forKey:@"playerGestureTopSelection"];
|
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeVolume forKey:@"playerGestureTopSelection"];
|
||||||
}
|
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeBrightness forKey:@"playerGestureMiddleSelection"];
|
||||||
if (![allKeys containsObject:@"playerGestureMiddleSelection"]) {
|
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeSeek forKey:@"playerGestureBottomSelection"];
|
||||||
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeBrightness forKey:@"playerGestureMiddleSelection"];
|
// Default gestures options
|
||||||
}
|
[[NSUserDefaults standardUserDefaults] setFloat:20.0 forKey:@"playerGesturesDeadzone"];
|
||||||
if (![allKeys containsObject:@"playerGestureBottomSelection"]) {
|
[[NSUserDefaults standardUserDefaults] setFloat:1.0 forKey:@"playerGesturesSensitivity"];
|
||||||
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeSeek forKey:@"playerGestureBottomSelection"];
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"playerGesturesHapticFeedback_enabled"];
|
||||||
}
|
|
||||||
// Default configuration options for gestures
|
|
||||||
if (![allKeys containsObject:@"playerGesturesDeadzone"]) {
|
|
||||||
[[NSUserDefaults standardUserDefaults] setFloat:20.0 forKey:@"playerGesturesDeadzone"];
|
|
||||||
}
|
|
||||||
if (![allKeys containsObject:@"playerGesturesSensitivity"]) {
|
|
||||||
[[NSUserDefaults standardUserDefaults] setFloat:1.0 forKey:@"playerGesturesSensitivity"];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
BIN
lang/YTLitePlus.bundle/YTLitePlusColored-1024.png
Normal file
BIN
lang/YTLitePlus.bundle/YTLitePlusColored-1024.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
lang/YTLitePlus.bundle/YTLitePlusColored-128.png
Normal file
BIN
lang/YTLitePlus.bundle/YTLitePlusColored-128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
lang/YTLitePlus.bundle/YTLitePlusDarkMode-1024.png
Normal file
BIN
lang/YTLitePlus.bundle/YTLitePlusDarkMode-1024.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
lang/YTLitePlus.bundle/YTLitePlusLightMode-1024.png
Normal file
BIN
lang/YTLitePlus.bundle/YTLitePlusLightMode-1024.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Paste Settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "خيارات تراكب ضوابط الفيديو";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "خيارات تراكب ضوابط الفيديو";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "زر "إخفاء الإرسال" ;
|
"HIDE_CAST_BUTTON" = "زر "إخفاء الإرسال" ;
|
||||||
"HIDE_CAST_BUTTON_DESC" = "مطلوب إعادة تشغيل التطبيق";
|
"HIDE_CAST_BUTTON_DESC" = "مطلوب إعادة تشغيل التطبيق";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Копиране на всички текущи настройки в клипборда";
|
"COPY_SETTINGS_DESC" = "Копиране на всички текущи настройки в клипборда";
|
||||||
"PASTE_SETTINGS" = "Поставяне на настройки";
|
"PASTE_SETTINGS" = "Поставяне на настройки";
|
||||||
"PASTE_SETTINGS_DESC" = "Поставяне на настройки от клипборда и прилагане";
|
"PASTE_SETTINGS_DESC" = "Поставяне на настройки от клипборда и прилагане";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Експортиране на настройки";
|
"EXPORT_SETTINGS" = "Експортиране на настройки";
|
||||||
"EXPORT_SETTINGS_DESC" = "Експортиране на всички текущи настройки в .txt файл";
|
"EXPORT_SETTINGS_DESC" = "Експортиране на всички текущи настройки в .txt файл";
|
||||||
"IMPORT_SETTINGS" = "Импортиране на настройки";
|
"IMPORT_SETTINGS" = "Импортиране на настройки";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Опции за контрол на видеото";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Опции за контрол на видеото";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Скрийте бутона за стрийминг";
|
"HIDE_CAST_BUTTON" = "Скрийте бутона за стрийминг";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Необходим е рестарт на приложението.";
|
"HIDE_CAST_BUTTON_DESC" = "Необходим е рестарт на приложението.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Скрийте бутона за iSponsorBlock в навигационната лента";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Скрийте бутона за iSponsorBlock в навигационната лента";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Paste Settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Overlay-Optionen für Videosteuerungen";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Overlay-Optionen für Videosteuerungen";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Cast button verstecken";
|
"HIDE_CAST_BUTTON" = "Cast button verstecken";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Google-Cast Button verstecken. Ein Neustart der App ist erforderlich.";
|
"HIDE_CAST_BUTTON_DESC" = "Google-Cast Button verstecken. Ein Neustart der App ist erforderlich.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "iSponsorBlock ausblenden";
|
"HIDE_SPONSORBLOCK_BUTTON" = "iSponsorBlock ausblenden";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "Blende die iSponsorBlock-Schaltfläche in der Navigationsleiste aus";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "Blende die iSponsorBlock-Schaltfläche in der Navigationsleiste aus";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste settings";
|
"PASTE_SETTINGS" = "Paste settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export settings";
|
"EXPORT_SETTINGS" = "Export settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import settings";
|
"IMPORT_SETTINGS" = "Import settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Hide Cast button";
|
"HIDE_CAST_BUTTON" = "Hide Cast button";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "App restart is required.";
|
"HIDE_CAST_BUTTON_DESC" = "App restart is required.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,35 +2,37 @@
|
||||||
"VERSION" = "Versión de YTLitePlus: %@";
|
"VERSION" = "Versión de YTLitePlus: %@";
|
||||||
"VERSION_CHECK" = "Pulse para comprobar si hay actualizaciones.";
|
"VERSION_CHECK" = "Pulse para comprobar si hay actualizaciones.";
|
||||||
|
|
||||||
"COPY_SETTINGS" = "Copy Settings";
|
"COPY_SETTINGS" = "Copiar Configuraciones";
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copiar todas las configuraciones actuales al portapapeles";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Pegar Configuraciones";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Pegar configuraciones desde el portapapeles y aplicar";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"PASTE_SETTINGS_ALERT" = "¿Aplicar configuraciones desde el portapapeles?";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS" = "Exportar Configuraciones";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"EXPORT_SETTINGS_DESC" = "Exportar todas las configuraciones actuales a un archivo .txt";
|
||||||
"IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
|
"IMPORT_SETTINGS" = "Importar Configuraciones";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
|
"IMPORT_SETTINGS_DESC" = "Presiona para importar configuraciones (.txt)";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
|
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Reemplazar Botones de 'Copiar Configuraciones' y 'Pegar Configuraciones'";
|
||||||
|
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Reemplaza los botones con 'Exportar Configuraciones' e 'Importar Configuraciones'";
|
||||||
|
|
||||||
"VIDEO_PLAYER" = "Video Player (Beta)";
|
"VIDEO_PLAYER" = "Reproductor de vídeo (Beta)";
|
||||||
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
|
"VIDEO_PLAYER_DESC" = "Abrir un vídeo descargado en el reproductor de Apple";
|
||||||
|
|
||||||
// Player Gestures
|
// Player Gestures
|
||||||
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
|
"PLAYER_GESTURES_TOGGLE" = "Habilitar Gestos del Reproductor";
|
||||||
"VOLUME" = "Volume";
|
"VOLUME" = "Volumen";
|
||||||
"BRIGHTNESS" = "Brightness";
|
"BRIGHTNESS" = "Brillo";
|
||||||
"SEEK" = "Seek";
|
"SEEK" = "Buscar";
|
||||||
"DISABLED" = "Disabled";
|
"DISABLED" = "Deshabilitado";
|
||||||
"DEADZONE" = "Deadzone";
|
"DEADZONE" = "Zona Muerta";
|
||||||
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
|
"DEADZONE_DESC" = "Distancia mínima a mover antes de que se reconozca un gesto";
|
||||||
"SENSITIVITY" = "Sensitivity";
|
"SENSITIVITY" = "Sensibilidad";
|
||||||
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
|
"SENSITIVITY_DESC" = "Multiplicador en gestos de volumen y brillo";
|
||||||
"PLAYER_GESTURES_TITLE" = "Player Gestures";
|
"PLAYER_GESTURES_TITLE" = "Gestos del Reproductor";
|
||||||
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
|
"PLAYER_GESTURES_DESC" = "Configura los gestos de desplazamiento horizontal para el reproductor";
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Sección Superior";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Sección Media";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Sección Inferior";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Habilitar Retroalimentación Háptica";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opciones de superposición de controles de vídeo";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opciones de superposición de controles de vídeo";
|
||||||
|
|
@ -77,20 +79,20 @@
|
||||||
"DISABLE_ENGAGEMENT_OVERLAY" = "Desactivar la superposición de compromiso a pantalla completa";
|
"DISABLE_ENGAGEMENT_OVERLAY" = "Desactivar la superposición de compromiso a pantalla completa";
|
||||||
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desactivar el gesto de deslizar hacia arriba y la lista de vídeos sugeridos en pantalla completa";
|
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desactivar el gesto de deslizar hacia arriba y la lista de vídeos sugeridos en pantalla completa";
|
||||||
|
|
||||||
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Hide Comment previews under player";
|
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar vistas previas de comentarios debajo del reproductor";
|
||||||
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Hide comment spoiler in comments button";
|
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Ocultar spoilers de comentarios en el botón de comentarios";
|
||||||
|
|
||||||
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Hide autoplay mini preview";
|
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ocultar mini vista previa de reproducción automática";
|
||||||
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Hide the small suggested video box near the title in fullscreen";
|
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Ocultar la pequeña caja de vídeo sugerido cerca del título en pantalla completa";
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "Ocultar mensajes HUD";
|
"HIDE_HUD_MESSAGES" = "Ocultar mensajes HUD";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, Vídeo en bucle está activado,...";
|
"HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, vídeo en bucle está activado,...";
|
||||||
|
|
||||||
"HIDE_COLLAPSE_BUTTON" = "Hide Collapse Button";
|
"HIDE_COLLAPSE_BUTTON" = "Ocultar botón de colapso";
|
||||||
"HIDE_COLLAPSE_BUTTON_DESC" = "Hides the Arrow Collapse Button that was shown in the Top Left of the Video Player.";
|
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta el botón de colapso en forma de flecha que se mostraba en la parte superior izquierda del reproductor de vídeo.";
|
||||||
|
|
||||||
"HIDE_SPEED_TOAST" = "Hide Speed Toast";
|
"HIDE_SPEED_TOAST" = "Ocultar notificación de velocidad";
|
||||||
"HIDE_SPEED_TOAST_DESC" = "Hide the 2X Speed popup when holding the player";
|
"HIDE_SPEED_TOAST_DESC" = "Oculta la notificación de velocidad 2X cuando se mantiene presionado el reproductor";
|
||||||
|
|
||||||
// App settings overlay options
|
// App settings overlay options
|
||||||
"APP_SETTINGS_OVERLAY_OPTIONS" = "Opciones de superposición de los ajustes de la aplicación";
|
"APP_SETTINGS_OVERLAY_OPTIONS" = "Opciones de superposición de los ajustes de la aplicación";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Ocultar botón Emitir";
|
"HIDE_CAST_BUTTON" = "Ocultar botón Emitir";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Es necesario reiniciar la aplicación";
|
"HIDE_CAST_BUTTON_DESC" = "Es necesario reiniciar la aplicación";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Botón del reproductor de vídeo";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Mostrar un botón en la barra de navegación para abrir vídeo descargados en el reproductor de Apple";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar el botón iSponsorBlock en la barra de navegación";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar el botón iSponsorBlock en la barra de navegación";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Paste Settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Options de l'overlay des contrôles vidéo";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Options de l'overlay des contrôles vidéo";
|
||||||
|
|
@ -166,6 +168,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Masquer le bouton Cast";
|
"HIDE_CAST_BUTTON" = "Masquer le bouton Cast";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Un redémarrage de l'application est requis.";
|
"HIDE_CAST_BUTTON_DESC" = "Un redémarrage de l'application est requis.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Masquer le bouton iSponsorBlock dans la barre de navigation";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Masquer le bouton iSponsorBlock dans la barre de navigation";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "現在のすべての設定をクリップボードにコピーします";
|
"COPY_SETTINGS_DESC" = "現在のすべての設定をクリップボードにコピーします";
|
||||||
"PASTE_SETTINGS" = "設定を貼り付け";
|
"PASTE_SETTINGS" = "設定を貼り付け";
|
||||||
"PASTE_SETTINGS_DESC" = "クリップボードから設定を貼り付けて適用します";
|
"PASTE_SETTINGS_DESC" = "クリップボードから設定を貼り付けて適用します";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "動画コントロールオーバーレイの設定";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "動画コントロールオーバーレイの設定";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "キャストボタンを非表示";
|
"HIDE_CAST_BUTTON" = "キャストボタンを非表示";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "アプリの再起動が必要です。";
|
"HIDE_CAST_BUTTON_DESC" = "アプリの再起動が必要です。";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "ナビゲーションバーのiSponsorBlockボタンを非表示";
|
"HIDE_SPONSORBLOCK_BUTTON" = "ナビゲーションバーのiSponsorBlockボタンを非表示";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,186 +1,191 @@
|
||||||
// Settings
|
// Settings
|
||||||
"VERSION" = "Versão do YTLitePlus: %@";
|
"VERSION" = "Versão do YTLitePlus: %@";
|
||||||
"VERSION_CHECK" = "Toque para verificar se há atualização!";
|
"VERSION_CHECK" = "Toque para verificar se há atualização!";
|
||||||
|
|
||||||
"COPY_SETTINGS" = "Copiar Configurações";
|
"COPY_SETTINGS" = "Copiar Configurações";
|
||||||
"COPY_SETTINGS_DESC" = "Copia todas as configurações atuais para a área de transferência";
|
"COPY_SETTINGS_DESC" = "Copia todas as configurações atuais para a área de transferência";
|
||||||
"PASTE_SETTINGS" = "Colar Configurações";
|
"PASTE_SETTINGS" = "Colar Configurações";
|
||||||
"PASTE_SETTINGS_DESC" = "Cola as configurações da área de transferência e aplica";
|
"PASTE_SETTINGS_DESC" = "Cola as configurações da área de transferência e aplica";
|
||||||
"EXPORT_SETTINGS" = "Exportar Configurações";
|
"PASTE_SETTINGS_ALERT" = "Aplicar configurações da área de transferência?";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exporta todas as configurações atuais para um arquivo .txt";
|
"EXPORT_SETTINGS" = "Exportar Configurações";
|
||||||
"IMPORT_SETTINGS" = "Importar Configurações";
|
"EXPORT_SETTINGS_DESC" = "Exporta todas as configurações atuais para um arquivo .txt";
|
||||||
"IMPORT_SETTINGS_DESC" = "Pressione para importar as configurações (.txt)";
|
"IMPORT_SETTINGS" = "Importar Configurações";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Substituir os Botões 'Copiar Configurações' e 'Colar Configurações'";
|
"IMPORT_SETTINGS_DESC" = "Pressione para importar as configurações (.txt)";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Substitui os Botões 'Exportar Configurações' e 'Importar Configurações'";
|
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Substituir os Botões 'Copiar Configurações' e 'Colar Configurações'";
|
||||||
|
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Substitui os Botões 'Exportar Configurações' e 'Importar Configurações'";
|
||||||
"VIDEO_PLAYER" = "Video Player (Beta)";
|
|
||||||
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
|
"VIDEO_PLAYER" = "Reprodutor de Vídeo (Beta)";
|
||||||
|
"VIDEO_PLAYER_DESC" = "Abra um vídeo baixado no Reprodutor de video da Apple";
|
||||||
// Player Gestures
|
|
||||||
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
|
// Player Gestures
|
||||||
"VOLUME" = "Volume";
|
"PLAYER_GESTURES_TOGGLE" = "Habilitar Gestos no Reprodutor de video";
|
||||||
"BRIGHTNESS" = "Brightness";
|
"VOLUME" = "Volume";
|
||||||
"SEEK" = "Seek";
|
"BRIGHTNESS" = "Brilho";
|
||||||
"DISABLED" = "Disabled";
|
"SEEK" = "Busca";
|
||||||
"DEADZONE" = "Deadzone";
|
"DISABLED" = "Desabilitado";
|
||||||
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
|
"DEADZONE" = "Zona morta";
|
||||||
"SENSITIVITY" = "Sensitivity";
|
"DEADZONE_DESC" = "Distância mínima a percorrer antes de um gesto ser reconhecido";
|
||||||
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
|
"SENSITIVITY" = "Sensibilidade";
|
||||||
"PLAYER_GESTURES_TITLE" = "Player Gestures";
|
"SENSITIVITY_DESC" = "Multiplicador em gestos de volume e brilho";
|
||||||
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
|
"PLAYER_GESTURES_TITLE" = "Gestos do Reprodutor de video";
|
||||||
"TOP_SECTION" = "Top Section";
|
"PLAYER_GESTURES_DESC" = "Configurar gestos panorâmicos horizontal para o player";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"TOP_SECTION" = "Seção Superior";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"MIDDLE_SECTION" = "Seção do Meio";
|
||||||
|
"BOTTOM_SECTION" = "Seção Inferior";
|
||||||
// Video controls overlay options
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Habilitar Feedback Tátil";
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opções de Sobreposição de Controles de Vídeo";
|
|
||||||
|
// Video controls overlay options
|
||||||
"ENABLE_SHARE_BUTTON" = "Ativar o botão 'Compartilhar'";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opções de Sobreposição de Controles de Vídeo";
|
||||||
"ENABLE_SHARE_BUTTON_DESC" = "Ativa o botão Compartilhar na sobreposição de controles de vídeo.";
|
|
||||||
|
"ENABLE_SHARE_BUTTON" = "Ativar o botão 'Compartilhar'";
|
||||||
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Ativar o botão 'Salvar'";
|
"ENABLE_SHARE_BUTTON_DESC" = "Ativa o botão Compartilhar na sobreposição de controles de vídeo.";
|
||||||
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Ativa o botão 'Salvar' na sobreposição de controles de vídeo.";
|
|
||||||
|
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Ativar o botão 'Salvar'";
|
||||||
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ocultar Sombras nos Botões de Sobreposição";
|
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Ativa o botão 'Salvar' na sobreposição de controles de vídeo.";
|
||||||
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Oculta as sombras nos botões de sobreposição Reproduzir/Pausar, Anterior, Próximo, Avançar e Retroceder.";
|
|
||||||
|
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ocultar Sombras nos Botões de Sobreposição";
|
||||||
"HIDE_RIGHT_PANEL" = "Ocultar o painel direito no modo de tela cheia";
|
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Oculta as sombras nos botões de sobreposição Reproduzir/Pausar, Anterior, Próximo, Avançar e Retroceder.";
|
||||||
"HIDE_RIGHT_PANEL_DESC" = "A reinicialização do app é necessária.";
|
|
||||||
|
"HIDE_RIGHT_PANEL" = "Ocultar o painel direito no modo de tela cheia";
|
||||||
"HIDE_HEATWAVES" = "Ocultar Ondas de calor";
|
"HIDE_RIGHT_PANEL_DESC" = "A reinicialização do app é necessária.";
|
||||||
"HIDE_HEATWAVES_DESC" = "Oculta as Ondas de calor no player de vídeo. A reinicialização do app é necessária.";
|
|
||||||
|
"HIDE_HEATWAVES" = "Ocultar Ondas de calor";
|
||||||
"DISABLE_AMBIENT_PORTRAIT" = "Desativar Iluminação cinematográfica (Retrato)";
|
"HIDE_HEATWAVES_DESC" = "Oculta as Ondas de calor no player de vídeo. A reinicialização do app é necessária.";
|
||||||
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Desativa a iluminação ao redor do título do vídeo";
|
|
||||||
|
"DISABLE_AMBIENT_PORTRAIT" = "Desativar Iluminação cinematográfica (Retrato)";
|
||||||
"DISABLE_AMBIENT_FULLSCREEN" = "Desativar Iluminação cinematográfica (Tela cheia)";
|
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Desativa a iluminação ao redor do título do vídeo";
|
||||||
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Desativa a iluminação ao redor do player de vídeo";
|
|
||||||
|
"DISABLE_AMBIENT_FULLSCREEN" = "Desativar Iluminação cinematográfica (Tela cheia)";
|
||||||
"FULLSCREEN_TO_THE_RIGHT" = "Tela cheia para a direita";
|
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Desativa a iluminação ao redor do player de vídeo";
|
||||||
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Sempre entre em tela cheia com o botão home no lado direito.";
|
|
||||||
|
"FULLSCREEN_TO_THE_RIGHT" = "Tela cheia para a direita";
|
||||||
"SEEK_ANYWHERE" = "Gesto de Busca em qualquer lugar";
|
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Sempre entre em tela cheia com o botão home no lado direito.";
|
||||||
"SEEK_ANYWHERE_DESC" = "Segure e arraste o player de vídeo para buscar. Você deve desativar o YTLite - Segurar para velocidade (Hold for speed)";
|
|
||||||
|
"SEEK_ANYWHERE" = "Gesto de Busca em qualquer lugar";
|
||||||
"ENABLE_TAP_TO_SEEK" = "Ativar Toque para Buscar";
|
"SEEK_ANYWHERE_DESC" = "Segure e arraste o player de vídeo para buscar. Você deve desativar o YTLite - Segurar para velocidade (Hold for speed)";
|
||||||
"ENABLE_TAP_TO_SEEK_DESC" = "Vá para qualquer lugar em um vídeo tocando uma vez na barra de busca";
|
|
||||||
|
"ENABLE_TAP_TO_SEEK" = "Ativar Toque para Buscar";
|
||||||
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Desativar gesto de puxar para tela cheia";
|
"ENABLE_TAP_TO_SEEK_DESC" = "Vá para qualquer lugar em um vídeo tocando uma vez na barra de busca";
|
||||||
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Desativa o gesto de arrastar para entrar em tela cheia vertical. Aplica-se apenas a vídeos em paisagem.";
|
|
||||||
|
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Desativar gesto de puxar para tela cheia";
|
||||||
"ALWAYS_USE_REMAINING_TIME" = "Sempre usar o tempo restante";
|
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Desativa o gesto de arrastar para entrar em tela cheia vertical. Aplica-se apenas a vídeos em paisagem.";
|
||||||
"ALWAYS_USE_REMAINING_TIME_DESC" = "Altera o padrão para mostrar o tempo restante na barra do player.";
|
|
||||||
|
"ALWAYS_USE_REMAINING_TIME" = "Sempre usar o tempo restante";
|
||||||
"DISABLE_TOGGLE_TIME_REMAINING" = "Desativar alternar tempo restante";
|
"ALWAYS_USE_REMAINING_TIME_DESC" = "Altera o padrão para mostrar o tempo restante na barra do player.";
|
||||||
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Desativa a alteração do tempo decorrido para o tempo restante. Use com outra configuração para mostrar sempre o tempo restante.";
|
|
||||||
|
"DISABLE_TOGGLE_TIME_REMAINING" = "Desativar alternar tempo restante";
|
||||||
"DISABLE_ENGAGEMENT_OVERLAY" = "Desativar sobreposição de engajamento em tela cheia";
|
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Desativa a alteração do tempo decorrido para o tempo restante. Use com outra configuração para mostrar sempre o tempo restante.";
|
||||||
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desativa o gesto de deslizar para cima e a lista de vídeos sugeridos em tela cheia";
|
|
||||||
|
"DISABLE_ENGAGEMENT_OVERLAY" = "Desativar sobreposição de engajamento em tela cheia";
|
||||||
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar Visualizações de comentários sob o player";
|
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desativa o gesto de deslizar para cima e a lista de vídeos sugeridos em tela cheia";
|
||||||
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Oculta a Prévia de comentário no botão de comentários";
|
|
||||||
|
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar Visualizações de comentários sob o player";
|
||||||
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ocultar mini visualização de reprodução automática";
|
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Oculta a Prévia de comentário no botão de comentários";
|
||||||
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Oculta a pequena caixa de vídeo sugerida perto do título em tela cheia";
|
|
||||||
|
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ocultar mini visualização de reprodução automática";
|
||||||
"HIDE_HUD_MESSAGES" = "Ocultar Mensagens do HUD";
|
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Oculta a pequena caixa de vídeo sugerida perto do título em tela cheia";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "Exemplo: Legendas/CC ativadas/desativadas, A repetição do vídeo está ativada,...";
|
|
||||||
|
"HIDE_HUD_MESSAGES" = "Ocultar Mensagens do HUD";
|
||||||
"HIDE_COLLAPSE_BUTTON" = "Ocultar Botão de Recolhimento";
|
"HIDE_HUD_MESSAGES_DESC" = "Exemplo: Legendas/CC ativadas/desativadas, A repetição do vídeo está ativada,...";
|
||||||
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta o botão de seta para recolher que era exibido no canto superior esquerdo do player de vídeo.";
|
|
||||||
|
"HIDE_COLLAPSE_BUTTON" = "Ocultar Botão de Recolhimento";
|
||||||
"HIDE_SPEED_TOAST" = "Ocultar Toast de Velocidade";
|
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta o botão de seta para recolher que era exibido no canto superior esquerdo do player de vídeo.";
|
||||||
"HIDE_SPEED_TOAST_DESC" = "Ocultar o popup de Velocidade 2X ao segurar o player";
|
|
||||||
|
"HIDE_SPEED_TOAST" = "Ocultar Toast de Velocidade";
|
||||||
|
"HIDE_SPEED_TOAST_DESC" = "Ocultar o popup de Velocidade 2X ao segurar o player";
|
||||||
// App settings overlay options
|
|
||||||
"APP_SETTINGS_OVERLAY_OPTIONS" = "Configurações do Aplicativo";
|
|
||||||
|
// App settings overlay options
|
||||||
"HIDE_ACCOUNT_SECTION" = "Ocultar a sessão \"Conta\"";
|
"APP_SETTINGS_OVERLAY_OPTIONS" = "Configurações do Aplicativo";
|
||||||
"HIDE_AUTOPLAY_SECTION" = "Ocultar a sessão \"Reprodução automática\"";
|
|
||||||
"HIDE_TRYNEWFEATURES_SECTION" = "Ocultar a sessão \"Experimente novos recursos\"";
|
"HIDE_ACCOUNT_SECTION" = "Ocultar a sessão \"Conta\"";
|
||||||
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "Ocultar a sessão \"Preferências de qualidade de vídeo\"";
|
"HIDE_AUTOPLAY_SECTION" = "Ocultar a sessão \"Reprodução automática\"";
|
||||||
"HIDE_NOTIFICATIONS_SECTION" = "Ocultar a sessão \"Notificações\"";
|
"HIDE_TRYNEWFEATURES_SECTION" = "Ocultar a sessão \"Experimente novos recursos\"";
|
||||||
"HIDE_MANAGEALLHISTORY_SECTION" = "Ocultar a sessão \"Gerencie todo o histórico\"";
|
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "Ocultar a sessão \"Preferências de qualidade de vídeo\"";
|
||||||
"HIDE_YOURDATAINYOUTUBE_SECTION" = "Ocultar a sessão \"Seus dados no YouTube\"";
|
"HIDE_NOTIFICATIONS_SECTION" = "Ocultar a sessão \"Notificações\"";
|
||||||
"HIDE_PRIVACY_SECTION" = "Ocultar a sessão \"Privacidade\"";
|
"HIDE_MANAGEALLHISTORY_SECTION" = "Ocultar a sessão \"Gerencie todo o histórico\"";
|
||||||
"HIDE_LIVECHAT_SECTION" = "Ocultar a sessão \"Chat ao vivo\"";
|
"HIDE_YOURDATAINYOUTUBE_SECTION" = "Ocultar a sessão \"Seus dados no YouTube\"";
|
||||||
|
"HIDE_PRIVACY_SECTION" = "Ocultar a sessão \"Privacidade\"";
|
||||||
// Theme
|
"HIDE_LIVECHAT_SECTION" = "Ocultar a sessão \"Chat ao vivo\"";
|
||||||
"THEME_OPTIONS" = "Opções de Temas";
|
|
||||||
|
// Theme
|
||||||
"OLED_DARK_THEME" = "Modo escuro OLED";
|
"THEME_OPTIONS" = "Opções de Temas";
|
||||||
"OLED_DARK_THEME_2" = "Modo escuro OLED";
|
|
||||||
"OLED_DARK_THEME_DESC" = "Verdadeiro tema escuro. Pode não funcionar corretamente em alguns casos. App restart is required after you enable/disable this option.";
|
"OLED_DARK_THEME" = "Modo escuro OLED";
|
||||||
|
"OLED_DARK_THEME_2" = "Modo escuro OLED";
|
||||||
"OLD_DARK_THEME" = "Antigo tema escuro";
|
"OLED_DARK_THEME_DESC" = "Verdadeiro tema escuro. Pode não funcionar corretamente em alguns casos. App restart is required after you enable/disable this option.";
|
||||||
"OLD_DARK_THEME_DESC" = "Tema escuro do YouTube antigo (tema cinza). A reinicialização do app é necessária.";
|
|
||||||
|
"OLD_DARK_THEME" = "Antigo tema escuro";
|
||||||
"DEFAULT_THEME" = "Padrão";
|
"OLD_DARK_THEME_DESC" = "Tema escuro do YouTube antigo (tema cinza). A reinicialização do app é necessária.";
|
||||||
"DEFAULT_THEME_DESC" = "Tema escuro padrão do YouTube. A reinicialização do app é necessária.";
|
|
||||||
|
"DEFAULT_THEME" = "Padrão";
|
||||||
"OLED_KEYBOARD" = "Teclado OLED";
|
"DEFAULT_THEME_DESC" = "Tema escuro padrão do YouTube. A reinicialização do app é necessária.";
|
||||||
"OLED_KEYBOARD_DESC" = "Pode não funcionar corretamente em alguns casos. A reinicialização do app é necessária.";
|
|
||||||
|
"OLED_KEYBOARD" = "Teclado OLED";
|
||||||
"LOW_CONTRAST_MODE" = "Modo de Baixo Contraste";
|
"OLED_KEYBOARD_DESC" = "Pode não funcionar corretamente em alguns casos. A reinicialização do app é necessária.";
|
||||||
"LOW_CONTRAST_MODE_DESC" = "Esta opção terá baixo contraste dos textos e botões, assim como era a antiga interface do YouTube. A reinicialização do app é necessária.";
|
|
||||||
"LCM_SELECTOR" = "Seleção do modo de baixo contraste";
|
"LOW_CONTRAST_MODE" = "Modo de Baixo Contraste";
|
||||||
"DEFAULT_LOWCONTRASTMODE" = "(Padrão) LowContrastMode";
|
"LOW_CONTRAST_MODE_DESC" = "Esta opção terá baixo contraste dos textos e botões, assim como era a antiga interface do YouTube. A reinicialização do app é necessária.";
|
||||||
"CUSTOM_LOWCONTRASTMODE" = "(Cor Personalizada) LowContrastMode";
|
"LCM_SELECTOR" = "Seleção do modo de baixo contraste";
|
||||||
|
"DEFAULT_LOWCONTRASTMODE" = "(Padrão) LowContrastMode";
|
||||||
// Miscellaneous
|
"CUSTOM_LOWCONTRASTMODE" = "(Cor Personalizada) LowContrastMode";
|
||||||
"MISCELLANEOUS" = "Diversos";
|
|
||||||
|
// Miscellaneous
|
||||||
"PLAYBACK_IN_FEEDS" = "Reprodução nos feeds";
|
"MISCELLANEOUS" = "Diversos";
|
||||||
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Sempre ativada";
|
|
||||||
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Somente Wi-Fi";
|
"PLAYBACK_IN_FEEDS" = "Reprodução nos feeds";
|
||||||
"PLAYBACK_IN_FEEDS_OFF" = "Desativada";
|
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Sempre ativada";
|
||||||
|
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Somente Wi-Fi";
|
||||||
"NEW_SETTINGS_UI" = "Nova Interface de Configurações";
|
"PLAYBACK_IN_FEEDS_OFF" = "Desativada";
|
||||||
"NEW_SETTINGS_UI_DESC" = "Usa a nova Interface de configurações agrupadas. Pode ocultar algumas configurações";
|
|
||||||
|
"NEW_SETTINGS_UI" = "Nova Interface de Configurações";
|
||||||
"ENABLE_YT_STARTUP_ANIMATION" = "Ative a animação de inicialização do YouTube";
|
"NEW_SETTINGS_UI_DESC" = "Usa a nova Interface de configurações agrupadas. Pode ocultar algumas configurações";
|
||||||
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
|
|
||||||
|
"ENABLE_YT_STARTUP_ANIMATION" = "Ative a animação de inicialização do YouTube";
|
||||||
"HIDE_MODERN_INTERFACE" = "Ocultar Interface Moderna (YTNoModernUI)";
|
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
|
||||||
"HIDE_MODERN_INTERFACE_DESC" = "Ative esta opção para ocultar qualquer elemento moderno adicionado pelo YouTube. Remove a iluminação cinematogrática, design arredondado e muito mais. A reinicialização do app é necessária.";
|
|
||||||
|
"HIDE_MODERN_INTERFACE" = "Ocultar Interface Moderna (YTNoModernUI)";
|
||||||
"IPAD_LAYOUT" = "Layout do iPad";
|
"HIDE_MODERN_INTERFACE_DESC" = "Ative esta opção para ocultar qualquer elemento moderno adicionado pelo YouTube. Remove a iluminação cinematogrática, design arredondado e muito mais. A reinicialização do app é necessária.";
|
||||||
"IPAD_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPad no seu iPhone/iPod atual. A reinicialização do app é necessária.";
|
|
||||||
|
"IPAD_LAYOUT" = "Layout do iPad";
|
||||||
"IPHONE_LAYOUT" = "Layout do iPhone";
|
"IPAD_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPad no seu iPhone/iPod atual. A reinicialização do app é necessária.";
|
||||||
"IPHONE_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPhone no seu iPad atual. A reinicialização do app é necessária.";
|
|
||||||
|
"IPHONE_LAYOUT" = "Layout do iPhone";
|
||||||
"CAST_CONFIRM" = "Alerta de confirmação antes de transmitir (YTCastConfirm)";
|
"IPHONE_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPhone no seu iPad atual. A reinicialização do app é necessária.";
|
||||||
"CAST_CONFIRM_DESC" = "Mostra um alerta de confirmação antes da transmissão para evitar o sequestro acidental da TV.";
|
|
||||||
"CASTING" = "Transmissão";
|
"CAST_CONFIRM" = "Alerta de confirmação antes de transmitir (YTCastConfirm)";
|
||||||
"MSG_ARE_YOU_SURE" = "Tem certeza de que deseja começar a transmitir?";
|
"CAST_CONFIRM_DESC" = "Mostra um alerta de confirmação antes da transmissão para evitar o sequestro acidental da TV.";
|
||||||
"MSG_YES" = "Sim";
|
"CASTING" = "Transmissão";
|
||||||
"MSG_CANCEL" = "Cancelar";
|
"MSG_ARE_YOU_SURE" = "Tem certeza de que deseja começar a transmitir?";
|
||||||
|
"MSG_YES" = "Sim";
|
||||||
"NEW_MINIPLAYER_STYLE" = "Novo estilo de barra de miniplayer (BigYTMiniPlayer)";
|
"MSG_CANCEL" = "Cancelar";
|
||||||
"NEW_MINIPLAYER_STYLE_DESC" = "A reinicialização do app é necessária.";
|
|
||||||
|
"NEW_MINIPLAYER_STYLE" = "Novo estilo de barra de miniplayer (BigYTMiniPlayer)";
|
||||||
"HIDE_CAST_BUTTON" = "Ocultar o botão Transmitir";
|
"NEW_MINIPLAYER_STYLE_DESC" = "A reinicialização do app é necessária.";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "A reinicialização do app é necessária.";
|
|
||||||
|
"HIDE_CAST_BUTTON" = "Ocultar o botão Transmitir";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar o botão iSponsorBlock na barra de navegação";
|
"HIDE_CAST_BUTTON_DESC" = "A reinicialização do app é necessária.";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Botão do Reprodutor de Vídeo";
|
||||||
"HIDE_HOME_TAB" = "Ocultar guia Início";
|
"VIDEO_PLAYER_BUTTON_DESC" = "Mostra um botão na barra de navegação para abrir vídeos baixados no Reprodutor de video da Apple";
|
||||||
"HIDE_HOME_TAB_DESC" = "Tenha cuidado ao ocultar todas as guias";
|
|
||||||
|
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar o botão iSponsorBlock na barra de navegação";
|
||||||
"FIX_CASTING" = "Corrigir Transmissão";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
"FIX_CASTING_DESC" = "Altera alguns sinalizadores AB para corrigir a transmissão";
|
|
||||||
|
"HIDE_HOME_TAB" = "Ocultar guia Início";
|
||||||
"ENABLE_FLEX" = "Ativar FLEX";
|
"HIDE_HOME_TAB_DESC" = "Tenha cuidado ao ocultar todas as guias";
|
||||||
"ENABLE_FLEX_DESC" = "Ativa o FLEX para depuração (não recomendado). Deixe isso desligado, a menos que você saiba o que está fazendo.";
|
|
||||||
|
"FIX_CASTING" = "Corrigir Transmissão";
|
||||||
// Version Spoofer
|
"FIX_CASTING_DESC" = "Altera alguns sinalizadores AB para corrigir a transmissão";
|
||||||
"APP_VERSION_SPOOFER_LITE" = "Ativar Falsificação da Versão do App (Lite)";
|
|
||||||
"APP_VERSION_SPOOFER_LITE_DESC" = "Ative isto para usar a Falsificação de Versão (Lite) e selecione sua versão preferida abaixo. A reinicialização do app é necessária.";
|
"ENABLE_FLEX" = "Ativar FLEX";
|
||||||
"VERSION_SPOOFER_TITLE" = "Selecionar Versão Falsa";
|
"ENABLE_FLEX_DESC" = "Ativa o FLEX para depuração (não recomendado). Deixe isso desligado, a menos que você saiba o que está fazendo.";
|
||||||
|
|
||||||
// Other Localization
|
// Version Spoofer
|
||||||
"APP_RESTART_DESC" = "A reinicialização do app é necessária.";
|
"APP_VERSION_SPOOFER_LITE" = "Ativar Falsificação da Versão do App (Lite)";
|
||||||
"CHANGE_APP_ICON" = "Mudar o Ícone do Aplicativo";
|
"APP_VERSION_SPOOFER_LITE_DESC" = "Ative isto para usar a Falsificação de Versão (Lite) e selecione sua versão preferida abaixo. A reinicialização do app é necessária.";
|
||||||
|
"VERSION_SPOOFER_TITLE" = "Selecionar Versão Falsa";
|
||||||
|
|
||||||
|
// Other Localization
|
||||||
|
"APP_RESTART_DESC" = "A reinicialização do app é necessária.";
|
||||||
|
"CHANGE_APP_ICON" = "Mudar o Ícone do Aplicativo";
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Paste Settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opțiuni Overlay Controale Video";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opțiuni Overlay Controale Video";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Ascundere buton Proiectare";
|
"HIDE_CAST_BUTTON" = "Ascundere buton Proiectare";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Este necesară repornirea aplicației.";
|
"HIDE_CAST_BUTTON_DESC" = "Este necesară repornirea aplicației.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Ascundere buton iSponsorBlock în bara de navigație";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Ascundere buton iSponsorBlock în bara de navigație";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Paste Settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Скрыть кнопку «Транслировать»";
|
"HIDE_CAST_BUTTON" = "Скрыть кнопку «Транслировать»";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Потребуется перезагрузка.";
|
"HIDE_CAST_BUTTON_DESC" = "Потребуется перезагрузка.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste settings";
|
"PASTE_SETTINGS" = "Paste settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export settings";
|
"EXPORT_SETTINGS" = "Export settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import settings";
|
"IMPORT_SETTINGS" = "Import settings";
|
||||||
|
|
@ -46,6 +47,7 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
|
||||||
|
|
@ -178,6 +180,9 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
|
||||||
"HIDE_CAST_BUTTON" = "Hide Cast button";
|
"HIDE_CAST_BUTTON" = "Hide Cast button";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "App restart is required.";
|
"HIDE_CAST_BUTTON_DESC" = "App restart is required.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Tüm mevcut ayarları panoya kopyala";
|
"COPY_SETTINGS_DESC" = "Tüm mevcut ayarları panoya kopyala";
|
||||||
"PASTE_SETTINGS" = "Ayarları Yapıştır";
|
"PASTE_SETTINGS" = "Ayarları Yapıştır";
|
||||||
"PASTE_SETTINGS_DESC" = "Panodaki ayarları yapıştır ve uygula";
|
"PASTE_SETTINGS_DESC" = "Panodaki ayarları yapıştır ve uygula";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Panodan ayarları uygulamak istiyor musun?";
|
||||||
"EXPORT_SETTINGS" = "Ayarları Dışa Aktar";
|
"EXPORT_SETTINGS" = "Ayarları Dışa Aktar";
|
||||||
"EXPORT_SETTINGS_DESC" = "Tüm mevcut ayarları bir .txt dosyasına dışa aktarır";
|
"EXPORT_SETTINGS_DESC" = "Tüm mevcut ayarları bir .txt dosyasına dışa aktarır";
|
||||||
"IMPORT_SETTINGS" = "Ayarları İçe Aktar";
|
"IMPORT_SETTINGS" = "Ayarları İçe Aktar";
|
||||||
|
|
@ -13,24 +14,25 @@
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS" = "'Ayarları Kopyala' ve 'Ayarları Yapıştır' Düğmelerini Değiştir";
|
"REPLACE_COPY_AND_PASTE_BUTTONS" = "'Ayarları Kopyala' ve 'Ayarları Yapıştır' Düğmelerini Değiştir";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Düğmeleri 'Ayarları Dışa Aktar' ve 'Ayarları İçe Aktar' ile değiştirir";
|
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Düğmeleri 'Ayarları Dışa Aktar' ve 'Ayarları İçe Aktar' ile değiştirir";
|
||||||
|
|
||||||
"VIDEO_PLAYER" = "Video Player (Beta)";
|
"VIDEO_PLAYER" = "Video Oynatıcı (Beta)";
|
||||||
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
|
"VIDEO_PLAYER_DESC" = "İndirilen bir videoyu Apple oynatıcısında aç";
|
||||||
|
|
||||||
// Player Gestures
|
// Player Gestures
|
||||||
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
|
"PLAYER_GESTURES_TOGGLE" = "Oynatıcı Hareketlerini Etkinleştir";
|
||||||
"VOLUME" = "Volume";
|
"VOLUME" = "Ses";
|
||||||
"BRIGHTNESS" = "Brightness";
|
"BRIGHTNESS" = "Parlaklık";
|
||||||
"SEEK" = "Seek";
|
"SEEK" = "Arama";
|
||||||
"DISABLED" = "Disabled";
|
"DISABLED" = "Devre Dışı";
|
||||||
"DEADZONE" = "Deadzone";
|
"DEADZONE" = "Ölü Bölge";
|
||||||
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
|
"DEADZONE_DESC" = "Bir hareketin tanınması için minimum mesafe";
|
||||||
"SENSITIVITY" = "Sensitivity";
|
"SENSITIVITY" = "Hassasiyet";
|
||||||
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
|
"SENSITIVITY_DESC" = "Ses ve parlaklık hareketleri için çarpan";
|
||||||
"PLAYER_GESTURES_TITLE" = "Player Gestures";
|
"PLAYER_GESTURES_TITLE" = "Oynatıcı Hareketleri";
|
||||||
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
|
"PLAYER_GESTURES_DESC" = "Oynatıcı için yatay kaydırma hareketlerini yapılandır";
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Üst Bölüm";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Orta Bölüm";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Alt Bölüm";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Haptik(titreşim) Geri Bildirimi Etkinleştir";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Kontrol Seç.";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Kontrol Seç.";
|
||||||
|
|
@ -163,6 +165,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "Yayınla düğmesini gizle";
|
"HIDE_CAST_BUTTON" = "Yayınla düğmesini gizle";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Yeniden başlatılmalı.";
|
"HIDE_CAST_BUTTON_DESC" = "Yeniden başlatılmalı.";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Oynatıcı Butonu";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "İndirilen videoları Apple oynatıcısında açmak için gezinme çubuğunda bir buton göster";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "Gezinme çubuğunda iSponsorBlock düğmesini gizle";
|
"HIDE_SPONSORBLOCK_BUTTON" = "Gezinme çubuğunda iSponsorBlock düğmesini gizle";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,294 +1,190 @@
|
||||||
// Settings
|
// Settings
|
||||||
"VERSION" = "Phiên bản của CercubePlus: %@";
|
"VERSION" = "Phiên bản YTLitePlus: %@";
|
||||||
"VERSION_CHECK" = "Nhấn để kiểm tra cập nhật!";
|
"VERSION_CHECK" = "Nhấn để kiểm tra cập nhật!";
|
||||||
|
|
||||||
"COPY_SETTINGS" = "Copy Settings";
|
"COPY_SETTINGS" = "Sao chép cài đặt";
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Sao chép cài đặt hiện tại vào bảng nhớ tạm";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Dán cài đặt";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Dán cài đặt từ bảng nhớ tạm và áp dụng";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"PASTE_SETTINGS_ALERT" = "Áp dụng các cài đặt?";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS" = "Xuất cài đặt";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"EXPORT_SETTINGS_DESC" = "Xuất tất cài đặt hiện tại vào tệp .txt";
|
||||||
"IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
|
"IMPORT_SETTINGS" = "Nhập cài đặt";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
|
"IMPORT_SETTINGS_DESC" = "Nhấn để nhập cài đặt (.txt)";
|
||||||
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
|
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Thay thế nút 'Sao chép cài đặt' và 'Dán cài đặt'";
|
||||||
|
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Thay thế các nút thành 'Xuất cài đặt' và 'Nhập cài đặt'";
|
||||||
|
|
||||||
"VIDEO_PLAYER" = "Video Player (Beta)";
|
"VIDEO_PLAYER" = "Trình phát video (Beta)";
|
||||||
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
|
"VIDEO_PLAYER_DESC" = "Mở video đã tải xuống trong trình phát Apple";
|
||||||
|
|
||||||
// Player Gestures
|
// Player Gestures
|
||||||
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
|
"PLAYER_GESTURES_TOGGLE" = "Bật cử chỉ trình phát";
|
||||||
"VOLUME" = "Volume";
|
"VOLUME" = "Âm lượng";
|
||||||
"BRIGHTNESS" = "Brightness";
|
"BRIGHTNESS" = "Độ sáng";
|
||||||
"SEEK" = "Seek";
|
"SEEK" = "Tua";
|
||||||
"DISABLED" = "Disabled";
|
"DISABLED" = "Vô hiệu hóa";
|
||||||
"DEADZONE" = "Deadzone";
|
"DEADZONE" = "Vùng chết";
|
||||||
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
|
"DEADZONE_DESC" = "Khoảng cách tối thiểu để nhận diện cử chỉ";
|
||||||
"SENSITIVITY" = "Sensitivity";
|
"SENSITIVITY" = "Độ nhạy";
|
||||||
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
|
"SENSITIVITY_DESC" = "Hệ số nhân cho cử chỉ âm lượng và độ sáng";
|
||||||
"PLAYER_GESTURES_TITLE" = "Player Gestures";
|
"PLAYER_GESTURES_TITLE" = "Cử chỉ trình phát";
|
||||||
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
|
"PLAYER_GESTURES_DESC" = "Cấu hình cử chỉ vuốt ngang cho trình phát";
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Phần trên";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Phần giữa";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Phần dưới";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Bật phản hồi xúc giác";
|
||||||
// Video player options
|
|
||||||
"VIDEO_PLAYER_OPTIONS" = "Tùy chọn trình phát video";
|
|
||||||
|
|
||||||
"SNAP_TO_CHAPTER" = "Vô hiệu hóa đính vào chương";
|
|
||||||
"SNAP_TO_CHAPTER_DESC" = "Tắt tính năng tự động chuyển sang chương khi tìm kiếm trong video. Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"PINCH_TO_ZOOM" = "Vô hiệu hóa chụm để thu phóng";
|
|
||||||
"PINCH_TO_ZOOM_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"YT_MINIPLAYER" = "Bật trình phát mini cho tất cả các video trên YouTube";
|
|
||||||
"YT_MINIPLAYER_DESC" = "Ví dụ: video dành cho trẻ em";
|
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Tùy chọn lớp phủ điều khiển video";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Lớp phủ video";
|
||||||
|
|
||||||
"HIDE_CHANNEL_WATERMARK" = "Ẩn hình mờ kênh";
|
"ENABLE_SHARE_BUTTON" = "Bật nút chia sẻ";
|
||||||
"HIDE_CHANNEL_WATERMARK_DESC" = "Ẩn hình mờ của kênh trong lớp phủ điều khiển video. Khởi động lại ứng dụng là bắt buộc.";
|
"ENABLE_SHARE_BUTTON_DESC" = "Thêm nút chia sẻ trong trình phát video.";
|
||||||
|
|
||||||
"RED_PROGRESS_BAR" = "Thanh tiến trình màu đỏ";
|
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Bật nút 'Lưu vào danh sách phát'";
|
||||||
"RED_PROGRESS_BAR_DESC" = "Mang lại thanh tiến trình màu đỏ. Khởi động lại ứng dụng là bắt buộc.";
|
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Thêm nút 'Lưu vào danh sách phát' trong trình phát video.";
|
||||||
|
|
||||||
"DONT_EAT_MY_CONTENT" = "Ngăn Notch/Đảo trên nội dung video 2:1 (DontEatMyContent)";
|
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ẩn bóng các nút";
|
||||||
"DONT_EAT_MY_CONTENT_DESC" = "Ngăn notch/Dynamic Island nghiền ngẫm nội dung video 2:1 trên YouTube. Khởi động lại ứng dụng là bắt buộc.";
|
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Ẩn bóng các nút Phát/Tạm dừng, Trước/Tiếp theo, Tua tới/Tua lại.";
|
||||||
|
|
||||||
|
"HIDE_RIGHT_PANEL" = "Ẩn bảng bên phải ở chế độ toàn màn hình";
|
||||||
|
"HIDE_RIGHT_PANEL_DESC" = "Điều nãy sẽ khiến bạn không thể xem nội dung mô tả, bình luận, v.v ở chế độ toàn màn hình. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"HIDE_HEATWAVES" = "Ẩn sóng nhiệt";
|
"HIDE_HEATWAVES" = "Ẩn sóng nhiệt";
|
||||||
"HIDE_HEATWAVES_DESC" = "Ẩn Sóng nhiệt trong trình phát video. Khởi động lại ứng dụng là bắt buộc.";
|
"HIDE_HEATWAVES_DESC" = "Ẩn sóng nhiệt khỏi trình phát video. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"DISABLE_AMBIENT_PORTRAIT" = "Disable Ambient Mode (Portrait)";
|
"DISABLE_AMBIENT_PORTRAIT" = "Tắt chế độ môi trường (Chân dung)";
|
||||||
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Disable lighting surrounding video title";
|
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Tắt ánh sáng xung quanh tiêu đề video";
|
||||||
|
|
||||||
"DISABLE_AMBIENT_FULLSCREEN" = "Disable Ambient Mode (Fullscreen)";
|
"DISABLE_AMBIENT_FULLSCREEN" = "Tắt chế độ môi trường (Toàn màn hình)";
|
||||||
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Disable lighting surrouding video player";
|
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Tắt ánh sáng xung quanh trình phát video";
|
||||||
|
|
||||||
"FULLSCREEN_TO_THE_RIGHT" = "Fullscreen to the Right";
|
"FULLSCREEN_TO_THE_RIGHT" = "Toàn màn hình bên phải";
|
||||||
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Always enter fullscreen with home button on the right side.";
|
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Luôn vào chế độ toàn màn hình với nút home ở bên phải.";
|
||||||
|
|
||||||
"SEEK_ANYWHERE" = "Seek Anywhere Gesture";
|
"SEEK_ANYWHERE" = "Tua ở mọi nơi";
|
||||||
"SEEK_ANYWHERE_DESC" = "Hold and drag on the video player to seek. You must disable YTLite - Hold to speed";
|
"SEEK_ANYWHERE_DESC" = "Giữ và kéo bất kỳ đâu trên trình phát video để tua. Bạn phải tắt tùy chỉnh YTLite - Giữ để tua";
|
||||||
|
|
||||||
"ENABLE_TAP_TO_SEEK" = "Enable Tap To Seek";
|
"ENABLE_TAP_TO_SEEK" = "Nhấn để tua";
|
||||||
"ENABLE_TAP_TO_SEEK_DESC" = "Jump to anywhere in a video by single-tapping the seek bar";
|
"ENABLE_TAP_TO_SEEK_DESC" = "Nhấn một lần vào thanh tua để tua đến bất kỳ vị trí nào trong video";
|
||||||
|
|
||||||
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Disable pull-to-fullscreen gesture";
|
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Tắt cử chỉ kéo để vào toàn màn hình";
|
||||||
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Disable the drag gesture to enter vertical fullscreen. Only applies to landscape videos.";
|
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Tắt cử chỉ kéo để vào toàn màn hình dọc. Chỉ áp dụng cho video ngang.";
|
||||||
|
|
||||||
"ALWAYS_USE_REMAINING_TIME" = "Always use remaining time";
|
"ALWAYS_USE_REMAINING_TIME" = "Hiển thị thời gian còn lại";
|
||||||
"ALWAYS_USE_REMAINING_TIME_DESC" = "Change the default to show time remaining in the player bar.";
|
"ALWAYS_USE_REMAINING_TIME_DESC" = "Luôn hiển thị thời gian còn lại trên thanh trình phát video.";
|
||||||
|
|
||||||
"DISABLE_TOGGLE_TIME_REMAINING" = "Disable toggle time remaining";
|
"DISABLE_TOGGLE_TIME_REMAINING" = "Tắt chuyển đổi thời gian còn lại";
|
||||||
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Disables changing time elapsed to time remaining. Use with other setting to always show remaining time.";
|
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Tắt chức năng chuyển đổi từ thời gian đã phát sang thời gian còn lại. Sử dụng với cài đặt khác để luôn hiển thị thời gian còn lại.";
|
||||||
|
|
||||||
"DISABLE_ENGAGEMENT_OVERLAY" = "Disable fullscreen engagement overlay";
|
"DISABLE_ENGAGEMENT_OVERLAY" = "Tắt lớp phủ tương tác toàn màn hình";
|
||||||
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Disable the swipe-up gesture and suggested videos list in fullscreen";
|
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Tắt cử chỉ vuốt lên để xem video gợi ý ở chế độ toàn màn hình";
|
||||||
|
|
||||||
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Hide Comment previews under player";
|
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ẩn bản xem trước bình luận dưới trình phát";
|
||||||
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Hide comment spoiler in comments button";
|
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Ngăn tiết lộ nội dung bình luận trong nút bình luận";
|
||||||
|
|
||||||
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Hide autoplay mini preview";
|
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ẩn bản xem trước tự động phát nhỏ";
|
||||||
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Hide the small suggested video box near the title in fullscreen";
|
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Ẩn hộp gợi ý video nhỏ gần tiêu đề ở chế độ toàn màn hình";
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "Ẩn thông báo HUD";
|
"HIDE_HUD_MESSAGES" = "Ẩn thông báo HUD";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "Ví dụ: Đã bật/tắt phụ đề, Tính năng phát video lặp lại đang bật,...";
|
"HIDE_HUD_MESSAGES_DESC" = "Ẩn các thông báo xuất hiện khi thực hiện các hành động (ví dụ: bật/tắt CC)";
|
||||||
|
|
||||||
"HIDE_COLLAPSE_BUTTON" = "Hide Collapse Button";
|
"HIDE_COLLAPSE_BUTTON" = "Ẩn nút thu gọn";
|
||||||
"HIDE_COLLAPSE_BUTTON_DESC" = "Hides the Arrow Collapse Button that was shown in the Top Left of the Video Player.";
|
"HIDE_COLLAPSE_BUTTON_DESC" = "Ẩn nút thu gọn (mũi tên) xuất hiện ở góc trái trên của trình phát Video.";
|
||||||
|
|
||||||
"HIDE_SPEED_TOAST" = "Hide Speed Toast";
|
"HIDE_SPEED_TOAST" = "Ẩn thông báo tốc độ";
|
||||||
"HIDE_SPEED_TOAST_DESC" = "Hide the 2X Speed popup when holding the player";
|
"HIDE_SPEED_TOAST_DESC" = "Ẩn thông báo tốc độ 2X khi giữ trình phát video";
|
||||||
|
|
||||||
// Shorts controls overlay options
|
// App settings overlay options
|
||||||
"SHORTS_CONTROLS_OVERLAY_OPTIONS" = "Tùy chọn lớp phủ điều khiển quần short";
|
"APP_SETTINGS_OVERLAY_OPTIONS" = "Lớp phủ cài đặt";
|
||||||
|
|
||||||
"HIDE_SHORTS_CHANNEL_AVATAR" = "Ẩn hình đại diện của kênh Shorts";
|
"HIDE_ACCOUNT_SECTION" = "Ẩn cài đặt \"Chuyển đổi tài khoản\"";
|
||||||
"HIDE_SHORTS_CHANNEL_AVATAR_DESC" = "";
|
"HIDE_AUTOPLAY_SECTION" = "Ẩn cài đặt \"Tự động phát\"";
|
||||||
|
"HIDE_TRYNEWFEATURES_SECTION" = "Ẩn cài đặt \"Thử các tính năng mới\"";
|
||||||
"HIDE_SHORTS_LIKE_BUTTON" = "Ẩn nút thích Shorts";
|
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "Ẩn cài đặt \"Lựa chọn ưu tiên về chất lượng video\"";
|
||||||
"HIDE_SHORTS_LIKE_BUTTON_DESC" = "";
|
"HIDE_NOTIFICATIONS_SECTION" = "Ẩn cài đặt \"Thông báo\"";
|
||||||
|
"HIDE_MANAGEALLHISTORY_SECTION" = "Ẩn cài đặt \"Quản lý toàn bộ nhật ký hoạt động\"";
|
||||||
"HIDE_SHORTS_DISLIKE_BUTTON" = "Ẩn nút không thích Shorts";
|
"HIDE_YOURDATAINYOUTUBE_SECTION" = "Ẩn cài đặt \"Dữ liệu của bạn trong YouTube\"";
|
||||||
"HIDE_SHORTS_DISLIKE_BUTTON_DESC" = "";
|
"HIDE_PRIVACY_SECTION" = "Ẩn cài đặt \"Quyền riêng tư\"";
|
||||||
|
"HIDE_LIVECHAT_SECTION" = "Ẩn cài đặt \"Trò chuyện trực tiếp\"";
|
||||||
"HIDE_SHORTS_COMMENT_BUTTON" = "Ẩn nút bình luận Shorts";
|
|
||||||
"HIDE_SHORTS_COMMENT_BUTTON_DESC" = "";
|
|
||||||
|
|
||||||
"HIDE_SHORTS_REMIX_BUTTON" = "Ẩn nút phối lại video ngắn";
|
|
||||||
"HIDE_SHORTS_REMIX_BUTTON_DESC" = "";
|
|
||||||
|
|
||||||
"HIDE_SHORTS_SHARE_BUTTON" = "Ẩn nút chia sẻ Shorts";
|
|
||||||
"HIDE_SHORTS_SHARE_BUTTON_DESC" = "";
|
|
||||||
|
|
||||||
"HIDE_SUBSCRIPTIONS" = "Hide Subscriptions button";
|
|
||||||
"HIDE_SUBSCRIPTIONS_DESC" = "Hide Subscriptions button which shows up when paused.";
|
|
||||||
|
|
||||||
"HIDE_SUPER_THANKS" = "Ẩn biểu ngữ Mua hàng Vô cùng cảm ơn";
|
|
||||||
"HIDE_SUPER_THANKS_DESC" = "Ẩn biểu ngữ Mua hàng Vô cùng cảm ơn trong Shorts.";
|
|
||||||
|
|
||||||
"DISABLE_RESUME_TO_SHORTS" = "Vô hiệu hóa sơ yếu lý lịch cho Shorts";
|
|
||||||
"DISABLE_RESUME_TO_SHORTS_DESC" = "Nếu bạn đóng YouTube khi đang xem các video ngắn, thì các video ngắn đó sẽ không tự động phát vào lần tới khi bạn mở YouTube.";
|
|
||||||
|
|
||||||
// Theme
|
// Theme
|
||||||
"THEME_OPTIONS" = "Tùy chọn chủ đề";
|
"THEME_OPTIONS" = "Tùy chọn giao diện";
|
||||||
|
|
||||||
"OLED_DARK_THEME" = "Chủ đề tối OLED (Thử nghiệm)";
|
"OLED_DARK_THEME" = "Giao diện tối OLED";
|
||||||
"OLED_DARK_THEME_2" = "chủ đề tối OLED";
|
"OLED_DARK_THEME_2" = "Giao diện tối OLED";
|
||||||
"OLED_DARK_THEME_DESC" = "Chủ đề tối thực sự. Có thể không hoạt động chính xác trong một số trường hợp. Cần phải khởi động lại ứng dụng sau khi bạn bật/tắt tùy chọn này.";
|
"OLED_DARK_THEME_DESC" = "Giao diện tối thực sự. Có thể không hoạt động đúng trong một số trường hợp. Cần khởi động lại ứng dụng sau khi bạn bật/tắt tùy chọn này.";
|
||||||
|
|
||||||
"OLD_DARK_THEME" = "Chủ đề tối cũ";
|
"OLD_DARK_THEME" = "Giao diện tối cũ";
|
||||||
"OLD_DARK_THEME_DESC" = "Chủ đề tối cũ của YouTube (chủ đề màu xám). Khởi động lại ứng dụng là bắt buộc.";
|
"OLD_DARK_THEME_DESC" = "Giao diện tối cũ của YouTube (giao diện xám). Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"DEFAULT_THEME" = "Vỡ nợ";
|
"DEFAULT_THEME" = "Mặc định";
|
||||||
"DEFAULT_THEME_DESC" = "Chủ đề (er) tối mặc định của YouTube. Khởi động lại ứng dụng là bắt buộc.";
|
"DEFAULT_THEME_DESC" = "Giao diện mặc định của YouTube. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"OLED_KEYBOARD" = "Bàn phím OLED (Thử nghiệm)";
|
"OLED_KEYBOARD" = "Bàn phím OLED";
|
||||||
"OLED_KEYBOARD_DESC" = "Có thể không hoạt động chính xác trong một số trường hợp. Khởi động lại ứng dụng là bắt buộc.";
|
"OLED_KEYBOARD_DESC" = "Có thể hoạt động không đúng trong một số trường hợp. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
// Customization Options
|
|
||||||
"CUSTOMIZATION_OPTIONS" = "Tùy chọn tùy chỉnh";
|
|
||||||
|
|
||||||
"HIDE_MODERN_INTERFACE" = "Ẩn giao diện hiện đại (YTNoModernUI)";
|
|
||||||
"HIDE_MODERN_INTERFACE_DESC" = "Bật tính năng này để ẩn mọi Thành phần hiện đại do YouTube thêm vào. Loại bỏ Chế độ môi trường xung quanh, Thiết kế bo tròn và hơn thế nữa. Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"HIDE_YOUTUBE_LOGO" = "Ẩn biểu trưng YouTube";
|
|
||||||
"HIDE_YOUTUBE_LOGO_DESC" = "thao tác này sẽ Ẩn Logo YouTube ở trên cùng bên trái của Giao diện. Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"HIDE_TAB_BAR_LABELS" = "Ẩn Nhãn trong Thanh Tab";
|
|
||||||
"HIDE_TAB_BAR_LABELS_DESC" = "điều này sẽ Ẩn tất cả các nhãn trong Thanh tab. Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"LOW_CONTRAST_MODE" = "Chế độ tương phản thấp";
|
"LOW_CONTRAST_MODE" = "Chế độ tương phản thấp";
|
||||||
"LOW_CONTRAST_MODE_DESC" = "điều này sẽ tạo ra các văn bản và nút có độ tương phản thấp giống như Giao diện YouTube cũ. Khởi động lại ứng dụng là bắt buộc.";
|
"LOW_CONTRAST_MODE_DESC" = "Tùy chọn này sẽ giảm tương phản của văn bản và nút giống như giao diện YouTube cũ. Cần khởi động lại ứng dụng.";
|
||||||
|
"LCM_SELECTOR" = "Chọn chế độ tương phản thấp";
|
||||||
"RED_UI" = "Màu đỏ";
|
"DEFAULT_LOWCONTRASTMODE" = "(Mặc định) Chế độ tương phản thấp";
|
||||||
"RED_UI_DESC" = "Giao diện người dùng màu đỏ (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
"CUSTOM_LOWCONTRASTMODE" = "(Màu tùy chỉnh) Chế độ tương phản thấp";
|
||||||
|
|
||||||
"BLUE_UI" = "Giao diện người dùng màu xanh lam";
|
|
||||||
"BLUE_UI_DESC" = "Giao diện người dùng màu xanh lam (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"GREEN_UI" = "Giao diện xanh";
|
|
||||||
"GREEN_UI_DESC" = "Giao diện người dùng xanh (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"YELLOW_UI" = "Giao diện người dùng màu vàng";
|
|
||||||
"YELLOW_UI_DESC" = "Giao diện người dùng màu vàng (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"ORANGE_UI" = "Giao diện người dùng màu cam";
|
|
||||||
"ORANGE_UI_DESC" = "Giao diện người dùng màu cam (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"PURPLE_UI" = "Giao diện người dùng màu tím";
|
|
||||||
"PURPLE_UI_DESC" = "Giao diện người dùng màu tím (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"PINK_UI" = "Giao diện người dùng màu hồng";
|
|
||||||
"PINK_UI_DESC" = "Giao diện người dùng màu hồng (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
"MISCELLANEOUS" = "Điều khoản khác";
|
"MISCELLANEOUS" = "Tùy chọn khác";
|
||||||
|
|
||||||
"CAST_CONFIRM" = "Xác nhận cảnh báo trước khi truyền (YTCastConfirm)";
|
"PLAYBACK_IN_FEEDS" = "Phát trong các trang danh sách video";
|
||||||
"CAST_CONFIRM_DESC" = "Hiển thị cảnh báo xác nhận trước khi truyền để tránh vô tình chiếm quyền điều khiển TV.";
|
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Luôn bật";
|
||||||
"CASTING" = "Đúc";
|
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Chỉ Wi-Fi";
|
||||||
"MSG_ARE_YOU_SURE" = "Bạn có chắc chắn muốn bắt đầu truyền không?";
|
"PLAYBACK_IN_FEEDS_OFF" = "Tắt";
|
||||||
"MSG_YES" = "Đúng";
|
|
||||||
"MSG_CANCEL" = "Hủy bỏ";
|
|
||||||
|
|
||||||
"DISABLE_HINTS" = "Tắt gợi ý";
|
"NEW_SETTINGS_UI" = "Giao diện cài đặt mới";
|
||||||
"DISABLE_HINTS_DESC" = "Tắt gợi ý tính năng từ YouTube thường hiển thị khi ứng dụng mới được cài đặt.";
|
"NEW_SETTINGS_UI_DESC" = "Nhóm các giao diện cài đặt. Một số cài đặt có thể bị ẩn";
|
||||||
|
|
||||||
"ENABLE_FLEX" = "Kích hoạt FLEX";
|
"ENABLE_YT_STARTUP_ANIMATION" = "Hoạt ảnh khởi động YouTube";
|
||||||
"ENABLE_FLEX_DESC" = "Bật FLEX để gỡ lỗi (không khuyến nghị). Bỏ qua điều này trừ khi bạn biết những gì bạn đang làm.";
|
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "Hiển thị hoạt ảnh khi mở YouTube";
|
||||||
|
|
||||||
"FIX_GOOGLE_SIGNIN" = "Sửa lỗi Đăng nhập bằng Google (chỉ dành cho người dùng TrollStore)";
|
"HIDE_MODERN_INTERFACE" = "Giao diện YouTube cũ";
|
||||||
"FIX_GOOGLE_SIGNIN_DESC" = "Chỉ bật tùy chọn này khi bạn không thể đăng nhập bằng tài khoản Google của mình và ứng dụng đã được cài đặt qua TrollStore. Nếu bạn có thể đăng nhập bình thường, hãy tắt nó đi. Khởi động lại ứng dụng là bắt buộc.";
|
"HIDE_MODERN_INTERFACE_DESC" = "Đưa giao diện cũ của YouTube trở lại từ phiên bản v17.38.10. Loại bỏ một số yếu tố bo tròn, chế độ môi trường, và các tính năng hiện đại khác. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"HIDE_CHIP_BAR" = "Ẩn thanh trên";
|
|
||||||
"HIDE_CHIP_BAR_DESC" = "Ẩn thanh trên trong nguồn cấp dữ liệu Trang chủ (Xu hướng, Âm nhạc, Trò chơi...) và nguồn cấp dữ liệu Đăng ký (Tất cả video, Tiếp tục xem...).";
|
|
||||||
|
|
||||||
"NEW_MINIPLAYER_STYLE" = "Phong cách thanh người chơi mini mới (BigYTMiniPlayer)";
|
|
||||||
"NEW_MINIPLAYER_STYLE_DESC" = "";
|
|
||||||
|
|
||||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Thay nút Previous và Next";
|
|
||||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Thay thế nút Trước và Tiếp theo bằng nút Tua đi và Tua lại. Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ẩn nút Trước và Tiếp theo";
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ẩn nút Trước đó và Tiếp theo trong lớp phủ điều khiển video.";
|
|
||||||
|
|
||||||
"HIDE_SHORTS_VIDEOS" = "Ẩn video ngắn";
|
|
||||||
"HIDE_SHORTS_VIDEOS_DESC" = "Ẩn video ngắn trong Trang chủ, được đề xuất...";
|
|
||||||
|
|
||||||
"HIDE_CERCUBE_BUTTON" = "Ẩn nút Cercube trong thanh Điều hướng";
|
|
||||||
"HIDE_CERCUBE_BUTTON_DESC" = "";
|
|
||||||
|
|
||||||
"HIDE_CERCUBE_PIP_BUTTON" = "Ẩn nút PiP của Cercube";
|
|
||||||
"HIDE_CERCUBE_PIP_BUTTON_DESC" = "Ẩn nút PiP của Cercube trong lớp phủ điều khiển video.";
|
|
||||||
|
|
||||||
"HIDE_CERCUBE_DOWNLOAD_BUTTON" = "Ẩn nút Tải xuống của Cercube";
|
|
||||||
"HIDE_CERCUBE_DOWNLOAD_BUTTON_DESC" = "Tùy chọn ẩn nút Tải xuống của Cercube đã được bật theo mặc định. bởi vì hiện tại bạn không thể tải xuống bất kỳ thứ gì vì Máy chủ tải xuống của Cercube đã biến mất.";
|
|
||||||
|
|
||||||
"HIDE_CAST_BUTTON" = "Ẩn nút Truyền";
|
|
||||||
"HIDE_CAST_BUTTON_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"HIDE_HOVER_CARD" = "Ẩn thẻ di chuột trên Màn hình kết thúc (YTNoHoverCards)";
|
|
||||||
"HIDE_HOVER_CARD_DESC" = "Ẩn màn hình kết thúc (hình thu nhỏ) của người tạo ở cuối video.";
|
|
||||||
|
|
||||||
"HIDE_RIGHT_PANEL" = "Ẩn bảng điều khiển bên phải ở chế độ toàn màn hình";
|
|
||||||
"HIDE_RIGHT_PANEL_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"HIDE_SUBTITLES_BUTTON" = "Ẩn nút phụ đề";
|
|
||||||
"HIDE_SUBTITLES_BUTTON_DESC" = "Ẩn nút Phụ đề trong lớp phủ điều khiển video.";
|
|
||||||
|
|
||||||
"HIDE_AUTOPLAY_SWITCH" = "Ẩn công tắc Tự động phát";
|
|
||||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ẩn công tắc Tự động phát trong lớp phủ điều khiển video.";
|
|
||||||
|
|
||||||
"AUTO_FULLSCREEN" = "Tự động toàn màn hình(YTAutoFullScreen)";
|
|
||||||
"AUTO_FULLSCREEN_DESC" = "Tự động phát video ở chế độ toàn màn hình.";
|
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "Ẩn tin nhắn HUD";
|
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "Ví dụ: Bật/tắt CC, Bật vòng lặp video,...";
|
|
||||||
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS" = "Ẩn thẻ Khuyến mại trả phí";
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Ẩn thẻ Bao gồm quảng cáo trả phí trong một số video.";
|
|
||||||
|
|
||||||
"HIDE_NOTIFICATION_BUTTON" = "Ẩn nút Thông báo trong thanh Điều hướng";
|
|
||||||
"HIDE_NOTIFICATION_BUTTON_DESC" = "";
|
|
||||||
|
|
||||||
"YT_RE_EXPLORE" = "Thay thế tab Shorts bằng tab Khám phá (YTReExplore)";
|
|
||||||
"YT_RE_EXPLORE_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
|
|
||||||
|
|
||||||
"IPAD_LAYOUT" = "Bố cục iPad";
|
"IPAD_LAYOUT" = "Bố cục iPad";
|
||||||
"IPAD_LAYOUT_DESC" = "Chỉ sử dụng tùy chọn này nếu bạn muốn tải Bố cục iPad trên iPhone/iPod hiện tại của mình. Khởi động lại ứng dụng là bắt buộc.";
|
"IPAD_LAYOUT_DESC" = "Chỉ sử dụng nếu muốn có bố cục iPad trên iPhone/iPod của mình. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"IPHONE_LAYOUT" = "Bố cục iPhone";
|
"IPHONE_LAYOUT" = "Bố cục iPhone";
|
||||||
"IPHONE_LAYOUT_DESC" = "Chỉ sử dụng tùy chọn này nếu bạn muốn tải Bố cục iPhone trên iPad hiện tại của mình. Khởi động lại ứng dụng là bắt buộc.";
|
"IPHONE_LAYOUT_DESC" = "Chỉ sử dụng nếu muốn có bố cục iPhone trên iPad của mình. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"CHANGE_APP_ICON" = "Change App Icon";
|
"CAST_CONFIRM" = "Xác nhận trước khi truyền";
|
||||||
|
"CAST_CONFIRM_DESC" = "Hiển thị thông báo xác nhận trước khi truyền.";
|
||||||
|
"CASTING" = "Truyền";
|
||||||
|
"MSG_ARE_YOU_SURE" = "Bạn có chắc chắn muốn bắt đầu truyền không?";
|
||||||
|
"MSG_YES" = "Có";
|
||||||
|
"MSG_CANCEL" = "Không";
|
||||||
|
|
||||||
// Newly added strings
|
"NEW_MINIPLAYER_STYLE" = Trình phát thu nhỏ kiểu mới";
|
||||||
"APP_RESTART_DESC": "Mô tả khi khởi động lại ứng dụng",
|
"NEW_MINIPLAYER_STYLE_DESC" = "Thay thế trình phát thu nhỏ mặc định thành (BigYTMiniPlayer). Cần khởi động lại ứng dụng.";
|
||||||
"CUSTOM_LOWCONTRASTMODE": "Chế độ độ tương phản thấp tùy chỉnh",
|
|
||||||
"APP_VERSION_SPOOFER_LITE": "Phiên bản giả lập ứng dụng nhẹ",
|
"HIDE_CAST_BUTTON" = "Ẩn nút truyền";
|
||||||
"PLAYBACK_IN_FEEDS_OFF": "Tắt phát trong các trang danh sách video",
|
"HIDE_CAST_BUTTON_DESC" = "Cần khởi động lại ứng dụng.";
|
||||||
"PLAYBACK_IN_FEEDS": "Phát trong các trang danh sách video",
|
|
||||||
"ENABLE_SHARE_BUTTON_DESC": "Mô tả nút chia sẻ",
|
"VIDEO_PLAYER_BUTTON" = "Nút Trình phát video";
|
||||||
"ENABLE_SAVE_TO_PLAYLIST_BUTTON": "Bật nút lưu vào danh sách phát",
|
"VIDEO_PLAYER_BUTTON_DESC" = "Hiển thị nút trong thanh điều hướng để mở video đã tải xuống trong trình phát Apple";
|
||||||
"LCM_SELECTOR": "Trình chọn chế độ độ tương phản thấp",
|
|
||||||
"NEW_SETTINGS_UI_DESC": "Mô tả giao diện cài đặt mới",
|
"HIDE_SPONSORBLOCK_BUTTON" = "Ẩn nút iSponsorBlock";
|
||||||
"VERSION_SPOOFER_TITLE": "Tiêu đề giả lập phiên bản",
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "Ẩn cài đặt iSponsorBlock trên thanh điều hướng";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON": "Ẩn nút SponsorBlock",
|
|
||||||
"ENABLE_SHARE_BUTTON": "Bật nút chia sẻ",
|
"HIDE_HOME_TAB" = "Ẩn tab Trang chủ";
|
||||||
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC": "Mô tả nút lưu vào danh sách phát",
|
"HIDE_HOME_TAB_DESC" = "Hãy cẩn thận khi ẩn tất cả các tab";
|
||||||
"HIDE_SHADOW_OVERLAY_BUTTONS": "Ẩn các nút lớp phủ bóng",
|
|
||||||
"APP_VERSION_SPOOFER_LITE_DESC": "Mô tả phiên bản giả lập ứng dụng nhẹ",
|
"FIX_CASTING" = "Sửa truyền";
|
||||||
"DEFAULT_LOWCONTRASTMODE": "Chế độ độ tương phản thấp mặc định",
|
"FIX_CASTING_DESC" = "Thay đổi một số cờ AB để sửa truyền";
|
||||||
"APP_SETTINGS_OVERLAY_OPTIONS": "Tùy chọn lớp phủ cài đặt ứng dụng",
|
|
||||||
"HIDE_HOME_TAB_DESC": "Mô tả ẩn tab Trang chủ",
|
"ENABLE_FLEX" = "Bật FLEX";
|
||||||
"PLAYBACK_IN_FEEDS_ALWAYS_ON": "Luôn bật phát trong các trang danh sách video",
|
"ENABLE_FLEX_DESC" = "Bật FLEX để gỡ lỗi (không khuyến khích). Để tùy chọn này tắt trừ khi bạn biết rõ bạn đang làm gì.";
|
||||||
"FIX_CASTING": "Sửa lỗi truyền phát",
|
|
||||||
"FIX_CASTING_DESC": "Mô tả sửa lỗi truyền phát",
|
// Version Spoofer
|
||||||
"PLAYBACK_IN_FEEDS_WIFI_ONLY": "Phát trong các trang danh sách video chỉ qua WiFi",
|
"APP_VERSION_SPOOFER_LITE" = "Giả mạo phiên bản ứng dụng (Lite)";
|
||||||
"NEW_MINIPLAYER_STYLE_DESC": "Mô tả kiểu trình phát nhỏ mới",
|
"APP_VERSION_SPOOFER_LITE_DESC" = "Bật tính năng này để làm giả phiên bản YouTube (Lite). Chọn phiên bản bạn ưa thích bên dưới. Cần khởi động lại ứng dụng.";
|
||||||
"NEW_SETTINGS_UI": "Giao diện cài đặt mới",
|
"VERSION_SPOOFER_TITLE" = "Chọn phiên bản giả mạo";
|
||||||
"HIDE_HOME_TAB": "Ẩn tab Trang chủ",
|
|
||||||
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC": "Mô tả ẩn các nút lớp phủ bóng",
|
// Other Localization
|
||||||
"ENABLE_YT_STARTUP_ANIMATION": "Bật hoạt ảnh khởi động YouTube"
|
"APP_RESTART_DESC" = "Cần khởi động lại ứng dụng.";
|
||||||
|
"CHANGE_APP_ICON" = "Đổi biểu tượng ứng dụng";
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
|
||||||
"PASTE_SETTINGS" = "Paste Settings";
|
"PASTE_SETTINGS" = "Paste Settings";
|
||||||
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
|
||||||
|
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
|
||||||
"EXPORT_SETTINGS" = "Export Settings";
|
"EXPORT_SETTINGS" = "Export Settings";
|
||||||
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
|
||||||
"IMPORT_SETTINGS" = "Import Settings";
|
"IMPORT_SETTINGS" = "Import Settings";
|
||||||
|
|
@ -32,6 +33,7 @@
|
||||||
"TOP_SECTION" = "Top Section";
|
"TOP_SECTION" = "Top Section";
|
||||||
"MIDDLE_SECTION" = "Middle Section";
|
"MIDDLE_SECTION" = "Middle Section";
|
||||||
"BOTTOM_SECTION" = "Bottom Section";
|
"BOTTOM_SECTION" = "Bottom Section";
|
||||||
|
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
|
||||||
|
|
||||||
// Video controls overlay options
|
// Video controls overlay options
|
||||||
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "影片區覆蓋按鈕設定";
|
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "影片區覆蓋按鈕設定";
|
||||||
|
|
@ -164,6 +166,9 @@
|
||||||
"HIDE_CAST_BUTTON" = "隱藏投放按鈕";
|
"HIDE_CAST_BUTTON" = "隱藏投放按鈕";
|
||||||
"HIDE_CAST_BUTTON_DESC" = "重新啟動應用程式以套用變更。";
|
"HIDE_CAST_BUTTON_DESC" = "重新啟動應用程式以套用變更。";
|
||||||
|
|
||||||
|
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
|
||||||
|
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
|
||||||
|
|
||||||
"HIDE_SPONSORBLOCK_BUTTON" = "隱藏 iSponsorBlock 按鈕";
|
"HIDE_SPONSORBLOCK_BUTTON" = "隱藏 iSponsorBlock 按鈕";
|
||||||
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue