Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b3a31068f | ||
|
|
d68f386698 | ||
|
|
644287173f | ||
|
|
555231828b | ||
|
|
972c651fe5 | ||
|
|
0848613088 | ||
|
|
fcc16d93e1 | ||
|
|
d0b0a24819 | ||
|
|
e5894e7291 | ||
|
|
c3cc0b4286 | ||
|
|
3372a0e8fa | ||
|
|
352a09b3e2 | ||
|
|
e5911db645 | ||
|
|
627578782e | ||
|
|
7902358abd | ||
|
|
1a0366b2a1 | ||
|
|
a8b747323e | ||
|
|
ea18023a91 | ||
|
|
5cbb044637 | ||
|
|
ffed2f814f | ||
|
|
51eccd0abf | ||
|
|
44d7cf3b59 | ||
|
|
9ffdd62b8d | ||
|
|
1991a9d6ee | ||
|
|
dc130bdf6b | ||
|
|
a95b16cb71 | ||
|
|
1214db95dc | ||
|
|
0ab9d5fa7e | ||
|
|
d2989b3f90 | ||
|
|
91a8a79cc8 | ||
|
|
cc4b8eb42c | ||
|
|
ddf6094c62 | ||
|
|
5bce5a7e33 | ||
|
|
2f601de852 | ||
|
|
bde14ad82b | ||
|
|
970c566046 | ||
|
|
d7c5e540a4 | ||
|
|
86b5688eae | ||
|
|
341b1cde9d | ||
|
|
e27e0fa8cf | ||
|
|
e0c7f92288 | ||
|
|
9cf2ca008c | ||
|
|
1265e80d15 | ||
|
|
56a5e906f3 | ||
|
|
154ea37acd | ||
|
|
0d83236666 | ||
|
|
5bf8181815 | ||
|
|
b6958ac963 | ||
|
|
8187bbaa13 | ||
|
|
5d2c85cb14 | ||
|
|
71b52fc82b | ||
|
|
6cc81886c0 | ||
|
|
0671598943 | ||
|
|
8886fb7b61 | ||
|
|
fe3a942de0 | ||
|
|
123215f372 | ||
|
|
07fc0b98c3 | ||
|
|
537f828731 | ||
|
|
8218578734 | ||
|
|
fe6b509b3b | ||
|
|
8f72d70029 | ||
|
|
07a13df097 |
@@ -0,0 +1,3 @@
|
|||||||
|
github: dayanch96
|
||||||
|
ko_fi: dayanch96
|
||||||
|
buy_me_a_coffee: dayanch96
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2023 dayanch96
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -5,14 +5,14 @@ endif
|
|||||||
DEBUG=0
|
DEBUG=0
|
||||||
FINALPACKAGE=1
|
FINALPACKAGE=1
|
||||||
ARCHS = arm64
|
ARCHS = arm64
|
||||||
PACKAGE_VERSION = 2.6.2
|
PACKAGE_VERSION = 3.0.1
|
||||||
TARGET := iphone:clang:latest:13.0
|
TARGET := iphone:clang:latest:13.0
|
||||||
|
|
||||||
include $(THEOS)/makefiles/common.mk
|
include $(THEOS)/makefiles/common.mk
|
||||||
|
|
||||||
TWEAK_NAME = YTLite
|
TWEAK_NAME = YTLite
|
||||||
$(TWEAK_NAME)_FRAMEWORKS = UIKit Foundation
|
$(TWEAK_NAME)_FRAMEWORKS = UIKit Foundation SystemConfiguration
|
||||||
$(TWEAK_NAME)_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION)
|
$(TWEAK_NAME)_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION)
|
||||||
$(TWEAK_NAME)_FILES = YTLite.x Settings.x Sideloading.x
|
$(TWEAK_NAME)_FILES = $(wildcard *.x Utils/*.m)
|
||||||
|
|
||||||
include $(THEOS_MAKE_PATH)/tweak.mk
|
include $(THEOS_MAKE_PATH)/tweak.mk
|
||||||
|
|||||||
@@ -4,7 +4,11 @@ Lightweight YouTube Enhancer
|
|||||||
Advanced mode can be activated inside **Version cell**. Then simply reopen YTLite settings
|
Advanced mode can be activated inside **Version cell**. Then simply reopen YTLite settings
|
||||||
|
|
||||||
# How to build it yourself
|
# How to build it yourself
|
||||||
Clone this repo and __[YouTubeHeader by PoomSmart](https://github.com/PoomSmart/YouTubeHeader/)__
|
Clone this repo
|
||||||
|
|
||||||
|
Clone __[YouTubeHeader by PoomSmart](https://github.com/PoomSmart/YouTubeHeader/)__
|
||||||
|
|
||||||
|
Clone __[protobuf by Protocol Buffers](https://github.com/protocolbuffers/protobuf)__
|
||||||
|
|
||||||
cd YTLite folder and run
|
cd YTLite folder and run
|
||||||
|
|
||||||
|
|||||||
+415
-288
@@ -41,44 +41,36 @@ static NSString *GetCacheSize() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
%hook YTSettingsCell
|
||||||
|
- (void)layoutSubviews {
|
||||||
|
%orig;
|
||||||
|
|
||||||
|
BOOL isYTLite = [self.accessibilityIdentifier isEqualToString:@"YTLiteSectionItem"];
|
||||||
|
YTTouchFeedbackController *feedback = [self valueForKey:@"_touchFeedbackController"];
|
||||||
|
ABCSwitch *abcSwitch = [self valueForKey:@"_switch"];
|
||||||
|
|
||||||
|
if (isYTLite) {
|
||||||
|
feedback.feedbackColor = [UIColor colorWithRed:0.75 green:0.50 blue:0.90 alpha:1.0];
|
||||||
|
abcSwitch.onTintColor = [UIColor colorWithRed:0.75 green:0.50 blue:0.90 alpha:1.0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
%hook YTSettingsSectionItemManager
|
%hook YTSettingsSectionItemManager
|
||||||
%new
|
%new
|
||||||
- (void)updatePrefsForKey:(NSString *)key enabled:(BOOL)enabled {
|
- (YTSettingsSectionItem *)switchWithTitle:(NSString *)title key:(NSString *)key {
|
||||||
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
|
|
||||||
NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:prefsPath];
|
|
||||||
|
|
||||||
if (!prefs) prefs = [NSMutableDictionary dictionary];
|
|
||||||
|
|
||||||
[prefs setObject:@(enabled) forKey:key];
|
|
||||||
[prefs writeToFile:prefsPath atomically:NO];
|
|
||||||
|
|
||||||
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
|
|
||||||
}
|
|
||||||
|
|
||||||
%new
|
|
||||||
- (void)updateIntegerPrefsForKey:(NSString *)key intValue:(NSInteger)intValue {
|
|
||||||
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
|
|
||||||
NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:prefsPath];
|
|
||||||
|
|
||||||
if (!prefs) prefs = [NSMutableDictionary dictionary];
|
|
||||||
|
|
||||||
[prefs setObject:@(intValue) forKey:key];
|
|
||||||
[prefs writeToFile:prefsPath atomically:NO];
|
|
||||||
|
|
||||||
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
|
|
||||||
}
|
|
||||||
|
|
||||||
static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleDescription, NSString *key, BOOL *value, id selfObject) {
|
|
||||||
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
|
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
|
||||||
Class YTAlertViewClass = %c(YTAlertView);
|
Class YTAlertViewClass = %c(YTAlertView);
|
||||||
YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:title
|
NSString *titleDesc = [NSString stringWithFormat:@"%@Desc", title];
|
||||||
titleDescription:titleDescription
|
|
||||||
accessibilityIdentifier:nil
|
YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:LOC(title)
|
||||||
switchOn:*value
|
titleDescription:LOC(titleDesc)
|
||||||
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
switchOn:ytlBool(key)
|
||||||
switchBlock:^BOOL(YTSettingsCell *cell, BOOL enabled) {
|
switchBlock:^BOOL(YTSettingsCell *cell, BOOL enabled) {
|
||||||
if ([key isEqualToString:@"shortsOnlyMode"]) {
|
if ([key isEqualToString:@"shortsOnlyMode"]) {
|
||||||
YTAlertView *alertView = [YTAlertViewClass confirmationDialogWithAction:^{
|
YTAlertView *alertView = [YTAlertViewClass confirmationDialogWithAction:^{
|
||||||
[selfObject updatePrefsForKey:@"shortsOnlyMode" enabled:enabled];
|
ytlSetBool(enabled, @"shortsOnlyMode");
|
||||||
}
|
}
|
||||||
actionTitle:LOC(@"Yes")
|
actionTitle:LOC(@"Yes")
|
||||||
cancelAction:^{
|
cancelAction:^{
|
||||||
@@ -91,374 +83,515 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
|||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
[selfObject updatePrefsForKey:key enabled:enabled];
|
ytlSetBool(enabled, key);
|
||||||
|
|
||||||
|
NSArray *keys = @[@"removeLabels", @"removeIndicators", @"reExplore", @"addExplore", @"removeShorts", @"removeSubscriptions", @"removeUploads", @"removeLibrary"];
|
||||||
|
if ([keys containsObject:key]) {
|
||||||
|
[[[%c(YTHeaderContentComboViewController) alloc] init] refreshPivotBar];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
settingItemId:0];
|
settingItemId:0];
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
%new
|
||||||
|
- (YTSettingsSectionItem *)linkWithTitle:(NSString *)title description:(NSString *)description link:(NSString *)link {
|
||||||
|
return [%c(YTSettingsSectionItem) itemWithTitle:title
|
||||||
|
titleDescription:description
|
||||||
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:nil
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
return [%c(YTUIUtils) openURL:[NSURL URLWithString:link]];
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
%new(v@:@)
|
%new(v@:@)
|
||||||
- (void)updateYTLiteSectionWithEntry:(id)entry {
|
- (void)updateYTLiteSectionWithEntry:(id)entry {
|
||||||
NSMutableArray *sectionItems = [NSMutableArray array];
|
NSMutableArray *sectionItems = [NSMutableArray array];
|
||||||
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
|
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
|
||||||
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
|
||||||
id selfObject = self;
|
|
||||||
|
|
||||||
YTSettingsSectionItem *space = [%c(YTSettingsSectionItem) itemWithTitle:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { return YES; }];
|
YTSettingsSectionItem *space = [%c(YTSettingsSectionItem) itemWithTitle:nil accessibilityIdentifier:@"YTLiteSectionItem" detailTextBlock:nil selectBlock:nil];
|
||||||
|
|
||||||
YTSettingsSectionItem *general = [YTSettingsSectionItemClass itemWithTitle:LOC(@"General")
|
YTSettingsSectionItem *general = [YTSettingsSectionItemClass itemWithTitle:LOC(@"General")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"RemoveAds"), LOC(@"RemoveAdsDesc"), @"noAds", &kNoAds, selfObject),
|
[self switchWithTitle:@"RemoveAds" key:@"noAds"],
|
||||||
createSwitchItem(LOC(@"BackgroundPlayback"), LOC(@"BackgroundPlaybackDesc"), @"backgroundPlayback", &kBackgroundPlayback, selfObject)
|
[self switchWithTitle:@"BackgroundPlayback" key:@"backgroundPlayback"]
|
||||||
];
|
];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"General") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"General") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:general];
|
[sectionItems addObject:general];
|
||||||
|
|
||||||
YTSettingsSectionItem *navbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Navbar")
|
YTSettingsSectionItem *navbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Navbar")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"RemoveCast"), LOC(@"RemoveCastDesc"), @"noCast", &kNoCast, selfObject),
|
[self switchWithTitle:@"RemoveCast" key:@"noCast"],
|
||||||
createSwitchItem(LOC(@"RemoveNotifications"), LOC(@"RemoveNotificationsDesc"), @"removeNotifsButton", &kNoNotifsButton, selfObject),
|
[self switchWithTitle:@"RemoveNotifications" key:@"noNotifsButton"],
|
||||||
createSwitchItem(LOC(@"RemoveSearch"), LOC(@"RemoveSearchDesc"), @"removeSearchButton", &kNoSearchButton, selfObject),
|
[self switchWithTitle:@"RemoveSearch" key:@"noSearchButton"],
|
||||||
createSwitchItem(LOC(@"RemoveVoiceSearch"), LOC(@"RemoveVoiceSearchDesc"), @"removeVoiceSearchButton", &kNoVoiceSearchButton, selfObject)
|
[self switchWithTitle:@"RemoveVoiceSearch" key:@"noVoiceSearchButton"]
|
||||||
];
|
];
|
||||||
|
|
||||||
if (kAdvancedMode) {
|
if (ytlBool(@"advancedMode")) {
|
||||||
YTSettingsSectionItem *addStickyNavbar = createSwitchItem(LOC(@"StickyNavbar"), LOC(@"StickyNavbarDesc"), @"stickyNavbar", &kStickyNavbar, selfObject);
|
rows = [rows arrayByAddingObjectsFromArray:@[
|
||||||
rows = [rows arrayByAddingObject:addStickyNavbar];
|
[self switchWithTitle:@"StickyNavbar" key:@"stickyNavbar"],
|
||||||
|
[self switchWithTitle:@"NoSubbar" key:@"noSubbar"],
|
||||||
YTSettingsSectionItem *addNoSubbar = createSwitchItem(LOC(@"NoSubbar"), LOC(@"NoSubbarDesc"), @"noSubbar", &kNoSubbar, selfObject);
|
[self switchWithTitle:@"NoYTLogo" key:@"noYTLogo"],
|
||||||
rows = [rows arrayByAddingObject:addNoSubbar];
|
[self switchWithTitle:@"PremiumYTLogo" key:@"premiumYTLogo"]
|
||||||
|
]];
|
||||||
YTSettingsSectionItem *addNoYTLogo = createSwitchItem(LOC(@"NoYTLogo"), LOC(@"NoYTLogoDesc"), @"noYTLogo", &kNoYTLogo, selfObject);
|
|
||||||
rows = [rows arrayByAddingObject:addNoYTLogo];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Navbar") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Navbar") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:navbar];
|
[sectionItems addObject:navbar];
|
||||||
|
|
||||||
if (kAdvancedMode) {
|
if (ytlBool(@"advancedMode")) {
|
||||||
YTSettingsSectionItem *overlay = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Overlay")
|
YTSettingsSectionItem *overlay = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Overlay")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"HideAutoplay"), LOC(@"HideAutoplayDesc"), @"hideAutoplay", &kHideAutoplay, selfObject),
|
[self switchWithTitle:@"HideAutoplay" key:@"hideAutoplay"],
|
||||||
createSwitchItem(LOC(@"HideSubs"), LOC(@"HideSubsDesc"), @"hideSubs", &kHideSubs, selfObject),
|
[self switchWithTitle:@"HideSubs" key:@"hideSubs"],
|
||||||
createSwitchItem(LOC(@"NoHUDMsgs"), LOC(@"NoHUDMsgsDesc"), @"noHUDMsgs", &kNoHUDMsgs, selfObject),
|
[self switchWithTitle:@"NoHUDMsgs" key:@"noHUDMsgs"],
|
||||||
createSwitchItem(LOC(@"HidePrevNext"), LOC(@"HidePrevNextDesc"), @"hidePrevNext", &kHidePrevNext, selfObject),
|
[self switchWithTitle:@"HidePrevNext" key:@"hidePrevNext"],
|
||||||
createSwitchItem(LOC(@"ReplacePrevNext"), LOC(@"ReplacePrevNextDesc"), @"replacePrevNext", &kReplacePrevNext, selfObject),
|
[self switchWithTitle:@"ReplacePrevNext" key:@"replacePrevNext"],
|
||||||
createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject),
|
[self switchWithTitle:@"NoDarkBg" key:@"noDarkBg"],
|
||||||
createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"endScreenCards", &kEndScreenCards, selfObject),
|
[self switchWithTitle:@"NoEndScreenCards" key:@"endScreenCards"],
|
||||||
createSwitchItem(LOC(@"NoFullscreenActions"), LOC(@"NoFullscreenActionsDesc"), @"noFullscreenActions", &kNoFullscreenActions, selfObject),
|
[self switchWithTitle:@"NoFullscreenActions" key:@"noFullscreenActions"],
|
||||||
createSwitchItem(LOC(@"PersistentProgressBar"), LOC(@"PersistentProgressBarDesc"), @"persistentProgressBar", &kPersistentProgressBar, selfObject),
|
[self switchWithTitle:@"PersistentProgressBar" key:@"persistentProgressBar"],
|
||||||
createSwitchItem(LOC(@"NoRelatedVids"), LOC(@"NoRelatedVidsDesc"), @"noRelatedVids", &kNoRelatedVids, selfObject),
|
[self switchWithTitle:@"StockVolumeHUD" key:@"stockVolumeHUD"],
|
||||||
createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject),
|
[self switchWithTitle:@"NoRelatedVids" key:@"noRelatedVids"],
|
||||||
createSwitchItem(LOC(@"NoWatermarks"), LOC(@"NoWatermarksDesc"), @"noWatermarks", &kNoWatermarks, selfObject)
|
[self switchWithTitle:@"NoPromotionCards" key:@"noPromotionCards"],
|
||||||
|
[self switchWithTitle:@"NoWatermarks" key:@"noWatermarks"],
|
||||||
|
[self switchWithTitle:@"VideoEndTime" key:@"videoEndTime"],
|
||||||
|
[self switchWithTitle:@"24hrFormat" key:@"24hrFormat"]
|
||||||
];
|
];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Overlay") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Overlay") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:overlay];
|
[sectionItems addObject:overlay];
|
||||||
|
|
||||||
YTSettingsSectionItem *player = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Player")
|
YTSettingsSectionItem *player = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Player")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"Miniplayer"), LOC(@"MiniplayerDesc"), @"miniplayer", &kMiniplayer, selfObject),
|
[self switchWithTitle:@"Miniplayer" key:@"miniplayer"],
|
||||||
createSwitchItem(LOC(@"PortraitFullscreen"), LOC(@"PortraitFullscreenDesc"), @"portraitFullscreen", &kPortraitFullscreen, selfObject),
|
[self switchWithTitle:@"PortraitFullscreen" key:@"portraitFullscreen"],
|
||||||
createSwitchItem(LOC(@"CopyWithTimestamp"), LOC(@"CopyWithTimestampDesc"), @"copyWithTimestamp", &kCopyWithTimestamp, selfObject),
|
[self switchWithTitle:@"CopyWithTimestamp" key:@"copyWithTimestamp"],
|
||||||
createSwitchItem(LOC(@"DisableAutoplay"), LOC(@"DisableAutoplayDesc"), @"disableAutoplay", &kDisableAutoplay, selfObject),
|
[self switchWithTitle:@"DisableAutoplay" key:@"disableAutoplay"],
|
||||||
createSwitchItem(LOC(@"DisableAutoCaptions"), LOC(@"DisableAutoCaptionsDesc"), @"disableAutoCaptions", &kDisableAutoCaptions, selfObject),
|
[self switchWithTitle:@"DisableAutoCaptions" key:@"disableAutoCaptions"],
|
||||||
createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject),
|
[self switchWithTitle:@"NoContentWarning" key:@"noContentWarning"],
|
||||||
createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject),
|
[self switchWithTitle:@"ClassicQuality" key:@"classicQuality"],
|
||||||
createSwitchItem(LOC(@"ExtraSpeedOptions"), LOC(@"ExtraSpeedOptionsDesc"), @"extraSpeedOptions", &kExtraSpeedOptions, selfObject),
|
[self switchWithTitle:@"ExtraSpeedOptions" key:@"extraSpeedOptions"],
|
||||||
createSwitchItem(LOC(@"DontSnap2Chapter"), LOC(@"DontSnap2ChapterDesc"), @"dontSnapToChapter", &kDontSnapToChapter, selfObject),
|
[self switchWithTitle:@"DontSnap2Chapter" key:@"dontSnapToChapter"],
|
||||||
createSwitchItem(LOC(@"RedProgressBar"), LOC(@"RedProgressBarDesc"), @"redProgressBar", &kRedProgressBar, selfObject),
|
[self switchWithTitle:@"NoTwoFingerSnapToChapter" key:@"noTwoFingerSnapToChapter"],
|
||||||
createSwitchItem(LOC(@"NoHints"), LOC(@"NoHintsDesc"), @"noHints", &kNoHints, selfObject),
|
[self switchWithTitle:@"PauseOnOverlay" key:@"pauseOnOverlay"],
|
||||||
createSwitchItem(LOC(@"NoFreeZoom"), LOC(@"NoFreeZoomDesc"), @"noFreeZoom", &kNoFreeZoom, selfObject),
|
[self switchWithTitle:@"RedProgressBar" key:@"redProgressBar"],
|
||||||
createSwitchItem(LOC(@"AutoFullscreen"), LOC(@"AutoFullscreenDesc"), @"autoFullscreen", &kAutoFullscreen, selfObject),
|
[self switchWithTitle:@"NoPlayerRemixButton" key:@"noPlayerRemixButton"],
|
||||||
createSwitchItem(LOC(@"ExitFullscreen"), LOC(@"ExitFullscreenDesc"), @"exitFullscreen", &kExitFullscreen, selfObject),
|
[self switchWithTitle:@"NoPlayerClipButton" key:@"noPlayerClipButton"],
|
||||||
createSwitchItem(LOC(@"NoDoubleTap2Seek"), LOC(@"NoDoubleTap2SeekDesc"), @"noDoubleTapToSeek", &kNoDoubleTapToSeek, selfObject)
|
[self switchWithTitle:@"NoPlayerDownloadButton" key:@"noPlayerDownloadButton"],
|
||||||
|
[self switchWithTitle:@"NoHints" key:@"noHints"],
|
||||||
|
[self switchWithTitle:@"NoFreeZoom" key:@"noFreeZoom"],
|
||||||
|
[self switchWithTitle:@"AutoFullscreen" key:@"autoFullscreen"],
|
||||||
|
[self switchWithTitle:@"ExitFullscreen" key:@"exitFullscreen"],
|
||||||
|
[self switchWithTitle:@"NoDoubleTap2Seek" key:@"noDoubleTapToSeek"]
|
||||||
];
|
];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Player") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Player") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:player];
|
[sectionItems addObject:player];
|
||||||
|
|
||||||
YTSettingsSectionItem *shorts = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Shorts")
|
YTSettingsSectionItem *shorts = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Shorts")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"ShortsOnlyMode"), LOC(@"ShortsOnlyModeDesc"), @"shortsOnlyMode", &kShortsOnlyMode, selfObject),
|
[self switchWithTitle:@"ShortsOnlyMode" key:@"shortsOnlyMode"],
|
||||||
createSwitchItem(LOC(@"HideShorts"), LOC(@"HideShortsDesc"), @"hideShorts", &kHideShorts, selfObject),
|
[self switchWithTitle:@"AutoSkipShorts" key:@"autoSkipShorts"],
|
||||||
createSwitchItem(LOC(@"ShortsProgress"), LOC(@"ShortsProgressDesc"), @"shortsProgress", &kShortsProgress, selfObject),
|
[self switchWithTitle:@"HideShorts" key:@"hideShorts"],
|
||||||
createSwitchItem(LOC(@"PinchToFullscreenShorts"), LOC(@"PinchToFullscreenShortsDesc"), @"pinchToFullscreenShorts", &kPinchToFullscreenShorts, selfObject),
|
[self switchWithTitle:@"ShortsProgress" key:@"shortsProgress"],
|
||||||
createSwitchItem(LOC(@"ShortsToRegular"), LOC(@"ShortsToRegularDesc"), @"shortsToRegular", &kShortsToRegular, selfObject),
|
[self switchWithTitle:@"PinchToFullscreenShorts" key:@"pinchToFullscreenShorts"],
|
||||||
createSwitchItem(LOC(@"ResumeShorts"), LOC(@"ResumeShortsDesc"), @"resumeShorts", &kResumeShorts, selfObject),
|
[self switchWithTitle:@"ShortsToRegular" key:@"shortsToRegular"],
|
||||||
createSwitchItem(LOC(@"HideShortsLogo"), LOC(@"HideShortsLogoDesc"), @"hideShortsLogo", &kHideShortsLogo, selfObject),
|
[self switchWithTitle:@"ResumeShorts" key:@"resumeShorts"],
|
||||||
createSwitchItem(LOC(@"HideShortsSearch"), LOC(@"HideShortsSearchDesc"), @"hideShortsSearch", &kHideShortsSearch, selfObject),
|
[self switchWithTitle:@"HideShortsLogo" key:@"hideShortsLogo"],
|
||||||
createSwitchItem(LOC(@"HideShortsCamera"), LOC(@"HideShortsCameraDesc"), @"hideShortsCamera", &kHideShortsCamera, selfObject),
|
[self switchWithTitle:@"HideShortsSearch" key:@"hideShortsSearch"],
|
||||||
createSwitchItem(LOC(@"HideShortsMore"), LOC(@"HideShortsMoreDesc"), @"hideShortsMore", &kHideShortsMore, selfObject),
|
[self switchWithTitle:@"HideShortsCamera" key:@"hideShortsCamera"],
|
||||||
createSwitchItem(LOC(@"HideShortsSubscriptions"), LOC(@"HideShortsSubscriptionsDesc"), @"hideShortsSubscriptions", &kHideShortsSubscriptions, selfObject),
|
[self switchWithTitle:@"HideShortsMore" key:@"hideShortsMore"],
|
||||||
createSwitchItem(LOC(@"HideShortsLike"), LOC(@"HideShortsLikeDesc"), @"hideShortsLike", &kHideShortsLike, selfObject),
|
[self switchWithTitle:@"HideShortsSubscriptions" key:@"hideShortsSubscriptions"],
|
||||||
createSwitchItem(LOC(@"HideShortsDislike"), LOC(@"HideShortsDislikeDesc"), @"hideShortsDislike", &kHideShortsDislike, selfObject),
|
[self switchWithTitle:@"HideShortsLike" key:@"hideShortsLike"],
|
||||||
createSwitchItem(LOC(@"HideShortsComments"), LOC(@"HideShortsCommentsDesc"), @"hideShortsComments", &kHideShortsComments, selfObject),
|
[self switchWithTitle:@"HideShortsDislike" key:@"hideShortsDislike"],
|
||||||
createSwitchItem(LOC(@"HideShortsRemix"), LOC(@"HideShortsRemixDesc"), @"hideShortsRemix", &kHideShortsRemix, selfObject),
|
[self switchWithTitle:@"HideShortsComments" key:@"hideShortsComments"],
|
||||||
createSwitchItem(LOC(@"HideShortsShare"), LOC(@"HideShortsShareDesc"), @"hideShortsShare", &kHideShortsShare, selfObject),
|
[self switchWithTitle:@"HideShortsRemix" key:@"hideShortsRemix"],
|
||||||
createSwitchItem(LOC(@"HideShortsAvatars"), LOC(@"HideShortsAvatarsDesc"), @"hideShortsAvatars", &kHideShortsAvatars, selfObject),
|
[self switchWithTitle:@"HideShortsShare" key:@"hideShortsShare"],
|
||||||
createSwitchItem(LOC(@"HideShortsThanks"), LOC(@"HideShortsThanksDesc"), @"hideShortsThanks", &kHideShortsThanks, selfObject),
|
[self switchWithTitle:@"HideShortsAvatars" key:@"hideShortsAvatars"],
|
||||||
createSwitchItem(LOC(@"HideShortsSource"), LOC(@"HideShortsSourceDesc"), @"hideShortsSource", &kHideShortsSource, selfObject),
|
[self switchWithTitle:@"HideShortsThanks" key:@"hideShortsThanks"],
|
||||||
createSwitchItem(LOC(@"HideShortsChannelName"), LOC(@"HideShortsChannelNameDesc"), @"hideShortsChannelName", &kHideShortsChannelName, selfObject),
|
[self switchWithTitle:@"HideShortsSource" key:@"hideShortsSource"],
|
||||||
createSwitchItem(LOC(@"HideShortsDescription"), LOC(@"HideShortsDescriptionDesc"), @"hideShortsDescription", &kHideShortsDescription, selfObject),
|
[self switchWithTitle:@"HideShortsChannelName" key:@"hideShortsChannelName"],
|
||||||
createSwitchItem(LOC(@"HideShortsAudioTrack"), LOC(@"HideShortsAudioTrackDesc"), @"hideShortsAudioTrack", &kHideShortsAudioTrack, selfObject),
|
[self switchWithTitle:@"HideShortsDescription" key:@"hideShortsDescription"],
|
||||||
createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"hideShortsPromoCards", &kHideShortsPromoCards, selfObject)
|
[self switchWithTitle:@"HideShortsAudioTrack" key:@"hideShortsAudioTrack"],
|
||||||
|
[self switchWithTitle:@"NoPromotionCards" key:@"hideShortsPromoCards"]
|
||||||
];
|
];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Shorts") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Shorts") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:shorts];
|
[sectionItems addObject:shorts];
|
||||||
}
|
}
|
||||||
|
|
||||||
YTSettingsSectionItem *tabbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Tabbar")
|
YTSettingsSectionItem *tabbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Tabbar")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"RemoveLabels"), LOC(@"RemoveLabelsDesc"), @"removeLabels", &kRemoveLabels, selfObject),
|
[self switchWithTitle:@"RemoveLabels" key:@"removeLabels"],
|
||||||
createSwitchItem(LOC(@"RemoveIndicators"), LOC(@"RemoveIndicatorsDesc"), @"removeIndicators", &kRemoveIndicators, selfObject),
|
[self switchWithTitle:@"RemoveIndicators" key:@"removeIndicators"],
|
||||||
createSwitchItem(LOC(@"ReExplore"), LOC(@"ReExploreDesc"), @"reExplore", &kReExplore, selfObject),
|
[self switchWithTitle:@"ReExplore" key:@"reExplore"],
|
||||||
createSwitchItem(LOC(@"AddExplore"), LOC(@"AddExploreDesc"), @"addExplore", &kAddExplore, selfObject),
|
[self switchWithTitle:@"AddExplore" key:@"addExplore"],
|
||||||
createSwitchItem(LOC(@"HideShortsTab"), LOC(@"HideShortsTabDesc"), @"removeShorts", &kRemoveShorts, selfObject),
|
[self switchWithTitle:@"HideShortsTab" key:@"removeShorts"],
|
||||||
createSwitchItem(LOC(@"HideSubscriptionsTab"), LOC(@"HideSubscriptionsTabDesc"), @"removeSubscriptions", &kRemoveSubscriptions, selfObject),
|
[self switchWithTitle:@"HideSubscriptionsTab" key:@"removeSubscriptions"],
|
||||||
createSwitchItem(LOC(@"HideUploadButton"), LOC(@"HideUploadButtonDesc"), @"removeUploads", &kRemoveUploads, selfObject),
|
[self switchWithTitle:@"HideUploadButton" key:@"removeUploads"],
|
||||||
createSwitchItem(LOC(@"HideLibraryTab"), LOC(@"HideLibraryTabDesc"), @"removeLibrary", &kRemoveLibrary, selfObject)
|
[self switchWithTitle:@"HideLibraryTab" key:@"removeLibrary"]
|
||||||
];
|
];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Tabbar") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Tabbar") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:tabbar];
|
[sectionItems addObject:tabbar];
|
||||||
|
|
||||||
if (kAdvancedMode) {
|
if (ytlBool(@"advancedMode")) {
|
||||||
YTSettingsSectionItem *other = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Other")
|
YTSettingsSectionItem *other = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Other")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
return @"‣";
|
return @"‣";
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
createSwitchItem(LOC(@"CopyVideoInfo"), LOC(@"CopyVideoInfoDesc"), @"copyVideoInfo", &kCopyVideoInfo, selfObject),
|
[self switchWithTitle:@"CopyVideoInfo" key:@"copyVideoInfo"],
|
||||||
createSwitchItem(LOC(@"PostManager"), LOC(@"PostManagerDesc"), @"postManager", &kPostManager, selfObject),
|
[self switchWithTitle:@"PostManager" key:@"postManager"],
|
||||||
createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject),
|
[self switchWithTitle:@"SaveProfilePhoto" key:@"saveProfilePhoto"],
|
||||||
createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, selfObject),
|
[self switchWithTitle:@"CommentManager" key:@"commentManager"],
|
||||||
createSwitchItem(LOC(@"CopyCommentText"), LOC(@"CopyCommentTextDesc"), @"copyCommentText", &kCopyCommentText, selfObject),
|
[self switchWithTitle:@"FixAlbums" key:@"fixAlbums"],
|
||||||
createSwitchItem(LOC(@"FixAlbums"), LOC(@"FixAlbumsDesc"), @"fixAlbums", &kFixAlbums, selfObject),
|
[self switchWithTitle:@"NativeShare" key:@"nativeShare"],
|
||||||
createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject),
|
[self switchWithTitle:@"RemovePlayNext" key:@"removePlayNext"],
|
||||||
createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject),
|
[self switchWithTitle:@"RemoveDownloadMenu" key:@"removeDownloadMenu"],
|
||||||
createSwitchItem(LOC(@"NoSearchHistory"), LOC(@"NoSearchHistoryDesc"), @"noSearchHistory", &kNoSearchHistory, selfObject),
|
[self switchWithTitle:@"RemoveWatchLaterMenu" key:@"removeWatchLaterMenu"],
|
||||||
createSwitchItem(LOC(@"NoRelatedWatchNexts"), LOC(@"NoRelatedWatchNextsDesc"), @"noRelatedWatchNexts", &kNoRelatedWatchNexts, selfObject),
|
[self switchWithTitle:@"RemoveSaveToPlaylistMenu" key:@"removeSaveToPlaylistMenu"],
|
||||||
createSwitchItem(LOC(@"StickSortComments"), LOC(@"StickSortCommentsDesc"), @"stickSortComments", &kStickSortComments, selfObject),
|
[self switchWithTitle:@"RemoveShareMenu" key:@"removeShareMenu"],
|
||||||
createSwitchItem(LOC(@"HideSortComments"), LOC(@"HideSortCommentsDesc"), @"hideSortComments", &kHideSortComments, selfObject),
|
[self switchWithTitle:@"RemoveNotInterestedMenu" key:@"removeNotInterestedMenu"],
|
||||||
createSwitchItem(LOC(@"PlaylistOldMinibar"), LOC(@"PlaylistOldMinibarDesc"), @"playlistOldMinibar", &kPlaylistOldMinibar, selfObject),
|
[self switchWithTitle:@"RemoveDontRecommendMenu" key:@"removeDontRecommendMenu"],
|
||||||
createSwitchItem(LOC(@"DisableRTL"), LOC(@"DisableRTLDesc"), @"disableRTL", &kDisableRTL, selfObject)
|
[self switchWithTitle:@"RemoveReportMenu" key:@"removeReportMenu"],
|
||||||
|
[self switchWithTitle:@"NoContinueWatching" key:@"noContinueWatching"],
|
||||||
|
[self switchWithTitle:@"NoSearchHistory" key:@"noSearchHistory"],
|
||||||
|
[self switchWithTitle:@"NoRelatedWatchNexts" key:@"noRelatedWatchNexts"],
|
||||||
|
[self switchWithTitle:@"StickSortComments" key:@"stickSortComments"],
|
||||||
|
[self switchWithTitle:@"HideSortComments" key:@"hideSortComments"],
|
||||||
|
[self switchWithTitle:@"PlaylistOldMinibar" key:@"playlistOldMinibar"],
|
||||||
|
[self switchWithTitle:@"DisableRTL" key:@"disableRTL"]
|
||||||
];
|
];
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Other") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Other") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:other];
|
[sectionItems addObject:other];
|
||||||
|
|
||||||
[sectionItems addObject:space];
|
[sectionItems addObject:space];
|
||||||
|
|
||||||
YTSettingsSectionItem *startup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Startup")
|
YTSettingsSectionItem *speed = [YTSettingsSectionItemClass itemWithTitle:LOC(@"HoldToSpeed")
|
||||||
accessibilityIdentifier:nil
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
detailTextBlock:^NSString *() {
|
detailTextBlock:^NSString *() {
|
||||||
switch (kPivotIndex) {
|
NSArray *speedLabels = @[LOC(@"Disabled"), LOC(@"Default"), @"0.25×", @"0.5×", @"0.75×", @"1.0×", @"1.25×", @"1.5×", @"1.75×", @"2.0×", @"3.0×", @"4.0×", @"5.0×"];
|
||||||
case 1:
|
return speedLabels[ytlInt(@"speedIndex")];
|
||||||
return LOC(@"Explore");
|
|
||||||
case 2:
|
|
||||||
return LOC(@"ShortsTab");
|
|
||||||
case 3:
|
|
||||||
return LOC(@"Subscriptions");
|
|
||||||
case 4:
|
|
||||||
return LOC(@"Library");
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
return LOC(@"Home");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[
|
NSMutableArray <YTSettingsSectionItem *> *rows = [NSMutableArray array];
|
||||||
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Home") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *home, NSUInteger arg1) {
|
NSArray *speedLabels = @[LOC(@"Disable"), LOC(@"Default"), @"0.25×", @"0.5×", @"0.75×", @"1.0×", @"1.25×", @"1.5×", @"1.75×", @"2.0×", @"3.0×", @"4.0×", @"5.0×"];
|
||||||
kPivotIndex = 0;
|
|
||||||
|
for (NSUInteger i = 0; i < speedLabels.count; i++) {
|
||||||
|
NSString *title = speedLabels[i];
|
||||||
|
YTSettingsSectionItem *item = [YTSettingsSectionItemClass checkmarkItemWithTitle:title titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
[settingsViewController reloadData];
|
[settingsViewController reloadData];
|
||||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
ytlSetInt((int)arg1, @"speedIndex");
|
||||||
return YES;
|
|
||||||
}],
|
|
||||||
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Explore") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *library, NSUInteger arg1) {
|
|
||||||
if (!kReExplore && !kAddExplore) {
|
|
||||||
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
|
|
||||||
alertView.title = LOC(@"Warning");
|
|
||||||
alertView.subtitle = LOC(@"TabIsHidden");
|
|
||||||
[alertView show];
|
|
||||||
return NO;
|
|
||||||
} else {
|
|
||||||
kPivotIndex = 1;
|
|
||||||
[settingsViewController reloadData];
|
|
||||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
|
||||||
return YES;
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[rows addObject:item];
|
||||||
}
|
}
|
||||||
}],
|
|
||||||
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ShortsTab") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *shorts, NSUInteger arg1) {
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"HoldToSpeed") pickerSectionTitle:nil rows:rows selectedItemIndex:ytlInt(@"speedIndex") parentResponder:[self parentResponder]];
|
||||||
if (kRemoveShorts) {
|
|
||||||
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
|
|
||||||
alertView.title = LOC(@"Warning");
|
|
||||||
alertView.subtitle = LOC(@"TabIsHidden");
|
|
||||||
[alertView show];
|
|
||||||
return NO;
|
|
||||||
} else {
|
|
||||||
kPivotIndex = 2;
|
|
||||||
[settingsViewController reloadData];
|
|
||||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Subscriptions") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *subscriptions, NSUInteger arg1) {
|
|
||||||
if (kRemoveSubscriptions) {
|
|
||||||
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
|
|
||||||
alertView.title = LOC(@"Warning");
|
|
||||||
alertView.subtitle = LOC(@"TabIsHidden");
|
|
||||||
[alertView show];
|
|
||||||
return NO;
|
|
||||||
} else {
|
|
||||||
kPivotIndex = 3;
|
|
||||||
[settingsViewController reloadData];
|
|
||||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Library") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *library, NSUInteger arg1) {
|
|
||||||
if (kRemoveLibrary) {
|
|
||||||
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
|
|
||||||
alertView.title = LOC(@"Warning");
|
|
||||||
alertView.subtitle = LOC(@"TabIsHidden");
|
|
||||||
[alertView show];
|
|
||||||
return NO;
|
|
||||||
} else {
|
|
||||||
kPivotIndex = 4;
|
|
||||||
[settingsViewController reloadData];
|
|
||||||
[self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex];
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
];
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Startup") pickerSectionTitle:nil rows:rows selectedItemIndex:kPivotIndex parentResponder:[self parentResponder]];
|
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
[sectionItems addObject:speed];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *autoSpeed = [YTSettingsSectionItemClass itemWithTitle:LOC(@"DefaultPlaybackRate")
|
||||||
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
NSArray *speedLabels = @[@"0.25×", @"0.5×", @"0.75×", @"1.0×", @"1.25×", @"1.5×", @"1.75×", @"2.0×", @"3.0×", @"4.0×", @"5.0×"];
|
||||||
|
return speedLabels[ytlInt(@"autoSpeedIndex")];
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSMutableArray <YTSettingsSectionItem *> *rows = [NSMutableArray array];
|
||||||
|
NSArray *speedLabels = @[@"0.25×", @"0.5×", @"0.75×", @"1.0×", @"1.25×", @"1.5×", @"1.75×", @"2.0×", @"3.0×", @"4.0×", @"5.0×"];
|
||||||
|
|
||||||
|
for (NSUInteger i = 0; i < speedLabels.count; i++) {
|
||||||
|
NSString *title = speedLabels[i];
|
||||||
|
YTSettingsSectionItem *item = [YTSettingsSectionItemClass checkmarkItemWithTitle:title titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
ytlSetInt((int)arg1, @"autoSpeedIndex");
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
[rows addObject:item];
|
||||||
|
}
|
||||||
|
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"DefaultPlaybackRate") pickerSectionTitle:nil rows:rows selectedItemIndex:ytlInt(@"autoSpeedIndex") parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[sectionItems addObject:autoSpeed];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *wifiQuality = [YTSettingsSectionItemClass itemWithTitle:LOC(@"PlaybackQualityOnWiFi")
|
||||||
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
NSArray *qualityLabels = @[LOC(@"Default"), LOC(@"Best"), @"2160p60", @"2160p", @"1440p60", @"1440p", @"1080p60", @"1080p", @"720p60", @"720p", @"480p", @"360p"];
|
||||||
|
return qualityLabels[ytlInt(@"wiFiQualityIndex")];
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSMutableArray <YTSettingsSectionItem *> *rows = [NSMutableArray array];
|
||||||
|
NSArray *qualityLabels = @[LOC(@"Default"), LOC(@"Best"), @"2160p60", @"2160p", @"1440p60", @"1440p", @"1080p60", @"1080p", @"720p60", @"720p", @"480p", @"360p"];
|
||||||
|
|
||||||
|
for (NSUInteger i = 0; i < qualityLabels.count; i++) {
|
||||||
|
NSString *title = qualityLabels[i];
|
||||||
|
YTSettingsSectionItem *item = [YTSettingsSectionItemClass checkmarkItemWithTitle:title titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
ytlSetInt((int)arg1, @"wiFiQualityIndex");
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[rows addObject:item];
|
||||||
|
}
|
||||||
|
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"SelectQuality") pickerSectionTitle:nil rows:rows selectedItemIndex:ytlInt(@"wiFiQualityIndex") parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[sectionItems addObject:wifiQuality];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *cellQuality = [YTSettingsSectionItemClass itemWithTitle:LOC(@"PlaybackQualityOnCellular")
|
||||||
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
NSArray *qualityLabels = @[LOC(@"Default"), LOC(@"Best"), @"2160p60", @"2160p", @"1440p60", @"1440p", @"1080p60", @"1080p", @"720p60", @"720p", @"480p", @"360p"];
|
||||||
|
return qualityLabels[ytlInt(@"cellQualityIndex")];
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSMutableArray <YTSettingsSectionItem *> *rows = [NSMutableArray array];
|
||||||
|
NSArray *qualityLabels = @[LOC(@"Default"), LOC(@"Best"), @"2160p60", @"2160p", @"1440p60", @"1440p", @"1080p60", @"1080p", @"720p60", @"720p", @"480p", @"360p"];
|
||||||
|
|
||||||
|
for (NSUInteger i = 0; i < qualityLabels.count; i++) {
|
||||||
|
NSString *title = qualityLabels[i];
|
||||||
|
YTSettingsSectionItem *item = [YTSettingsSectionItemClass checkmarkItemWithTitle:title titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
ytlSetInt((int)arg1, @"cellQualityIndex");
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[rows addObject:item];
|
||||||
|
}
|
||||||
|
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"SelectQuality") pickerSectionTitle:nil rows:rows selectedItemIndex:ytlInt(@"cellQualityIndex") parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[sectionItems addObject:cellQuality];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *startup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Startup")
|
||||||
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
NSArray *tabLabels = @[LOC(@"Home"), LOC(@"Explore"), LOC(@"ShortsTab"), LOC(@"Subscriptions"), LOC(@"Library")];
|
||||||
|
return tabLabels[ytlInt(@"pivotIndex")];
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSMutableArray <YTSettingsSectionItem *> *rows = [NSMutableArray array];
|
||||||
|
NSArray *tabLabels = @[LOC(@"Home"), LOC(@"Explore"), LOC(@"ShortsTab"), LOC(@"Subscriptions"), LOC(@"Library")];
|
||||||
|
|
||||||
|
for (NSUInteger i = 0; i < tabLabels.count; i++) {
|
||||||
|
NSString *title = tabLabels[i];
|
||||||
|
YTSettingsSectionItem *item = [YTSettingsSectionItemClass checkmarkItemWithTitle:title titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
if (([title isEqualToString:LOC(@"Explore")] && !ytlBool(@"reExplore") && !ytlBool(@"addExplore")) ||
|
||||||
|
([title isEqualToString:LOC(@"ShortsTab")] && ytlBool(@"removeShorts")) ||
|
||||||
|
([title isEqualToString:LOC(@"Subscriptions")] && ytlBool(@"removeSubscriptions")) ||
|
||||||
|
([title isEqualToString:LOC(@"Library")] && ytlBool(@"removeLibrary"))) {
|
||||||
|
YTAlertView *alertView = [%c(YTAlertView) infoDialog];
|
||||||
|
alertView.title = LOC(@"Warning");
|
||||||
|
alertView.subtitle = LOC(@"TabIsHidden");
|
||||||
|
[alertView show];
|
||||||
|
return NO;
|
||||||
|
} else {
|
||||||
|
[settingsViewController reloadData];
|
||||||
|
ytlSetInt((int)arg1, @"pivotIndex");
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
[rows addObject:item];
|
||||||
|
}
|
||||||
|
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Startup") pickerSectionTitle:nil rows:rows selectedItemIndex:ytlInt(@"pivotIndex") parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
|
}];
|
||||||
|
|
||||||
[sectionItems addObject:startup];
|
[sectionItems addObject:startup];
|
||||||
}
|
}
|
||||||
|
|
||||||
[sectionItems addObject:space];
|
[sectionItems addObject:space];
|
||||||
|
|
||||||
YTSettingsSectionItem *ps = [%c(YTSettingsSectionItem) itemWithTitle:@"PoomSmart" titleDescription:@"YouTube-X, YTNoPremium, YTClassicVideoQuality, YTShortsProgress, YTReExplore, SkipContentWarning, YTAutoFullscreen, YouTubeHeaders" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
YTSettingsSectionItem *support = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"SupportDevelopment") accessibilityIdentifier:@"YTLiteSectionItem" detailTextBlock:^NSString *() { return @"♡"; } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/PoomSmart/"]];
|
YTDefaultSheetController *sheetController = [%c(YTDefaultSheetController) sheetControllerWithMessage:LOC(@"SupportDevelopment") subMessage:LOC(@"SupportDevelopmentDesc") delegate:nil parentResponder:nil];
|
||||||
|
YTActionSheetHeaderView *headerView = [sheetController valueForKey:@"_headerView"];
|
||||||
|
YTFormattedStringLabel *subtitle = [headerView valueForKey:@"_subtitleLabel"];
|
||||||
|
subtitle.numberOfLines = 0;
|
||||||
|
[headerView showHeaderDivider];
|
||||||
|
|
||||||
|
[sheetController addAction:[%c(YTActionSheetAction) actionWithTitle:@"PayPal" iconImage:[self resizedImageNamed:@"paypal"] secondaryIconImage:nil accessibilityIdentifier:nil handler:^ {
|
||||||
|
[%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://paypal.me/dayanch96"]];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[sheetController addAction:[%c(YTActionSheetAction) actionWithTitle:@"Github Sponsors" iconImage:[self resizedImageNamed:@"github"] secondaryIconImage:nil accessibilityIdentifier:nil handler:^ {
|
||||||
|
[%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/sponsors/dayanch96"]];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[sheetController addAction:[%c(YTActionSheetAction) actionWithTitle:@"Buy Me a Coffee" iconImage:[self resizedImageNamed:@"coffee"] secondaryIconImage:nil accessibilityIdentifier:nil handler:^ {
|
||||||
|
[%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://www.buymeacoffee.com/dayanch96"]];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[sheetController addAction:[%c(YTActionSheetAction) actionWithTitle:@"USDT (TRC20)" iconImage:[self resizedImageNamed:@"usdt"] secondaryIconImage:nil accessibilityIdentifier:nil handler:^ {
|
||||||
|
[UIPasteboard generalPasteboard].string = @"TEdKJdKwc1Bbu8Py4um8qPQ6MbproEqNJw";
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:[self parentResponder]] send];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[sheetController addAction:[%c(YTActionSheetAction) actionWithTitle:@"BNB Smart Chain (BEP20)" iconImage:[self resizedImageNamed:@"bnb"] secondaryIconImage:nil accessibilityIdentifier:nil handler:^ {
|
||||||
|
[UIPasteboard generalPasteboard].string = @"0xc6f9fddb30ce10d70e6497950f44c8e10b72bcd6";
|
||||||
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:[self parentResponder]] send];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[sheetController addAction:[%c(YTActionSheetAction) actionWithTitle:@"Boosty" iconImage:[self resizedImageNamed:@"boosty"] secondaryIconImage:nil accessibilityIdentifier:nil handler:^ {
|
||||||
|
[%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://boosty.to/dayanch96"]];
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[sheetController presentFromViewController:[%c(YTUIUtils) topViewControllerForPresenting] animated:YES completion:nil];
|
||||||
|
|
||||||
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
YTSettingsSectionItem *miro = [%c(YTSettingsSectionItem) itemWithTitle:@"MiRO92" titleDescription:@"YTNoShorts" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
YTSettingsSectionItem *thanks = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Contributors")
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/MiRO92/"]];
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
return @"‣";
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[self linkWithTitle:@"Dayanch96" description:LOC(@"Developer") link:@"https://github.com/Dayanch96/"],
|
||||||
|
[self linkWithTitle:@"Dan Pashin" description:LOC(@"SpecialThanks") link:@"https://github.com/danpashin/"],
|
||||||
|
space,
|
||||||
|
[self linkWithTitle:@"Stalker" description:LOC(@"ChineseSimplified") link:@"https://github.com/xiangfeidexiaohuo"],
|
||||||
|
[self linkWithTitle:@"Clement" description:LOC(@"ChineseTraditional") link:@"https://twitter.com/a100900900"],
|
||||||
|
[self linkWithTitle:@"Balackburn" description:LOC(@"French") link:@"https://github.com/Balackburn"],
|
||||||
|
[self linkWithTitle:@"DeciBelioS" description:LOC(@"Spanish") link:@"https://github.com/Deci8BelioS"],
|
||||||
|
[self linkWithTitle:@"SKEIDs" description:LOC(@"Japanese") link:@"https://github.com/SKEIDs"],
|
||||||
|
[self linkWithTitle:@"Hiepvk" description:LOC(@"Vietnamese") link:@"https://github.com/hiepvk"]
|
||||||
|
];
|
||||||
|
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
YTSettingsSectionItem *lillie = [%c(YTSettingsSectionItem) itemWithTitle:@"Lillie" titleDescription:@"ExtraSpeedOptions" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
YTSettingsSectionItem *sources = [YTSettingsSectionItemClass itemWithTitle:LOC(@"OpenSourceLibs")
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/LillieH1000"]];
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
|
detailTextBlock:^NSString *() {
|
||||||
|
return @"‣";
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[self linkWithTitle:@"PoomSmart" description:@"YouTube-X, YTNoPremium, YTClassicVideoQuality, YTShortsProgress, YTReExplore, SkipContentWarning, YTAutoFullscreen, YouTubeHeaders" link:@"https://github.com/PoomSmart/"],
|
||||||
|
[self linkWithTitle:@"MiRO92" description:@"YTNoShorts" link:@"https://github.com/MiRO92/YTNoShorts"],
|
||||||
|
[self linkWithTitle:@"Tony Million" description:@"Reachability" link:@"https://github.com/tonymillion/Reachability"],
|
||||||
|
[self linkWithTitle:@"jkhsjdhjs" description:@"YouTube Native Share" link:@"https://github.com/jkhsjdhjs/youtube-native-share"]
|
||||||
|
];
|
||||||
|
|
||||||
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
|
[settingsViewController pushViewController:picker];
|
||||||
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
YTSettingsSectionItem *stalker = [%c(YTSettingsSectionItem) itemWithTitle:@"Stalker" titleDescription:LOC(@"ChineseSimplified") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
YTSettingsSectionItem *version = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Version")
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/xiangfeidexiaohuo"]];
|
accessibilityIdentifier:@"YTLiteSectionItem"
|
||||||
}];
|
detailTextBlock:^NSString *() {
|
||||||
|
return @(OS_STRINGIFY(TWEAK_VERSION));
|
||||||
|
}
|
||||||
|
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
|
NSArray <YTSettingsSectionItem *> *rows = @[
|
||||||
|
[self switchWithTitle:@"Advanced" key:@"advancedMode"],
|
||||||
|
|
||||||
YTSettingsSectionItem *clement = [%c(YTSettingsSectionItem) itemWithTitle:@"Clement" titleDescription:LOC(@"ChineseTraditional") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
[%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ClearCache") titleDescription:nil accessibilityIdentifier:@"YTLiteSectionItem" detailTextBlock:^NSString *() { return GetCacheSize(); } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://twitter.com/a100900900"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *balackburn = [%c(YTSettingsSectionItem) itemWithTitle:@"Balackburn" titleDescription:LOC(@"French") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Balackburn"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *decibelios = [%c(YTSettingsSectionItem) itemWithTitle:@"DeciBelioS" titleDescription:LOC(@"Spanish") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Deci8BelioS"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *skeids = [%c(YTSettingsSectionItem) itemWithTitle:@"SKEIDs" titleDescription:LOC(@"Japanese") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/SKEIDs"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *hiepvk = [%c(YTSettingsSectionItem) itemWithTitle:@"Hiepvk" titleDescription:LOC(@"Vietnamese") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/hiepvk"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *dayanch96 = [%c(YTSettingsSectionItem) itemWithTitle:@"Dayanch96" titleDescription:LOC(@"Developer") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *paypal = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"DonateViaPayPal") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:^NSString *() { return @"♡"; } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://paypal.me/Dayanch96/"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *ghSponsors = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"SupportViaGhSponsors") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:^NSString *() { return @"♡"; } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/sponsors/dayanch96"]];
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *cache = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ClearCache") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:^NSString *() { return GetCacheSize(); } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||||
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
|
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
|
||||||
[[NSFileManager defaultManager] removeItemAtPath:cachePath error:nil];
|
[[NSFileManager defaultManager] removeItemAtPath:cachePath error:nil];
|
||||||
});
|
});
|
||||||
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Done") firstResponder:[self parentResponder]] send];
|
|
||||||
return YES;
|
|
||||||
}];
|
|
||||||
|
|
||||||
YTSettingsSectionItem *reset = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
[[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Done") firstResponder:[self parentResponder]] send];
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}],
|
||||||
|
|
||||||
|
[%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:@"YTLiteSectionItem" detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
||||||
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
||||||
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
|
[YTLUserDefaults resetUserDefaults];
|
||||||
[[NSFileManager defaultManager] removeItemAtPath:prefsPath error:nil];
|
|
||||||
|
|
||||||
[[UIApplication sharedApplication] performSelector:@selector(suspend)];
|
[[UIApplication sharedApplication] performSelector:@selector(suspend)];
|
||||||
[NSThread sleepForTimeInterval:1.0];
|
[NSThread sleepForTimeInterval:1.0];
|
||||||
@@ -469,23 +602,22 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
|||||||
alertView.title = LOC(@"Warning");
|
alertView.title = LOC(@"Warning");
|
||||||
alertView.subtitle = LOC(@"ResetMessage");
|
alertView.subtitle = LOC(@"ResetMessage");
|
||||||
[alertView show];
|
[alertView show];
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}]
|
||||||
|
];
|
||||||
|
|
||||||
YTSettingsSectionItem *version = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Version")
|
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
||||||
accessibilityIdentifier:nil
|
|
||||||
detailTextBlock:^NSString *() {
|
|
||||||
return @(OS_STRINGIFY(TWEAK_VERSION));
|
|
||||||
}
|
|
||||||
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
|
|
||||||
NSArray <YTSettingsSectionItem *> *rows = @[ps, miro, lillie, dayanch96, stalker, clement, balackburn, decibelios, skeids, hiepvk, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), cache, reset];
|
|
||||||
|
|
||||||
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
|
|
||||||
[settingsViewController pushViewController:picker];
|
[settingsViewController pushViewController:picker];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
[sectionItems addObject:paypal];
|
|
||||||
[sectionItems addObject:ghSponsors];
|
[sectionItems addObject:thanks];
|
||||||
|
|
||||||
|
[sectionItems addObject:sources];
|
||||||
|
|
||||||
|
[sectionItems addObject:support];
|
||||||
|
|
||||||
[sectionItems addObject:version];
|
[sectionItems addObject:version];
|
||||||
|
|
||||||
BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)];
|
BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)];
|
||||||
@@ -500,27 +632,22 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD
|
|||||||
return;
|
return;
|
||||||
} %orig;
|
} %orig;
|
||||||
}
|
}
|
||||||
%end
|
|
||||||
|
|
||||||
%ctor {
|
%new
|
||||||
if (!kAdvancedModeReminder && !kAdvancedMode) {
|
- (UIImage *)resizedImageNamed:(NSString *)iconName {
|
||||||
NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"];
|
|
||||||
NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:prefsPath];
|
|
||||||
[prefs setObject:@(YES) forKey:@"advancedModeReminder"];
|
|
||||||
[prefs writeToFile:prefsPath atomically:NO];
|
|
||||||
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
|
|
||||||
|
|
||||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:CGSizeMake(32, 32)];
|
||||||
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
|
||||||
[prefs setObject:@(YES) forKey:@"advancedMode"];
|
UIView *imageView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
|
||||||
[prefs writeToFile:prefsPath atomically:NO];
|
UIImageView *iconImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[NSBundle.ytl_defaultBundle pathForResource:iconName ofType:@"png"]]];
|
||||||
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES);
|
iconImageView.contentMode = UIViewContentModeScaleAspectFit;
|
||||||
}
|
iconImageView.clipsToBounds = YES;
|
||||||
actionTitle:LOC(@"Yes")
|
iconImageView.frame = imageView.bounds;
|
||||||
cancelTitle:LOC(@"No")];
|
|
||||||
alertView.title = @"YTLite";
|
[imageView addSubview:iconImageView];
|
||||||
alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")];
|
[imageView.layer renderInContext:rendererContext.CGContext];
|
||||||
[alertView show];
|
}];
|
||||||
});
|
|
||||||
}
|
return image;
|
||||||
}
|
}
|
||||||
|
%end
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <rootless.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface NSBundle (YTLite)
|
||||||
|
|
||||||
|
// Returns YTLite default bundle. Supports rootless if defined in compilation parameters
|
||||||
|
@property (class, nonatomic, readonly) NSBundle *ytl_defaultBundle;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#import "NSBundle+YTLite.h"
|
||||||
|
|
||||||
|
@implementation NSBundle (YTLite)
|
||||||
|
|
||||||
|
+ (NSBundle *)ytl_defaultBundle {
|
||||||
|
static NSBundle *bundle = nil;
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"];
|
||||||
|
NSString *rootlessBundlePath = ROOT_PATH_NS("/Library/Application Support/YTLite.bundle");
|
||||||
|
|
||||||
|
bundle = [NSBundle bundleWithPath:tweakBundlePath ?: rootlessBundlePath];
|
||||||
|
});
|
||||||
|
|
||||||
|
return bundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2011, Tony Million.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <SystemConfiguration/SystemConfiguration.h>
|
||||||
|
|
||||||
|
//! Project version number for MacOSReachability.
|
||||||
|
FOUNDATION_EXPORT double ReachabilityVersionNumber;
|
||||||
|
|
||||||
|
//! Project version string for MacOSReachability.
|
||||||
|
FOUNDATION_EXPORT const unsigned char ReachabilityVersionString[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X.
|
||||||
|
*
|
||||||
|
* @see http://nshipster.com/ns_enum-ns_options/
|
||||||
|
**/
|
||||||
|
#ifndef NS_ENUM
|
||||||
|
#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern NSString *const kReachabilityChangedNotification;
|
||||||
|
|
||||||
|
typedef NS_ENUM(NSInteger, NetworkStatus) {
|
||||||
|
// Apple NetworkStatus Compatible Names.
|
||||||
|
NotReachable = 0,
|
||||||
|
ReachableViaWiFi = 2,
|
||||||
|
ReachableViaWWAN = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
@class Reachability;
|
||||||
|
|
||||||
|
typedef void (^NetworkReachable)(Reachability * reachability);
|
||||||
|
typedef void (^NetworkUnreachable)(Reachability * reachability);
|
||||||
|
typedef void (^NetworkReachability)(Reachability * reachability, SCNetworkConnectionFlags flags);
|
||||||
|
|
||||||
|
|
||||||
|
@interface Reachability : NSObject
|
||||||
|
|
||||||
|
@property (nonatomic, copy) NetworkReachable reachableBlock;
|
||||||
|
@property (nonatomic, copy) NetworkUnreachable unreachableBlock;
|
||||||
|
@property (nonatomic, copy) NetworkReachability reachabilityBlock;
|
||||||
|
|
||||||
|
@property (nonatomic, assign) BOOL reachableOnWWAN;
|
||||||
|
|
||||||
|
|
||||||
|
+(instancetype)reachabilityWithHostname:(NSString*)hostname;
|
||||||
|
// This is identical to the function above, but is here to maintain
|
||||||
|
//compatibility with Apples original code. (see .m)
|
||||||
|
+(instancetype)reachabilityWithHostName:(NSString*)hostname;
|
||||||
|
+(instancetype)reachabilityForInternetConnection;
|
||||||
|
+(instancetype)reachabilityWithAddress:(void *)hostAddress;
|
||||||
|
+(instancetype)reachabilityForLocalWiFi;
|
||||||
|
+(instancetype)reachabilityWithURL:(NSURL*)url;
|
||||||
|
|
||||||
|
-(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref;
|
||||||
|
|
||||||
|
-(BOOL)startNotifier;
|
||||||
|
-(void)stopNotifier;
|
||||||
|
|
||||||
|
-(BOOL)isReachable;
|
||||||
|
-(BOOL)isReachableViaWWAN;
|
||||||
|
-(BOOL)isReachableViaWiFi;
|
||||||
|
|
||||||
|
// WWAN may be available, but not active until a connection has been established.
|
||||||
|
// WiFi may require a connection for VPN on Demand.
|
||||||
|
-(BOOL)isConnectionRequired; // Identical DDG variant.
|
||||||
|
-(BOOL)connectionRequired; // Apple's routine.
|
||||||
|
// Dynamic, on demand connection?
|
||||||
|
-(BOOL)isConnectionOnDemand;
|
||||||
|
// Is user intervention required?
|
||||||
|
-(BOOL)isInterventionRequired;
|
||||||
|
|
||||||
|
-(NetworkStatus)currentReachabilityStatus;
|
||||||
|
-(SCNetworkReachabilityFlags)reachabilityFlags;
|
||||||
|
-(NSString*)currentReachabilityString;
|
||||||
|
-(NSString*)currentReachabilityFlags;
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -0,0 +1,508 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2011, Tony Million.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "Reachability.h"
|
||||||
|
|
||||||
|
#import <sys/socket.h>
|
||||||
|
#import <netinet/in.h>
|
||||||
|
#import <netinet6/in6.h>
|
||||||
|
#import <arpa/inet.h>
|
||||||
|
#import <ifaddrs.h>
|
||||||
|
#import <netdb.h>
|
||||||
|
|
||||||
|
|
||||||
|
NSString *const kReachabilityChangedNotification = @"kReachabilityChangedNotification";
|
||||||
|
|
||||||
|
|
||||||
|
@interface Reachability ()
|
||||||
|
|
||||||
|
@property (nonatomic, assign) SCNetworkReachabilityRef reachabilityRef;
|
||||||
|
@property (nonatomic, strong) dispatch_queue_t reachabilitySerialQueue;
|
||||||
|
@property (nonatomic, strong) id reachabilityObject;
|
||||||
|
|
||||||
|
-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags;
|
||||||
|
-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
static NSString *reachabilityFlags(SCNetworkReachabilityFlags flags)
|
||||||
|
{
|
||||||
|
return [NSString stringWithFormat:@"%c%c %c%c%c%c%c%c%c",
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
(flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-',
|
||||||
|
#else
|
||||||
|
'X',
|
||||||
|
#endif
|
||||||
|
(flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-',
|
||||||
|
(flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start listening for reachability notifications on the current run loop
|
||||||
|
static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info)
|
||||||
|
{
|
||||||
|
#pragma unused (target)
|
||||||
|
|
||||||
|
Reachability *reachability = ((__bridge Reachability*)info);
|
||||||
|
|
||||||
|
// We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool,
|
||||||
|
// but what the heck eh?
|
||||||
|
@autoreleasepool
|
||||||
|
{
|
||||||
|
[reachability reachabilityChanged:flags];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@implementation Reachability
|
||||||
|
|
||||||
|
#pragma mark - Class Constructor Methods
|
||||||
|
|
||||||
|
+(instancetype)reachabilityWithHostName:(NSString*)hostname
|
||||||
|
{
|
||||||
|
return [Reachability reachabilityWithHostname:hostname];
|
||||||
|
}
|
||||||
|
|
||||||
|
+(instancetype)reachabilityWithHostname:(NSString*)hostname
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);
|
||||||
|
if (ref)
|
||||||
|
{
|
||||||
|
id reachability = [[self alloc] initWithReachabilityRef:ref];
|
||||||
|
|
||||||
|
return reachability;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(instancetype)reachabilityWithAddress:(void *)hostAddress
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress);
|
||||||
|
if (ref)
|
||||||
|
{
|
||||||
|
id reachability = [[self alloc] initWithReachabilityRef:ref];
|
||||||
|
|
||||||
|
return reachability;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(instancetype)reachabilityForInternetConnection
|
||||||
|
{
|
||||||
|
struct sockaddr_in zeroAddress;
|
||||||
|
bzero(&zeroAddress, sizeof(zeroAddress));
|
||||||
|
zeroAddress.sin_len = sizeof(zeroAddress);
|
||||||
|
zeroAddress.sin_family = AF_INET;
|
||||||
|
|
||||||
|
return [self reachabilityWithAddress:&zeroAddress];
|
||||||
|
}
|
||||||
|
|
||||||
|
+(instancetype)reachabilityForLocalWiFi
|
||||||
|
{
|
||||||
|
struct sockaddr_in localWifiAddress;
|
||||||
|
bzero(&localWifiAddress, sizeof(localWifiAddress));
|
||||||
|
localWifiAddress.sin_len = sizeof(localWifiAddress);
|
||||||
|
localWifiAddress.sin_family = AF_INET;
|
||||||
|
// IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0
|
||||||
|
localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM);
|
||||||
|
|
||||||
|
return [self reachabilityWithAddress:&localWifiAddress];
|
||||||
|
}
|
||||||
|
|
||||||
|
+(instancetype)reachabilityWithURL:(NSURL*)url
|
||||||
|
{
|
||||||
|
id reachability;
|
||||||
|
|
||||||
|
NSString *host = url.host;
|
||||||
|
BOOL isIpAddress = [self isIpAddress:host];
|
||||||
|
|
||||||
|
if (isIpAddress)
|
||||||
|
{
|
||||||
|
NSNumber *port = url.port ?: [url.scheme isEqualToString:@"https"] ? @(443) : @(80);
|
||||||
|
|
||||||
|
struct sockaddr_in address;
|
||||||
|
address.sin_len = sizeof(address);
|
||||||
|
address.sin_family = AF_INET;
|
||||||
|
address.sin_port = htons([port intValue]);
|
||||||
|
address.sin_addr.s_addr = inet_addr([host UTF8String]);
|
||||||
|
|
||||||
|
reachability = [self reachabilityWithAddress:&address];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reachability = [self reachabilityWithHostname:host];
|
||||||
|
}
|
||||||
|
|
||||||
|
return reachability;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(BOOL)isIpAddress:(NSString*)host
|
||||||
|
{
|
||||||
|
struct in_addr pin;
|
||||||
|
return 1 == inet_aton([host UTF8String], &pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Initialization methods
|
||||||
|
|
||||||
|
-(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil)
|
||||||
|
{
|
||||||
|
self.reachableOnWWAN = YES;
|
||||||
|
self.reachabilityRef = ref;
|
||||||
|
|
||||||
|
// We need to create a serial queue.
|
||||||
|
// We allocate this once for the lifetime of the notifier.
|
||||||
|
|
||||||
|
self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)dealloc
|
||||||
|
{
|
||||||
|
[self stopNotifier];
|
||||||
|
|
||||||
|
if(self.reachabilityRef)
|
||||||
|
{
|
||||||
|
CFRelease(self.reachabilityRef);
|
||||||
|
self.reachabilityRef = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.reachableBlock = nil;
|
||||||
|
self.unreachableBlock = nil;
|
||||||
|
self.reachabilityBlock = nil;
|
||||||
|
self.reachabilitySerialQueue = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Notifier Methods
|
||||||
|
|
||||||
|
// Notifier
|
||||||
|
// NOTE: This uses GCD to trigger the blocks - they *WILL NOT* be called on THE MAIN THREAD
|
||||||
|
// - In other words DO NOT DO ANY UI UPDATES IN THE BLOCKS.
|
||||||
|
// INSTEAD USE dispatch_async(dispatch_get_main_queue(), ^{UISTUFF}) (or dispatch_sync if you want)
|
||||||
|
|
||||||
|
-(BOOL)startNotifier
|
||||||
|
{
|
||||||
|
// allow start notifier to be called multiple times
|
||||||
|
if(self.reachabilityObject && (self.reachabilityObject == self))
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCNetworkReachabilityContext context = { 0, NULL, NULL, NULL, NULL };
|
||||||
|
context.info = (__bridge void *)self;
|
||||||
|
|
||||||
|
if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context))
|
||||||
|
{
|
||||||
|
// Set it as our reachability queue, which will retain the queue
|
||||||
|
if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue))
|
||||||
|
{
|
||||||
|
// this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves
|
||||||
|
// woah
|
||||||
|
self.reachabilityObject = self;
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError()));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// UH OH - FAILURE - stop any callbacks!
|
||||||
|
SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError()));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we get here we fail at the internet
|
||||||
|
self.reachabilityObject = nil;
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)stopNotifier
|
||||||
|
{
|
||||||
|
// First stop, any callbacks!
|
||||||
|
SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);
|
||||||
|
|
||||||
|
// Unregister target from the GCD serial dispatch queue.
|
||||||
|
SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL);
|
||||||
|
|
||||||
|
self.reachabilityObject = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - reachability tests
|
||||||
|
|
||||||
|
// This is for the case where you flick the airplane mode;
|
||||||
|
// you end up getting something like this:
|
||||||
|
//Reachability: WR ct-----
|
||||||
|
//Reachability: -- -------
|
||||||
|
//Reachability: WR ct-----
|
||||||
|
//Reachability: -- -------
|
||||||
|
// We treat this as 4 UNREACHABLE triggers - really apple should do better than this
|
||||||
|
|
||||||
|
#define testcase (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection)
|
||||||
|
|
||||||
|
-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags
|
||||||
|
{
|
||||||
|
BOOL connectionUP = YES;
|
||||||
|
|
||||||
|
if(!(flags & kSCNetworkReachabilityFlagsReachable))
|
||||||
|
connectionUP = NO;
|
||||||
|
|
||||||
|
if( (flags & testcase) == testcase )
|
||||||
|
connectionUP = NO;
|
||||||
|
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
if(flags & kSCNetworkReachabilityFlagsIsWWAN)
|
||||||
|
{
|
||||||
|
// We're on 3G.
|
||||||
|
if(!self.reachableOnWWAN)
|
||||||
|
{
|
||||||
|
// We don't want to connect when on 3G.
|
||||||
|
connectionUP = NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return connectionUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)isReachable
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityFlags flags;
|
||||||
|
|
||||||
|
if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
return NO;
|
||||||
|
|
||||||
|
return [self isReachableWithFlags:flags];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)isReachableViaWWAN
|
||||||
|
{
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
|
||||||
|
SCNetworkReachabilityFlags flags = 0;
|
||||||
|
|
||||||
|
if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
{
|
||||||
|
// Check we're REACHABLE
|
||||||
|
if(flags & kSCNetworkReachabilityFlagsReachable)
|
||||||
|
{
|
||||||
|
// Now, check we're on WWAN
|
||||||
|
if(flags & kSCNetworkReachabilityFlagsIsWWAN)
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)isReachableViaWiFi
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityFlags flags = 0;
|
||||||
|
|
||||||
|
if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
{
|
||||||
|
// Check we're reachable
|
||||||
|
if((flags & kSCNetworkReachabilityFlagsReachable))
|
||||||
|
{
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
// Check we're NOT on WWAN
|
||||||
|
if((flags & kSCNetworkReachabilityFlagsIsWWAN))
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// WWAN may be available, but not active until a connection has been established.
|
||||||
|
// WiFi may require a connection for VPN on Demand.
|
||||||
|
-(BOOL)isConnectionRequired
|
||||||
|
{
|
||||||
|
return [self connectionRequired];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)connectionRequired
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityFlags flags;
|
||||||
|
|
||||||
|
if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
{
|
||||||
|
return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dynamic, on demand connection?
|
||||||
|
-(BOOL)isConnectionOnDemand
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityFlags flags;
|
||||||
|
|
||||||
|
if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
{
|
||||||
|
return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) &&
|
||||||
|
(flags & (kSCNetworkReachabilityFlagsConnectionOnTraffic | kSCNetworkReachabilityFlagsConnectionOnDemand)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is user intervention required?
|
||||||
|
-(BOOL)isInterventionRequired
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityFlags flags;
|
||||||
|
|
||||||
|
if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
{
|
||||||
|
return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) &&
|
||||||
|
(flags & kSCNetworkReachabilityFlagsInterventionRequired));
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - reachability status stuff
|
||||||
|
|
||||||
|
-(NetworkStatus)currentReachabilityStatus
|
||||||
|
{
|
||||||
|
if([self isReachable])
|
||||||
|
{
|
||||||
|
if([self isReachableViaWiFi])
|
||||||
|
return ReachableViaWiFi;
|
||||||
|
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
return ReachableViaWWAN;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return NotReachable;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(SCNetworkReachabilityFlags)reachabilityFlags
|
||||||
|
{
|
||||||
|
SCNetworkReachabilityFlags flags = 0;
|
||||||
|
|
||||||
|
if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
|
||||||
|
{
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSString*)currentReachabilityString
|
||||||
|
{
|
||||||
|
NetworkStatus temp = [self currentReachabilityStatus];
|
||||||
|
|
||||||
|
if(temp == ReachableViaWWAN)
|
||||||
|
{
|
||||||
|
// Updated for the fact that we have CDMA phones now!
|
||||||
|
return NSLocalizedString(@"Cellular", @"");
|
||||||
|
}
|
||||||
|
if (temp == ReachableViaWiFi)
|
||||||
|
{
|
||||||
|
return NSLocalizedString(@"WiFi", @"");
|
||||||
|
}
|
||||||
|
|
||||||
|
return NSLocalizedString(@"No Connection", @"");
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSString*)currentReachabilityFlags
|
||||||
|
{
|
||||||
|
return reachabilityFlags([self reachabilityFlags]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Callback function calls this method
|
||||||
|
|
||||||
|
-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags
|
||||||
|
{
|
||||||
|
if([self isReachableWithFlags:flags])
|
||||||
|
{
|
||||||
|
if(self.reachableBlock)
|
||||||
|
{
|
||||||
|
self.reachableBlock(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(self.unreachableBlock)
|
||||||
|
{
|
||||||
|
self.unreachableBlock(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(self.reachabilityBlock)
|
||||||
|
{
|
||||||
|
self.reachabilityBlock(self, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
// this makes sure the change notification happens on the MAIN THREAD
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
[[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification
|
||||||
|
object:self];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Debug Description
|
||||||
|
|
||||||
|
- (NSString *) description
|
||||||
|
{
|
||||||
|
NSString *description = [NSString stringWithFormat:@"<%@: %p (%@)>",
|
||||||
|
NSStringFromClass([self class]), self, [self currentReachabilityFlags]];
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface YTLUserDefaults : NSUserDefaults
|
||||||
|
|
||||||
|
@property (class, readonly, strong) YTLUserDefaults *standardUserDefaults;
|
||||||
|
|
||||||
|
- (void)reset;
|
||||||
|
|
||||||
|
+ (void)resetUserDefaults;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#import "YTLUserDefaults.h"
|
||||||
|
|
||||||
|
@implementation YTLUserDefaults
|
||||||
|
|
||||||
|
static NSString *const kDefaultsSuiteName = @"com.dvntm.ytlite";
|
||||||
|
|
||||||
|
+ (YTLUserDefaults *)standardUserDefaults {
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
static YTLUserDefaults *defaults = nil;
|
||||||
|
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
defaults = [[self alloc] initWithSuiteName:kDefaultsSuiteName];
|
||||||
|
[defaults registerDefaults];
|
||||||
|
});
|
||||||
|
|
||||||
|
return defaults;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)reset {
|
||||||
|
[self removePersistentDomainForName:kDefaultsSuiteName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)registerDefaults {
|
||||||
|
[self registerDefaults:@{
|
||||||
|
@"noAds": @YES,
|
||||||
|
@"backgroundPlayback": @YES,
|
||||||
|
@"removeUploads": @YES,
|
||||||
|
@"speedIndex": @1,
|
||||||
|
@"autoSpeedIndex": @3,
|
||||||
|
@"wiFiQualityIndex": @0,
|
||||||
|
@"cellQualityIndex": @0,
|
||||||
|
@"pivotIndex": @0
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)resetUserDefaults {
|
||||||
|
[[self standardUserDefaults] reset];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -1,142 +1,36 @@
|
|||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import <rootless.h>
|
|
||||||
#import <Photos/Photos.h>
|
#import <Photos/Photos.h>
|
||||||
#import "../YouTubeHeader/YTAlertView.h"
|
#import "Utils/NSBundle+YTLite.h"
|
||||||
#import "../YouTubeHeader/YTIGuideResponse.h"
|
#import "Utils/YTLUserDefaults.h"
|
||||||
#import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
|
#import "Utils/Reachability.h"
|
||||||
#import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h"
|
#import "YouTubeHeaders.h"
|
||||||
#import "../YouTubeHeader/YTIPivotBarRenderer.h"
|
|
||||||
#import "../YouTubeHeader/YTIBrowseRequest.h"
|
|
||||||
#import "../YouTubeHeader/YTISectionListRenderer.h"
|
|
||||||
#import "../YouTubeHeader/YTQTMButton.h"
|
|
||||||
#import "../YouTubeHeader/YTIButtonRenderer.h"
|
|
||||||
#import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
|
||||||
#import "../YouTubeHeader/YTPlayerViewController.h"
|
|
||||||
#import "../YouTubeHeader/YTWatchController.h"
|
|
||||||
#import "../YouTubeHeader/YTPlayerOverlay.h"
|
|
||||||
#import "../YouTubeHeader/YTPlayerOverlayProvider.h"
|
|
||||||
#import "../YouTubeHeader/YTSettingsViewController.h"
|
|
||||||
#import "../YouTubeHeader/YTSettingsSectionItem.h"
|
|
||||||
#import "../YouTubeHeader/YTSettingsSectionItemManager.h"
|
|
||||||
#import "../YouTubeHeader/YTSettingsPickerViewController.h"
|
|
||||||
#import "../YouTubeHeader/YTUIUtils.h"
|
|
||||||
#import "../YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h"
|
|
||||||
#import "../YouTubeHeader/YTToastResponderEvent.h"
|
|
||||||
#import "../YouTubeHeader/YTPageStyleController.h"
|
|
||||||
|
|
||||||
static inline NSBundle *YTLiteBundle() {
|
#define LOC(key) [NSBundle.ytl_defaultBundle localizedStringForKey:key value:nil table:nil]
|
||||||
static NSBundle *bundle = nil;
|
|
||||||
static dispatch_once_t onceToken;
|
|
||||||
|
|
||||||
dispatch_once(&onceToken, ^{
|
#define ytlBool(key) [[YTLUserDefaults standardUserDefaults] boolForKey:key]
|
||||||
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"];
|
#define ytlInt(key) [[YTLUserDefaults standardUserDefaults] integerForKey:key]
|
||||||
NSString *rootlessBundlePath = ROOT_PATH_NS("/Library/Application Support/YTLite.bundle");
|
|
||||||
|
|
||||||
bundle = [NSBundle bundleWithPath:tweakBundlePath ?: rootlessBundlePath];
|
#define ytlSetBool(value, key) [[YTLUserDefaults standardUserDefaults] setBool:(value) forKey:(key)]
|
||||||
});
|
#define ytlSetInt(value, key) [[YTLUserDefaults standardUserDefaults] setInteger:(value) forKey:(key)]
|
||||||
|
|
||||||
return bundle;
|
@interface YTTouchFeedbackController : YTCollectionViewCell
|
||||||
}
|
@property (nonatomic, strong, readwrite) UIColor *feedbackColor;
|
||||||
|
|
||||||
static inline NSString *LOC(NSString *key) {
|
|
||||||
return [YTLiteBundle() localizedStringForKey:key value:nil table:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL kNoAds;
|
|
||||||
BOOL kBackgroundPlayback;
|
|
||||||
BOOL kNoCast;
|
|
||||||
BOOL kNoNotifsButton;
|
|
||||||
BOOL kNoSearchButton;
|
|
||||||
BOOL kNoVoiceSearchButton;
|
|
||||||
BOOL kStickyNavbar;
|
|
||||||
BOOL kNoSubbar;
|
|
||||||
BOOL kNoYTLogo;
|
|
||||||
BOOL kHideAutoplay;
|
|
||||||
BOOL kHideSubs;
|
|
||||||
BOOL kNoHUDMsgs;
|
|
||||||
BOOL kHidePrevNext;
|
|
||||||
BOOL kReplacePrevNext;
|
|
||||||
BOOL kNoDarkBg;
|
|
||||||
BOOL kEndScreenCards;
|
|
||||||
BOOL kNoFullscreenActions;
|
|
||||||
BOOL kPersistentProgressBar;
|
|
||||||
BOOL kNoRelatedVids;
|
|
||||||
BOOL kNoPromotionCards;
|
|
||||||
BOOL kNoWatermarks;
|
|
||||||
BOOL kMiniplayer;
|
|
||||||
BOOL kPortraitFullscreen;
|
|
||||||
BOOL kCopyWithTimestamp;
|
|
||||||
BOOL kDisableAutoplay;
|
|
||||||
BOOL kDisableAutoCaptions;
|
|
||||||
BOOL kNoContentWarning;
|
|
||||||
BOOL kClassicQuality;
|
|
||||||
BOOL kExtraSpeedOptions;
|
|
||||||
BOOL kDontSnapToChapter;
|
|
||||||
BOOL kRedProgressBar;
|
|
||||||
BOOL kNoHints;
|
|
||||||
BOOL kNoFreeZoom;
|
|
||||||
BOOL kAutoFullscreen;
|
|
||||||
BOOL kExitFullscreen;
|
|
||||||
BOOL kNoDoubleTapToSeek;
|
|
||||||
BOOL kShortsOnlyMode;
|
|
||||||
BOOL kHideShorts;
|
|
||||||
BOOL kShortsProgress;
|
|
||||||
BOOL kPinchToFullscreenShorts;
|
|
||||||
BOOL kShortsToRegular;
|
|
||||||
BOOL kResumeShorts;
|
|
||||||
BOOL kHideShortsLogo;
|
|
||||||
BOOL kHideShortsSearch;
|
|
||||||
BOOL kHideShortsCamera;
|
|
||||||
BOOL kHideShortsMore;
|
|
||||||
BOOL kHideShortsSubscriptions;
|
|
||||||
BOOL kHideShortsLike;
|
|
||||||
BOOL kHideShortsDislike;
|
|
||||||
BOOL kHideShortsComments;
|
|
||||||
BOOL kHideShortsRemix;
|
|
||||||
BOOL kHideShortsShare;
|
|
||||||
BOOL kHideShortsAvatars;
|
|
||||||
BOOL kHideShortsThanks;
|
|
||||||
BOOL kHideShortsSource;
|
|
||||||
BOOL kHideShortsChannelName;
|
|
||||||
BOOL kHideShortsDescription;
|
|
||||||
BOOL kHideShortsAudioTrack;
|
|
||||||
BOOL kHideShortsPromoCards;
|
|
||||||
BOOL kRemoveLabels;
|
|
||||||
BOOL kRemoveIndicators;
|
|
||||||
BOOL kReExplore;
|
|
||||||
BOOL kAddExplore;
|
|
||||||
BOOL kRemoveShorts;
|
|
||||||
BOOL kRemoveSubscriptions;
|
|
||||||
BOOL kRemoveUploads;
|
|
||||||
BOOL kRemoveLibrary;
|
|
||||||
BOOL kCopyVideoInfo;
|
|
||||||
BOOL kPostManager;
|
|
||||||
BOOL kSavePostImage;
|
|
||||||
BOOL kSaveProfilePhoto;
|
|
||||||
BOOL kCopyCommentText;
|
|
||||||
BOOL kSavePost;
|
|
||||||
BOOL kFixAlbums;
|
|
||||||
BOOL kRemovePlayNext;
|
|
||||||
BOOL kNoContinueWatching;
|
|
||||||
BOOL kNoSearchHistory;
|
|
||||||
BOOL kNoRelatedWatchNexts;
|
|
||||||
BOOL kStickSortComments;
|
|
||||||
BOOL kHideSortComments;
|
|
||||||
BOOL kPlaylistOldMinibar;
|
|
||||||
BOOL kDisableRTL;
|
|
||||||
BOOL kAdvancedMode;
|
|
||||||
BOOL kAdvancedModeReminder;
|
|
||||||
int kPivotIndex;
|
|
||||||
|
|
||||||
@interface YTSettingsSectionItemManager (Custom)
|
|
||||||
@property (nonatomic, strong) NSMutableDictionary *prefs;
|
|
||||||
@property (nonatomic, strong) NSString *prefsPath;
|
|
||||||
- (void)updatePrefsForKey:(NSString *)key enabled:(BOOL)enabled;
|
|
||||||
- (void)updateIntegerPrefsForKey:(NSString *)key intValue:(NSInteger)intValue;
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTPivotBarView : UIView
|
@interface ABCSwitch : UIControl
|
||||||
|
@property (nonatomic, strong, readwrite) UIColor *onTintColor;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTSettingsCell ()
|
||||||
|
- (void)setIndicatorIcon:(int)icon;
|
||||||
|
- (void)setTitleDescription:(id)titleDescription;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTSettingsSectionItemManager (Custom)
|
||||||
|
- (YTSettingsSectionItem *)switchWithTitle:(NSString *)title key:(NSString *)key;
|
||||||
|
- (YTSettingsSectionItem *)linkWithTitle:(NSString *)title description:(NSString *)description link:(NSString *)link;
|
||||||
|
- (UIImage *)resizedImageNamed:(NSString *)iconName;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTLightweightQTMButton ()
|
@interface YTLightweightQTMButton ()
|
||||||
@@ -146,10 +40,7 @@ int kPivotIndex;
|
|||||||
@interface YTQTMButton ()
|
@interface YTQTMButton ()
|
||||||
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
|
@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer;
|
||||||
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
|
- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets;
|
||||||
@end
|
- (BOOL)yt_isVisible;
|
||||||
|
|
||||||
@interface YTPivotBarItemView : UIView
|
|
||||||
@property (nonatomic, strong, readwrite) YTQTMButton *navigationButton;
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTRightNavigationButtons : UIView
|
@interface YTRightNavigationButtons : UIView
|
||||||
@@ -166,25 +57,106 @@ int kPivotIndex;
|
|||||||
@interface YTChipCloudCell : UICollectionViewCell
|
@interface YTChipCloudCell : UICollectionViewCell
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface YTHeaderContentComboViewController : UIViewController
|
||||||
|
- (void)refreshPivotBar;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPivotBarViewController : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
@interface YTAppViewController : UIViewController
|
@interface YTAppViewController : UIViewController
|
||||||
|
@property (nonatomic, assign, readonly) YTPivotBarViewController *pivotBarViewController;
|
||||||
- (void)hidePivotBar;
|
- (void)hidePivotBar;
|
||||||
- (void)showPivotBar;
|
- (void)showPivotBar;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTPivotBarViewController : UIViewController
|
@interface YTPivotBarView : UIView
|
||||||
@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController;
|
|
||||||
- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier;
|
- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface YTPivotBarViewController ()
|
||||||
|
@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController;
|
||||||
|
@property (nonatomic, copy, readwrite) NSString *selectedPivotIdentifier;
|
||||||
|
- (YTPivotBarView *)pivotBarView;
|
||||||
|
- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPivotBarItemView : UIView
|
||||||
|
@property (nonatomic, strong, readwrite) YTIPivotBarItemRenderer *renderer;
|
||||||
|
@property (nonatomic, weak, readwrite) YTPivotBarViewController *delegate;
|
||||||
|
@property (nonatomic, strong, readwrite) YTQTMButton *navigationButton;
|
||||||
|
- (void)manageTab:(UILongPressGestureRecognizer *)gesture;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface YTScrollableNavigationController : UINavigationController
|
@interface YTScrollableNavigationController : UINavigationController
|
||||||
@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController;
|
@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTReelWatchRootViewController : UIViewController
|
@interface YTTabsViewController : UIViewController
|
||||||
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTTabsViewController : UIViewController
|
@interface YTIVideoDetails : NSObject
|
||||||
|
@property (nonatomic, copy, readwrite) NSString *title;
|
||||||
|
@property (nonatomic, copy, readwrite) NSString *shortDescription;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTIPlayerResponse : NSObject
|
||||||
|
@property (nonatomic, assign, readonly) YTIVideoDetails *videoDetails;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlayerResponse : NSObject
|
||||||
|
@property (nonatomic, assign, readonly) YTIPlayerResponse *playerData;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLQuickMenuVideoQualitySettingFormatConstraint : NSObject
|
||||||
|
- (instancetype)initWithVideoQualitySetting:(int)settings formatSelectionReason:(NSInteger)reason qualityLabel:(NSString *)label;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLFormat : NSObject
|
||||||
|
@property (nonatomic, assign, readonly) NSString *qualityLabel;
|
||||||
|
@property (nonatomic, assign, readonly) int singleDimensionResolution;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTSingleVideoTime : NSObject
|
||||||
|
@property (nonatomic, assign, readonly) CGFloat time;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTSingleVideoController : NSObject
|
||||||
|
@property (nonatomic, assign, readonly) float playbackRate;
|
||||||
|
@property (nonatomic, assign, readonly) CGFloat totalMediaTime;
|
||||||
|
@property (nonatomic, assign, readonly) NSArray *selectableVideoFormats;
|
||||||
|
- (void)setVideoFormatConstraint:(MLQuickMenuVideoQualitySettingFormatConstraint *)formatConstraint;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlayerViewController : UIViewController
|
||||||
|
@property (nonatomic, assign, readonly) YTPlayerResponse *playerResponse;
|
||||||
|
@property (nonatomic, assign, readonly) YTSingleVideoController *activeVideo;
|
||||||
|
@property (nonatomic, weak, readwrite) UIViewController *activeVideoPlayerOverlay;
|
||||||
|
@property (nonatomic, weak, readwrite) UIViewController *parentViewController;
|
||||||
|
@property (nonatomic, weak, readwrite) UIViewController *UIDelegate;
|
||||||
|
@property (nonatomic, readonly) NSString *contentVideoID;
|
||||||
|
- (void)setActiveCaptionTrack:(id)track;
|
||||||
|
- (void)setPlaybackRate:(CGFloat)rate;
|
||||||
|
- (void)shortsToRegular;
|
||||||
|
- (void)autoFullscreen;
|
||||||
|
- (void)turnOffCaptions;
|
||||||
|
- (void)setAutoSpeed;
|
||||||
|
- (void)autoQuality;
|
||||||
|
- (void)play;
|
||||||
|
- (void)pause;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlayerView : UIView
|
||||||
|
@property (nonatomic, weak, readwrite) YTPlayerViewController *playerViewDelegate;
|
||||||
|
@property (nonatomic, strong, readwrite) UIView *overlayView;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTMainAppControlsOverlayView : UIView
|
||||||
|
@property (nonatomic, strong, readwrite) YTPlayerViewController *playerViewController;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTReelWatchRootViewController : UIViewController
|
||||||
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -193,30 +165,20 @@ int kPivotIndex;
|
|||||||
|
|
||||||
@interface YTReelContentView : UIView
|
@interface YTReelContentView : UIView
|
||||||
@property (nonatomic, assign, readonly) YTReelWatchPlaybackOverlayView *playbackOverlay;
|
@property (nonatomic, assign, readonly) YTReelWatchPlaybackOverlayView *playbackOverlay;
|
||||||
|
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTShortsPlayerViewController : UIViewController
|
@interface YTReelPlayerViewController : UIViewController
|
||||||
|
@property (nonatomic, strong, readwrite) YTPlayerViewController *player;
|
||||||
|
- (void)reelContentViewRequestsAdvanceToNextVideo:(id)video;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTShortsPlayerViewController : YTReelPlayerViewController
|
||||||
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTIVideoDetails ()
|
@interface YTPivotBarViewController ()
|
||||||
@property (nonatomic, copy, readwrite) NSString *title;
|
@property (nonatomic, weak, readwrite) YTShortsPlayerViewController *scrubberDelegate;
|
||||||
@property (nonatomic, copy, readwrite) NSString *shortDescription;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface YTPlayerViewController (YTAFS)
|
|
||||||
@property (nonatomic, assign, readonly) YTPlayerResponse *playerResponse;
|
|
||||||
@property (nonatomic, weak, readwrite) UIViewController *parentViewController;
|
|
||||||
@property (readonly, nonatomic) NSString *contentVideoID;
|
|
||||||
- (void)setActiveCaptionTrack:(id)arg1;
|
|
||||||
- (void)shortsToRegular;
|
|
||||||
- (void)autoFullscreen;
|
|
||||||
- (void)turnOffCaptions;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface YTPlayerView : UIView
|
|
||||||
@property (nonatomic, weak, readwrite) YTPlayerViewController *playerViewDelegate;
|
|
||||||
- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture;
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTEngagementPanelIdentifier : NSObject
|
@interface YTEngagementPanelIdentifier : NSObject
|
||||||
@@ -250,7 +212,7 @@ int kPivotIndex;
|
|||||||
- (void)didTapCopyInfoButton:(UIButton *)sender;
|
- (void)didTapCopyInfoButton:(UIButton *)sender;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTSegmentableInlinePlayerBarView
|
@interface YTSegmentableInlinePlayerBarView : UIView
|
||||||
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -258,7 +220,7 @@ int kPivotIndex;
|
|||||||
- (void)confirmAlertDidPressConfirm;
|
- (void)confirmAlertDidPressConfirm;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTReelPlayerButton : UIButton
|
@interface YTReelPlayerButton : YTQTMButton
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface ELMCellNode
|
@interface ELMCellNode
|
||||||
@@ -272,12 +234,6 @@ int kPivotIndex;
|
|||||||
- (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath;
|
- (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// @interface YTReelWatchPlaybackOverlayView : UIView
|
|
||||||
// @end
|
|
||||||
|
|
||||||
// @interface YTReelWatchHeaderView : UIView
|
|
||||||
// @end
|
|
||||||
|
|
||||||
@interface YTReelTransparentStackView : UIStackView
|
@interface YTReelTransparentStackView : UIStackView
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -288,15 +244,16 @@ int kPivotIndex;
|
|||||||
@property (atomic, assign, readonly) NSMutableArray *allObjects;
|
@property (atomic, assign, readonly) NSMutableArray *allObjects;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface ASDisplayNode : NSObject
|
@interface ASDisplayNode ()
|
||||||
@property (nonatomic, assign, readonly) UIViewController *closestViewController;
|
@property (nonatomic, assign, readonly) UIViewController *closestViewController;
|
||||||
@property (atomic, assign, readonly) ASNodeAncestryEnumerator *supernodes;
|
@property (atomic, assign, readonly) ASNodeAncestryEnumerator *supernodes;
|
||||||
@property (atomic, copy, readwrite) NSArray *yogaChildren;
|
// @property (atomic, copy, readwrite) NSArray *yogaChildren;
|
||||||
@property (atomic) CALayer *layer;
|
@property (atomic) CALayer *layer;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface ELMContainerNode : ASDisplayNode
|
@interface ELMContainerNode : ASDisplayNode
|
||||||
@property (nonatomic, strong, readwrite) NSString *copiedComment;
|
@property (nonatomic, strong, readwrite) NSString *copiedComment;
|
||||||
|
@property (nonatomic, strong, readwrite) NSURL *copiedURL;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface ELMExpandableTextNode : ASDisplayNode
|
@interface ELMExpandableTextNode : ASDisplayNode
|
||||||
@@ -307,6 +264,9 @@ int kPivotIndex;
|
|||||||
@property (atomic, copy, readwrite) NSURL *URL;
|
@property (atomic, copy, readwrite) NSURL *URL;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface YTImageZoomNode : ASNetworkImageNode
|
||||||
|
@end
|
||||||
|
|
||||||
@interface ASTextNode : ASDisplayNode
|
@interface ASTextNode : ASDisplayNode
|
||||||
@property (atomic, copy, readwrite) NSAttributedString *attributedText;
|
@property (atomic, copy, readwrite) NSAttributedString *attributedText;
|
||||||
@end
|
@end
|
||||||
@@ -314,29 +274,77 @@ int kPivotIndex;
|
|||||||
@interface _ASDisplayView : UIView
|
@interface _ASDisplayView : UIView
|
||||||
@property (nonatomic, strong, readwrite) ASDisplayNode *keepalive_node;
|
@property (nonatomic, strong, readwrite) ASDisplayNode *keepalive_node;
|
||||||
- (void)postManager:(UILongPressGestureRecognizer *)sender;
|
- (void)postManager:(UILongPressGestureRecognizer *)sender;
|
||||||
- (void)saveImage:(UILongPressGestureRecognizer *)sender;
|
|
||||||
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
|
- (void)savePFP:(UILongPressGestureRecognizer *)sender;
|
||||||
- (void)copyComment:(UILongPressGestureRecognizer *)sender;
|
- (void)commentManager:(UILongPressGestureRecognizer *)sender;
|
||||||
@end
|
|
||||||
|
|
||||||
@interface MLHAMQueuePlayer : NSObject
|
|
||||||
@property id playerEventCenter;
|
|
||||||
-(void)setRate:(float)rate;
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTVarispeedSwitchControllerOption : NSObject
|
@interface YTVarispeedSwitchControllerOption : NSObject
|
||||||
- (id)initWithTitle:(id)title rate:(float)rate;
|
- (id)initWithTitle:(NSString *)title rate:(float)rate;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface HAMPlayerInternal : NSObject
|
@interface YTVarispeedSwitchController : NSObject
|
||||||
- (void)setRate:(float)rate;
|
- (void)addActionForOption:(YTVarispeedSwitchControllerOption *)option;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface MLPlayerEventCenter : NSObject
|
@interface YTLabel : UILabel
|
||||||
- (void)broadcastRateChange:(float)rate;
|
- (void)setFontAttributes:(id)attributes text:(NSString *)text;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTInlinePlayerScrubUserEducationView : UIView
|
||||||
|
@property (nonatomic, assign, readwrite) NSUInteger labelType;
|
||||||
|
- (YTLabel *)userEducationLabel;
|
||||||
|
- (void)setVisible:(BOOL)visible;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
||||||
|
@property (nonatomic, weak, readwrite) YTPlayerViewController *parentViewController;
|
||||||
|
- (CGFloat)currentPlaybackRate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTInlinePlayerBarContainerView : UIView
|
||||||
|
@property (nonatomic, strong, readwrite) YTLabel *durationLabel;
|
||||||
|
@property (nonatomic, strong, readwrite) NSString *endTimeString;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTMainAppVideoPlayerOverlayView : UIView
|
||||||
|
@property (nonatomic, assign, readonly) YTInlinePlayerScrubUserEducationView *scrubUserEducationView;
|
||||||
|
@property (nonatomic, strong, readwrite) YTInlinePlayerBarContainerView *playerBar;
|
||||||
|
@property (nonatomic, weak, readwrite) YTMainAppVideoPlayerOverlayViewController *delegate;
|
||||||
|
- (void)speedmasterYtLite:(UILongPressGestureRecognizer *)sender;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTMainAppVideoPlayerOverlayViewController ()
|
||||||
|
@property (nonatomic, assign, readonly) YTMainAppVideoPlayerOverlayView * videoPlayerOverlayView;
|
||||||
@property (readonly, nonatomic) CGFloat mediaTime;
|
@property (readonly, nonatomic) CGFloat mediaTime;
|
||||||
@property (readonly, nonatomic) NSString *videoID;
|
@property (readonly, nonatomic) NSString *videoID;
|
||||||
|
- (void)setPlaybackRate:(CGFloat)rate;
|
||||||
|
- (CGFloat)currentPlaybackRate;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTSpeedmasterController : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTFormattedStringLabel : UILabel
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTActionSheetHeaderView : UIView
|
||||||
|
- (void)showHeaderDivider;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTActionSheetAction : NSObject
|
||||||
|
+ (instancetype)actionWithTitle:(NSString *)title iconImage:(UIImage *)image style:(NSInteger)style handler:(void (^)(void))handler;
|
||||||
|
+ (instancetype)actionWithTitle:(NSString *)title iconImage:(UIImage *)image secondaryIconImage:(UIImage *)secondaryIconImage accessibilityIdentifier:(NSString *)identifier handler:(void (^)(void))handler;
|
||||||
|
+ (instancetype)actionWithTitle:(NSString *)title titleColor:(UIColor *)titleColor iconImage:(UIImage *)image iconColor:(UIColor *)iconColor disableAutomaticButtonColor:(BOOL)autoColor accessibilityIdentifier:(NSString *)identifier handler:(void (^)(void))handler;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTDefaultSheetController : NSObject
|
||||||
|
- (void)addAction:(YTActionSheetAction *)action;
|
||||||
|
- (void)presentFromView:(UIView *)view animated:(BOOL)animated completion:(void(^)(void))completion;
|
||||||
|
- (void)presentFromViewController:(UIViewController *)vc animated:(BOOL)animated completion:(void(^)(void))completion;
|
||||||
|
- (void)dismissViewControllerAnimated:(BOOL)animated completion:(void(^)(void))completion;
|
||||||
|
|
||||||
|
+ (instancetype)sheetControllerWithParentResponder:(id)parentResponder;
|
||||||
|
+ (instancetype)sheetControllerWithParentResponder:(id)parentResponder forcedSheetStyle:(NSInteger)style;
|
||||||
|
+ (instancetype)sheetControllerWithMessage:(NSString *)message delegate:(id)delegate parentResponder:(id)parentResponder;
|
||||||
|
+ (instancetype)sheetControllerWithMessage:(NSString *)message subMessage:(NSString *)subMessage delegate:(id)delegate parentResponder:(id)parentResponder;
|
||||||
@end
|
@end
|
||||||
+126
@@ -0,0 +1,126 @@
|
|||||||
|
/* YouTube Native Share - An iOS Tweak to replace YouTube's share sheet and remove source identifiers.
|
||||||
|
* Copyright (C) 2024 YouTube Native Share Contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Source code can be found here: https://github.com/jkhsjdhjs/youtube-native-share (Thanks to @jkhsjdhjs)
|
||||||
|
|
||||||
|
#include <UIKit/UIActivityViewController.h>
|
||||||
|
|
||||||
|
#import "../YouTubeHeader/YTUIUtils.h"
|
||||||
|
|
||||||
|
#import "../protobuf/objectivec/GPBDescriptor.h"
|
||||||
|
#import "../protobuf/objectivec/GPBMessage.h"
|
||||||
|
#import "../protobuf/objectivec/GPBUnknownField.h"
|
||||||
|
#import "../protobuf/objectivec/GPBUnknownFieldSet.h"
|
||||||
|
|
||||||
|
#define ytlBool(key) [[[NSUserDefaults alloc] initWithSuiteName:@"com.dvntm.ytlite"] boolForKey:key]
|
||||||
|
|
||||||
|
@interface CustomGPBMessage : GPBMessage
|
||||||
|
+ (instancetype)deserializeFromString:(NSString *)string;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTICommand : GPBMessage
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ELMPBCommand : GPBMessage
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ELMPBShowActionSheetCommand : GPBMessage
|
||||||
|
@property (nonatomic, strong, readwrite) ELMPBCommand *onAppear;
|
||||||
|
@property (nonatomic, assign, readwrite) BOOL hasOnAppear;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTIUpdateShareSheetCommand
|
||||||
|
@property (nonatomic, assign, readwrite) BOOL hasSerializedShareEntity;
|
||||||
|
@property (nonatomic, copy, readwrite) NSString *serializedShareEntity;
|
||||||
|
+ (GPBExtensionDescriptor*)updateShareSheetCommand;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTIInnertubeCommandExtensionRoot
|
||||||
|
+ (GPBExtensionDescriptor*)innertubeCommand;
|
||||||
|
@end
|
||||||
|
|
||||||
|
typedef NS_ENUM(NSInteger, ShareEntityType) {
|
||||||
|
ShareEntityFieldVideo = 1,
|
||||||
|
ShareEntityFieldPlaylist = 2,
|
||||||
|
ShareEntityFieldChannel = 3,
|
||||||
|
ShareEntityFieldClip = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline NSString* extractIdWithFormat(GPBUnknownFieldSet *fields, NSInteger fieldNumber, NSString *format) {
|
||||||
|
if (![fields hasField:fieldNumber])
|
||||||
|
return nil;
|
||||||
|
GPBUnknownField *idField = [fields getField:fieldNumber];
|
||||||
|
if ([idField.lengthDelimitedList count] != 1)
|
||||||
|
return nil;
|
||||||
|
NSString *id = [[NSString alloc] initWithData:[idField.lengthDelimitedList firstObject] encoding:NSUTF8StringEncoding];
|
||||||
|
return [NSString stringWithFormat:format, id];
|
||||||
|
}
|
||||||
|
|
||||||
|
%hook ELMPBShowActionSheetCommand
|
||||||
|
- (void)executeWithCommandContext:(id)_context handler:(id)_handler {
|
||||||
|
if (!ytlBool(@"nativeShare"))
|
||||||
|
return %orig;
|
||||||
|
|
||||||
|
if (!self.hasOnAppear)
|
||||||
|
return %orig;
|
||||||
|
GPBExtensionDescriptor *innertubeCommandDescriptor = [%c(YTIInnertubeCommandExtensionRoot) innertubeCommand];
|
||||||
|
if (![self.onAppear hasExtension:innertubeCommandDescriptor])
|
||||||
|
return %orig;
|
||||||
|
YTICommand *innertubeCommand = [self.onAppear getExtension:innertubeCommandDescriptor];
|
||||||
|
GPBExtensionDescriptor *updateShareSheetCommandDescriptor = [%c(YTIUpdateShareSheetCommand) updateShareSheetCommand];
|
||||||
|
if(![innertubeCommand hasExtension:updateShareSheetCommandDescriptor])
|
||||||
|
return %orig;
|
||||||
|
YTIUpdateShareSheetCommand *updateShareSheetCommand = [innertubeCommand getExtension:updateShareSheetCommandDescriptor];
|
||||||
|
if (!updateShareSheetCommand.hasSerializedShareEntity)
|
||||||
|
return %orig;
|
||||||
|
|
||||||
|
GPBMessage *shareEntity = [%c(GPBMessage) deserializeFromString:updateShareSheetCommand.serializedShareEntity];
|
||||||
|
GPBUnknownFieldSet *fields = shareEntity.unknownFields;
|
||||||
|
NSString *shareUrl;
|
||||||
|
|
||||||
|
if ([fields hasField:ShareEntityFieldClip]) {
|
||||||
|
GPBUnknownField *shareEntityClip = [fields getField:ShareEntityFieldClip];
|
||||||
|
if ([shareEntityClip.lengthDelimitedList count] != 1)
|
||||||
|
return %orig;
|
||||||
|
GPBMessage *clipMessage = [%c(GPBMessage) parseFromData:[shareEntityClip.lengthDelimitedList firstObject] error:nil];
|
||||||
|
shareUrl = extractIdWithFormat(clipMessage.unknownFields, 1, @"https://youtube.com/clip/%@");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shareUrl)
|
||||||
|
shareUrl = extractIdWithFormat(fields, ShareEntityFieldChannel, @"https://youtube.com/channel/%@");
|
||||||
|
|
||||||
|
if (!shareUrl) {
|
||||||
|
shareUrl = extractIdWithFormat(fields, ShareEntityFieldPlaylist, @"%@");
|
||||||
|
if (shareUrl) {
|
||||||
|
if (![shareUrl hasPrefix:@"PL"] && ![shareUrl hasPrefix:@"FL"])
|
||||||
|
shareUrl = [shareUrl stringByAppendingString:@"&playnext=1"];
|
||||||
|
shareUrl = [@"https://youtube.com/playlist?list=" stringByAppendingString:shareUrl];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shareUrl)
|
||||||
|
shareUrl = extractIdWithFormat(fields, ShareEntityFieldVideo, @"https://youtube.com/watch?v=%@");
|
||||||
|
|
||||||
|
if (!shareUrl)
|
||||||
|
return %orig;
|
||||||
|
|
||||||
|
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]initWithActivityItems:@[shareUrl] applicationActivities:nil];
|
||||||
|
[[%c(YTUIUtils) topViewControllerForPresenting] presentViewController:activityViewController animated:YES completion:^{}];
|
||||||
|
}
|
||||||
|
%end
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#import "../YouTubeHeader/YTAlertView.h"
|
||||||
|
#import "../YouTubeHeader/YTIGuideResponse.h"
|
||||||
|
#import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
|
||||||
|
#import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h"
|
||||||
|
#import "../YouTubeHeader/YTIPivotBarRenderer.h"
|
||||||
|
#import "../YouTubeHeader/YTIBrowseRequest.h"
|
||||||
|
#import "../YouTubeHeader/YTISectionListRenderer.h"
|
||||||
|
#import "../YouTubeHeader/YTQTMButton.h"
|
||||||
|
#import "../YouTubeHeader/YTIButtonRenderer.h"
|
||||||
|
#import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
||||||
|
#import "../YouTubeHeader/YTWatchController.h"
|
||||||
|
#import "../YouTubeHeader/YTPlayerOverlay.h"
|
||||||
|
#import "../YouTubeHeader/YTPlayerOverlayProvider.h"
|
||||||
|
#import "../YouTubeHeader/YTSettingsViewController.h"
|
||||||
|
#import "../YouTubeHeader/YTSettingsSectionItem.h"
|
||||||
|
#import "../YouTubeHeader/YTSettingsSectionItemManager.h"
|
||||||
|
#import "../YouTubeHeader/YTSettingsPickerViewController.h"
|
||||||
|
#import "../YouTubeHeader/YTUIUtils.h"
|
||||||
|
#import "../YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h"
|
||||||
|
#import "../YouTubeHeader/YTToastResponderEvent.h"
|
||||||
|
#import "../YouTubeHeader/YTPageStyleController.h"
|
||||||
|
#import "../YouTubeHeader/ASCollectionElement.h"
|
||||||
|
#import "../YouTubeHeader/ASCollectionView.h"
|
||||||
|
#import "../YouTubeHeader/ELMNodeController.h"
|
||||||
@@ -7,3 +7,5 @@ Description: Lightweight YouTube Enhancer
|
|||||||
Maintainer: dvntm
|
Maintainer: dvntm
|
||||||
Author: dvntm
|
Author: dvntm
|
||||||
Section: Tweaks
|
Section: Tweaks
|
||||||
|
Icon: https://raw.githubusercontent.com/dayanch96/icons/main/ytlite.png
|
||||||
|
SileoDepiction: https://raw.githubusercontent.com/dayanch96/icons/main/ytlite.json
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 6.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
@@ -19,6 +19,8 @@
|
|||||||
"NoSubbarDesc" = "Hides Subbar (All, New to you, Live etc.) under the Navigation bar.";
|
"NoSubbarDesc" = "Hides Subbar (All, New to you, Live etc.) under the Navigation bar.";
|
||||||
"NoYTLogo" = "Remove YouTube logo";
|
"NoYTLogo" = "Remove YouTube logo";
|
||||||
"NoYTLogoDesc" = "Removes YouTube logo in the Navigation bar.";
|
"NoYTLogoDesc" = "Removes YouTube logo in the Navigation bar.";
|
||||||
|
"PremiumYTLogo" = "Set Premium YouTube logo";
|
||||||
|
"PremiumYTLogoDesc" = "Sets Premium YouTube logo in the Navigation bar.";
|
||||||
|
|
||||||
"Overlay" = "Overlay";
|
"Overlay" = "Overlay";
|
||||||
"HideAutoplay" = "Hide Autoplay switch";
|
"HideAutoplay" = "Hide Autoplay switch";
|
||||||
@@ -39,12 +41,18 @@
|
|||||||
"NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode.";
|
"NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode.";
|
||||||
"PersistentProgressBar" = "Persistent progress bar";
|
"PersistentProgressBar" = "Persistent progress bar";
|
||||||
"PersistentProgressBarDesc" = "Always shows progress bar in the player.";
|
"PersistentProgressBarDesc" = "Always shows progress bar in the player.";
|
||||||
|
"StockVolumeHUD" = "Stock volume HUD";
|
||||||
|
"StockVolumeHUDDesc" = "Displays system volume HUD in fullscreen.";
|
||||||
"NoRelatedVids" = "No related videos in overlay";
|
"NoRelatedVids" = "No related videos in overlay";
|
||||||
"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up.";
|
"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up.";
|
||||||
"NoPromotionCards" = "Hide Paid Promotion cards";
|
"NoPromotionCards" = "Hide Paid Promotion cards";
|
||||||
"NoPromotionCardsDesc" = "Hides \"Includes Paid Promotions\" card in promotions included videos.";
|
"NoPromotionCardsDesc" = "Hides \"Includes Paid Promotions\" card in promotions included videos.";
|
||||||
"NoWatermarks" = "Hide Watermarks";
|
"NoWatermarks" = "Hide Watermarks";
|
||||||
"NoWatermarksDesc" = "Hides channel watermarks from the player.";
|
"NoWatermarksDesc" = "Hides channel watermarks from the player.";
|
||||||
|
"VideoEndTime" = "Show playback end time";
|
||||||
|
"VideoEndTimeDesc" = "Adds video playback end time to the player bar.";
|
||||||
|
"24hrFormat" = "24-hour format";
|
||||||
|
"24hrFormatDesc" = "Shows end time in 24-hour format.";
|
||||||
|
|
||||||
"Player" = "Player";
|
"Player" = "Player";
|
||||||
"Miniplayer" = "Enable mini player";
|
"Miniplayer" = "Enable mini player";
|
||||||
@@ -53,7 +61,7 @@
|
|||||||
"PortraitFullscreenDesc" = "Enables portrait fullscreen mode support.";
|
"PortraitFullscreenDesc" = "Enables portrait fullscreen mode support.";
|
||||||
"CopyWithTimestamp" = "Copy timestamped links";
|
"CopyWithTimestamp" = "Copy timestamped links";
|
||||||
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
"CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button.";
|
||||||
"DisableAutoplay" = "Disable Autoplay videos";
|
"DisableAutoplay" = "Disable autoplay videos";
|
||||||
"DisableAutoplayDesc" = "Prevents video playback after opening.";
|
"DisableAutoplayDesc" = "Prevents video playback after opening.";
|
||||||
"DisableAutoCaptions" = "Disable auto captions";
|
"DisableAutoCaptions" = "Disable auto captions";
|
||||||
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
|
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
|
||||||
@@ -65,8 +73,18 @@
|
|||||||
"ExtraSpeedOptionsDesc" = "Adds more video playback speed options to the player menu.";
|
"ExtraSpeedOptionsDesc" = "Adds more video playback speed options to the player menu.";
|
||||||
"DontSnap2Chapter" = "Disable snap to chapter";
|
"DontSnap2Chapter" = "Disable snap to chapter";
|
||||||
"DontSnap2ChapterDesc" = "Disables skipping to the next episode by double-tap gesture.";
|
"DontSnap2ChapterDesc" = "Disables skipping to the next episode by double-tap gesture.";
|
||||||
|
"NoTwoFingerSnapToChapter" = "Disable two finger double tap";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "Disables two finger double tap snap to chapter gesture.";
|
||||||
|
"PauseOnOverlay" = "Pause on overlay";
|
||||||
|
"PauseOnOverlayDesc" = "Sets playback on pause if overlay appears.";
|
||||||
"RedProgressBar" = "Red progress bar";
|
"RedProgressBar" = "Red progress bar";
|
||||||
"RedProgressBarDesc" = "Brings back red progress bar.";
|
"RedProgressBarDesc" = "Brings back red progress bar.";
|
||||||
|
"NoPlayerRemixButton" = "Remove remix button";
|
||||||
|
"NoPlayerRemixButtonDesc" = "Removes remix button under the player.";
|
||||||
|
"NoPlayerClipButton" = "Remove clip button";
|
||||||
|
"NoPlayerClipButtonDesc" = "Removes clip button under the player.";
|
||||||
|
"NoPlayerDownloadButton" = "Remove download button";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "Removes download button under the player.";
|
||||||
"NoHints" = "Disable hints";
|
"NoHints" = "Disable hints";
|
||||||
"NoHintsDesc" = "Disables hints by author which appears at the top-right corner during playback.";
|
"NoHintsDesc" = "Disables hints by author which appears at the top-right corner during playback.";
|
||||||
"NoFreeZoom" = "Disable free zoom gesture";
|
"NoFreeZoom" = "Disable free zoom gesture";
|
||||||
@@ -94,11 +112,13 @@
|
|||||||
"HideUploadButton" = "Hide Upload button";
|
"HideUploadButton" = "Hide Upload button";
|
||||||
"HideUploadButtonDesc" = "Hides Upload button from the Tab bar.";
|
"HideUploadButtonDesc" = "Hides Upload button from the Tab bar.";
|
||||||
"HideLibraryTab" = "Hide Library tab";
|
"HideLibraryTab" = "Hide Library tab";
|
||||||
"HideLibraryTabDesc" = "Hides Library tab from the Tab bar.";
|
"HideLibraryTabDesc" = "Hides Library tab from the Tab bar.\n\nThis tab can be restored by long pressing Home tab.";
|
||||||
|
|
||||||
"Shorts" = "Shorts";
|
"Shorts" = "Shorts";
|
||||||
"ShortsOnlyMode" = "Shorts Only Mode";
|
"ShortsOnlyMode" = "Shorts Only Mode";
|
||||||
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
|
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
|
||||||
|
"AutoSkipShorts" = "Auto-skip Shorts";
|
||||||
|
"AutoSkipShortsDesc" = "Moves to the next video when the current video playback finishes.";
|
||||||
"HideShorts" = "Hide Shorts videos";
|
"HideShorts" = "Hide Shorts videos";
|
||||||
"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)";
|
"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)";
|
||||||
"ShortsProgress" = "Enable progress bar";
|
"ShortsProgress" = "Enable progress bar";
|
||||||
@@ -147,16 +167,30 @@
|
|||||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "Save post information";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
||||||
"SavePostImage" = "Save image from community posts";
|
|
||||||
"SavePostImageDesc" = "Saves community post image to the Photos app by long tap.";
|
|
||||||
"SaveProfilePhoto" = "Save profile picture";
|
"SaveProfilePhoto" = "Save profile picture";
|
||||||
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
||||||
"CopyCommentText" = "Copy comments text";
|
"CommentManager" = "Save comment information";
|
||||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
"CommentManagerDesc" = "Allows to copy comment text and save comment as image by long tap.";
|
||||||
"FixAlbums" = "Fix covers";
|
"FixAlbums" = "Fix covers";
|
||||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
||||||
|
"NativeShare" = "Native share sheet";
|
||||||
|
"NativeShareDesc" = "Uses system share sheet to share media";
|
||||||
"RemovePlayNext" = "Remove \"Play next in queue\"";
|
"RemovePlayNext" = "Remove \"Play next in queue\"";
|
||||||
"RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu.";
|
"RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu.";
|
||||||
|
"RemoveDownloadMenu" = "Remove \"Download\"";
|
||||||
|
"RemoveDownloadMenuDesc" = "Removes \"Download\" option from menu.";
|
||||||
|
"RemoveWatchLaterMenu" = "Remove \"Save to Watch Later\"";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "Removes \"Save to Watch Later\" option from menu.";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "Remove \"Save to playlist\"";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "Removes \"Save to playlist\" option from menu.";
|
||||||
|
"RemoveShareMenu" = "Remove \"Share\"";
|
||||||
|
"RemoveShareMenuDesc" = "Removes \"Share\" option from menu.";
|
||||||
|
"RemoveNotInterestedMenu" = "Remove \"Not interested\"";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "Removes \"Not interested\" option from menu.";
|
||||||
|
"RemoveDontRecommendMenu" = "Remove \"Don't recommend channel\"";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "Removes \"Don't recommend channel\" option from menu.";
|
||||||
|
"RemoveReportMenu" = "Remove \"Report\"";
|
||||||
|
"RemoveReportMenuDesc" = "Removes \"Report\" option from menu.";
|
||||||
"NoContinueWatching" = "Remove \"Continue watching\"";
|
"NoContinueWatching" = "Remove \"Continue watching\"";
|
||||||
"NoContinueWatchingDesc" = "Removes the \"Continue watching\" section containing unfinished videos from the Home page.";
|
"NoContinueWatchingDesc" = "Removes the \"Continue watching\" section containing unfinished videos from the Home page.";
|
||||||
"NoSearchHistory" = "Hide search history";
|
"NoSearchHistory" = "Hide search history";
|
||||||
@@ -172,6 +206,19 @@
|
|||||||
"DisableRTL" = "Disable RTL formatting";
|
"DisableRTL" = "Disable RTL formatting";
|
||||||
"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL).";
|
"DisableRTLDesc" = "Forcefully displays text in left-to-right (LTR) format for languages that are initially displayed in right-to-left (RTL).";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "Hold to speed";
|
||||||
|
"Disable" = "Disable";
|
||||||
|
"Disabled" = "Disabled";
|
||||||
|
"PlaybackSpeed" = "Playback Speed";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "Default playback rate";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "Playback quality on WiFi";
|
||||||
|
"PlaybackQualityOnCellular" = "Playback quality on Cellular";
|
||||||
|
"SelectQuality" = "Select Quality";
|
||||||
|
"Default" = "Default";
|
||||||
|
"Best" = "Best";
|
||||||
|
|
||||||
"Startup" = "Startup page";
|
"Startup" = "Startup page";
|
||||||
"Home" = "Home";
|
"Home" = "Home";
|
||||||
"Explore" = "Explore";
|
"Explore" = "Explore";
|
||||||
@@ -181,12 +228,15 @@
|
|||||||
"Warning" = "Warning";
|
"Warning" = "Warning";
|
||||||
"TabIsHidden" = "Hidden tab cannot be selected as startup page";
|
"TabIsHidden" = "Hidden tab cannot be selected as startup page";
|
||||||
|
|
||||||
"DonateViaPayPal" = "Donate via PayPal";
|
"SupportDevelopment" = "Support development";
|
||||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
"SupportDevelopmentDesc" = "If you like YTLite and would like to support its development, you can do it using any of convenient ways below.\nThanks❤";
|
||||||
|
"Contributors" = "Contributors";
|
||||||
|
"OpenSourceLibs" = "Open Source Libraries";
|
||||||
"Version" = "Version";
|
"Version" = "Version";
|
||||||
"About" = "About";
|
"About" = "About";
|
||||||
"Credits" = "Credits";
|
"Credits" = "Credits";
|
||||||
"Developer" = "YTLite developer";
|
"Developer" = "YTLite developer";
|
||||||
|
"SpecialThanks" = "Special thanks";
|
||||||
"ChineseSimplified" = "Chinese (Simplified) localization";
|
"ChineseSimplified" = "Chinese (Simplified) localization";
|
||||||
"ChineseTraditional" = "Chinese (Traditional) localization";
|
"ChineseTraditional" = "Chinese (Traditional) localization";
|
||||||
"French" = "French localization";
|
"French" = "French localization";
|
||||||
@@ -194,12 +244,15 @@
|
|||||||
"Japanese" = "Japanese localization";
|
"Japanese" = "Japanese localization";
|
||||||
"Vietnamese" = "Vietnamese localization";
|
"Vietnamese" = "Vietnamese localization";
|
||||||
"Advanced" = "Advanced mode";
|
"Advanced" = "Advanced mode";
|
||||||
|
"AdvancedDesc" = "More customizable mode";
|
||||||
"AdvancedModeReminder" = "Would you like to activate Advanced mode for YTLite?\n\nThis mode provides more than 50 additional options to customize and optimize your YouTube experience. You can enable/disable it later from Settings → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "Would you like to activate Advanced mode for YTLite?\n\nThis mode provides more than 50 additional options to customize and optimize your YouTube experience. You can enable/disable it later from Settings → %@ → %@ → %@.";
|
||||||
"ClearCache" = "Clear cache";
|
"ClearCache" = "Clear cache";
|
||||||
"ResetSettings" = "Reset YTLite settings";
|
"ResetSettings" = "Reset YTLite settings";
|
||||||
"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?";
|
"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?";
|
||||||
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
|
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
|
||||||
"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off";
|
"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off";
|
||||||
|
"LibraryAdded" = "The You/Library tab has been restored";
|
||||||
|
"LibraryRemoved" = "The You/Library tab has been removed";
|
||||||
"Yes" = "Yes";
|
"Yes" = "Yes";
|
||||||
"No" = "No";
|
"No" = "No";
|
||||||
|
|
||||||
@@ -207,8 +260,15 @@
|
|||||||
"CopyTitle" = "Copy title";
|
"CopyTitle" = "Copy title";
|
||||||
"CopyDescription" = "Copy description";
|
"CopyDescription" = "Copy description";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "Copy post text";
|
||||||
|
"SaveCurrentImage" = "Save current image";
|
||||||
|
"CopyCurrentImage" = "Copy current image";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SavePostAsImage" = "Save post as image";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyPostAsImage" = "Copy post as image";
|
||||||
|
"CopyCommentText" = "Copy comment text";
|
||||||
|
"SaveCommentAsImage" = "Save comment as image";
|
||||||
|
"CopyCommentAsImage" = "Copy comment as image";
|
||||||
|
"SaveProfilePicture" = "Save profile picture";
|
||||||
|
"CopyProfilePicture" = "Copy profile picture";
|
||||||
"Cancel" = "Cancel";
|
"Cancel" = "Cancel";
|
||||||
"Copied" = "Copied to clipboard";
|
"Copied" = "Copied to clipboard";
|
||||||
"Saved" = "Saved to Photos";
|
"Saved" = "Saved to Photos";
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
"BackgroundPlaybackDesc" = "Permite la reproducción en segundo plano.";
|
"BackgroundPlaybackDesc" = "Permite la reproducción en segundo plano.";
|
||||||
|
|
||||||
"Navbar" = "Barra de navegación";
|
"Navbar" = "Barra de navegación";
|
||||||
"RemoveCast" = "Ocultar botón de Cast";
|
"RemoveCast" = "Ocultar botón Emitir";
|
||||||
"RemoveCastDesc" = "Oculta el botón de Cast de la barra de navegación.";
|
"RemoveCastDesc" = "Oculta el botón Emitir de la barra de navegación.";
|
||||||
"RemoveNotifications" = "Ocultar botón de Notificaciones";
|
"RemoveNotifications" = "Ocultar botón de Notificaciones";
|
||||||
"RemoveNotificationsDesc" = "Oculta el botón de Notificaciones de la barra de navegación.";
|
"RemoveNotificationsDesc" = "Oculta el botón de Notificaciones de la barra de navegación.";
|
||||||
"RemoveSearch" = "Ocultar botón de Búsqueda";
|
"RemoveSearch" = "Ocultar botón de Búsqueda";
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
"NoSubbarDesc" = "Oculta la subbarra (Todo, Novedades para ti, En directo, etc.) debajo de la barra de navegación.";
|
"NoSubbarDesc" = "Oculta la subbarra (Todo, Novedades para ti, En directo, etc.) debajo de la barra de navegación.";
|
||||||
"NoYTLogo" = "Eliminar el logo de YouTube";
|
"NoYTLogo" = "Eliminar el logo de YouTube";
|
||||||
"NoYTLogoDesc" = "Elimina el logo de YouTube de la barra de navegación.";
|
"NoYTLogoDesc" = "Elimina el logo de YouTube de la barra de navegación.";
|
||||||
|
"PremiumYTLogo" = "Establece el logotipo Premium de YouTube";
|
||||||
|
"PremiumYTLogoDesc" = "Establece el logotipo de YouTube Premium en la barra de navegación.";
|
||||||
|
|
||||||
"Overlay" = "Superposición";
|
"Overlay" = "Superposición";
|
||||||
"HideAutoplay" = "Ocultar interruptor de reproducción automática";
|
"HideAutoplay" = "Ocultar interruptor de reproducción automática";
|
||||||
@@ -39,12 +41,18 @@
|
|||||||
"NoFullscreenActionsDesc" = "Desactiva el panel de acciones en el modo de pantalla completa.";
|
"NoFullscreenActionsDesc" = "Desactiva el panel de acciones en el modo de pantalla completa.";
|
||||||
"PersistentProgressBar" = "Barra de progreso persistente";
|
"PersistentProgressBar" = "Barra de progreso persistente";
|
||||||
"PersistentProgressBarDesc" = "Muestra siempre la barra de progreso en el reproductor.";
|
"PersistentProgressBarDesc" = "Muestra siempre la barra de progreso en el reproductor.";
|
||||||
|
"StockVolumeHUD" = "HUD de volumen del sistema";
|
||||||
|
"StockVolumeHUDDesc" = "Muestra el HUD de volumen del sistema a pantalla completa.";
|
||||||
"NoRelatedVids" = "Sin vídeos relacionados en la superposición";
|
"NoRelatedVids" = "Sin vídeos relacionados en la superposición";
|
||||||
"NoRelatedVidsDesc" = "Elimina los vídeos relacionados que se muestran en la superposición al deslizar hacia arriba.";
|
"NoRelatedVidsDesc" = "Elimina los vídeos relacionados que se muestran en la superposición al deslizar hacia arriba.";
|
||||||
"NoPromotionCards" = "Ocultar tarjetas de promoción pagada";
|
"NoPromotionCards" = "Ocultar tarjetas de promoción pagada";
|
||||||
"NoPromotionCardsDesc" = "Oculta la tarjeta \"Incluye promociones pagadas\" en los vídeos que incluyen promociones pagadas.";
|
"NoPromotionCardsDesc" = "Oculta la tarjeta \"Incluye promociones pagadas\" en los vídeos que incluyen promociones pagadas.";
|
||||||
"NoWatermarks" = "Ocultar marcas de agua";
|
"NoWatermarks" = "Ocultar marcas de agua";
|
||||||
"NoWatermarksDesc" = "Oculta las marcas de agua del canal del reproductor.";
|
"NoWatermarksDesc" = "Oculta las marcas de agua del canal del reproductor.";
|
||||||
|
"VideoEndTime" = "Muestra la hora de finalización de la reproducción";
|
||||||
|
"VideoEndTimeDesc" = "Añade la hora final de reproducción del vídeo a la barra del reproductor.";
|
||||||
|
"24hrFormat" = "Formato de 24 horas";
|
||||||
|
"24hrFormatDesc" = "Muestra la hora de finalización en formato de 24 horas.";
|
||||||
|
|
||||||
"Player" = "Reproductor";
|
"Player" = "Reproductor";
|
||||||
"Miniplayer" = "Activar mini reproductor";
|
"Miniplayer" = "Activar mini reproductor";
|
||||||
@@ -65,8 +73,18 @@
|
|||||||
"ExtraSpeedOptionsDesc" = "Agrega más opciones de velocidad de reproducción de vídeo al menú del reproductor.";
|
"ExtraSpeedOptionsDesc" = "Agrega más opciones de velocidad de reproducción de vídeo al menú del reproductor.";
|
||||||
"DontSnap2Chapter" = "Desactivar saltar al siguiente capítulo";
|
"DontSnap2Chapter" = "Desactivar saltar al siguiente capítulo";
|
||||||
"DontSnap2ChapterDesc" = "Desactiva el salto al siguiente episodio mediante el gesto de doble toque.";
|
"DontSnap2ChapterDesc" = "Desactiva el salto al siguiente episodio mediante el gesto de doble toque.";
|
||||||
|
"NoTwoFingerSnapToChapter" = "Desactivar el doble toque con dos dedos";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "Desactiva el gesto de pasar a capítulo con dos dedos.";
|
||||||
|
"PauseOnOverlay" = "Pausa en la superposición";
|
||||||
|
"PauseOnOverlayDesc" = "Establece la reproducción en pausa si aparece la superposición.";
|
||||||
"RedProgressBar" = "Barra de progreso roja";
|
"RedProgressBar" = "Barra de progreso roja";
|
||||||
"RedProgressBarDesc" = "Devuelve la barra de progreso roja.";
|
"RedProgressBarDesc" = "Devuelve la barra de progreso roja.";
|
||||||
|
"NoPlayerRemixButton" = "Elimina el botón Remix";
|
||||||
|
"NoPlayerRemixButtonDesc" = "Quita el botón Remix bajo el reproductor.";
|
||||||
|
"NoPlayerClipButton" = "Elimina el botón de clip";
|
||||||
|
"NoPlayerClipButtonDesc" = "Elimina botón de clip bajo el reproductor.";
|
||||||
|
"NoPlayerDownloadButton" = "Elimina el botón de descarga";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "Elimina el botón de descarga situado bajo el reproductor.";
|
||||||
"NoHints" = "Desactivar sugerencias";
|
"NoHints" = "Desactivar sugerencias";
|
||||||
"NoHintsDesc" = "Desactiva las sugerencias del autor que aparecen en la esquina superior derecha durante la reproducción.";
|
"NoHintsDesc" = "Desactiva las sugerencias del autor que aparecen en la esquina superior derecha durante la reproducción.";
|
||||||
"NoFreeZoom" = "Desactivar gesto de zoom libre";
|
"NoFreeZoom" = "Desactivar gesto de zoom libre";
|
||||||
@@ -94,11 +112,13 @@
|
|||||||
"HideUploadButton" = "Ocultar botón Subir";
|
"HideUploadButton" = "Ocultar botón Subir";
|
||||||
"HideUploadButtonDesc" = "Oculta el botón Subir de la barra de pestañas.";
|
"HideUploadButtonDesc" = "Oculta el botón Subir de la barra de pestañas.";
|
||||||
"HideLibraryTab" = "Ocultar pestaña Biblioteca";
|
"HideLibraryTab" = "Ocultar pestaña Biblioteca";
|
||||||
"HideLibraryTabDesc" = "Oculta la pestaña Biblioteca de la barra de pestañas.";
|
"HideLibraryTabDesc" = "Oculta la pestaña Biblioteca de la barra de pestañas.\n\nEsta pestaña se puede restaurar manteniendo pulsada la pestaña Inicio.";
|
||||||
|
|
||||||
"Shorts" = "Shorts";
|
"Shorts" = "Shorts";
|
||||||
"ShortsOnlyMode" = "Modo sólo Shorts";
|
"ShortsOnlyMode" = "Modo sólo Shorts";
|
||||||
"ShortsOnlyModeDesc" = "Limita la funcionalidad de YouTube únicamente a la visualización de Shorts.";
|
"ShortsOnlyModeDesc" = "Limita la funcionalidad de YouTube únicamente a la visualización de Shorts.";
|
||||||
|
"AutoSkipShorts" = "Salto automático de Shorts";
|
||||||
|
"AutoSkipShortsDesc" = "Pasa al vídeo siguiente cuando finaliza la reproducción del vídeo actual.";
|
||||||
"HideShorts" = "Ocultar vídeos Shorts";
|
"HideShorts" = "Ocultar vídeos Shorts";
|
||||||
"HideShortsDesc" = "Oculta los vídeos Shorts de la página de inicio, Recomendados, etc. (No se aplica al historial de reproducciones)";
|
"HideShortsDesc" = "Oculta los vídeos Shorts de la página de inicio, Recomendados, etc. (No se aplica al historial de reproducciones)";
|
||||||
"ShortsProgress" = "Activar barra de progreso";
|
"ShortsProgress" = "Activar barra de progreso";
|
||||||
@@ -143,20 +163,34 @@
|
|||||||
"HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts.";
|
"HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts.";
|
||||||
|
|
||||||
"Other" = "Otro";
|
"Other" = "Otro";
|
||||||
"CopyVideoInfo" = "Copy video information";
|
"CopyVideoInfo" = "Copiar información de vídeo";
|
||||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
"CopyVideoInfoDesc" = "Añade un botón para copiar el título y la descripción del vídeo en el panel Descripción del vídeo.";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "Guardar información de post";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "Permite copiar el texto de un post y guardarlo como imagen con un toque prolongado.";
|
||||||
"SavePostImage" = "Guardar imagen de las entradas de la comunidad";
|
|
||||||
"SavePostImageDesc" = "Guarda la imagen de las publicaciones de la comunidad en la aplicación Fotos con un toque prolongado";
|
|
||||||
"SaveProfilePhoto" = "Guardar foto de perfil";
|
"SaveProfilePhoto" = "Guardar foto de perfil";
|
||||||
"SaveProfilePhotoDesc" = "Guarda la imagen de perfil en la aplicación Fotos con un toque prolongado";
|
"SaveProfilePhotoDesc" = "Guarda la imagen de perfil en la aplicación Fotos con un toque prolongado";
|
||||||
"CopyCommentText" = "Copy comments text";
|
"CommentManager" = "Guardar información de comentarios";
|
||||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
"CommentManagerDesc" = "Permite copiar el texto del comentario y guardarlo como imagen pulsando prolongadamente.";
|
||||||
"FixAlbums" = "Arreglar portadas";
|
"FixAlbums" = "Arreglar portadas";
|
||||||
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
|
"FixAlbumsDesc" = "Corrige la visualización de portadas para usuarios de Rusia";
|
||||||
|
"NativeShare" = "Hoja de acciones nativas";
|
||||||
|
"NativeShareDesc" = "Utiliza la hoja de uso compartido del sistema para compartir medios";
|
||||||
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
|
"RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\"";
|
||||||
"RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú.";
|
"RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú.";
|
||||||
|
"RemoveDownloadMenu" = "Eliminar \"Descargar\"";
|
||||||
|
"RemoveDownloadMenuDesc" = "Elimina la opción \"Descargar\" del menú.";
|
||||||
|
"RemoveWatchLaterMenu" = "Eliminar \"Guardar para ver más tarde\"";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "Elimina la opción \"Guardar para ver más tarde\" del menú.";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "Eliminar \"Guardar en lista de reproducción\"";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "Elimina la opción \"Guardar en lista de reproducción\" del menú.";
|
||||||
|
"RemoveShareMenu" = "Eliminar \"Compartir\"";
|
||||||
|
"RemoveShareMenuDesc" = "Elimina la opción \"Compartir\" del menú.";
|
||||||
|
"RemoveNotInterestedMenu" = "Eliminar \"No me interesa\"";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "Elimina la opción \"No me interesa\" del menú.";
|
||||||
|
"RemoveDontRecommendMenu" = "Eliminar \"No recomendar canal\"";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "Elimina la opción \"No recomendar canal\" del menú.";
|
||||||
|
"RemoveReportMenu" = "Eliminar \"Reportar\"";
|
||||||
|
"RemoveReportMenuDesc" = "Elimina la opción \"Reportar\" del menú.";
|
||||||
"NoContinueWatching" = "Eliminar \"Continuar viendo\"";
|
"NoContinueWatching" = "Eliminar \"Continuar viendo\"";
|
||||||
"NoContinueWatchingDesc" = "Elimina la sección \"Continuar viendo\" que contiene videos sin terminar de la página de inicio.";
|
"NoContinueWatchingDesc" = "Elimina la sección \"Continuar viendo\" que contiene videos sin terminar de la página de inicio.";
|
||||||
"NoSearchHistory" = "Ocultar el historial de búsqueda";
|
"NoSearchHistory" = "Ocultar el historial de búsqueda";
|
||||||
@@ -172,6 +206,19 @@
|
|||||||
"DisableRTL" = "Desactivar el formato RTL";
|
"DisableRTL" = "Desactivar el formato RTL";
|
||||||
"DisableRTLDesc" = "Muestra forzosamente el texto en formato de izquierda a derecha (LTR) para los idiomas que se muestran inicialmente en formato de derecha a izquierda (RTL).";
|
"DisableRTLDesc" = "Muestra forzosamente el texto en formato de izquierda a derecha (LTR) para los idiomas que se muestran inicialmente en formato de derecha a izquierda (RTL).";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "Mantener para velocidad";
|
||||||
|
"Disable" = "Desactivar";
|
||||||
|
"Disabled" = "Desactivado";
|
||||||
|
"PlaybackSpeed" = "Velocidad de reproducción";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "Velocidad de reproducción predeterminada";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "Calidad de reproducción en WiFi";
|
||||||
|
"PlaybackQualityOnCellular" = "Calidad de reproducción en red móvil";
|
||||||
|
"SelectQuality" = "Seleccionar Calidad";
|
||||||
|
"Default" = "Predeterminado";
|
||||||
|
"Best" = "Mejor";
|
||||||
|
|
||||||
"Startup" = "Página de inicio";
|
"Startup" = "Página de inicio";
|
||||||
"Home" = "Inicio";
|
"Home" = "Inicio";
|
||||||
"Explore" = "Explorar";
|
"Explore" = "Explorar";
|
||||||
@@ -181,36 +228,49 @@
|
|||||||
"Warning" = "Advertencia";
|
"Warning" = "Advertencia";
|
||||||
"TabIsHidden" = "No se puede seleccionar una pestaña oculta como página de inicio";
|
"TabIsHidden" = "No se puede seleccionar una pestaña oculta como página de inicio";
|
||||||
|
|
||||||
"DonateViaPayPal" = "Donate via PayPal";
|
"SupportDevelopment" = "Apoyar el desarrollo";
|
||||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
"SupportDevelopmentDesc" = "Si te gusta YTLite y quieres apoyar su desarrollo, puedes hacerlo utilizando cualquiera de las formas convenientes que se indican a continuación.\n¡Gracias❤!";
|
||||||
|
"Contributors" = "Colaboradores";
|
||||||
|
"OpenSourceLibs" = "Bibliotecas de código abierto";
|
||||||
"Version" = "Versión";
|
"Version" = "Versión";
|
||||||
"About" = "Acerca de";
|
"About" = "Acerca de";
|
||||||
"Credits" = "Créditos";
|
"Credits" = "Créditos";
|
||||||
"Developer" = "Desarrollador de YTLite";
|
"Developer" = "Desarrollador de YTLite";
|
||||||
|
"SpecialThanks" = "Agradecimientos especiales";
|
||||||
"ChineseSimplified" = "Traducción: Chino (Simplificado)";
|
"ChineseSimplified" = "Traducción: Chino (Simplificado)";
|
||||||
"ChineseTraditional" = "Traducción: Chino (Tradicional)";
|
"ChineseTraditional" = "Traducción: Chino (Tradicional)";
|
||||||
"French" = "Traducción: Frances";
|
"French" = "Traducción: Frances";
|
||||||
"Spanish" = "Traducción: Español";
|
"Spanish" = "Traducción: Español";
|
||||||
"Japanese" = "Traducción: Japonés";
|
"Japanese" = "Traducción: Japonés";
|
||||||
"Vietnamese" = "Vietnamese localization";
|
"Vietnamese" = "Traducción: vietnamita";
|
||||||
"Advanced" = "Modo avanzado";
|
"Advanced" = "Modo avanzado";
|
||||||
|
"AdvancedDesc" = "Modo más personalizable";
|
||||||
"AdvancedModeReminder" = "¿Desea activar el modo Avanzado para YTLite?\n\nEste modo ofrece más de 50 opciones adicionales para personalizar y optimizar tu experiencia en YouTube. Puedes activarlo/desactivarlo más tarde desde Ajustes → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "¿Desea activar el modo Avanzado para YTLite?\n\nEste modo ofrece más de 50 opciones adicionales para personalizar y optimizar tu experiencia en YouTube. Puedes activarlo/desactivarlo más tarde desde Ajustes → %@ → %@ → %@.";
|
||||||
"ClearCache" = "Clear cache";
|
"ClearCache" = "Borrar caché";
|
||||||
"ResetSettings" = "Restablecer configuración de YTLite";
|
"ResetSettings" = "Restablecer configuración de YTLite";
|
||||||
"ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?";
|
"ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?";
|
||||||
"ShortsOnlyWarning" = "¿Estás seguro de que quieres activar este modo?\n\nEn este modo, sólo podrás ver Shorts y no podrás hacer nada más.\n\nPuedes desactivar el modo sólo Shorts realizando una pulsación larga con dos dedos en el reproductor de Shorts.";
|
"ShortsOnlyWarning" = "¿Estás seguro de que quieres activar este modo?\n\nEn este modo, sólo podrás ver Shorts y no podrás hacer nada más.\n\nPuedes desactivar el modo sólo Shorts realizando una pulsación larga con dos dedos en el reproductor de Shorts.";
|
||||||
"ShortsModeTurnedOff" = "Se ha desactivado el modo de sólo Shorts";
|
"ShortsModeTurnedOff" = "Se ha desactivado el modo de sólo Shorts";
|
||||||
|
"LibraryAdded" = "Se ha restablecido la pestaña Tú/Biblioteca";
|
||||||
|
"LibraryRemoved" = "Se ha eliminado la pestaña Tú/Biblioteca";
|
||||||
"Yes" = "Sí";
|
"Yes" = "Sí";
|
||||||
"No" = "No";
|
"No" = "No";
|
||||||
|
|
||||||
"SelectAction" = "Select action";
|
"SelectAction" = "Seleccionar acción";
|
||||||
"CopyTitle" = "Copy title";
|
"CopyTitle" = "Copiar título";
|
||||||
"CopyDescription" = "Copy description";
|
"CopyDescription" = "Copiar descripción";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "Copiar texto de la publicación";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SaveCurrentImage" = "Guardar imagen actual";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyCurrentImage" = "Copiar imagen actual";
|
||||||
"Cancel" = "Cancel";
|
"SavePostAsImage" = "Guardar publicación como imagen";
|
||||||
|
"CopyPostAsImage" = "Copiar publicación como imagen";
|
||||||
|
"CopyCommentText" = "Copiar texto del comentario";
|
||||||
|
"SaveCommentAsImage" = "Guardar comentario como imagen";
|
||||||
|
"CopyCommentAsImage" = "Copiar comentario como imagen";
|
||||||
|
"SaveProfilePicture" = "Guardar imagen de perfil";
|
||||||
|
"CopyProfilePicture" = "Copiar imagen de perfil";
|
||||||
|
"Cancel" = "Cancelar";
|
||||||
"Copied" = "Copiado al portapapeles";
|
"Copied" = "Copiado al portapapeles";
|
||||||
"Done" = "Done";
|
"Done" = "Hecho";
|
||||||
"Saved" = "Guardado en Fotos";
|
"Saved" = "Guardado en Fotos";
|
||||||
"Error" = "Error";
|
"Error" = "Error";
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
"NoSubbarDesc" = "Masque la sous-barre (Tous, Nouveautés, En direct, etc.) sous la barre de navigation.";
|
"NoSubbarDesc" = "Masque la sous-barre (Tous, Nouveautés, En direct, etc.) sous la barre de navigation.";
|
||||||
"NoYTLogo" = "Supprimer le logo YouTube";
|
"NoYTLogo" = "Supprimer le logo YouTube";
|
||||||
"NoYTLogoDesc" = "Supprime le logo YouTube dans la barre de navigation.";
|
"NoYTLogoDesc" = "Supprime le logo YouTube dans la barre de navigation.";
|
||||||
|
"PremiumYTLogo" = "Définir le logo Premium YouTube";
|
||||||
|
"PremiumYTLogoDesc" = "Définit le logo Premium YouTube dans la barre de navigation.";
|
||||||
|
|
||||||
"Overlay" = "Overlay";
|
"Overlay" = "Overlay";
|
||||||
"HideAutoplay" = "Masquer le toggle de lecture automatique";
|
"HideAutoplay" = "Masquer le toggle de lecture automatique";
|
||||||
@@ -38,13 +40,19 @@
|
|||||||
"NoFullscreenActions" = "Désactiver les actions en plein écran";
|
"NoFullscreenActions" = "Désactiver les actions en plein écran";
|
||||||
"NoFullscreenActionsDesc" = "Désactive le panneau d'actions en mode plein écran.";
|
"NoFullscreenActionsDesc" = "Désactive le panneau d'actions en mode plein écran.";
|
||||||
"PersistentProgressBar" = "Barre de progression persistante";
|
"PersistentProgressBar" = "Barre de progression persistante";
|
||||||
"PersistentProgressBarDesc" = " Affiche toujours la barre de progression dans le lecteur ";
|
"PersistentProgressBarDesc" = "Affiche toujours la barre de progression dans le lecteur";
|
||||||
|
"StockVolumeHUD" = "HUD du volume original";
|
||||||
|
"StockVolumeHUDDesc" = "Affiche le HUD du volume du système en plein écran.";
|
||||||
"NoRelatedVids" = "Pas de vidéos associées dans l'overlay";
|
"NoRelatedVids" = "Pas de vidéos associées dans l'overlay";
|
||||||
"NoRelatedVidsDesc" = "Supprime les vidéos associées affichées dans l'overlay en faisant glisser vers le haut.";
|
"NoRelatedVidsDesc" = "Supprime les vidéos associées affichées dans l'overlay en faisant glisser vers le haut.";
|
||||||
"NoPromotionCards" = "Masquer les cartes de promotion payante";
|
"NoPromotionCards" = "Masquer les cartes de promotion payante";
|
||||||
"NoPromotionCardsDesc" = "Masque la carte \"Comprend des promotions payantes\" dans les vidéos avec promotions incluses.";
|
"NoPromotionCardsDesc" = "Masque la carte \"Comprend des promotions payantes\" dans les vidéos avec promotions incluses.";
|
||||||
"NoWatermarks" = "Masquer les filigranes";
|
"NoWatermarks" = "Masquer les filigranes";
|
||||||
"NoWatermarksDesc" = "Masque les filigranes de chaîne dans le lecteur.";
|
"NoWatermarksDesc" = "Masque les filigranes de chaîne dans le lecteur.";
|
||||||
|
"VideoEndTime" = "Afficher l'heure de fin de lecture";
|
||||||
|
"VideoEndTimeDesc" = "Ajoute l'heure de fin de lecture à la barre du lecteur.";
|
||||||
|
"24hrFormat" = "Format 24 heures";
|
||||||
|
"24hrFormatDesc" = "Affiche l'heure de fin au format 24 heures.";
|
||||||
|
|
||||||
"Player" = "Lecteur";
|
"Player" = "Lecteur";
|
||||||
"Miniplayer" = "Activer le mini-lecteur";
|
"Miniplayer" = "Activer le mini-lecteur";
|
||||||
@@ -65,8 +73,18 @@
|
|||||||
"ExtraSpeedOptionsDesc" = "Ajoute des options de vitesse de lecture supplémentaires au menu de vitesse.";
|
"ExtraSpeedOptionsDesc" = "Ajoute des options de vitesse de lecture supplémentaires au menu de vitesse.";
|
||||||
"DontSnap2Chapter" = "Désactiver la coupure au chapitre";
|
"DontSnap2Chapter" = "Désactiver la coupure au chapitre";
|
||||||
"DontSnap2ChapterDesc" = "Désactive le passage à l'épisode suivant en double tapant.";
|
"DontSnap2ChapterDesc" = "Désactive le passage à l'épisode suivant en double tapant.";
|
||||||
|
"NoTwoFingerSnapToChapter" = "Désactiver le double tap à deux doigts";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "Désactive le geste de double tap à deux doigts pour passer au chapitre.";
|
||||||
|
"PauseOnOverlay" = "Pause quand l'overlay est visible";
|
||||||
|
"PauseOnOverlayDesc" = "Met la lecture en pause si l'overlay apparaît.";
|
||||||
"RedProgressBar" = "Barre de progression rouge";
|
"RedProgressBar" = "Barre de progression rouge";
|
||||||
"RedProgressBarDesc" = "Ramène la barre de progression rouge.";
|
"RedProgressBarDesc" = "Ramène la barre de progression rouge.";
|
||||||
|
"NoPlayerRemixButton" = "Supprimer le bouton de remix";
|
||||||
|
"NoPlayerRemixButtonDesc" = "Supprime le bouton de remix sous le lecteur.";
|
||||||
|
"NoPlayerClipButton" = "Supprimer le bouton de clip";
|
||||||
|
"NoPlayerClipButtonDesc" = "Supprime le bouton de clip sous le lecteur.";
|
||||||
|
"NoPlayerDownloadButton" = "Supprimer le bouton de téléchargement";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "Supprime le bouton de téléchargement sous le lecteur.";
|
||||||
"NoHints" = "Désactiver les indices";
|
"NoHints" = "Désactiver les indices";
|
||||||
"NoHintsDesc" = "Désactive les indices de l'auteur qui apparaissent dans le coin supérieur droit pendant la lecture.";
|
"NoHintsDesc" = "Désactive les indices de l'auteur qui apparaissent dans le coin supérieur droit pendant la lecture.";
|
||||||
"NoFreeZoom" = "Désactiver le geste de zoom libre";
|
"NoFreeZoom" = "Désactiver le geste de zoom libre";
|
||||||
@@ -94,11 +112,13 @@
|
|||||||
"HideUploadButton" = "Masquer le bouton de téléchargement";
|
"HideUploadButton" = "Masquer le bouton de téléchargement";
|
||||||
"HideUploadButtonDesc" = "Masque le bouton de téléchargement de la barre d'onglets";
|
"HideUploadButtonDesc" = "Masque le bouton de téléchargement de la barre d'onglets";
|
||||||
"HideLibraryTab" = "Masquer l'onglet Bibliothèque";
|
"HideLibraryTab" = "Masquer l'onglet Bibliothèque";
|
||||||
"HideLibraryTabDesc" = "Masque l'onglet Bibliothèque de la barre d'onglets";
|
"HideLibraryTabDesc" = "Masque l'onglet Bibliothèque de la barre d'onglets.\n\nCet onglet peut être restauré en maintenant enfoncée l'onglet Accueil.";
|
||||||
|
|
||||||
"Shorts" = "Shorts";
|
"Shorts" = "Shorts";
|
||||||
"ShortsOnlyMode" = "Mode Shorts uniquement";
|
"ShortsOnlyMode" = "Mode Shorts uniquement";
|
||||||
"ShortsOnlyModeDesc" = "Limite les fonctionnalités de YouTube à la visualisation des Shorts uniquement.";
|
"ShortsOnlyModeDesc" = "Limite les fonctionnalités de YouTube à la visualisation des Shorts uniquement.";
|
||||||
|
"AutoSkipShorts" = "Défilage automatique des Shorts";
|
||||||
|
"AutoSkipShortsDesc" = "Passe automatiquement à la vidéo suivante lorsque la lecture de la vidéo actuelle est terminée.";
|
||||||
"HideShorts" = "Masquer les vidéos Shorts";
|
"HideShorts" = "Masquer les vidéos Shorts";
|
||||||
"HideShortsDesc" = "Masque les vidéos Shorts de la page d'accueil, des recommandations, etc. (Non appliqué à l'historique de visionnage)";
|
"HideShortsDesc" = "Masque les vidéos Shorts de la page d'accueil, des recommandations, etc. (Non appliqué à l'historique de visionnage)";
|
||||||
"ShortsProgress" = "Activer la barre de progression";
|
"ShortsProgress" = "Activer la barre de progression";
|
||||||
@@ -145,18 +165,32 @@
|
|||||||
"Other" = "Autre";
|
"Other" = "Autre";
|
||||||
"CopyVideoInfo" = "Copier les informations vidéo";
|
"CopyVideoInfo" = "Copier les informations vidéo";
|
||||||
"CopyVideoInfoDesc" = "Ajout d'un bouton permettant de copier le titre et la description de la vidéo dans le panneau Description de la vidéo.";
|
"CopyVideoInfoDesc" = "Ajout d'un bouton permettant de copier le titre et la description de la vidéo dans le panneau Description de la vidéo.";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "Gérer les publications";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "Permet de copier le texte de la publication et de sauvegarder la publication en tant qu'image en maintenant le toucher.";
|
||||||
"SavePostImage" = "Enregistrer l'image des publications de la communauté";
|
|
||||||
"SavePostImageDesc" = "Enregistre l'image des publications de la communauté dans l'application Photos en appuyant longuement.";
|
|
||||||
"SaveProfilePhoto" = "Enregistrer la photo de profil";
|
"SaveProfilePhoto" = "Enregistrer la photo de profil";
|
||||||
"SaveProfilePhotoDesc" = "Enregistre la photo de profil dans l'application Photos en appuyant longuement.";
|
"SaveProfilePhotoDesc" = "Enregistre la photo de profil dans l'application Photos en appuyant longuement.";
|
||||||
"CopyCommentText" = "Copier le texte des commentaires";
|
"CommentManager" = "Gérer les commentaires";
|
||||||
"CopyCommentTextDesc" = "Copie le texte des commentaires dans le presse-papiers par un appui long.";
|
"CommentManagerDesc" = "Permet de copier le texte des commentaires et de sauvegarder le commentaire en tant qu'image en maintenant une pression prolongée.";
|
||||||
"FixAlbums" = "Réparer les couvertures";
|
"FixAlbums" = "Réparer les vignettes";
|
||||||
"FixAlbumsDesc" = "Répare l'affichage des couvertures pour les utilisateurs de Russie.";
|
"FixAlbumsDesc" = "Répare l'affichage des vignettes pour les utilisateurs de Russie.";
|
||||||
|
"NativeShare" = "Fiche de partage native";
|
||||||
|
"NativeShareDesc" = "Utilise la fiche de partage du système pour partager des médias";
|
||||||
"RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\"";
|
"RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\"";
|
||||||
"RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu.";
|
"RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu.";
|
||||||
|
"RemoveDownloadMenu" = "Supprimer \"Télécharger\"";
|
||||||
|
"RemoveDownloadMenuDesc" = "Supprime l'option \"Télécharger\" du menu.";
|
||||||
|
"RemoveWatchLaterMenu" = "Supprimer \"Enregistrer pour plus tard\"";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "Supprime l'option \"Enregistrer pour plus tard\" du menu.";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "Supprimer \"Enregistrer dans une playlist\"";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "Supprime l'option \"Enregistrer dans une playlist\" du menu.";
|
||||||
|
"RemoveShareMenu" = "Supprimer \"Partager\"";
|
||||||
|
"RemoveShareMenuDesc" = "Supprime l'option \"Partager\" du menu.";
|
||||||
|
"RemoveNotInterestedMenu" = "Supprimer \"Pas intéressé\"";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "Supprime l'option \"Pas intéressé\" du menu.";
|
||||||
|
"RemoveDontRecommendMenu" = "Supprimer \"Ne pas recommander la chaîne\"";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "Supprime l'option \"Ne pas recommander la chaîne\" du menu.";
|
||||||
|
"RemoveReportMenu" = "Supprimer \"Signaler\"";
|
||||||
|
"RemoveReportMenuDesc" = "Supprime l'option \"Signaler\" du menu.";
|
||||||
"NoContinueWatching" = "Supprimer \"Continuer à regarder\"";
|
"NoContinueWatching" = "Supprimer \"Continuer à regarder\"";
|
||||||
"NoContinueWatchingDesc" = "Supprime la section \"Continuer à regarder\" contenant les vidéos inachevées de la page d'accueil.";
|
"NoContinueWatchingDesc" = "Supprime la section \"Continuer à regarder\" contenant les vidéos inachevées de la page d'accueil.";
|
||||||
"NoSearchHistory" = "Masquer l'historique de recherche";
|
"NoSearchHistory" = "Masquer l'historique de recherche";
|
||||||
@@ -172,6 +206,19 @@
|
|||||||
"DisableRTL" = "Désactiver le formatage de droite à gauche";
|
"DisableRTL" = "Désactiver le formatage de droite à gauche";
|
||||||
"DisableRTLDesc" = "Affiche le texte de force en format de gauche à droite (LTR) pour les langues qui sont initialement affichées de droite à gauche (RTL).";
|
"DisableRTLDesc" = "Affiche le texte de force en format de gauche à droite (LTR) pour les langues qui sont initialement affichées de droite à gauche (RTL).";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "Maintenir pour accélérer";
|
||||||
|
"Disable" = "Désactiver";
|
||||||
|
"Disabled" = "Désactivé";
|
||||||
|
"PlaybackSpeed" = "Vitesse de lecture";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "Vitesse de lecture par défaut" ;
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "Qualité de lecture sur WiFi";
|
||||||
|
"PlaybackQualityOnCellular" = "Qualité de lecture sur réseau cellulaire";
|
||||||
|
"SelectQuality" = "Sélectionner la qualité";
|
||||||
|
"Default" = "Par défaut";
|
||||||
|
"Best" = "Meilleure";
|
||||||
|
|
||||||
"Startup" = "Page de démarrage";
|
"Startup" = "Page de démarrage";
|
||||||
"Home" = "Accueil";
|
"Home" = "Accueil";
|
||||||
"Explore" = "Explorer";
|
"Explore" = "Explorer";
|
||||||
@@ -181,12 +228,15 @@
|
|||||||
"Warning" = "Avertissement";
|
"Warning" = "Avertissement";
|
||||||
"TabIsHidden" = "L'onglet masqué ne peut pas être sélectionné comme page de démarrage";
|
"TabIsHidden" = "L'onglet masqué ne peut pas être sélectionné comme page de démarrage";
|
||||||
|
|
||||||
"DonateViaPayPal" = "Faire un don via PayPal";
|
"SupportDevelopment" = "Soutenir le développement";
|
||||||
"SupportViaGhSponsors" = "Soutenir le développement via les sponsors Github";
|
"SupportDevelopmentDesc" = "Si vous aimez YTLite et souhaitez soutenir son développement, vous pouvez le faire en utilisant l'une des méthodes pratiques ci-dessous.\nMerci❤";
|
||||||
|
"Contributors" = "Contributeurs";
|
||||||
|
"OpenSourceLibs" = "Bibliothèques Open Source";
|
||||||
"Version" = "Version";
|
"Version" = "Version";
|
||||||
"About" = "À propos";
|
"About" = "À propos";
|
||||||
"Credits" = "Crédits";
|
"Credits" = "Crédits";
|
||||||
"Developer" = "Développeur YTLite";
|
"Developer" = "Développeur de YTLite";
|
||||||
|
"SpecialThanks" = "Remerciements spéciaux";
|
||||||
"ChineseSimplified" = "Localisation chinoise (simplifiée)";
|
"ChineseSimplified" = "Localisation chinoise (simplifiée)";
|
||||||
"ChineseTraditional" = "Localisation chinoise (traditionnelle)";
|
"ChineseTraditional" = "Localisation chinoise (traditionnelle)";
|
||||||
"French" = "Localisation française";
|
"French" = "Localisation française";
|
||||||
@@ -194,21 +244,31 @@
|
|||||||
"Japanese" = "Localisation japonaise";
|
"Japanese" = "Localisation japonaise";
|
||||||
"Vietnamese" = "Localisation vietnamienne";
|
"Vietnamese" = "Localisation vietnamienne";
|
||||||
"Advanced" = "Mode avancé";
|
"Advanced" = "Mode avancé";
|
||||||
|
"AdvancedDesc" = "Mode plus personnalisable";
|
||||||
"AdvancedModeReminder" = "Voulez-vous activer le mode avancé pour YTLite ?\n\nCe mode offre plus de 50 options supplémentaires pour personnaliser et optimiser votre expérience YouTube. Vous pouvez l'activer/désactiver ultérieurement depuis Paramètres → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "Voulez-vous activer le mode avancé pour YTLite ?\n\nCe mode offre plus de 50 options supplémentaires pour personnaliser et optimiser votre expérience YouTube. Vous pouvez l'activer/désactiver ultérieurement depuis Paramètres → %@ → %@ → %@.";
|
||||||
"ClearCache" = "Effacer le cache";
|
"ClearCache" = "Effacer le cache";
|
||||||
"ResetSettings" = "Réinitialiser les paramètres YTLite";
|
"ResetSettings" = "Réinitialiser les paramètres YTLite";
|
||||||
"ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?";
|
"ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?";
|
||||||
"ShortsOnlyWarning" = "Êtes-vous sûr de vouloir activer ce mode?\n\nDans ce mode, vous ne pourrez regarder que des vidéos Shorts et vous ne pourrez rien d'autre faire.\n\nVous pouvez désactiver le mode Shorts Only en appuyant longuement avec deux doigts dans le lecteur Shorts.";
|
"ShortsOnlyWarning" = "Êtes-vous sûr de vouloir activer ce mode?\n\nDans ce mode, vous ne pourrez regarder que des vidéos Shorts et vous ne pourrez rien d'autre faire.\n\nVous pouvez désactiver le mode Shorts Only en appuyant longuement avec deux doigts dans le lecteur Shorts.";
|
||||||
"ShortsModeTurnedOff" = "Le mode Shorts uniquement a été désactivé";
|
"ShortsModeTurnedOff" = "Le mode Shorts uniquement a été désactivé";
|
||||||
|
"LibraryAdded" = "L'onglet Vous/Bibliothèque a été restauré";
|
||||||
|
"LibraryRemoved" = "L'onglet Vous/Bibliothèque a été supprimé";
|
||||||
"Yes" = "Oui";
|
"Yes" = "Oui";
|
||||||
"No" = "Non";
|
"No" = "Non";
|
||||||
|
|
||||||
"SelectAction" = "Sélectionner une action";
|
"SelectAction" = "Sélectionner une action";
|
||||||
"CopyTitle" = "Copier le titre";
|
"CopyTitle" = "Copier le titre";
|
||||||
"CopyDescription" = "Copier la description";
|
"CopyDescription" = "Copier la description";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "Copier le texte de la publication";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SaveCurrentImage" = "Save current image";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyCurrentImage" = "Copy current image";
|
||||||
|
"SavePostAsImage" = "Enregistrer la publication en tant qu'image";
|
||||||
|
"CopyPostAsImage" = "Copier la publication en tant qu'image";
|
||||||
|
"CopyCommentText" = "Copier le texte du commentaire";
|
||||||
|
"SaveCommentAsImage" = "Enregistrer le commentaire en tant qu'image";
|
||||||
|
"CopyCommentAsImage" = "Copier le commentaire en tant qu'image";
|
||||||
|
"SaveProfilePicture" = "Enregistrer la photo de profil";
|
||||||
|
"CopyProfilePicture" = "Copier la photo de profil";
|
||||||
"Cancel" = "Annuler";
|
"Cancel" = "Annuler";
|
||||||
"Copied" = "Copié dans le presse-papiers";
|
"Copied" = "Copié dans le presse-papiers";
|
||||||
"Saved" = "Enregistré dans Photos";
|
"Saved" = "Enregistré dans Photos";
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
@@ -2,7 +2,7 @@
|
|||||||
"RemoveAds" = "広告を削除";
|
"RemoveAds" = "広告を削除";
|
||||||
"RemoveAdsDesc" = "アプリ内の広告を削除します";
|
"RemoveAdsDesc" = "アプリ内の広告を削除します";
|
||||||
"BackgroundPlayback" = "バックグラウンド再生";
|
"BackgroundPlayback" = "バックグラウンド再生";
|
||||||
"BackgroundPlaybackDesc" = "バックグラウンドでの再生を有効にします";
|
"BackgroundPlaybackDesc" = "バックグラウンド再生を有効にします";
|
||||||
|
|
||||||
"Navbar" = "ナビゲーションバー";
|
"Navbar" = "ナビゲーションバー";
|
||||||
"RemoveCast" = "キャストボタンを非表示";
|
"RemoveCast" = "キャストボタンを非表示";
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
"NoSubbarDesc" = "ナビゲーションバーの下にあるサブバー(すべて,音楽,ライブ など)を非表示にします";
|
"NoSubbarDesc" = "ナビゲーションバーの下にあるサブバー(すべて,音楽,ライブ など)を非表示にします";
|
||||||
"NoYTLogo" = "YouTubeロゴを削除";
|
"NoYTLogo" = "YouTubeロゴを削除";
|
||||||
"NoYTLogoDesc" = "ナビゲーションバーのYouTubeロゴを非表示にします";
|
"NoYTLogoDesc" = "ナビゲーションバーのYouTubeロゴを非表示にします";
|
||||||
|
"PremiumYTLogo" = "Youtube Premiumロゴを設定";
|
||||||
|
"PremiumYTLogoDesc" = "ナビゲーションバーのロゴをYoutube Premiumのロゴにします";
|
||||||
|
|
||||||
"Overlay" = "オーバーレイ";
|
"Overlay" = "オーバーレイ";
|
||||||
"HideAutoplay" = "自動再生スイッチを非表示";
|
"HideAutoplay" = "自動再生スイッチを非表示";
|
||||||
@@ -35,16 +37,22 @@
|
|||||||
"NoDarkBgDesc" = "オーバーレイの暗い背景を削除します";
|
"NoDarkBgDesc" = "オーバーレイの暗い背景を削除します";
|
||||||
"NoEndScreenCards" = "エンドスクリーンのホバーカードを非表示";
|
"NoEndScreenCards" = "エンドスクリーンのホバーカードを非表示";
|
||||||
"NoEndScreenCardsDesc" = "動画の終わりに表示されるエンドスクリーン(サムネイル)を非表示にします";
|
"NoEndScreenCardsDesc" = "動画の終わりに表示されるエンドスクリーン(サムネイル)を非表示にします";
|
||||||
"NoFullscreenActions" = "フルスクリーンアクションを無効化";
|
"NoFullscreenActions" = "フルスクリーン時のアクションを無効化";
|
||||||
"NoFullscreenActionsDesc" = "フルスクリーンモードでのアクションパネルを無効にします";
|
"NoFullscreenActionsDesc" = "フルスクリーン時のアクションパネルを無効にします";
|
||||||
"PersistentProgressBar" = "Persistent progress bar";
|
"PersistentProgressBar" = "プログレスバーを常に表示";
|
||||||
"PersistentProgressBarDesc" = "Always shows progress bar in the player.";
|
"PersistentProgressBarDesc" = "プレーヤーに常にプログレスバーを表示します";
|
||||||
|
"StockVolumeHUD" = "標準の音量HUD";
|
||||||
|
"StockVolumeHUDDesc" = "フルスクリーン時にシステムの音量HUDを表示します";
|
||||||
"NoRelatedVids" = "オーバーレイの関連動画を非表示";
|
"NoRelatedVids" = "オーバーレイの関連動画を非表示";
|
||||||
"NoRelatedVidsDesc" = "スワイプアップでオーバーレイに表示される関連動画を非表示にします";
|
"NoRelatedVidsDesc" = "上にスワイプして表示される関連動画を非表示にします";
|
||||||
"NoPromotionCards" = "有料プロモーションカードを非表示";
|
"NoPromotionCards" = "有料プロモーションカードを非表示";
|
||||||
"NoPromotionCardsDesc" = "プロモーションが含まれている動画の\"有料プロモーションを含む\"カードを非表示にします";
|
"NoPromotionCardsDesc" = "プロモーションが含まれている動画の\"有料プロモーションを含む\"カードを非表示にします";
|
||||||
"NoWatermarks" = "ウォーターマークを非表示";
|
"NoWatermarks" = "ウォーターマークを非表示";
|
||||||
"NoWatermarksDesc" = "プレーヤーからチャンネルのウォーターマークを非表示にします";
|
"NoWatermarksDesc" = "プレーヤーからチャンネルのウォーターマークを非表示にします";
|
||||||
|
"VideoEndTime" = "再生終了時間を表示";
|
||||||
|
"VideoEndTimeDesc" = "プレーヤーバーに再生終了時間を表示します";
|
||||||
|
"24hrFormat" = "24時間表記";
|
||||||
|
"24hrFormatDesc" = "再生終了時間を24時間表記にします";
|
||||||
|
|
||||||
"Player" = "プレーヤー";
|
"Player" = "プレーヤー";
|
||||||
"Miniplayer" = "ミニプレーヤーを有効化";
|
"Miniplayer" = "ミニプレーヤーを有効化";
|
||||||
@@ -54,19 +62,29 @@
|
|||||||
"CopyWithTimestamp" = "タイムスタンプ付きリンクをコピー";
|
"CopyWithTimestamp" = "タイムスタンプ付きリンクをコピー";
|
||||||
"CopyWithTimestampDesc" = "一時停止ボタンを押すことで、タイムスタンプ付きリンクをクリップボードにコピーできます";
|
"CopyWithTimestampDesc" = "一時停止ボタンを押すことで、タイムスタンプ付きリンクをクリップボードにコピーできます";
|
||||||
"DisableAutoplay" = "自動再生を無効化";
|
"DisableAutoplay" = "自動再生を無効化";
|
||||||
"DisableAutoplayDesc" = "アプリを開いた後に動画の自動再生を防止します";
|
"DisableAutoplayDesc" = "アプリを開いた後の動画の自動再生を防ぎます";
|
||||||
"DisableAutoCaptions" = "Disable auto captions";
|
"DisableAutoCaptions" = "自動字幕を無効化";
|
||||||
"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions.";
|
"DisableAutoCaptionsDesc" = "字幕の自動表示を無効にします";
|
||||||
"NoContentWarning" = "コンテンツ警告をスキップ";
|
"NoContentWarning" = "コンテンツ警告をスキップ";
|
||||||
"NoContentWarningDesc" = "不適切なコンテンツの警告メッセージをスキップします";
|
"NoContentWarningDesc" = "不適切なコンテンツの警告メッセージをスキップします";
|
||||||
"ClassicQuality" = "クラシックなビデオ品質";
|
"ClassicQuality" = "クラシックな画質選択";
|
||||||
"ClassicQualityDesc" = "クラシックなビデオ品質選択メニューを復元します";
|
"ClassicQualityDesc" = "クラシックな画質選択メニューに戻します";
|
||||||
"ExtraSpeedOptions" = "再生速度の追加オプション";
|
"ExtraSpeedOptions" = "追加の再生速度オプション";
|
||||||
"ExtraSpeedOptionsDesc" = "プレーヤーメニューに追加の再生速度オプションを追加します";
|
"ExtraSpeedOptionsDesc" = "プレーヤーメニューに再生速度のオプションを追加します";
|
||||||
"DontSnap2Chapter" = "チャプターへのスナップを無効化";
|
"DontSnap2Chapter" = "チャプターへのスナップを無効化";
|
||||||
"DontSnap2ChapterDesc" = "ダブルタップジェスチャーで次のエピソードへスキップするのを無効にします";
|
"DontSnap2ChapterDesc" = "ダブルタップジェスチャーで次のエピソードへスキップしないようにします";
|
||||||
|
"NoTwoFingerSnapToChapter" = "2本指ダブルタップジェスチャーを無効化";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "2本指ダブルタップで次のエピソードにスキップするジェスチャーを無効にします";
|
||||||
|
"PauseOnOverlay" = "オーバーレイ時に一時停止";
|
||||||
|
"PauseOnOverlayDesc" = "オーバーレイが表示されたら再生を一時停止します";
|
||||||
"RedProgressBar" = "赤いプログレスバー";
|
"RedProgressBar" = "赤いプログレスバー";
|
||||||
"RedProgressBarDesc" = "赤いプログレスバーを復元します";
|
"RedProgressBarDesc" = "赤いプログレスバーに戻します";
|
||||||
|
"NoPlayerRemixButton" = "リミックスボタンを削除";
|
||||||
|
"NoPlayerRemixButtonDesc" = "プレーヤーの下のリミックスボタンを削除します";
|
||||||
|
"NoPlayerClipButton" = "クリップボタンを削除";
|
||||||
|
"NoPlayerClipButtonDesc" = "プレーヤーの下のクリップボタンを削除します";
|
||||||
|
"NoPlayerDownloadButton" = "ダウンロードボタンを削除";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "プレーヤーの下のダウンロードボタンを削除します";
|
||||||
"NoHints" = "ヒントを無効化";
|
"NoHints" = "ヒントを無効化";
|
||||||
"NoHintsDesc" = "再生中に右上に表示される投稿者のヒントを無効にします";
|
"NoHintsDesc" = "再生中に右上に表示される投稿者のヒントを無効にします";
|
||||||
"NoFreeZoom" = "フリーズームジェスチャーを無効化";
|
"NoFreeZoom" = "フリーズームジェスチャーを無効化";
|
||||||
@@ -74,53 +92,55 @@
|
|||||||
"AutoFullscreen" = "動画をフルスクリーンで再生";
|
"AutoFullscreen" = "動画をフルスクリーンで再生";
|
||||||
"AutoFullscreenDesc" = "動画を自動的にフルスクリーンモードで再生します";
|
"AutoFullscreenDesc" = "動画を自動的にフルスクリーンモードで再生します";
|
||||||
"ExitFullscreen" = "再生終了時にフルスクリーンモードを終了";
|
"ExitFullscreen" = "再生終了時にフルスクリーンモードを終了";
|
||||||
"ExitFullscreenDesc" = "動画再生が終了したときにフルスクリーンモードを終了します";
|
"ExitFullscreenDesc" = "動画が終了したときにフルスクリーンモードも終了します";
|
||||||
"NoDoubleTap2Seek" = "ダブルタップでのシークを無効化";
|
"NoDoubleTap2Seek" = "ダブルタップでのシークを無効化";
|
||||||
"NoDoubleTap2SeekDesc" = "ダブルタップでのシークジェスチャーを無効にします";
|
"NoDoubleTap2SeekDesc" = "ダブルタップでシーク操作するジェスチャーを無効にします";
|
||||||
|
|
||||||
"Tabbar" = "タブバー";
|
"Tabbar" = "タブバー";
|
||||||
"RemoveLabels" = "ラベルを削除";
|
"RemoveLabels" = "ラベルを削除";
|
||||||
"RemoveLabelsDesc" = "タブラベルを削除します";
|
"RemoveLabelsDesc" = "タブのラベルを削除します";
|
||||||
"RemoveIndicators" = "インジケーターを削除";
|
"RemoveIndicators" = "インジケーターを削除";
|
||||||
"RemoveIndicatorsDesc" = "タブインジケーターを削除します";
|
"RemoveIndicatorsDesc" = "タブのインジケーターを削除します";
|
||||||
"ReExplore" = "ショートタブを探索タブに置き換え";
|
"ReExplore" = "ショートタブを探索タブに置き換え";
|
||||||
"ReExploreDesc" = "古いYouTubeバージョンのように、ショートタブの代わりに探索タブを表示します";
|
"ReExploreDesc" = "古いYouTubeバージョンのように、ショートタブの代わりに探索タブを表示します";
|
||||||
"AddExplore" = "Add Explore tab";
|
"AddExplore" = "探索タブを追加";
|
||||||
"AddExploreDesc" = "Adds Explore tab to the Tab bar.";
|
"AddExploreDesc" = "タブバーに探索タブを追加します";
|
||||||
"HideShortsTab" = "ショートタブを非表示";
|
"HideShortsTab" = "ショートタブを非表示";
|
||||||
"HideShortsTabDesc" = "タブバーからショートタブを非表示にします";
|
"HideShortsTabDesc" = "ショートタブを非表示にします";
|
||||||
"HideSubscriptionsTab" = "登録チャンネルタブを非表示";
|
"HideSubscriptionsTab" = "登録チャンネルタブを非表示";
|
||||||
"HideSubscriptionsTabDesc" = "タブバーから登録チャンネルタブを非表示にします";
|
"HideSubscriptionsTabDesc" = "登録チャンネルタブを非表示にします";
|
||||||
"HideUploadButton" = "アップロードボタンを非表示";
|
"HideUploadButton" = "アップロードボタンを非表示";
|
||||||
"HideUploadButtonDesc" = "タブバーからアップロードボタンを非表示にします";
|
"HideUploadButtonDesc" = "アップロードボタンを非表示にします";
|
||||||
"HideLibraryTab" = "ライブラリタブを非表示";
|
"HideLibraryTab" = "ライブラリタブを非表示";
|
||||||
"HideLibraryTabDesc" = "タブバーからライブラリタブを非表示にします";
|
"HideLibraryTabDesc" = "ライブラリタブを非表示にします。\n\nこのタブはホームタブを長押しすることで復元できま。";
|
||||||
|
|
||||||
"Shorts" = "ショート";
|
"Shorts" = "ショート";
|
||||||
"ShortsOnlyMode" = "Shorts Only Mode";
|
"ShortsOnlyMode" = "ショートオンリーモード";
|
||||||
"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only.";
|
"ShortsOnlyModeDesc" = "YouTubeの機能をショートの視聴のみに制限します";
|
||||||
|
"AutoSkipShorts" = "自動でショートをスキップ";
|
||||||
|
"AutoSkipShortsDesc" = "現在の動画の再生が終わったら次の動画に移動します";
|
||||||
"HideShorts" = "ショート動画を非表示";
|
"HideShorts" = "ショート動画を非表示";
|
||||||
"HideShortsDesc" = "ホーム, おすすめなどからショート動画を非表示にします(視聴履歴には適用されません)";
|
"HideShortsDesc" = "ホーム, おすすめなどからショート動画を非表示にします(視聴履歴には適用されません)";
|
||||||
"ShortsProgress" = "プログレスバーを有効化";
|
"ShortsProgress" = "プログレスバーを有効化";
|
||||||
"ShortsProgressDesc" = "ショートオーバーレイにプログレスバーを表示します";
|
"ShortsProgressDesc" = "ショートオーバーレイにプログレスバーを表示します";
|
||||||
"PinchToFullscreenShorts" = "Pinch to Fullscreen";
|
"PinchToFullscreenShorts" = "ピンチでフルスクリーン表示";
|
||||||
"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode.";
|
"PinchToFullscreenShortsDesc" = "ピンチインとピンチアウトのジェスチャーでオーバーレイの表示/非表示を切り替え、ショートをフルスクリーン表示します";
|
||||||
"ShortsToRegular" = "Shorts to regular videos";
|
"ShortsToRegular" = "ショートを通常のビデオで開く";
|
||||||
"ShortsToRegularDesc" = "Opens Shorts videos as regular videos.";
|
"ShortsToRegularDesc" = "ショート動画を通常のビデオとして開きます";
|
||||||
"ResumeShorts" = "ショートタブからの再開を防止";
|
"ResumeShorts" = "ショートタブからの再開を防止";
|
||||||
"ResumeShortsDesc" = "ショートを視聴中にアプリを閉じた場合でも、ショートからの再開を防止します";
|
"ResumeShortsDesc" = "ショートを視聴中にアプリを閉じた場合でも、ショートからの再開を防止します";
|
||||||
"HideShortsLogo" = "ショートロゴを非表示";
|
"HideShortsLogo" = "ショートロゴを非表示";
|
||||||
"HideShortsLogoDesc" = "左上隅のショートロゴを非表示にします";
|
"HideShortsLogoDesc" = "左上のショートロゴを非表示にします";
|
||||||
"HideShortsSearch" = "検索ボタンを非表示";
|
"HideShortsSearch" = "検索ボタンを非表示";
|
||||||
"HideShortsSearchDesc" = "ショートオーバーレイから検索ボタンを非表示にします";
|
"HideShortsSearchDesc" = "ショートオーバーレイから検索ボタンを非表示にします";
|
||||||
"HideShortsCamera" = "カメラボタンを非表示";
|
"HideShortsCamera" = "カメラボタンを非表示";
|
||||||
"HideShortsCameraDesc" = "ショートオーバーレイからカメラボタンを非表示にします";
|
"HideShortsCameraDesc" = "ショートオーバーレイからカメラボタンを非表示にします";
|
||||||
"HideShortsMore" = "その他(⋮)ボタンを非表示";
|
"HideShortsMore" = "その他(⋮)ボタンを非表示";
|
||||||
"HideShortsMoreDesc" = "ショートオーバーレイからその他(⋮)ボタンを非表示にします。画面の長押しでアクセスも可能です";
|
"HideShortsMoreDesc" = "ショートオーバーレイからその他(⋮)ボタンを非表示にします。画面を長押しすると表示されます";
|
||||||
"HideShortsSubscriptions" = "チャンネル登録ボタンを非表示";
|
"HideShortsSubscriptions" = "チャンネル登録ボタンを非表示";
|
||||||
"HideShortsSubscriptionsDesc" = "ショートが一時停止されたときに表示されるチャンネル登録ボタンを非表示にします";
|
"HideShortsSubscriptionsDesc" = "ショートが一時停止されたときに表示されるチャンネル登録ボタンを非表示にします";
|
||||||
"HideShortsLike" = "いいねボタンを非表示";
|
"HideShortsLike" = "高評価ボタンを非表示";
|
||||||
"HideShortsLikeDesc" = "ショートオーバーレイからいいねボタンを非表示にします";
|
"HideShortsLikeDesc" = "ショートオーバーレイから高評価ボタンを非表示にします";
|
||||||
"HideShortsDislike" = "低評価ボタンを非表示";
|
"HideShortsDislike" = "低評価ボタンを非表示";
|
||||||
"HideShortsDislikeDesc" = "ショートオーバーレイから低評価ボタンを非表示にします";
|
"HideShortsDislikeDesc" = "ショートオーバーレイから低評価ボタンを非表示にします";
|
||||||
"HideShortsComments" = "コメントボタンを非表示";
|
"HideShortsComments" = "コメントボタンを非表示";
|
||||||
@@ -130,47 +150,74 @@
|
|||||||
"HideShortsShare" = "共有ボタンを非表示";
|
"HideShortsShare" = "共有ボタンを非表示";
|
||||||
"HideShortsShareDesc" = "ショートオーバーレイから共有ボタンを非表示にします";
|
"HideShortsShareDesc" = "ショートオーバーレイから共有ボタンを非表示にします";
|
||||||
"HideShortsAvatars" = "チャンネルのアバターを非表示";
|
"HideShortsAvatars" = "チャンネルのアバターを非表示";
|
||||||
"HideShortsAvatarsDesc" = "右下隅のプロフィール画像を非表示にします";
|
"HideShortsAvatarsDesc" = "右下のプロフィール画像を非表示にします";
|
||||||
"HideShortsThanks" = "スーパーサンクスボタンを非表示";
|
"HideShortsThanks" = "スーパーサンクスボタンを非表示";
|
||||||
"HideShortsThanksDesc" = "ショートオーバーレイからスーパーサンクス(寄付)ボタンを非表示にします";
|
"HideShortsThanksDesc" = "ショートオーバーレイからスーパーサンクス(寄付)ボタンを非表示にします";
|
||||||
"HideShortsSource" = "Hide Shorts Source";
|
"HideShortsSource" = "ショートソースを非表示";
|
||||||
"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name.";
|
"HideShortsSourceDesc" = "チャンネル名の下のショートソースを非表示にします";
|
||||||
"HideShortsChannelName" = "チャンネル名を非表示";
|
"HideShortsChannelName" = "チャンネル名を非表示";
|
||||||
"HideShortsChannelNameDesc" = "ショートオーバーレイからチャンネル名とチャンネル登録ボタンを非表示にします";
|
"HideShortsChannelNameDesc" = "ショートオーバーレイからチャンネル名とチャンネル登録ボタンを非表示にします";
|
||||||
"HideShortsDescription" = "説明を非表示";
|
"HideShortsDescription" = "概要を非表示";
|
||||||
"HideShortsDescriptionDesc" = "チャンネル名の下に表示されるショートの説明を非表示にします";
|
"HideShortsDescriptionDesc" = "チャンネル名の下に表示されるショートの概要欄を非表示にします";
|
||||||
"HideShortsAudioTrack" = "オーディオトラックを非表示";
|
"HideShortsAudioTrack" = "オーディオトラックを非表示";
|
||||||
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
"HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします";
|
||||||
|
|
||||||
"Other" = "その他";
|
"Other" = "その他";
|
||||||
"CopyVideoInfo" = "Copy video information";
|
"CopyVideoInfo" = "動画情報をコピー";
|
||||||
"CopyVideoInfoDesc" = "Adds button to copy video title and description into Video Description panel.";
|
"CopyVideoInfoDesc" = "概要欄にタイトルと概要のコピーボタンを追加します";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "コミュニティの投稿を保存";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "長押しでテキストをコピーし、投稿を画像として保存できます";
|
||||||
"SavePostImage" = "Save community posts image";
|
"SaveProfilePhoto" = "プロフィール写真を保存";
|
||||||
"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap.";
|
"SaveProfilePhotoDesc" = "プロフィール写真を長押しして保存できます";
|
||||||
"SaveProfilePhoto" = "Save profile picture";
|
"CommentManager" = "コメント情報を保存";
|
||||||
"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap.";
|
"CommentManagerDesc" = "長押しでテキストをコピーし、コメントを画像として保存できます";
|
||||||
"CopyCommentText" = "Copy comments text";
|
"FixAlbums" = "カバーを修正";
|
||||||
"CopyCommentTextDesc" = "Copies comments text to the clipboard by long tap.";
|
"FixAlbumsDesc" = "ロシアのユーザーのカバー表示を修正します";
|
||||||
"FixAlbums" = "Fix covers";
|
"NativeShare" = "ネイティブ共有シート";
|
||||||
"FixAlbumsDesc" = "Fixes the display of covers for users from Russia.";
|
"NativeShareDesc" = "共有の際にシステムの共有シートを使うように変更します";
|
||||||
"RemovePlayNext" = "\"次に再生\"を削除";
|
"RemovePlayNext" = "\"キューの最初に追加\"を削除";
|
||||||
"RemovePlayNextDesc" = "メニューから\"次に再生\"オプションを削除します";
|
"RemovePlayNextDesc" = "メニューから\"キューの最初に追加\"オプションを削除します";
|
||||||
|
"RemoveDownloadMenu" = "\"動画を一時保存\"を削除";
|
||||||
|
"RemoveDownloadMenuDesc" = "メニューから\"動画を一時保存\"オプションを削除します";
|
||||||
|
"RemoveWatchLaterMenu" = "\"後で見るに保存\"を削除";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "メニューから\"後で見るに保存\"オプションを削除します";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "\"再生リストに保存\"";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "メニューから\"再生リストに保存\"オプションを削除します";
|
||||||
|
"RemoveShareMenu" = "\"共有\"を削除";
|
||||||
|
"RemoveShareMenuDesc" = "メニューから\"共有\"オプションを削除します";
|
||||||
|
"RemoveNotInterestedMenu" = "\"興味なし\"を削除";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "メニューから\"興味なし\"オプションを削除します";
|
||||||
|
"RemoveDontRecommendMenu" = "\"チャンネルをおすすめに表示しない\"を削除";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "メニューから \"チャンネルをおすすめに表示しない\"オプションを削除します";
|
||||||
|
"RemoveReportMenu" = "\"報告\"を削除";
|
||||||
|
"RemoveReportMenuDesc" = "メニューから\"報告\"オプションを削除します";
|
||||||
"NoContinueWatching" = "\"続きを見る\"を削除";
|
"NoContinueWatching" = "\"続きを見る\"を削除";
|
||||||
"NoContinueWatchingDesc" = "ホームページに未完成の動画を含む\"続きを見る\"セクションを削除します";
|
"NoContinueWatchingDesc" = "ホームから未視聴の動画を含む\"続きを見る\"セクションを削除します";
|
||||||
"NoSearchHistory" = "検索履歴を非表示";
|
"NoSearchHistory" = "検索履歴を非表示";
|
||||||
"NoSearchHistoryDesc" = "検索履歴とサジェストを視覚的に非表示にします。注意:検索履歴は他のYouTubeクライアントからアクセス可能です";
|
"NoSearchHistoryDesc" = "検索履歴とサジェストを非表示にします。※検索履歴は他のYouTubeクライアントからアクセス可能です";
|
||||||
"NoRelatedWatchNexts" = "プレーヤー下のすべての動画を非表示";
|
"NoRelatedWatchNexts" = "プレーヤー下のすべての動画を非表示";
|
||||||
"NoRelatedWatchNextsDesc" = "プレーヤー下に表示されるすべての動画を非表示にし、動画情報とコメントセクションのみにします";
|
"NoRelatedWatchNextsDesc" = "プレーヤー下に表示されるすべての動画を非表示にし、概要欄とコメントのみにします";
|
||||||
"StickSortComments" = "コメントヘッダーを固定";
|
"StickSortComments" = "コメントヘッダーを固定";
|
||||||
"StickSortCommentsDesc" = "コメントのソートヘッダー(トップ,最新)をスクロールしても消えないように固定します";
|
"StickSortCommentsDesc" = "コメントのソートヘッダー(人気,新しい順)をスクロールしても消えないように固定します";
|
||||||
"HideSortComments" = "コメントヘッダーを非表示";
|
"HideSortComments" = "コメントヘッダーを非表示";
|
||||||
"HideSortCommentsDesc" = "コメントのソートヘッダー(トップ,最新)を表示しないようにします";
|
"HideSortCommentsDesc" = "コメントのソートヘッダー(人気,新しい順)を表示しないようにします";
|
||||||
"PlaylistOldMinibar" = "古いプレイリストミニバー";
|
"PlaylistOldMinibar" = "古いプレイリストミニバー";
|
||||||
"PlaylistOldMinibarDesc" = "新しいフローティングプレイリストパネルを古いものに置き換えます";
|
"PlaylistOldMinibarDesc" = "新しいフローティングプレイリストパネルを古いものに置き換えます";
|
||||||
"DisableRTL" = "RTLフォーマットを無効化";
|
"DisableRTL" = "RTLの書式設定を無効化";
|
||||||
"DisableRTLDesc" = "RTLで表示される言語を左から右(LTR)の形式で表示するように強制します";
|
"DisableRTLDesc" = "右から左(RTL)に初期設定されている言語をすべて左から右(LTR)の書式で強制的に表示します";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "ホールドし続けて再生速度を変更";
|
||||||
|
"Disable" = "無効";
|
||||||
|
"Disabled" = "無効";
|
||||||
|
"PlaybackSpeed" = "再生速度";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "デフォルトの再生速度";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "Wi-Fi時の画質";
|
||||||
|
"PlaybackQualityOnCellular" = "モバイル通信時の画質";
|
||||||
|
"SelectQuality" = "画質を選択";
|
||||||
|
"Default" = "デフォルト";
|
||||||
|
"Best" = "最高";
|
||||||
|
|
||||||
"Startup" = "スタートアップページ";
|
"Startup" = "スタートアップページ";
|
||||||
"Home" = "ホーム";
|
"Home" = "ホーム";
|
||||||
@@ -181,36 +228,49 @@
|
|||||||
"Warning" = "警告";
|
"Warning" = "警告";
|
||||||
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
|
"TabIsHidden" = "非表示のタブはスタートアップページとして選択できません";
|
||||||
|
|
||||||
"DonateViaPayPal" = "Donate via PayPal";
|
"SupportDevelopment" = "開発を支援する";
|
||||||
"SupportViaGhSponsors" = "Support development via Github Sponsors";
|
"SupportDevelopmentDesc" = "YTLiteを気に入り、開発を支援したい場合は、以下のいずれかの方法で支援できます。\nありがとう❤";
|
||||||
|
"Contributors" = "貢献者";
|
||||||
|
"OpenSourceLibs" = "オープンソースライブラリ";
|
||||||
"Version" = "バージョン";
|
"Version" = "バージョン";
|
||||||
"About" = "About";
|
"About" = "YTLiteについて";
|
||||||
"Credits" = "クレジット";
|
"Credits" = "クレジット";
|
||||||
"Developer" = "YTLiteの開発者";
|
"Developer" = "開発者";
|
||||||
|
"SpecialThanks" = "スペシャルサンクス";
|
||||||
"ChineseSimplified" = "中国語(簡体字)翻訳";
|
"ChineseSimplified" = "中国語(簡体字)翻訳";
|
||||||
"ChineseTraditional" = "中国語(繁体字)翻訳";
|
"ChineseTraditional" = "中国語(繁体字)翻訳";
|
||||||
"French" = "フランス語翻訳";
|
"French" = "フランス語翻訳";
|
||||||
"Spanish" = "スペイン語翻訳";
|
"Spanish" = "スペイン語翻訳";
|
||||||
"Japanese" = "日本語翻訳";
|
"Japanese" = "日本語翻訳";
|
||||||
"Vietnamese" = "Vietnamese localization";
|
"Vietnamese" = "ベトナム語翻訳";
|
||||||
"Advanced" = "アドバンスモード";
|
"Advanced" = "アドバンスモード";
|
||||||
"AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます";
|
"AdvancedDesc" = "より詳細にカスタマイズできるモード";
|
||||||
"ClearCache" = "Clear cache";
|
"AdvancedModeReminder" = "アドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後から、設定 → %@ → %@ → %@で有効/無効を切り替えられます。";
|
||||||
|
"ClearCache" = "キャッシュを消去";
|
||||||
"ResetSettings" = "YTLiteの設定をリセット";
|
"ResetSettings" = "YTLiteの設定をリセット";
|
||||||
"ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、アプリが終了します。\n\n続行してもよろしいですか?";
|
"ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、アプリが終了します。\n\n続行してもよろしいですか?";
|
||||||
"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player.";
|
"ShortsOnlyWarning" = "本当にこのモードを有効にしますか?\n\nこのモードではショート動画のみを視聴でき、他の機能は使えません。\n\n2本指でプレーヤーを長押しすると、このモードを無効にできます。";
|
||||||
"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off";
|
"ShortsModeTurnedOff" = "ショートオンリーモードが無効になりました";
|
||||||
|
"LibraryAdded" = "マイページ/ライブラリタブが復元されました";
|
||||||
|
"LibraryRemoved" = "マイページ/ライブラリタブがが削除されました";
|
||||||
"Yes" = "はい";
|
"Yes" = "はい";
|
||||||
"No" = "いいえ";
|
"No" = "いいえ";
|
||||||
|
|
||||||
"SelectAction" = "Select action";
|
"SelectAction" = "操作を選択";
|
||||||
"CopyTitle" = "Copy title";
|
"CopyTitle" = "タイトルをコピー";
|
||||||
"CopyDescription" = "Copy description";
|
"CopyDescription" = "概要をコピー";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "投稿のテキストをコピー";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SaveCurrentImage" = "現在の画像を保存";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyCurrentImage" = "現在の画像をコピー";
|
||||||
"Cancel" = "Cancel";
|
"SavePostAsImage" = "投稿を画像として保存";
|
||||||
"Copied" = "Copied to clipboard";
|
"CopyPostAsImage" = "投稿を画像としてコピー";
|
||||||
"Saved" = "Saved to Photos";
|
"CopyCommentText" = "コメントのテキストをコピー";
|
||||||
"Done" = "Done";
|
"SaveCommentAsImage" = "コメントを画像として保存";
|
||||||
"Error" = "Error";
|
"CopyCommentAsImage" = "コメントを画像としてコピー";
|
||||||
|
"SaveProfilePicture" = "プロフィール写真を保存";
|
||||||
|
"CopyProfilePicture" = "プロフィール写真をコピー";
|
||||||
|
"Cancel" = "キャンセル";
|
||||||
|
"Copied" = "クリップボードにコピーしました";
|
||||||
|
"Saved" = "写真に保存しました";
|
||||||
|
"Done" = "完了";
|
||||||
|
"Error" = "エラー";
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
@@ -19,6 +19,8 @@
|
|||||||
"NoSubbarDesc" = "Скрывает панель с наклейками (Все, Новое для вас, Сейчас в эфире и т.д.) под панелью навигации.";
|
"NoSubbarDesc" = "Скрывает панель с наклейками (Все, Новое для вас, Сейчас в эфире и т.д.) под панелью навигации.";
|
||||||
"NoYTLogo" = "Скрыть логотип YouTube";
|
"NoYTLogo" = "Скрыть логотип YouTube";
|
||||||
"NoYTLogoDesc" = "Убирает логотип YouTube с панели навигации.";
|
"NoYTLogoDesc" = "Убирает логотип YouTube с панели навигации.";
|
||||||
|
"PremiumYTLogo" = "Отображать Premium логотип";
|
||||||
|
"PremiumYTLogoDesc" = "Отображает логотип Premium в панели навигации.";
|
||||||
|
|
||||||
"Overlay" = "Настройки оверлея";
|
"Overlay" = "Настройки оверлея";
|
||||||
"HideAutoplay" = "Скрыть «Автовоспроизведение»";
|
"HideAutoplay" = "Скрыть «Автовоспроизведение»";
|
||||||
@@ -39,12 +41,18 @@
|
|||||||
"NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера.";
|
"NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера.";
|
||||||
"PersistentProgressBar" = "Всегда отображать прогресс-бар";
|
"PersistentProgressBar" = "Всегда отображать прогресс-бар";
|
||||||
"PersistentProgressBarDesc" = "Всегда отображает прогресс-бар внутри плеера.";
|
"PersistentProgressBarDesc" = "Всегда отображает прогресс-бар внутри плеера.";
|
||||||
|
"StockVolumeHUD" = "Системный уровень громкости";
|
||||||
|
"StockVolumeHUDDesc" = "Отображает системную шкалу громкости в полноэкранном режиме.";
|
||||||
"NoRelatedVids" = "Скрыть рекомендации в оверлее";
|
"NoRelatedVids" = "Скрыть рекомендации в оверлее";
|
||||||
"NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере.";
|
"NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере.";
|
||||||
"NoPromotionCards" = "Скрыть сообщение «Есть реклама»";
|
"NoPromotionCards" = "Скрыть сообщение «Есть реклама»";
|
||||||
"NoPromotionCardsDesc" = "Скрывает всплывающее сообщение «Есть реклама» в роликах со спонсорской рекламой.";
|
"NoPromotionCardsDesc" = "Скрывает всплывающее сообщение «Есть реклама» в роликах со спонсорской рекламой.";
|
||||||
"NoWatermarks" = "Скрыть водяные знаки";
|
"NoWatermarks" = "Скрыть водяные знаки";
|
||||||
"NoWatermarksDesc" = "Скрывает значки каналов в плеере.";
|
"NoWatermarksDesc" = "Скрывает значки каналов в плеере.";
|
||||||
|
"VideoEndTime" = "Показывать время окончания";
|
||||||
|
"VideoEndTimeDesc" = "Отображает, в каком часу закончится ролик.";
|
||||||
|
"24hrFormat" = "24-часовой формат";
|
||||||
|
"24hrFormatDesc" = "Отображает время окончания в 24-часовом формате.";
|
||||||
|
|
||||||
"Player" = "Настройки плеера";
|
"Player" = "Настройки плеера";
|
||||||
"Miniplayer" = "Разрешить миниплеер";
|
"Miniplayer" = "Разрешить миниплеер";
|
||||||
@@ -65,8 +73,18 @@
|
|||||||
"ExtraSpeedOptionsDesc" = "Добавляет больше опций скорости воспроизведения в выпадающее меню плеера.";
|
"ExtraSpeedOptionsDesc" = "Добавляет больше опций скорости воспроизведения в выпадающее меню плеера.";
|
||||||
"DontSnap2Chapter" = "Не перематывать эпизоды";
|
"DontSnap2Chapter" = "Не перематывать эпизоды";
|
||||||
"DontSnap2ChapterDesc" = "Отключает жест перемотки к следующему эпизоду двойным нажатием.";
|
"DontSnap2ChapterDesc" = "Отключает жест перемотки к следующему эпизоду двойным нажатием.";
|
||||||
|
"NoTwoFingerSnapToChapter" = "Отключить касание двумя пальцами";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "Отключает жест перемотки эпизодов двойным нажатием двумя пальцами.";
|
||||||
|
"PauseOnOverlay" = "Ставить на паузу с оверлеем";
|
||||||
|
"PauseOnOverlayDesc" = "Приостанавливает воспроизведение при появлении кнопок управления плеером.";
|
||||||
"RedProgressBar" = "Красный прогресс-бар";
|
"RedProgressBar" = "Красный прогресс-бар";
|
||||||
"RedProgressBarDesc" = "Возвращает красный прогресс-бар вместо нового, серого цвета.";
|
"RedProgressBarDesc" = "Возвращает красный прогресс-бар вместо нового, серого цвета.";
|
||||||
|
"NoPlayerRemixButton" = "Убрать кнопку «Ремикс»";
|
||||||
|
"NoPlayerRemixButtonDesc" = "Убирает кнопку «Ремикс» под плеером.";
|
||||||
|
"NoPlayerClipButton" = "Убрать кнопку «Создать клип»";
|
||||||
|
"NoPlayerClipButtonDesc" = "Убирает кнопку «Создать клип» под плеером.";
|
||||||
|
"NoPlayerDownloadButton" = "Убрать кнопку «Скачать»";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "Убирает кнопку «Скачать» под плеером.";
|
||||||
"NoHints" = "Отключить подсказки";
|
"NoHints" = "Отключить подсказки";
|
||||||
"NoHintsDesc" = "Скрывает подсказки от авторов видео, появляющиеся в правом верхнем углу.";
|
"NoHintsDesc" = "Скрывает подсказки от авторов видео, появляющиеся в правом верхнем углу.";
|
||||||
"NoFreeZoom" = "Отключить жесты для зума";
|
"NoFreeZoom" = "Отключить жесты для зума";
|
||||||
@@ -94,11 +112,13 @@
|
|||||||
"HideUploadButton" = "Скрыть «Создать» (+)";
|
"HideUploadButton" = "Скрыть «Создать» (+)";
|
||||||
"HideUploadButtonDesc" = "Скрывает кнопку «Создать» с панели вкладок.";
|
"HideUploadButtonDesc" = "Скрывает кнопку «Создать» с панели вкладок.";
|
||||||
"HideLibraryTab" = "Скрыть «Библиотеку»";
|
"HideLibraryTab" = "Скрыть «Библиотеку»";
|
||||||
"HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок.";
|
"HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок.\n\nДанную вкладку можно восстановить долгим нажатием по вкладке «Главная»";
|
||||||
|
|
||||||
"Shorts" = "Настройки Shorts";
|
"Shorts" = "Настройки Shorts";
|
||||||
"ShortsOnlyMode" = "Режим Shorts";
|
"ShortsOnlyMode" = "Режим Shorts";
|
||||||
"ShortsOnlyModeDesc" = "Ограничивает функциональность YouTube до отображения видеороликов Shorts";
|
"ShortsOnlyModeDesc" = "Ограничивает функциональность YouTube до отображения видеороликов Shorts";
|
||||||
|
"AutoSkipShorts" = "Автопереход к следующему";
|
||||||
|
"AutoSkipShortsDesc" = "Переключается на следующий Shorts по окончанию воспроизведения.";
|
||||||
"HideShorts" = "Скрыть видеоролики Shorts";
|
"HideShorts" = "Скрыть видеоролики Shorts";
|
||||||
"HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)";
|
"HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)";
|
||||||
"ShortsProgress" = "Показывать прогресс-бар";
|
"ShortsProgress" = "Показывать прогресс-бар";
|
||||||
@@ -147,16 +167,30 @@
|
|||||||
"CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео.";
|
"CopyVideoInfoDesc" = "Добавляет кнопку для копирования названия и описания видео в панель описания видео.";
|
||||||
"PostManager" = "Сохранять информацию с постов";
|
"PostManager" = "Сохранять информацию с постов";
|
||||||
"PostManagerDesc" = "Позволяет скопировать текст из поста или сохранить пост как фото долгим нажатием по нему.";
|
"PostManagerDesc" = "Позволяет скопировать текст из поста или сохранить пост как фото долгим нажатием по нему.";
|
||||||
"SavePostImage" = "Сохранять изображения постов";
|
|
||||||
"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним.";
|
|
||||||
"SaveProfilePhoto" = "Сохранять фото профиля";
|
"SaveProfilePhoto" = "Сохранять фото профиля";
|
||||||
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
|
"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему.";
|
||||||
"CopyCommentText" = "Копировать текст комментариев";
|
"CommentManager" = "Сохранять информацию с комментариев";
|
||||||
"CopyCommentTextDesc" = "Копирует текст комментариев в буфер обмена долгим нажатием.";
|
"CommentManagerDesc" = "Позволяет скопировать текст из комментария или сохранить комментарий как фото долгим нажатием по нему.";
|
||||||
|
"NativeShare" = "Системное меню «Поделиться»";
|
||||||
|
"NativeShareDesc" = "Выводит системное меню «Поделиться» при отправке контента.";
|
||||||
"FixAlbums" = "Исправить отображение обложек";
|
"FixAlbums" = "Исправить отображение обложек";
|
||||||
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
|
"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России.";
|
||||||
"RemovePlayNext" = "Убрать «Добавить в начало очереди»";
|
"RemovePlayNext" = "Убрать «Добавить в начало очереди»";
|
||||||
"RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео.";
|
"RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео.";
|
||||||
|
"RemoveDownloadMenu" = "Убрать «Скачать»";
|
||||||
|
"RemoveDownloadMenuDesc" = "Убирает «Скачать» из меню видео.";
|
||||||
|
"RemoveWatchLaterMenu" = "Убрать «Смотреть позже»";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "Убирает «Смотреть позже» из меню видео.";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "Убрать «Добавить в плейлист»";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "Убирает «Добавить в плейлист» из меню видео.";
|
||||||
|
"RemoveShareMenu" = "Убрать «Поделиться»";
|
||||||
|
"RemoveShareMenuDesc" = "Убирает «Поделиться» из меню видео.";
|
||||||
|
"RemoveNotInterestedMenu" = "Убрать «Не интересует»";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "Убирает «Не интересует» из меню видео.";
|
||||||
|
"RemoveDontRecommendMenu" = "Убрать «Не рекомендовать»";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "Убирает «Не рекомендовать видео с этого канала» из меню видео.";
|
||||||
|
"RemoveReportMenu" = "Убрать «Пожаловаться»";
|
||||||
|
"RemoveReportMenuDesc" = "Убирает «Пожаловаться» из меню видео.";
|
||||||
"NoContinueWatching" = "Отключить «Продолжить просмотр»";
|
"NoContinueWatching" = "Отключить «Продолжить просмотр»";
|
||||||
"NoContinueWatchingDesc" = "Удаляет блок «Продолжить просмотр» содержащий недосмотренные видео с Главной страницы.";
|
"NoContinueWatchingDesc" = "Удаляет блок «Продолжить просмотр» содержащий недосмотренные видео с Главной страницы.";
|
||||||
"NoSearchHistory" = "Скрыть историю поиска";
|
"NoSearchHistory" = "Скрыть историю поиска";
|
||||||
@@ -172,6 +206,19 @@
|
|||||||
"DisableRTL" = "Запретить формат «справа налево»";
|
"DisableRTL" = "Запретить формат «справа налево»";
|
||||||
"DisableRTLDesc" = "Принудительно отображает текст в формате слева направо для языков, изначально отображающихся в формате справа налево.";
|
"DisableRTLDesc" = "Принудительно отображает текст в формате слева направо для языков, изначально отображающихся в формате справа налево.";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "Ускорение долгим нажатием";
|
||||||
|
"Disable" = "Отключено";
|
||||||
|
"Disabled" = "Отключить";
|
||||||
|
"PlaybackSpeed" = "Скорость воспроизведения";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "Скорость воспроизведения по умолчанию";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "Качество по WiFi";
|
||||||
|
"PlaybackQualityOnCellular" = "Качество по мобильной сети";
|
||||||
|
"SelectQuality" = "Выберите качество";
|
||||||
|
"Default" = "По умолчанию";
|
||||||
|
"Best" = "Лучшее";
|
||||||
|
|
||||||
"Startup" = "Начальная страница";
|
"Startup" = "Начальная страница";
|
||||||
"Home" = "Главная";
|
"Home" = "Главная";
|
||||||
"Explore" = "Навигация";
|
"Explore" = "Навигация";
|
||||||
@@ -181,12 +228,15 @@
|
|||||||
"Warning" = "Внимание";
|
"Warning" = "Внимание";
|
||||||
"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы";
|
"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы";
|
||||||
|
|
||||||
"DonateViaPayPal" = "Задонатить на PayPal";
|
"SupportDevelopment" = "Помочь с развитием проекта";
|
||||||
"SupportViaGhSponsors" = "Поддержать разработку в Github Sponsors";
|
"SupportDevelopmentDesc" = "Если вам понравился YTLite и вы хотели бы поддержать проект, то можете сделать это любым подходящим ниже способом.\nСпасибо❤";
|
||||||
|
"Contributors" = "О нас";
|
||||||
|
"OpenSourceLibs" = "Библиотеки с исходным кодом";
|
||||||
"Version" = "Версия";
|
"Version" = "Версия";
|
||||||
"About" = "О твике";
|
"About" = "О твике";
|
||||||
"Credits" = "Авторы";
|
"Credits" = "Авторы";
|
||||||
"Developer" = "Разработчик твика";
|
"Developer" = "Разработчик твика";
|
||||||
|
"SpecialThanks" = "Особая благодарность";
|
||||||
"ChineseSimplified" = "Китайская (упрощенная) локализация";
|
"ChineseSimplified" = "Китайская (упрощенная) локализация";
|
||||||
"ChineseTraditional" = "Китайская (традиционная) локализация";
|
"ChineseTraditional" = "Китайская (традиционная) локализация";
|
||||||
"French" = "Французская локализация";
|
"French" = "Французская локализация";
|
||||||
@@ -194,21 +244,31 @@
|
|||||||
"Japanese" = "Японская локализация";
|
"Japanese" = "Японская локализация";
|
||||||
"Vietnamese" = "Вьетнамская локализация";
|
"Vietnamese" = "Вьетнамская локализация";
|
||||||
"Advanced" = "Расширенный режим";
|
"Advanced" = "Расширенный режим";
|
||||||
|
"AdvancedDesc" = "Более настраиваемый режим";
|
||||||
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@.";
|
||||||
"ClearCache" = "Очистить кеш";
|
"ClearCache" = "Очистить кеш";
|
||||||
"ResetSettings" = "Сбросить настройки твика";
|
"ResetSettings" = "Сбросить настройки твика";
|
||||||
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
|
"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?";
|
||||||
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
|
"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами.";
|
||||||
"ShortsModeTurnedOff" = "Режим Shorts был отключен";
|
"ShortsModeTurnedOff" = "Режим Shorts был отключен";
|
||||||
|
"LibraryAdded" = "Вкладка «Вы»/«Библиотека» восстановлена";
|
||||||
|
"LibraryRemoved" = "Вкладка «Вы»/«Библиотека» удалена";
|
||||||
"Yes" = "Да";
|
"Yes" = "Да";
|
||||||
"No" = "Нет";
|
"No" = "Нет";
|
||||||
|
|
||||||
"SelectAction" = "Выберите действие";
|
"SelectAction" = "Выберите действие";
|
||||||
"CopyTitle" = "Скопировать название";
|
"CopyTitle" = "Скопировать название";
|
||||||
"CopyDescription" = "Скопировать описание";
|
"CopyDescription" = "Скопировать описание";
|
||||||
"CopyPostText" = "Копировать текст поста";
|
"CopyPostText" = "Скопировать текст поста";
|
||||||
|
"SaveCurrentImage" = "Сохранить данное фото";
|
||||||
|
"CopyCurrentImage" = "Скопировать данное фото";
|
||||||
"SavePostAsImage" = "Сохранить пост как фото";
|
"SavePostAsImage" = "Сохранить пост как фото";
|
||||||
"CopyPostAsImage" = "Скопировать пост как фото";
|
"CopyPostAsImage" = "Скопировать пост как фото";
|
||||||
|
"CopyCommentText" = "Скопировать текст комментария";
|
||||||
|
"SaveCommentAsImage" = "Сохранить комментарий как фото";
|
||||||
|
"CopyCommentAsImage" = "Скопировать комментарий как фото";
|
||||||
|
"SaveProfilePicture" = "Сохранить фото профиля";
|
||||||
|
"CopyProfilePicture" = "Скопировать фото профиля";
|
||||||
"Cancel" = "Отмена";
|
"Cancel" = "Отмена";
|
||||||
"Copied" = "Скопировано в буфер обмена";
|
"Copied" = "Скопировано в буфер обмена";
|
||||||
"Saved" = "Сохранено в Фото";
|
"Saved" = "Сохранено в Фото";
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 5.8 KiB |
@@ -1,8 +1,8 @@
|
|||||||
"General" = "Chung";
|
"General" = "Chung";
|
||||||
"RemoveAds" = "Loại bỏ các quảng cáo";
|
"RemoveAds" = "Loại bỏ các quảng cáo";
|
||||||
"RemoveAdsDesc" = "Loại bỏ quảng cáo trong ứng dụng.";
|
"RemoveAdsDesc" = "Loại bỏ quảng cáo trong ứng dụng.";
|
||||||
"BackgroundPlayback" = "Phát lại ở chế độ nền";
|
"BackgroundPlayback" = "Phát ở chế độ nền";
|
||||||
"BackgroundPlaybackDesc" = "Cho phép phát lại ở chế độ nền.";
|
"BackgroundPlaybackDesc" = "Cho phép phát ở chế độ nền.";
|
||||||
|
|
||||||
"Navbar" = "Thanh điều hướng";
|
"Navbar" = "Thanh điều hướng";
|
||||||
"RemoveCast" = "Ẩn nút Cast";
|
"RemoveCast" = "Ẩn nút Cast";
|
||||||
@@ -18,14 +18,16 @@
|
|||||||
"NoSubbar" = "Ẩn thanh phụ";
|
"NoSubbar" = "Ẩn thanh phụ";
|
||||||
"NoSubbarDesc" = "Ẩn Thanh phụ (Tất cả, Mới đối với bạn, Trực tiếp, v.v.) dưới thanh Điều hướng.";
|
"NoSubbarDesc" = "Ẩn Thanh phụ (Tất cả, Mới đối với bạn, Trực tiếp, v.v.) dưới thanh Điều hướng.";
|
||||||
"NoYTLogo" = "Xóa biểu tượng YouTube";
|
"NoYTLogo" = "Xóa biểu tượng YouTube";
|
||||||
"NoYTLogoDesc" = "Xóa logo YouTube trong thanh Điều hướng.";
|
"NoYTLogoDesc" = "Xóa biểu tượng YouTube trong thanh Điều hướng.";
|
||||||
|
"PremiumYTLogo" = "Đặt biểu tượng YouTube Premium";
|
||||||
|
"PremiumYTLogoDesc" = "Đặt biểu tượng YouTube Premium trong thanh Điều hướng.";
|
||||||
|
|
||||||
"Overlay" = "Lớp phủ";
|
"Overlay" = "Lớp phủ";
|
||||||
"HideAutoplay" = "Ẩn công tắc Tự động phát";
|
"HideAutoplay" = "Ẩn nút Tự động phát";
|
||||||
"HideAutoplayDesc" = "Ẩn công tắc Tự động phát khỏi lớp phủ.";
|
"HideAutoplayDesc" = "Ẩn nút Tự động phát trong trình phát video.";
|
||||||
"HideSubs" = "Ẩn nút phụ đề";
|
"HideSubs" = "Ẩn nút phụ đề";
|
||||||
"HideSubsDesc" = "Ẩn nút Phụ đề khỏi lớp phủ.";
|
"HideSubsDesc" = "Ẩn nút Phụ đề khỏi lớp phủ.";
|
||||||
"NoHUDMsgs" = "Ẩn tin nhắn HUD";
|
"NoHUDMsgs" = "Ẩn thông báo HUD";
|
||||||
"NoHUDMsgsDesc" = "Ẩn tất cả các thông báo tính năng từ người chơi. Ví dụ: CC được bật/tắt, Vòng lặp video được bật, v.v.";
|
"NoHUDMsgsDesc" = "Ẩn tất cả các thông báo tính năng từ người chơi. Ví dụ: CC được bật/tắt, Vòng lặp video được bật, v.v.";
|
||||||
"HidePrevNext" = "Ẩn nút Trước và Tiếp theo";
|
"HidePrevNext" = "Ẩn nút Trước và Tiếp theo";
|
||||||
"HidePrevNextDesc" = "Ẩn các nút Trước và Tiếp theo khỏi lớp phủ video.";
|
"HidePrevNextDesc" = "Ẩn các nút Trước và Tiếp theo khỏi lớp phủ video.";
|
||||||
@@ -39,44 +41,60 @@
|
|||||||
"NoFullscreenActionsDesc" = "Vô hiệu hóa bảng hành động ở chế độ toàn màn hình.";
|
"NoFullscreenActionsDesc" = "Vô hiệu hóa bảng hành động ở chế độ toàn màn hình.";
|
||||||
"PersistentProgressBar" = "Thanh tiến trình liên tục";
|
"PersistentProgressBar" = "Thanh tiến trình liên tục";
|
||||||
"PersistentProgressBarDesc" = "Luôn hiển thị thanh tiến trình trong trình phát.";
|
"PersistentProgressBarDesc" = "Luôn hiển thị thanh tiến trình trong trình phát.";
|
||||||
|
"StockVolumeHUD" = "Sử dụng thanh âm lượng mặc định của iOS";
|
||||||
|
"StockVolumeHUDDesc" = "Sử dụng thanh âm lượng mặc định ở chế độ toàn màn hình.";
|
||||||
"NoRelatedVids" = "Không có video liên quan trong lớp phủ";
|
"NoRelatedVids" = "Không có video liên quan trong lớp phủ";
|
||||||
"NoRelatedVidsDesc" = "Xóa các video liên quan được hiển thị trong lớp phủ bằng cách vuốt lên.";
|
"NoRelatedVidsDesc" = "Xóa các video liên quan được hiển thị trong lớp phủ bằng cách vuốt lên.";
|
||||||
"NoPromotionCards" = "Ẩn thẻ Quảng cáo trả phí";
|
"NoPromotionCards" = "Ẩn thẻ Quảng cáo trả phí";
|
||||||
"NoPromotionCardsDesc" = "Ẩn thẻ \"Bao gồm quảng cáo trả phí\" trong các video có quảng cáo.";
|
"NoPromotionCardsDesc" = "Ẩn thẻ \"Bao gồm quảng cáo trả phí\" trong các video có quảng cáo.";
|
||||||
"NoWatermarks" = "Ẩn hình mờ";
|
"NoWatermarks" = "Ẩn watermark của kênh";
|
||||||
"NoWatermarksDesc" = "Ẩn hình mờ kênh khỏi trình phát.";
|
"NoWatermarksDesc" = "Ẩn watermark của kênh trong video. Yêu cầu khởi động lại ứng dụng.";
|
||||||
|
"VideoEndTime" = "Hiển thị thời gian kết thúc phát";
|
||||||
|
"VideoEndTimeDesc" = "Thêm thời gian kết thúc phát video vào thanh trình phát.";
|
||||||
|
"24hrFormat" = "định dạng 24 giờ";
|
||||||
|
"24hrFormatDesc" = "Hiển thị thời gian kết thúc ở định dạng 24 giờ.";
|
||||||
|
|
||||||
"Player" = "Trình phát";
|
"Player" = "Trình phát";
|
||||||
"Miniplayer" = "Bật trình phát mini";
|
"Miniplayer" = "Cho phép sử dụng trình phát thu nhỏ với mọi video";
|
||||||
"MiniplayerDesc" = "Bật trình phát mini cho các video ban đầu không được thiết kế cho trình phát đó, chẳng hạn như các video dành cho trẻ em.";
|
"MiniplayerDesc" = "Cho phép sử dụng trình phát thu nhỏ với mọi video ban đầu không được thiết kế cho trình phát đó, chẳng hạn như các video dành cho trẻ em.";
|
||||||
"PortraitFullscreen" = "Chế độ toàn màn hình dọc";
|
"PortraitFullscreen" = "Chế độ toàn màn hình dọc";
|
||||||
"PortraitFullscreenDesc" = "Cho phép hỗ trợ chế độ toàn màn hình dọc.";
|
"PortraitFullscreenDesc" = "Cho phép hỗ trợ chế độ toàn màn hình dọc.";
|
||||||
"CopyWithTimestamp" = "Sao chép các liên kết có dấu thời gian";
|
"CopyWithTimestamp" = "Sao chép các liên kết có dấu thời gian";
|
||||||
"CopyWithTimestampDesc" = "Cho phép sao chép liên kết có dấu thời gian vào bảng tạm bằng cách nhấn nút tạm dừng.";
|
"CopyWithTimestampDesc" = "Cho phép sao chép liên kết có dấu thời gian vào bảng tạm bằng cách nhấn nút tạm dừng.";
|
||||||
"DisableAutoplay" = "Tắt video Tự động phát";
|
"DisableAutoplay" = "Tắt video Tự động phát";
|
||||||
"DisableAutoplayDesc" = "Ngăn chặn phát lại video sau khi mở.";
|
"DisableAutoplayDesc" = "Ngăn chặn phát video sau khi mở.";
|
||||||
"DisableAutoCaptions" = "Tắt phụ đề tự động";
|
"DisableAutoCaptions" = "Tắt chú thích tự động";
|
||||||
"DisableAutoCaptionsDesc" = "Ngăn chặn việc tự động kích hoạt phụ đề.";
|
"DisableAutoCaptionsDesc" = "Ngăn chặn việc tự động kích hoạt chú thích.";
|
||||||
"NoContentWarning" = "Bỏ qua cảnh báo nội dung";
|
"NoContentWarning" = "Bỏ qua cảnh báo nội dung";
|
||||||
"NoContentWarningDesc" = "Bỏ qua thông báo cảnh báo nội dung nhạy cảm.";
|
"NoContentWarningDesc" = "Bỏ qua thông báo cảnh báo nội dung nhạy cảm.";
|
||||||
"ClassicQuality" = "Chất lượng video cổ điển";
|
"ClassicQuality" = "Chất lượng video cổ điển";
|
||||||
"ClassicQualityDesc" = "Mang lại menu lựa chọn chất lượng video cổ điển.";
|
"ClassicQualityDesc" = "Mang lại menu lựa chọn chất lượng video cổ điển.";
|
||||||
"ExtraSpeedOptions" = "Bổ sung tùy chọn tốc độ";
|
"ExtraSpeedOptions" = "Bổ sung tùy chọn tốc độ";
|
||||||
"ExtraSpeedOptionsDesc" = "Thêm nhiều tùy chọn tốc độ phát lại video vào menu trình phát.";
|
"ExtraSpeedOptionsDesc" = "Thêm nhiều tùy chọn tốc độ phát video vào menu trình phát.";
|
||||||
"DontSnap2Chapter" = "Tắt tính năng chuyển sang tập tiếp theo";
|
"DontSnap2Chapter" = "Tắt tự động chuyển tới chương";
|
||||||
"DontSnap2ChapterDesc" = "Vô hiệu hóa việc chuyển sang tập tiếp theo bằng cử chỉ nhấn đúp.";
|
"DontSnap2ChapterDesc" = "Tắt tính năng tự động chuyển tới chương gần nhất khi tua video.";
|
||||||
|
"NoTwoFingerSnapToChapter" = "Tắt tính năng chạm 2 lần bằng 2 ngón tay";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "Tắt thao tác chạm 2 lần bằng 2 ngón tay để chuyển tới chương.";
|
||||||
|
"PauseOnOverlay" = "Tạm dừng trên lớp phủ";
|
||||||
|
"PauseOnOverlayDesc" = "Đặt chế độ phát ở trạng thái tạm dừng nếu lớp phủ xuất hiện.";
|
||||||
"RedProgressBar" = "Thanh tiến trình màu đỏ";
|
"RedProgressBar" = "Thanh tiến trình màu đỏ";
|
||||||
"RedProgressBarDesc" = "Mang lại thanh tiến trình màu đỏ.";
|
"RedProgressBarDesc" = "Mang lại thanh tiến trình màu đỏ.";
|
||||||
|
"NoPlayerRemixButton" = "Xóa nút phối lại";
|
||||||
|
"NoPlayerRemixButtonDesc" = "Xóa nút phối lại bên dưới trình phát.";
|
||||||
|
"NoPlayerClipButton" = "Xóa nút clip";
|
||||||
|
"NoPlayerClipButtonDesc" = "Xóa nút clip bên dưới trình phát.";
|
||||||
|
"NoPlayerDownloadButton" = "Xóa nút tải xuống";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "Xóa nút tải xuống dưới trình phát.";
|
||||||
"NoHints" = "Tắt gợi ý";
|
"NoHints" = "Tắt gợi ý";
|
||||||
"NoHintsDesc" = "Tắt gợi ý của tác giả xuất hiện ở góc trên bên phải trong khi phát lại.";
|
"NoHintsDesc" = "Tắt gợi ý của tác giả xuất hiện ở góc trên bên phải trong khi phát.";
|
||||||
"NoFreeZoom" = "Tắt cử chỉ thu phóng";
|
"NoFreeZoom" = "Tắt tính năng chạm để thu phóng";
|
||||||
"NoFreeZoomDesc" = "Tắt các cử chỉ thu phóng mới.";
|
"NoFreeZoomDesc" = "Tắt tính năng chạm để thu phóng";
|
||||||
"AutoFullscreen" = "Phát video ở chế độ toàn màn hình";
|
"AutoFullscreen" = "Phát video ở chế độ toàn màn hình";
|
||||||
"AutoFullscreenDesc" = "Tự động phát video ở chế độ toàn màn hình.";
|
"AutoFullscreenDesc" = "Tự động phát video ở chế độ toàn màn hình.";
|
||||||
"ExitFullscreen" = "Thoát chế độ toàn màn hình khi hoàn tất";
|
"ExitFullscreen" = "Thoát chế độ toàn màn hình khi hoàn tất";
|
||||||
"ExitFullscreenDesc" = "Thoát khỏi chế độ toàn màn hình khi kết thúc phát video.";
|
"ExitFullscreenDesc" = "Thoát khỏi chế độ toàn màn hình khi kết thúc phát video.";
|
||||||
"NoDoubleTap2Seek" = "Tắt tính năng nhấn đúp để tìm kiếm";
|
"NoDoubleTap2Seek" = "Tắt tình năng chạm 2 lần để tua";
|
||||||
"NoDoubleTap2SeekDesc" = "Tắt cử chỉ nhấn đúp để tìm kiếm.";
|
"NoDoubleTap2SeekDesc" = "Tắt tình năng chạm 2 lần để tua";
|
||||||
|
|
||||||
"Tabbar" = "Thanh tab";
|
"Tabbar" = "Thanh tab";
|
||||||
"RemoveLabels" = "Xóa nhãn";
|
"RemoveLabels" = "Xóa nhãn";
|
||||||
@@ -94,11 +112,13 @@
|
|||||||
"HideUploadButton" = "Ẩn nút Tải lên";
|
"HideUploadButton" = "Ẩn nút Tải lên";
|
||||||
"HideUploadButtonDesc" = "Ẩn nút Tải lên khỏi thanh Tab.";
|
"HideUploadButtonDesc" = "Ẩn nút Tải lên khỏi thanh Tab.";
|
||||||
"HideLibraryTab" = "Ẩn tab Thư viện";
|
"HideLibraryTab" = "Ẩn tab Thư viện";
|
||||||
"HideLibraryTabDesc" = "Ẩn tab Thư viện khỏi thanh Tab.";
|
"HideLibraryTabDesc" = "Ẩn tab Thư viện khỏi thanh tab.\n\nTab này có thể được khôi phục bằng cách nhấn và giữ tab Trang chủ.";
|
||||||
|
|
||||||
"Shorts" = "Shorts";
|
"Shorts" = "Shorts";
|
||||||
"ShortsOnlyMode" = "Chế độ chỉ dành cho Short";
|
"ShortsOnlyMode" = "Chế độ chỉ dành cho Short";
|
||||||
"ShortsOnlyModeDesc" = "Giới hạn chức năng của YouTube chỉ ở chế độ Short.";
|
"ShortsOnlyModeDesc" = "Giới hạn chức năng của YouTube chỉ ở chế độ Short.";
|
||||||
|
"AutoSkipShorts" = "Tự động bỏ qua Shorts";
|
||||||
|
"AutoSkipShortsDesc" = "Chuyển sang video tiếp theo khi quá trình phát video hiện tại kết thúc.";
|
||||||
"HideShorts" = "Ẩn Shorts";
|
"HideShorts" = "Ẩn Shorts";
|
||||||
"HideShortsDesc" = "Ẩn Shorts khỏi Trang chủ, Được đề xuất, v.v. (Không áp dụng cho Lịch sử xem)";
|
"HideShortsDesc" = "Ẩn Shorts khỏi Trang chủ, Được đề xuất, v.v. (Không áp dụng cho Lịch sử xem)";
|
||||||
"ShortsProgress" = "Bật thanh tiến trình";
|
"ShortsProgress" = "Bật thanh tiến trình";
|
||||||
@@ -107,8 +127,8 @@
|
|||||||
"PinchToFullscreenShortsDesc" = "Quản lý khả năng hiển thị của lớp phủ bằng cử chỉ chụm vào và kéo ra, hiển thị Shorts ở chế độ toàn màn hình.";
|
"PinchToFullscreenShortsDesc" = "Quản lý khả năng hiển thị của lớp phủ bằng cử chỉ chụm vào và kéo ra, hiển thị Shorts ở chế độ toàn màn hình.";
|
||||||
"ShortsToRegular" = "Từ Shorts đến video thông thường";
|
"ShortsToRegular" = "Từ Shorts đến video thông thường";
|
||||||
"ShortsToRegularDesc" = "Mở Shorts như video thông thường.";
|
"ShortsToRegularDesc" = "Mở Shorts như video thông thường.";
|
||||||
"ResumeShorts" = "Đừng bắt đầu từ tab Shorts";
|
"ResumeShorts" = "Tắt tính năng tự động tiếp tục Shorts";
|
||||||
"ResumeShortsDesc" = "Ngăn chặn việc bắt đầu từ Shorts ở ứng dụng đang mở, điều này xảy ra nếu YouTube bị đóng trong khi xem Shorts.";
|
"ResumeShortsDesc" = "Nếu bạn thoát YouTube trong khi đang xem video Shorts, video Shorts đó sẽ không tự động phát khi bạn mở lại YouTube.";
|
||||||
"HideShortsLogo" = "Ẩn biểu tượng Shorts";
|
"HideShortsLogo" = "Ẩn biểu tượng Shorts";
|
||||||
"HideShortsLogoDesc" = "Ẩn biểu tượng Shorts ở góc trên cùng bên trái.";
|
"HideShortsLogoDesc" = "Ẩn biểu tượng Shorts ở góc trên cùng bên trái.";
|
||||||
"HideShortsSearch" = "Ẩn nút Tìm kiếm";
|
"HideShortsSearch" = "Ẩn nút Tìm kiếm";
|
||||||
@@ -145,18 +165,32 @@
|
|||||||
"Other" = "Khác";
|
"Other" = "Khác";
|
||||||
"CopyVideoInfo" = "Sao chép thông tin video";
|
"CopyVideoInfo" = "Sao chép thông tin video";
|
||||||
"CopyVideoInfoDesc" = "Thêm nút để sao chép tiêu đề và mô tả video vào bảng Mô tả Video.";
|
"CopyVideoInfoDesc" = "Thêm nút để sao chép tiêu đề và mô tả video vào bảng Mô tả Video.";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "Lưu bài đăng";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "Cho phép sao chép văn bản bài đăng và lưu bài đăng dưới dạng hình ảnh bằng cách nhấn giữ.";
|
||||||
"SavePostImage" = "Lưu hình ảnh từ bài đăng trên cộng đồng";
|
|
||||||
"SavePostImageDesc" = "Lưu hình ảnh bài đăng của cộng đồng vào ứng dụng Ảnh bằng cách nhấn giữ.";
|
|
||||||
"SaveProfilePhoto" = "Lưu ảnh hồ sơ";
|
"SaveProfilePhoto" = "Lưu ảnh hồ sơ";
|
||||||
"SaveProfilePhotoDesc" = "Lưu ảnh hồ sơ vào ứng dụng Ảnh bằng cách nhấn và giữ.";
|
"SaveProfilePhotoDesc" = "Lưu ảnh hồ sơ vào ứng dụng Ảnh bằng cách nhấn và giữ.";
|
||||||
"CopyCommentText" = "Sao chép văn bản bình luận";
|
"CommentManager" = "Lưu bình luận";
|
||||||
"CopyCommentTextDesc" = "Sao chép văn bản nhận xét vào clipboard bằng cách nhấn giữ.";
|
"CommentManagerDesc" = "Cho phép sao chép văn bản bình luận và lưu bình luận dưới dạng hình ảnh bằng cách nhấn giữ.";
|
||||||
"FixAlbums" = "Sửa Albums";
|
"FixAlbums" = "Sửa Albums";
|
||||||
"FixAlbumsDesc" = "Sửa lỗi hiển thị Albums cho người dùng Nga.";
|
"FixAlbumsDesc" = "Sửa lỗi hiển thị Albums cho người dùng Nga.";
|
||||||
"RemovePlayNext" = "Xóa \"Chơi tiếp theo trong hàng đợi\"";
|
"NativeShare" = "Bảng chia sẻ gốc";
|
||||||
"RemovePlayNextDesc" = "Xóa tùy chọn \"Chơi tiếp theo trong hàng đợi\" khỏi menu.";
|
"NativeShareDesc" = "Sử dụng bảng chia sẻ hệ thống để chia sẻ phương tiện";
|
||||||
|
"RemovePlayNext" = "Xóa \"Phát tiếp theo trong danh sách chờ\"";
|
||||||
|
"RemovePlayNextDesc" = "Xóa tùy chọn \"Phát tiếp theo trong danh sách chờ\" khỏi menu.";
|
||||||
|
"RemoveDownloadMenu" = "Xóa \"Tải video xuống\"";
|
||||||
|
"RemoveDownloadMenuDesc" = "Xóa tùy chọn \"Tải video xuống\" khỏi menu.";
|
||||||
|
"RemoveWatchLaterMenu" = "Xóa \"Lưu vào danh sách Xem sau\"";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "Xóa tùy chọn \"Lưu vào danh sách Xem sau\" khỏi menu.";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "Xóa \"Lưu vào danh sách phát\"";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "Xóa tùy chọn \"Lưu vào danh sách phát\" khỏi menu.";
|
||||||
|
"RemoveShareMenu" = "Xóa \"Chia sẻ\"";
|
||||||
|
"RemoveShareMenuDesc" = "Xóa tùy chọn \"Chia sẻ\" khỏi menu.";
|
||||||
|
"RemoveNotInterestedMenu" = "Xóa \"Không quan tâm\"";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "Xóa tùy chọn \"Không quan tâm\" khỏi menu.";
|
||||||
|
"RemoveDontRecommendMenu" = "Xóa \"Không đề xuất kênh này\"";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "Xóa tùy chọn \"Không đề xuất kênh này\" khỏi menu.";
|
||||||
|
"RemoveReportMenu" = "Xóa \"Báo vi phạm\"";
|
||||||
|
"RemoveReportMenuDesc" = "Xóa tùy chọn \"Báo vi phạm\" khỏi menu.";
|
||||||
"NoContinueWatching" = "Xóa \"Tiếp tục xem\"";
|
"NoContinueWatching" = "Xóa \"Tiếp tục xem\"";
|
||||||
"NoContinueWatchingDesc" = "Xóa phần \"Tiếp tục xem\" chứa các video chưa xem hết khỏi Trang chủ.";
|
"NoContinueWatchingDesc" = "Xóa phần \"Tiếp tục xem\" chứa các video chưa xem hết khỏi Trang chủ.";
|
||||||
"NoSearchHistory" = "Ẩn lịch sử tìm kiếm";
|
"NoSearchHistory" = "Ẩn lịch sử tìm kiếm";
|
||||||
@@ -165,13 +199,26 @@
|
|||||||
"NoRelatedWatchNextsDesc" = "Ẩn tất cả video bên dưới trình phát, chỉ để lại phần thông tin video và nhận xét.";
|
"NoRelatedWatchNextsDesc" = "Ẩn tất cả video bên dưới trình phát, chỉ để lại phần thông tin video và nhận xét.";
|
||||||
"StickSortComments" = "Dán tiêu đề bình luận";
|
"StickSortComments" = "Dán tiêu đề bình luận";
|
||||||
"StickSortCommentsDesc" = "Ghim sắp xếp tiêu đề nhận xét (Hàng đầu, Mới nhất) để nó không biến mất khi cuộn.";
|
"StickSortCommentsDesc" = "Ghim sắp xếp tiêu đề nhận xét (Hàng đầu, Mới nhất) để nó không biến mất khi cuộn.";
|
||||||
"HideSortComments" = "Ẩn tiêu đề bình luận";
|
"HideSortComments" = "Ẩn bình luận";
|
||||||
"HideSortCommentsDesc" = "Ẩn tiêu đề nhận xét sắp xếp (Hàng đầu, Mới nhất) để nó không bao giờ xuất hiện.";
|
"HideSortCommentsDesc" = "Ẩn bình luận Short, sắp xếp (Hàng đầu, Mới nhất) để nó không bao giờ xuất hiện.";
|
||||||
"PlaylistOldMinibar" = "Danh sách phát mini bar cũ";
|
"PlaylistOldMinibar" = "Danh sách phát mini bar cũ";
|
||||||
"PlaylistOldMinibarDesc" = "Thay thế bảng điều khiển danh sách phát nổi mới bằng bảng điều khiển cũ.";
|
"PlaylistOldMinibarDesc" = "Thay thế bảng điều khiển danh sách phát nổi mới bằng bảng điều khiển cũ.";
|
||||||
"DisableRTL" = "Tắt định dạng RTL";
|
"DisableRTL" = "Tắt định dạng RTL";
|
||||||
"DisableRTLDesc" = "Hiển thị mạnh mẽ văn bản ở định dạng từ trái sang phải (LTR) cho các ngôn ngữ ban đầu được hiển thị ở định dạng từ phải sang trái (RTL).";
|
"DisableRTLDesc" = "Hiển thị mạnh mẽ văn bản ở định dạng từ trái sang phải (LTR) cho các ngôn ngữ ban đầu được hiển thị ở định dạng từ phải sang trái (RTL).";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "Giữ tốc độ";
|
||||||
|
"Disable" = "Tắt";
|
||||||
|
"Disabled" = "Đã tắt";
|
||||||
|
"PlaybackSpeed" = "Tốc độ phát";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "Tốc độ phát mặc định";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "Chất lượng Video trên mạng Wi-Fi";
|
||||||
|
"PlaybackQualityOnCellular" = "Chất lượng Video trên mạng di động";
|
||||||
|
"SelectQuality" = "Chọn chất lượng";
|
||||||
|
"Default" = "Mặc định";
|
||||||
|
"Best" = "Tốt nhất";
|
||||||
|
|
||||||
"Startup" = "Trang khởi động";
|
"Startup" = "Trang khởi động";
|
||||||
"Home" = "Trang chủ";
|
"Home" = "Trang chủ";
|
||||||
"Explore" = "Khám phá";
|
"Explore" = "Khám phá";
|
||||||
@@ -181,12 +228,15 @@
|
|||||||
"Warning" = "Cảnh báo";
|
"Warning" = "Cảnh báo";
|
||||||
"TabIsHidden" = "Không thể chọn Tab ẩn làm trang khởi động";
|
"TabIsHidden" = "Không thể chọn Tab ẩn làm trang khởi động";
|
||||||
|
|
||||||
"DonateViaPayPal" = "Quyên góp qua PayPal";
|
"SupportDevelopment" = "Hỗ trợ nhà phát triển";
|
||||||
"SupportViaGhSponsors" = "Hỗ trợ phát triển thông qua Github";
|
"SupportDevelopmentDesc" = "Nếu bạn thích YTLite và muốn hỗ trợ sự phát triển của nó, bạn có thể thực hiện bằng bất kỳ cách thuận tiện nào dưới đây.\nCảm ơn❤";
|
||||||
|
"Contributors" = "Người đóng góp";
|
||||||
|
"OpenSourceLibs" = "Thư viện nguồn mở";
|
||||||
"Version" = "Phiên bản";
|
"Version" = "Phiên bản";
|
||||||
"About" = "Giới thiệu";
|
"About" = "Giới thiệu";
|
||||||
"Credits" = "Credits";
|
"Credits" = "Credits";
|
||||||
"Developer" = "Nhà phát triển YTLite";
|
"Developer" = "Nhà phát triển YTLite";
|
||||||
|
"SpecialThanks" = "Cảm tạ";
|
||||||
"ChineseSimplified" = "Tiếng Trung (giản thể)";
|
"ChineseSimplified" = "Tiếng Trung (giản thể)";
|
||||||
"ChineseTraditional" = "Tiếng Trung (phồn thể)";
|
"ChineseTraditional" = "Tiếng Trung (phồn thể)";
|
||||||
"French" = "Tiếng Pháp";
|
"French" = "Tiếng Pháp";
|
||||||
@@ -194,21 +244,31 @@
|
|||||||
"Japanese" = "Tiếng Nhật";
|
"Japanese" = "Tiếng Nhật";
|
||||||
"Vietnamese" = "Tiếng Việt";
|
"Vietnamese" = "Tiếng Việt";
|
||||||
"Advanced" = "Chế độ nâng cao";
|
"Advanced" = "Chế độ nâng cao";
|
||||||
|
"AdvancedDesc" = "Nhiều chế độ tùy chỉnh hơn";
|
||||||
"AdvancedModeReminder" = "Bạn có muốn kích hoạt Chế độ nâng cao cho YTLite không?\n\nChế độ này cung cấp hơn 50 tùy chọn bổ sung để tùy chỉnh và tối ưu hóa trải nghiệm YouTube của bạn. Bạn có thể Bật/Tắt nó sau từ Cài đặt → %@ → %@ → %@.";
|
"AdvancedModeReminder" = "Bạn có muốn kích hoạt Chế độ nâng cao cho YTLite không?\n\nChế độ này cung cấp hơn 50 tùy chọn bổ sung để tùy chỉnh và tối ưu hóa trải nghiệm YouTube của bạn. Bạn có thể Bật/Tắt nó sau từ Cài đặt → %@ → %@ → %@.";
|
||||||
"ClearCache" = "Xóa bộ nhớ đệm";
|
"ClearCache" = "Xóa bộ nhớ đệm";
|
||||||
"ResetSettings" = "Đặt lại cài đặt YTLite";
|
"ResetSettings" = "Đặt lại cài đặt YTLite";
|
||||||
"ResetMessage" = "Tùy chọn này sẽ đặt lại cài đặt YTLite về mặc định và đóng YouTube.\n\nBạn có chắc chắn muốn tiếp tục không?";
|
"ResetMessage" = "Tùy chọn này sẽ đặt lại cài đặt YTLite về mặc định và đóng YouTube.\n\nBạn có chắc chắn muốn tiếp tục không?";
|
||||||
"ShortsOnlyWarning" = "Bạn có chắc chắn muốn kích hoạt chế độ này?\n\nỞ chế độ này, bạn sẽ chỉ có thể xem video Shorts và không thể làm gì khác.\n\nBạn có thể tắt Chế độ chỉ Shorts bằng cách nhấn và giữ bằng hai ngón tay trong trình phát Shorts.";
|
"ShortsOnlyWarning" = "Bạn có chắc chắn muốn kích hoạt chế độ này?\n\nỞ chế độ này, bạn sẽ chỉ có thể xem video Shorts và không thể làm gì khác.\n\nBạn có thể tắt Chế độ chỉ Shorts bằng cách nhấn và giữ bằng hai ngón tay trong trình phát Shorts.";
|
||||||
"ShortsModeTurnedOff" = "Chế độ chỉ dành cho Shorts đã bị tắt";
|
"ShortsModeTurnedOff" = "Chế độ chỉ dành cho Shorts đã bị tắt";
|
||||||
|
"LibraryAdded" = "Tab Thư viện đã được khôi phục";
|
||||||
|
"LibraryRemoved" = "Tab Thư viện đã bị xóa";
|
||||||
"Yes" = "Có";
|
"Yes" = "Có";
|
||||||
"No" = "Không";
|
"No" = "Không";
|
||||||
|
|
||||||
"SelectAction" = "Chọn hành động";
|
"SelectAction" = "Chọn hành động";
|
||||||
"CopyTitle" = "Sao chép tiêu đề";
|
"CopyTitle" = "Sao chép tiêu đề";
|
||||||
"CopyDescription" = "Sao chép mô tả";
|
"CopyDescription" = "Sao chép mô tả";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "Sao chép văn bản bài đăng";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SaveCurrentImage" = "Lưu hình ảnh hiện tại";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyCurrentImage" = "Sao chép hình ảnh hiện tại";
|
||||||
|
"SavePostAsImage" = "Lưu bài đăng dưới dạng hình ảnh";
|
||||||
|
"CopyPostAsImage" = "Sao chép bài đăng dưới dạng hình ảnh";
|
||||||
|
"CopyCommentText" = "Sao chép văn bản bình luận";
|
||||||
|
"SaveCommentAsImage" = "Lưu bình luận dưới dạng hình ảnh";
|
||||||
|
"CopyCommentAsImage" = "Sao chép bình luận dưới dạng hình ảnh";
|
||||||
|
"SaveProfilePicture" = "Lưu ảnh hồ sơ";
|
||||||
|
"CopyProfilePicture" = "Sao chép ảnh hồ sơ";
|
||||||
"Cancel" = "Hủy bỏ";
|
"Cancel" = "Hủy bỏ";
|
||||||
"Copied" = "Sao chép vào clipboard";
|
"Copied" = "Sao chép vào clipboard";
|
||||||
"Saved" = "Đã lưu vào Ảnh";
|
"Saved" = "Đã lưu vào Ảnh";
|
||||||
|
|||||||
+73
-13
@@ -19,6 +19,8 @@
|
|||||||
"NoSubbarDesc" = "隐藏导航栏下的子栏(全部、新内容、实时等)。";
|
"NoSubbarDesc" = "隐藏导航栏下的子栏(全部、新内容、实时等)。";
|
||||||
"NoYTLogo" = "删除 YouTube Logo";
|
"NoYTLogo" = "删除 YouTube Logo";
|
||||||
"NoYTLogoDesc" = "删除导航栏中的 YouTube Logo。";
|
"NoYTLogoDesc" = "删除导航栏中的 YouTube Logo。";
|
||||||
|
"PremiumYTLogo" = "设置 Premium Logo";
|
||||||
|
"PremiumYTLogoDesc" = "在导航栏中设置 Premium Logo。";
|
||||||
|
|
||||||
"Overlay" = "播放界面";
|
"Overlay" = "播放界面";
|
||||||
"HideAutoplay" = "隐藏自动播放开关";
|
"HideAutoplay" = "隐藏自动播放开关";
|
||||||
@@ -39,12 +41,18 @@
|
|||||||
"NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。";
|
"NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。";
|
||||||
"PersistentProgressBar" = "持续进度条";
|
"PersistentProgressBar" = "持续进度条";
|
||||||
"PersistentProgressBarDesc" = "始终在播放器中显示进度条。";
|
"PersistentProgressBarDesc" = "始终在播放器中显示进度条。";
|
||||||
|
"StockVolumeHUD" = "原生音量 HUD";
|
||||||
|
"StockVolumeHUDDesc" = "全屏显示系统音量 HUD。";
|
||||||
"NoRelatedVids" = "没有相关视频";
|
"NoRelatedVids" = "没有相关视频";
|
||||||
"NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。";
|
"NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。";
|
||||||
"NoPromotionCards" = "隐藏付费";
|
"NoPromotionCards" = "隐藏付费";
|
||||||
"NoPromotionCardsDesc" = "在付费视频中隐藏“付费内容”。";
|
"NoPromotionCardsDesc" = "在付费视频中隐藏“付费内容”。";
|
||||||
"NoWatermarks" = "隐藏水印";
|
"NoWatermarks" = "隐藏水印";
|
||||||
"NoWatermarksDesc" = "隐藏播放器的频道水印。";
|
"NoWatermarksDesc" = "隐藏播放器的频道水印。";
|
||||||
|
"VideoEndTime" = "显示播放结束时间";
|
||||||
|
"VideoEndTimeDesc" = "将视频播放结束时间添加到播放器栏。";
|
||||||
|
"24hrFormat" = "24 小时格式";
|
||||||
|
"24hrFormatDesc" = "以 24 小时格式显示结束时间。";
|
||||||
|
|
||||||
"Player" = "播放器";
|
"Player" = "播放器";
|
||||||
"Miniplayer" = "启用迷你播放器";
|
"Miniplayer" = "启用迷你播放器";
|
||||||
@@ -65,8 +73,18 @@
|
|||||||
"ExtraSpeedOptionsDesc" = "在播放器菜单中添加更多视频播放速度的选项。";
|
"ExtraSpeedOptionsDesc" = "在播放器菜单中添加更多视频播放速度的选项。";
|
||||||
"DontSnap2Chapter" = "禁用双击跳转";
|
"DontSnap2Chapter" = "禁用双击跳转";
|
||||||
"DontSnap2ChapterDesc" = "禁用通过双击手势跳到下一集。";
|
"DontSnap2ChapterDesc" = "禁用通过双击手势跳到下一集。";
|
||||||
|
"NoTwoFingerSnapToChapter" = "禁用双指双击";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "禁用双指双击捕捉手势。";
|
||||||
|
"PauseOnOverlay" = "覆盖时暂停";
|
||||||
|
"PauseOnOverlayDesc" = "当播放器控制按钮出现时暂停播放。";
|
||||||
"RedProgressBar" = "红色进度条";
|
"RedProgressBar" = "红色进度条";
|
||||||
"RedProgressBarDesc" = "加回红色进度条。";
|
"RedProgressBarDesc" = "加回红色进度条。";
|
||||||
|
"NoPlayerRemixButton" = "移除混剪按钮";
|
||||||
|
"NoPlayerRemixButtonDesc" = "移除播放器下方的混剪按钮。";
|
||||||
|
"NoPlayerClipButton" = "移除剪辑按钮";
|
||||||
|
"NoPlayerClipButtonDesc" = "移除播放器下方的剪辑按钮。";
|
||||||
|
"NoPlayerDownloadButton" = "移除下载按钮";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "移除播放器下方的下载按钮。";
|
||||||
"NoHints" = "禁用提示";
|
"NoHints" = "禁用提示";
|
||||||
"NoHintsDesc" = "禁用播放期间出现在右上角的作者提示。";
|
"NoHintsDesc" = "禁用播放期间出现在右上角的作者提示。";
|
||||||
"NoFreeZoom" = "禁用自由缩放手势";
|
"NoFreeZoom" = "禁用自由缩放手势";
|
||||||
@@ -94,11 +112,13 @@
|
|||||||
"HideUploadButton" = "隐藏上传按钮";
|
"HideUploadButton" = "隐藏上传按钮";
|
||||||
"HideUploadButtonDesc" = "从选项卡栏中隐藏上传按钮。";
|
"HideUploadButtonDesc" = "从选项卡栏中隐藏上传按钮。";
|
||||||
"HideLibraryTab" = "隐藏媒体库";
|
"HideLibraryTab" = "隐藏媒体库";
|
||||||
"HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库。";
|
"HideLibraryTabDesc" = "从选项卡栏隐藏“媒体库”。\n\n长按“首页”选项卡可以恢复此选项卡。";
|
||||||
|
|
||||||
"Shorts" = "短视频";
|
"Shorts" = "短视频";
|
||||||
"ShortsOnlyMode" = "仅短视频模式";
|
"ShortsOnlyMode" = "仅短视频模式";
|
||||||
"ShortsOnlyModeDesc" = "将 YouTube 功能限制为只能观看短视频。";
|
"ShortsOnlyModeDesc" = "将 YouTube 功能限制为只能观看短视频。";
|
||||||
|
"AutoSkipShorts" = "自动跳过短视频";
|
||||||
|
"AutoSkipShortsDesc" = "当前视频播放结束后跳转至下一个视频。";
|
||||||
"HideShorts" = "隐藏短视频";
|
"HideShorts" = "隐藏短视频";
|
||||||
"HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。";
|
"HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。";
|
||||||
"ShortsProgress" = "启用进度条";
|
"ShortsProgress" = "启用进度条";
|
||||||
@@ -145,18 +165,32 @@
|
|||||||
"Other" = "其他";
|
"Other" = "其他";
|
||||||
"CopyVideoInfo" = "复制视频信息";
|
"CopyVideoInfo" = "复制视频信息";
|
||||||
"CopyVideoInfoDesc" = "添加按钮从“视频说明”面板中复制视频的标题和描述。";
|
"CopyVideoInfoDesc" = "添加按钮从“视频说明”面板中复制视频的标题和描述。";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "保存帖子信息";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "允许通过长按复制帖子文本并将帖子另存为图片。";
|
||||||
"SavePostImage" = "保存社区帖子图片";
|
|
||||||
"SavePostImageDesc" = "长按社区帖子图片保存到照片应用程序。";
|
|
||||||
"SaveProfilePhoto" = "保存个人资料图片";
|
"SaveProfilePhoto" = "保存个人资料图片";
|
||||||
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
|
"SaveProfilePhotoDesc" = "长按个人资料图片保存到照片应用程序。";
|
||||||
"CopyCommentText" = "复制评论文本";
|
"CommentManager" = "保存评论信息";
|
||||||
"CopyCommentTextDesc" = "长按将评论文本复制到剪贴板。";
|
"CommentManagerDesc" = "允许通过长按复制评论文本并将评论保存为图片。";
|
||||||
"FixAlbums" = "修复封面";
|
"FixAlbums" = "修复封面";
|
||||||
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
|
"FixAlbumsDesc" = "修复来自俄罗斯用户的封面显示问题。";
|
||||||
|
"NativeShare" = "原生共享表";
|
||||||
|
"NativeShareDesc" = "使用系统共享表共享媒体。";
|
||||||
"RemovePlayNext" = "删除“播放队列中的下一个”";
|
"RemovePlayNext" = "删除“播放队列中的下一个”";
|
||||||
"RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。";
|
"RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。";
|
||||||
|
"RemoveDownloadMenu" = "删除“下载”";
|
||||||
|
"RemoveDownloadMenuDesc" = "从菜单中删除“下载”选项。";
|
||||||
|
"RemoveWatchLaterMenu" = "删除“保存到稍后观看”";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "从菜单中删除“保存到稍后观看”选项。";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "删除“保存到播放列表”";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "从菜单中删除“保存到播放列表”选项。";
|
||||||
|
"RemoveShareMenu" = "删除“分享”";
|
||||||
|
"RemoveShareMenuDesc" = "从菜单中删除“分享”选项。";
|
||||||
|
"RemoveNotInterestedMenu" = "删除“不感兴趣”";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "从菜单中删除“不感兴趣”选项。";
|
||||||
|
"RemoveDontRecommendMenu" = "删除“不推荐此频道”";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "从菜单中删除“不推荐此频道”选项。";
|
||||||
|
"RemoveReportMenu" = "删除“举报”";
|
||||||
|
"RemoveReportMenuDesc" = "从菜单中删除“举报”选项。";
|
||||||
"NoContinueWatching" = "删除“继续观看”";
|
"NoContinueWatching" = "删除“继续观看”";
|
||||||
"NoContinueWatchingDesc" = "从首页中删除包含未完成视频的“继续观看”部分。";
|
"NoContinueWatchingDesc" = "从首页中删除包含未完成视频的“继续观看”部分。";
|
||||||
"NoSearchHistory" = "隐藏搜索历史记录";
|
"NoSearchHistory" = "隐藏搜索历史记录";
|
||||||
@@ -170,7 +204,20 @@
|
|||||||
"PlaylistOldMinibar" = "旧播放列表";
|
"PlaylistOldMinibar" = "旧播放列表";
|
||||||
"PlaylistOldMinibarDesc" = "将新的浮动播放列表面板替换为旧的浮动播放列表面板。";
|
"PlaylistOldMinibarDesc" = "将新的浮动播放列表面板替换为旧的浮动播放列表面板。";
|
||||||
"DisableRTL" = "禁用 RTL 格式";
|
"DisableRTL" = "禁用 RTL 格式";
|
||||||
"DisableRTLDesc" = "对于最初以从右到左 (RTL) 显示的语言,强制以从左到右 (LTR) 格式显示文本。";
|
"DisableRTLDesc" = "对于最初以从右到左(RTL)显示的语言,强制以从左到右(LTR)格式显示文本。";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "长按变更速度";
|
||||||
|
"Disable" = "禁用";
|
||||||
|
"Disabled" = "已禁用";
|
||||||
|
"PlaybackSpeed" = "播放速度";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "默认播放速率";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "WiFi网络播放质量";
|
||||||
|
"PlaybackQualityOnCellular" = "蜂窝网络播放质量";
|
||||||
|
"SelectQuality" = "选择质量";
|
||||||
|
"Default" = "默认";
|
||||||
|
"Best" = "最好";
|
||||||
|
|
||||||
"Startup" = "启动页";
|
"Startup" = "启动页";
|
||||||
"Home" = "首页";
|
"Home" = "首页";
|
||||||
@@ -181,12 +228,15 @@
|
|||||||
"Warning" = "警告";
|
"Warning" = "警告";
|
||||||
"TabIsHidden" = "无法选择隐藏选项卡作为启动页。";
|
"TabIsHidden" = "无法选择隐藏选项卡作为启动页。";
|
||||||
|
|
||||||
"DonateViaPayPal" = "PayPal 赞助";
|
"SupportDevelopment" = "支持开发";
|
||||||
"SupportViaGhSponsors" = "通过 Github 赞助支持开发";
|
"SupportDevelopmentDesc" = "如果您喜欢YTLite并愿意支持其开发,可以使用以下任何便捷的方式来赞助。\n感谢❤";
|
||||||
|
"Contributors" = "贡献者";
|
||||||
|
"OpenSourceLibs" = "开源库";
|
||||||
"Version" = "版本";
|
"Version" = "版本";
|
||||||
"About" = "关于";
|
"About" = "关于";
|
||||||
"Credits" = "信息";
|
"Credits" = "信息";
|
||||||
"Developer" = "YTLite开发者";
|
"Developer" = "YTLite开发者";
|
||||||
|
"SpecialThanks" = "特别感谢";
|
||||||
"ChineseSimplified" = "中文(简体)本地化";
|
"ChineseSimplified" = "中文(简体)本地化";
|
||||||
"ChineseTraditional" = "中文(繁体)本地化";
|
"ChineseTraditional" = "中文(繁体)本地化";
|
||||||
"French" = "法语本地化";
|
"French" = "法语本地化";
|
||||||
@@ -194,21 +244,31 @@
|
|||||||
"Japanese" = "日语本地化";
|
"Japanese" = "日语本地化";
|
||||||
"Vietnamese" = "越南语本地化";
|
"Vietnamese" = "越南语本地化";
|
||||||
"Advanced" = "高级模式";
|
"Advanced" = "高级模式";
|
||||||
|
"AdvancedDesc" = "更多自定义的功能";
|
||||||
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
"AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。";
|
||||||
"ClearCache" = "清除缓存";
|
"ClearCache" = "清除缓存";
|
||||||
"ResetSettings" = "重置YTLite设置";
|
"ResetSettings" = "重置YTLite设置";
|
||||||
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
|
"ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?";
|
||||||
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
|
"ShortsOnlyWarning" = "确定要激活此模式吗?\n\n在此模式下,将只能观看短视频,且无法执行任何其他操作。\n\n可以通过双指长按禁用“仅短视频模式”。";
|
||||||
"ShortsModeTurnedOff" = "仅短视频模式已关闭";
|
"ShortsModeTurnedOff" = "仅短视频模式已关闭";
|
||||||
|
"LibraryAdded" = "“我/媒体库”选项卡已恢复";
|
||||||
|
"LibraryRemoved" = "“我/媒体库”选项卡已删除";
|
||||||
"Yes" = "是";
|
"Yes" = "是";
|
||||||
"No" = "不";
|
"No" = "不";
|
||||||
|
|
||||||
"SelectAction" = "选择操作";
|
"SelectAction" = "选择操作";
|
||||||
"CopyTitle" = "复制标题";
|
"CopyTitle" = "复制标题";
|
||||||
"CopyDescription" = "复制描述";
|
"CopyDescription" = "复制描述";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "复制帖子文本";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SaveCurrentImage" = "保存当前图片";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyCurrentImage" = "复制当前图片";
|
||||||
|
"SavePostAsImage" = "帖子另存为图片";
|
||||||
|
"CopyPostAsImage" = "帖子作为图片复制";
|
||||||
|
"CopyCommentText" = "复制评论文本";
|
||||||
|
"SaveCommentAsImage" = "评论另存为图片";
|
||||||
|
"CopyCommentAsImage" = "评论作为图片复制";
|
||||||
|
"SaveProfilePicture" = "保存个人资料图片";
|
||||||
|
"CopyProfilePicture" = "复制个人资料图片";
|
||||||
"Cancel" = "取消";
|
"Cancel" = "取消";
|
||||||
"Copied" = "已复制到剪贴板";
|
"Copied" = "已复制到剪贴板";
|
||||||
"Saved" = "已保存到照片";
|
"Saved" = "已保存到照片";
|
||||||
|
|||||||
+84
-24
@@ -17,8 +17,10 @@
|
|||||||
"StickyNavbarDesc" = "向下滑動時保持可見狀態";
|
"StickyNavbarDesc" = "向下滑動時保持可見狀態";
|
||||||
"NoSubbar" = "隱藏子導覽列";
|
"NoSubbar" = "隱藏子導覽列";
|
||||||
"NoSubbarDesc" = "隱藏導覽列下的子導覽列(全部、讓你耳目一新的影片、直播中...等)";
|
"NoSubbarDesc" = "隱藏導覽列下的子導覽列(全部、讓你耳目一新的影片、直播中...等)";
|
||||||
"NoYTLogo" = "移除YouTube圖示";
|
"NoYTLogo" = "移除 YouTube 標誌";
|
||||||
"NoYTLogoDesc" = "移除在左上方導覽列的YouTube圖示";
|
"NoYTLogoDesc" = "移除在左上方導覽列的 YouTube 標誌";
|
||||||
|
"PremiumYTLogo" = "YouTube Premium 標誌";
|
||||||
|
"PremiumYTLogoDesc" = "左上方導覽列設定為 YouTube Premium 標誌";
|
||||||
|
|
||||||
"Overlay" = "播放介面";
|
"Overlay" = "播放介面";
|
||||||
"HideAutoplay" = "隱藏自動播放開關";
|
"HideAutoplay" = "隱藏自動播放開關";
|
||||||
@@ -39,12 +41,18 @@
|
|||||||
"NoFullscreenActionsDesc" = "在全螢幕模式下停用操作面板";
|
"NoFullscreenActionsDesc" = "在全螢幕模式下停用操作面板";
|
||||||
"PersistentProgressBar" = "固定進度條";
|
"PersistentProgressBar" = "固定進度條";
|
||||||
"PersistentProgressBarDesc" = "總是在播放器中顯示進度條";
|
"PersistentProgressBarDesc" = "總是在播放器中顯示進度條";
|
||||||
|
"StockVolumeHUD" = "原生系統音量HUD";
|
||||||
|
"StockVolumeHUDDesc" = "全螢幕模式中顯示原生系統音量HUD";
|
||||||
"NoRelatedVids" = "隱藏相關影片";
|
"NoRelatedVids" = "隱藏相關影片";
|
||||||
"NoRelatedVidsDesc" = "移除全螢幕模式向上滑動時所出現的相關影片";
|
"NoRelatedVidsDesc" = "移除全螢幕模式向上滑動時所出現的相關影片";
|
||||||
"NoPromotionCards" = "隱藏付費推廣";
|
"NoPromotionCards" = "隱藏付費推廣";
|
||||||
"NoPromotionCardsDesc" = "在付費推廣的影片中隱藏「付費推廣」";
|
"NoPromotionCardsDesc" = "在付費推廣的影片中隱藏 \"付費推廣\"";
|
||||||
"NoWatermarks" = "隱藏浮水印";
|
"NoWatermarks" = "隱藏浮水印";
|
||||||
"NoWatermarksDesc" = "在播放器中隱藏頻道浮水印";
|
"NoWatermarksDesc" = "在播放器中隱藏頻道浮水印";
|
||||||
|
"VideoEndTime" = "顯示播放結束時間";
|
||||||
|
"VideoEndTimeDesc" = "新增影片播放結束時間至播放器欄";
|
||||||
|
"24hrFormat" = "24小時制";
|
||||||
|
"24hrFormatDesc" = "播放結束時間將以24小時制顯示";
|
||||||
|
|
||||||
"Player" = "播放器";
|
"Player" = "播放器";
|
||||||
"Miniplayer" = "啟用迷你播放器";
|
"Miniplayer" = "啟用迷你播放器";
|
||||||
@@ -65,8 +73,18 @@
|
|||||||
"ExtraSpeedOptionsDesc" = "在播放速度選單中添加更多選項";
|
"ExtraSpeedOptionsDesc" = "在播放速度選單中添加更多選項";
|
||||||
"DontSnap2Chapter" = "停用跳轉到章節";
|
"DontSnap2Chapter" = "停用跳轉到章節";
|
||||||
"DontSnap2ChapterDesc" = "停用點兩下手勢跳轉到下一集";
|
"DontSnap2ChapterDesc" = "停用點兩下手勢跳轉到下一集";
|
||||||
|
"NoTwoFingerSnapToChapter" = "停用兩指點兩下";
|
||||||
|
"NoTwoFingerSnapToChapterDesc" = "停用兩指點兩下跳轉到章節的手勢";
|
||||||
|
"PauseOnOverlay" = "覆蓋時暫停";
|
||||||
|
"PauseOnOverlayDesc" = "當覆蓋畫面出現時,暫停播放";
|
||||||
"RedProgressBar" = "紅色進度條";
|
"RedProgressBar" = "紅色進度條";
|
||||||
"RedProgressBarDesc" = "恢復紅色的進度條";
|
"RedProgressBarDesc" = "恢復紅色的進度條";
|
||||||
|
"NoPlayerRemixButton" = "移除Remix按鈕";
|
||||||
|
"NoPlayerRemixButtonDesc" = "移除播放器下方的Remix按鈕";
|
||||||
|
"NoPlayerClipButton" = "移除剪輯片段按鈕";
|
||||||
|
"NoPlayerClipButtonDesc" = "移除播放器下方的剪輯片段按鈕";
|
||||||
|
"NoPlayerDownloadButton" = "移除下載按鈕";
|
||||||
|
"NoPlayerDownloadButtonDesc" = "移除播放器下方的下載按鈕";
|
||||||
"NoHints" = "停用提示";
|
"NoHints" = "停用提示";
|
||||||
"NoHintsDesc" = "在播放過程中出現在右上角的作者提示";
|
"NoHintsDesc" = "在播放過程中出現在右上角的作者提示";
|
||||||
"NoFreeZoom" = "停用自由縮放手勢";
|
"NoFreeZoom" = "停用自由縮放手勢";
|
||||||
@@ -93,12 +111,14 @@
|
|||||||
"HideSubscriptionsTabDesc" = "從標籤欄中隱藏訂閱內容";
|
"HideSubscriptionsTabDesc" = "從標籤欄中隱藏訂閱內容";
|
||||||
"HideUploadButton" = "隱藏+";
|
"HideUploadButton" = "隱藏+";
|
||||||
"HideUploadButtonDesc" = "從標籤欄中隱藏+標籤";
|
"HideUploadButtonDesc" = "從標籤欄中隱藏+標籤";
|
||||||
"HideLibraryTab" = "隱藏媒體庫";
|
"HideLibraryTab" = "隱藏你的內容/媒體庫";
|
||||||
"HideLibraryTabDesc" = "從標籤欄中隱藏媒體庫標籤";
|
"HideLibraryTabDesc" = "從標籤欄中隱藏你的內容/媒體庫標籤\n\n長按首頁標籤,可以恢復此標籤";
|
||||||
|
|
||||||
"Shorts" = "Shorts";
|
"Shorts" = "Shorts";
|
||||||
"ShortsOnlyMode" = "只看Shorts模式";
|
"ShortsOnlyMode" = "只看Shorts模式";
|
||||||
"ShortsOnlyModeDesc" = "限制YouTube功能只能觀看Shorts影片";
|
"ShortsOnlyModeDesc" = "限制YouTube功能只能觀看Shorts影片";
|
||||||
|
"AutoSkipShorts" = "連續播放Shorts";
|
||||||
|
"AutoSkipShortsDesc" = "影片播放完畢後,自動跳轉至下一部影片";
|
||||||
"HideShorts" = "隱藏Shorts影片";
|
"HideShorts" = "隱藏Shorts影片";
|
||||||
"HideShortsDesc" = "從首頁、推薦...等,隱藏Shorts影片(不適用於觀看紀錄)";
|
"HideShortsDesc" = "從首頁、推薦...等,隱藏Shorts影片(不適用於觀看紀錄)";
|
||||||
"ShortsProgress" = "啟用時間進度條";
|
"ShortsProgress" = "啟用時間進度條";
|
||||||
@@ -145,20 +165,34 @@
|
|||||||
"Other" = "其它";
|
"Other" = "其它";
|
||||||
"CopyVideoInfo" = "複製影片資訊";
|
"CopyVideoInfo" = "複製影片資訊";
|
||||||
"CopyVideoInfoDesc" = "新增按鈕將影片標題和說明,複製到影片說明欄";
|
"CopyVideoInfoDesc" = "新增按鈕將影片標題和說明,複製到影片說明欄";
|
||||||
"PostManager" = "Save post information";
|
"PostManager" = "儲存貼文資訊";
|
||||||
"PostManagerDesc" = "Allows to copy post text and save post as image by long tap.";
|
"PostManagerDesc" = "長按可以複製貼文內容或將貼文儲存為圖片";
|
||||||
"SavePostImage" = "儲存社群貼文圖片";
|
"SaveProfilePhoto" = "儲存個人資料相片";
|
||||||
"SavePostImageDesc" = "長按社群貼文圖片儲存到照片應用";
|
"SaveProfilePhotoDesc" = "長按個人資料相片儲存到照片應用";
|
||||||
"SaveProfilePhoto" = "儲存個人檔案照片";
|
"CommentManager" = "儲存留言資訊";
|
||||||
"SaveProfilePhotoDesc" = "長按個人檔案照片儲存到照片應用";
|
"CommentManagerDesc" = "長按可以複製留言內容或將留言儲存為圖片";
|
||||||
"CopyCommentText" = "複製評論文字";
|
|
||||||
"CopyCommentTextDesc" = "長按評論文字複製到剪貼簿";
|
|
||||||
"FixAlbums" = "修復封面";
|
"FixAlbums" = "修復封面";
|
||||||
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
|
"FixAlbumsDesc" = "為俄羅斯使用者修復封面顯示問題";
|
||||||
"RemovePlayNext" = "移除「播放下一個」";
|
"NativeShare" = "原生分享選單";
|
||||||
"RemovePlayNextDesc" = "從選單移除「播放下一個」";
|
"NativeShareDesc" = "使用系統分享選單分享媒體";
|
||||||
"NoContinueWatching" = "移除「繼續觀看」";
|
"RemovePlayNext" = "移除 \"加入待播放清單接著播放\"";
|
||||||
"NoContinueWatchingDesc" = "從首頁中移除包含未完成影片的「繼續觀看」部分";
|
"RemovePlayNextDesc" = "從選單移除 \"加入待播放清單接著播放\" 選項";
|
||||||
|
"RemoveDownloadMenu" = "移除 \"下載影片\"";
|
||||||
|
"RemoveDownloadMenuDesc" = "從選單移除 \"下載影片\" 選項";
|
||||||
|
"RemoveWatchLaterMenu" = "移除 \"儲存至「稍後觀看」清單\"";
|
||||||
|
"RemoveWatchLaterMenuDesc" = "從選單移除 \"儲存至「稍後觀看」清單\" 選項";
|
||||||
|
"RemoveSaveToPlaylistMenu" = "移除 \"儲存至播放清單\"";
|
||||||
|
"RemoveSaveToPlaylistMenuDesc" = "從選單移除 \"儲存至播放清單\" 選項";
|
||||||
|
"RemoveShareMenu" = "移除 \"分享\"";
|
||||||
|
"RemoveShareMenuDesc" = "從選單移除 \"分享\" 選項";
|
||||||
|
"RemoveNotInterestedMenu" = "移除 \"不感興趣\"";
|
||||||
|
"RemoveNotInterestedMenuDesc" = "從選單移除 \"不感興趣\" 選項";
|
||||||
|
"RemoveDontRecommendMenu" = "移除 \"不要推薦這個頻道\"";
|
||||||
|
"RemoveDontRecommendMenuDesc" = "從選單移除 \"不要推薦這個頻道\" 選項";
|
||||||
|
"RemoveReportMenu" = "移除 \"檢舉\"";
|
||||||
|
"RemoveReportMenuDesc" = "從選單移除 \"檢舉\" 選項";
|
||||||
|
"NoContinueWatching" = "移除 \"繼續觀看\"";
|
||||||
|
"NoContinueWatchingDesc" = "從首頁中移除包含未完成影片的 \"繼續觀看\" 部分";
|
||||||
"NoSearchHistory" = "隱藏搜尋記錄";
|
"NoSearchHistory" = "隱藏搜尋記錄";
|
||||||
"NoSearchHistoryDesc" = "視覺上隱藏搜尋歷史紀錄和建議。注意:您的搜尋紀錄仍然可在其它YouTube客戶端中存取";
|
"NoSearchHistoryDesc" = "視覺上隱藏搜尋歷史紀錄和建議。注意:您的搜尋紀錄仍然可在其它YouTube客戶端中存取";
|
||||||
"NoRelatedWatchNexts" = "隱藏播放器下的所有影片";
|
"NoRelatedWatchNexts" = "隱藏播放器下的所有影片";
|
||||||
@@ -172,21 +206,37 @@
|
|||||||
"DisableRTL" = "停用RTL格式";
|
"DisableRTL" = "停用RTL格式";
|
||||||
"DisableRTLDesc" = "強制將初始顯示從右到左(RTL)格式的語言,改為從左到右(LTR)顯示";
|
"DisableRTLDesc" = "強制將初始顯示從右到左(RTL)格式的語言,改為從左到右(LTR)顯示";
|
||||||
|
|
||||||
|
"HoldToSpeed" = "按住加速";
|
||||||
|
"Disable" = "停用";
|
||||||
|
"Disabled" = "已停用";
|
||||||
|
"PlaybackSpeed" = "播放速度";
|
||||||
|
|
||||||
|
"DefaultPlaybackRate" = "預設播放速度";
|
||||||
|
|
||||||
|
"PlaybackQualityOnWiFi" = "使用Wi-Fi時的影片畫質";
|
||||||
|
"PlaybackQualityOnCellular" = "使用行動網路時的影片畫質";
|
||||||
|
"SelectQuality" = "選擇畫質";
|
||||||
|
"Default" = "預設";
|
||||||
|
"Best" = "最佳";
|
||||||
|
|
||||||
"Startup" = "啟動頁面";
|
"Startup" = "啟動頁面";
|
||||||
"Home" = "首頁";
|
"Home" = "首頁";
|
||||||
"Explore" = "探索";
|
"Explore" = "探索";
|
||||||
"ShortsTab" = "Shorts";
|
"ShortsTab" = "Shorts";
|
||||||
"Subscriptions" = "訂閱內容";
|
"Subscriptions" = "訂閱內容";
|
||||||
"Library" = "媒體庫";
|
"Library" = "你的內容/媒體庫";
|
||||||
"Warning" = "警告";
|
"Warning" = "警告";
|
||||||
"TabIsHidden" = "無法將隱藏的標籤選為啟動頁面";
|
"TabIsHidden" = "無法將隱藏的標籤選為啟動頁面";
|
||||||
|
|
||||||
"DonateViaPayPal" = "透過PayPal贊助";
|
"SupportDevelopment" = "支持開發";
|
||||||
"SupportViaGhSponsors" = "透過Github贊助支持開發";
|
"SupportDevelopmentDesc" = "如果您喜歡 YTLite 並願意支持開發,可以使用以下任何方便的方式支持。\n感謝❤";
|
||||||
|
"Contributors" = "貢獻者";
|
||||||
|
"OpenSourceLibs" = "開源函式庫";
|
||||||
"Version" = "版本";
|
"Version" = "版本";
|
||||||
"About" = "關於";
|
"About" = "關於";
|
||||||
"Credits" = "貢獻";
|
"Credits" = "貢獻";
|
||||||
"Developer" = "YTLite開發者";
|
"Developer" = "YTLite開發者";
|
||||||
|
"SpecialThanks" = "特別感謝";
|
||||||
"ChineseSimplified" = "簡體中文在地化";
|
"ChineseSimplified" = "簡體中文在地化";
|
||||||
"ChineseTraditional" = "繁體中文在地化";
|
"ChineseTraditional" = "繁體中文在地化";
|
||||||
"French" = "法文在地化";
|
"French" = "法文在地化";
|
||||||
@@ -194,23 +244,33 @@
|
|||||||
"Japanese" = "日本語在地化";
|
"Japanese" = "日本語在地化";
|
||||||
"Vietnamese" = "越南語在地化";
|
"Vietnamese" = "越南語在地化";
|
||||||
"Advanced" = "進階模式";
|
"Advanced" = "進階模式";
|
||||||
|
"AdvancedDesc" = "更多自訂功能";
|
||||||
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
"AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。";
|
||||||
"ClearCache" = "清除快取";
|
"ClearCache" = "清除快取";
|
||||||
"ResetSettings" = "重置YTLite設定";
|
"ResetSettings" = "重置YTLite設定";
|
||||||
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
|
"ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?";
|
||||||
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
|
"ShortsOnlyWarning" = "您確定要開啟此模式嗎?\n\n在此模式下,您只能觀看Shorts影片,無法進行其它操作。\n\n您可以在Shorts播放器中使用兩指長按來停用只看Shorts模式。";
|
||||||
"ShortsModeTurnedOff" = "已關閉「只看Shorts模式」";
|
"ShortsModeTurnedOff" = "已關閉「只看Shorts模式」";
|
||||||
|
"LibraryAdded" = "你的內容/媒體庫標籤已恢復";
|
||||||
|
"LibraryRemoved" = "你的內容/媒體庫標籤已移除";
|
||||||
"Yes" = "是";
|
"Yes" = "是";
|
||||||
"No" = "否";
|
"No" = "否";
|
||||||
|
|
||||||
"SelectAction" = "選擇動作";
|
"SelectAction" = "選擇動作";
|
||||||
"CopyTitle" = "複製標題";
|
"CopyTitle" = "複製標題";
|
||||||
"CopyDescription" = "複製說明";
|
"CopyDescription" = "複製說明";
|
||||||
"CopyPostText" = "Copy post text";
|
"CopyPostText" = "複製貼文內容";
|
||||||
"SavePostAsImage" = "Save post as image";
|
"SaveCurrentImage" = "儲存目前圖片";
|
||||||
"CopyPostAsImage" = "Copy post as image";
|
"CopyCurrentImage" = "複製目前圖片";
|
||||||
|
"SavePostAsImage" = "貼文儲存為圖片";
|
||||||
|
"CopyPostAsImage" = "複製貼文為圖片";
|
||||||
|
"CopyCommentText" = "複製留言內容";
|
||||||
|
"SaveCommentAsImage" = "留言儲存為圖片";
|
||||||
|
"CopyCommentAsImage" = "複製留言為圖片";
|
||||||
|
"SaveProfilePicture" = "儲存個人資料相片";
|
||||||
|
"CopyProfilePicture" = "複製個人資料相片";
|
||||||
"Cancel" = "取消";
|
"Cancel" = "取消";
|
||||||
"Copied" = "已複製到剪貼簿";
|
"Copied" = "已複製到剪貼簿";
|
||||||
"Saved" = "已儲存到照片應用";
|
"Saved" = "已儲存到照片應用";
|
||||||
"Done" = "Done";
|
"Done" = "完成";
|
||||||
"Error" = "發生錯誤";
|
"Error" = "發生錯誤";
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user