mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-16 15:53:58 +00:00
Compare commits
8 Commits
v5.32.0-de
...
v5.33.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0d4e9bfb4 | ||
|
|
e9e4cf39b6 | ||
|
|
0579a9f760 | ||
|
|
1c0acef3f3 | ||
|
|
2419adb77b | ||
|
|
9e4113555b | ||
|
|
125855540b | ||
|
|
a8eee825e6 |
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,3 +1,33 @@
|
||||
# [5.33.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.32.0...v5.33.0-dev.1) (2025-07-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Playback speed:** Add "Restore old playback speed menu" option ([#5552](https://github.com/ReVanced/revanced-patches/issues/5552)) ([b01f15b](https://github.com/ReVanced/revanced-patches/commit/b01f15b9acb0427aed99b0141ae271831b7936bf))
|
||||
|
||||
# [5.32.0](https://github.com/ReVanced/revanced-patches/compare/v5.31.2...v5.32.0) (2025-07-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Messenger - Hide inbox ads:** Support the latest app version ([2959c02](https://github.com/ReVanced/revanced-patches/commit/2959c0214dfa703ee623ef1f89bded7f78c9d252))
|
||||
* **YouTube - Hide layout components:** Fix "Hide ticket shelf" ([#5516](https://github.com/ReVanced/revanced-patches/issues/5516)) ([3b85c71](https://github.com/ReVanced/revanced-patches/commit/3b85c71433325fff49e01c77c7b9ff8ddd0a7068))
|
||||
* **YouTube - GmsCore support:** Fix search suggestions when logged out by using correct search provider ([#5483](https://github.com/ReVanced/revanced-patches/issues/5483)) ([e86fdc8](https://github.com/ReVanced/revanced-patches/commit/e86fdc86b161a6077960b85149e83bacbac664e7))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Prime Video:** Add `Playback speed` patch ([#5444](https://github.com/ReVanced/revanced-patches/issues/5444)) ([22cf313](https://github.com/ReVanced/revanced-patches/commit/22cf313a7b99b69e17b9d488c514802043a5dc10))
|
||||
* **YouTube - External downloads:** Improve the selection of the external downloader package ([#5504](https://github.com/ReVanced/revanced-patches/issues/5504)) ([5de9aa9](https://github.com/ReVanced/revanced-patches/commit/5de9aa9fad4f24186da045fb188f8718d6f63d7a))
|
||||
* **YT Music:** Support latest versions ([#5524](https://github.com/ReVanced/revanced-patches/issues/5524)) ([551dcf0](https://github.com/ReVanced/revanced-patches/commit/551dcf01ca9c489a779196b49c8744727d79d6bc))
|
||||
|
||||
# [5.32.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.32.0-dev.4...v5.32.0-dev.5) (2025-07-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YT Music:** Support latest versions ([#5524](https://github.com/ReVanced/revanced-patches/issues/5524)) ([551dcf0](https://github.com/ReVanced/revanced-patches/commit/551dcf01ca9c489a779196b49c8744727d79d6bc))
|
||||
|
||||
# [5.32.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.32.0-dev.3...v5.32.0-dev.4) (2025-07-25)
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.patches.components.ReturnYouTubeDislikeFilterPatch;
|
||||
import app.revanced.extension.youtube.patches.components.ReturnYouTubeDislikeFilter;
|
||||
import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
@@ -55,7 +55,7 @@ public class ReturnYouTubeDislikePatch {
|
||||
private static volatile ReturnYouTubeDislike lastLithoShortsVideoData;
|
||||
|
||||
/**
|
||||
* Because litho Shorts spans are created offscreen after {@link ReturnYouTubeDislikeFilterPatch}
|
||||
* Because litho Shorts spans are created offscreen after {@link ReturnYouTubeDislikeFilter}
|
||||
* detects the video ids, but the current Short can arbitrarily reload the same span,
|
||||
* then use the {@link #lastLithoShortsVideoData} if this value is greater than zero.
|
||||
*/
|
||||
|
||||
@@ -3,9 +3,9 @@ package app.revanced.extension.youtube.patches.components;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class HideInfoCardsFilterPatch extends Filter {
|
||||
public final class HideInfoCardsFilter extends Filter {
|
||||
|
||||
public HideInfoCardsFilterPatch() {
|
||||
public HideInfoCardsFilter() {
|
||||
addIdentifierCallbacks(
|
||||
new StringFilterGroup(
|
||||
Settings.HIDE_INFO_CARDS,
|
||||
@@ -8,27 +8,44 @@ import app.revanced.extension.youtube.settings.Settings;
|
||||
/**
|
||||
* Abuse LithoFilter for {@link CustomPlaybackSpeedPatch}.
|
||||
*/
|
||||
public final class PlaybackSpeedMenuFilterPatch extends Filter {
|
||||
public final class PlaybackSpeedMenuFilter extends Filter {
|
||||
|
||||
/**
|
||||
* Old litho based speed selection menu.
|
||||
*/
|
||||
public static volatile boolean isOldPlaybackSpeedMenuVisible;
|
||||
|
||||
/**
|
||||
* 0.05x speed selection menu.
|
||||
*/
|
||||
public static volatile boolean isPlaybackRateSelectorMenuVisible;
|
||||
|
||||
public PlaybackSpeedMenuFilterPatch() {
|
||||
private final StringFilterGroup oldPlaybackMenuGroup;
|
||||
|
||||
public PlaybackSpeedMenuFilter() {
|
||||
// 0.05x litho speed menu.
|
||||
var playbackRateSelectorGroup = new StringFilterGroup(
|
||||
Settings.CUSTOM_SPEED_MENU,
|
||||
"playback_rate_selector_menu_sheet.eml-js"
|
||||
);
|
||||
|
||||
// Old litho based speed menu.
|
||||
oldPlaybackMenuGroup = new StringFilterGroup(
|
||||
Settings.CUSTOM_SPEED_MENU,
|
||||
"playback_speed_sheet_content.eml-js");
|
||||
|
||||
|
||||
addPathCallbacks(playbackRateSelectorGroup);
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray,
|
||||
StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) {
|
||||
isPlaybackRateSelectorMenuVisible = true;
|
||||
if (matchedGroup == oldPlaybackMenuGroup) {
|
||||
isOldPlaybackSpeedMenuVisible = true;
|
||||
} else {
|
||||
isPlaybackRateSelectorMenuVisible = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -26,7 +26,7 @@ import app.revanced.extension.youtube.TrieSearch;
|
||||
*
|
||||
* Once a way to asynchronously update litho text is found, this strategy will no longer be needed.
|
||||
*/
|
||||
public final class ReturnYouTubeDislikeFilterPatch extends Filter {
|
||||
public final class ReturnYouTubeDislikeFilter extends Filter {
|
||||
|
||||
/**
|
||||
* Last unique video id's loaded. Value is ignored and Map is treated as a Set.
|
||||
@@ -67,7 +67,7 @@ public final class ReturnYouTubeDislikeFilterPatch extends Filter {
|
||||
|
||||
private final ByteArrayFilterGroupList videoIdFilterGroup = new ByteArrayFilterGroupList();
|
||||
|
||||
public ReturnYouTubeDislikeFilterPatch() {
|
||||
public ReturnYouTubeDislikeFilter() {
|
||||
// When a new Short is opened, the like buttons always seem to load before the dislike.
|
||||
// But if swiping back to a previous video and liking/disliking, then only that single button reloads.
|
||||
// So must check for both buttons.
|
||||
@@ -23,7 +23,6 @@ import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.Animation;
|
||||
@@ -42,7 +41,7 @@ import java.util.function.Function;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.patches.VideoInformation;
|
||||
import app.revanced.extension.youtube.patches.components.PlaybackSpeedMenuFilterPatch;
|
||||
import app.revanced.extension.youtube.patches.components.PlaybackSpeedMenuFilter;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
import kotlin.Unit;
|
||||
@@ -80,6 +79,16 @@ public class CustomPlaybackSpeedPatch {
|
||||
*/
|
||||
public static final float[] customPlaybackSpeeds;
|
||||
|
||||
/**
|
||||
* Minimum and maximum custom playback speeds of {@link #customPlaybackSpeeds}.
|
||||
*/
|
||||
private static final float customPlaybackSpeedsMin, customPlaybackSpeedsMax;
|
||||
|
||||
/**
|
||||
* The last time the old playback menu was forcefully called.
|
||||
*/
|
||||
private static volatile long lastTimeOldPlaybackMenuInvoked;
|
||||
|
||||
/**
|
||||
* Formats speeds to UI strings.
|
||||
*/
|
||||
@@ -90,11 +99,6 @@ public class CustomPlaybackSpeedPatch {
|
||||
*/
|
||||
private static WeakReference<Dialog> currentDialog = new WeakReference<>(null);
|
||||
|
||||
/**
|
||||
* Minimum and maximum custom playback speeds of {@link #customPlaybackSpeeds}.
|
||||
*/
|
||||
private static final float customPlaybackSpeedsMin, customPlaybackSpeedsMax;
|
||||
|
||||
static {
|
||||
// Cap at 2 decimals (rounds automatically).
|
||||
speedFormatter.setMaximumFractionDigits(2);
|
||||
@@ -174,25 +178,33 @@ public class CustomPlaybackSpeedPatch {
|
||||
public static void onFlyoutMenuCreate(RecyclerView recyclerView) {
|
||||
recyclerView.getViewTreeObserver().addOnDrawListener(() -> {
|
||||
try {
|
||||
if (PlaybackSpeedMenuFilterPatch.isPlaybackRateSelectorMenuVisible) {
|
||||
if (hideLithoMenuAndShowCustomSpeedMenu(recyclerView, 5)) {
|
||||
PlaybackSpeedMenuFilterPatch.isPlaybackRateSelectorMenuVisible = false;
|
||||
if (PlaybackSpeedMenuFilter.isPlaybackRateSelectorMenuVisible) {
|
||||
if (hideLithoMenuAndShowSpeedMenu(recyclerView, 5)) {
|
||||
PlaybackSpeedMenuFilter.isPlaybackRateSelectorMenuVisible = false;
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "onFlyoutMenuCreate failure", ex);
|
||||
Logger.printException(() -> "isPlaybackRateSelectorMenuVisible failure", ex);
|
||||
}
|
||||
|
||||
try {
|
||||
if (PlaybackSpeedMenuFilter.isOldPlaybackSpeedMenuVisible) {
|
||||
if (hideLithoMenuAndShowSpeedMenu(recyclerView, 8)) {
|
||||
PlaybackSpeedMenuFilter.isOldPlaybackSpeedMenuVisible = false;
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "isOldPlaybackSpeedMenuVisible failure", ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
private static boolean hideLithoMenuAndShowCustomSpeedMenu(RecyclerView recyclerView, int expectedChildCount) {
|
||||
private static boolean hideLithoMenuAndShowSpeedMenu(RecyclerView recyclerView, int expectedChildCount) {
|
||||
if (recyclerView.getChildCount() == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
View firstChild = recyclerView.getChildAt(0);
|
||||
if (!(firstChild instanceof ViewGroup playbackSpeedParentView)) {
|
||||
if (!(recyclerView.getChildAt(0) instanceof ViewGroup playbackSpeedParentView)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -200,33 +212,49 @@ public class CustomPlaybackSpeedPatch {
|
||||
return false;
|
||||
}
|
||||
|
||||
ViewParent parentView3rd = Utils.getParentView(recyclerView, 3);
|
||||
if (!(parentView3rd instanceof ViewGroup)) {
|
||||
return true;
|
||||
if (!(Utils.getParentView(recyclerView, 3) instanceof ViewGroup parentView3rd)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ViewParent parentView4th = parentView3rd.getParent();
|
||||
if (!(parentView4th instanceof ViewGroup)) {
|
||||
return true;
|
||||
if (!(parentView3rd.getParent() instanceof ViewGroup parentView4th)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Dismiss View [R.id.touch_outside] is the 1st ChildView of the 4th ParentView.
|
||||
// This only shows in phone layout.
|
||||
final var touchInsidedView = ((ViewGroup) parentView4th).getChildAt(0);
|
||||
var touchInsidedView = parentView4th.getChildAt(0);
|
||||
touchInsidedView.setSoundEffectsEnabled(false);
|
||||
touchInsidedView.performClick();
|
||||
|
||||
// In tablet layout there is no Dismiss View, instead we just hide all two parent views.
|
||||
((ViewGroup) parentView3rd).setVisibility(View.GONE);
|
||||
((ViewGroup) parentView4th).setVisibility(View.GONE);
|
||||
parentView3rd.setVisibility(View.GONE);
|
||||
parentView4th.setVisibility(View.GONE);
|
||||
|
||||
// Close the litho speed menu and show the modern custom speed dialog.
|
||||
showModernCustomPlaybackSpeedDialog(recyclerView.getContext());
|
||||
Logger.printDebug(() -> "Modern playback speed dialog shown");
|
||||
// Close the litho speed menu and show the custom speeds.
|
||||
if (Settings.RESTORE_OLD_SPEED_MENU.get()) {
|
||||
showOldPlaybackSpeedMenu();
|
||||
Logger.printDebug(() -> "Old playback speed dialog shown");
|
||||
} else {
|
||||
showModernCustomPlaybackSpeedDialog(recyclerView.getContext());
|
||||
Logger.printDebug(() -> "Modern playback speed dialog shown");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void showOldPlaybackSpeedMenu() {
|
||||
// This method is sometimes used multiple times.
|
||||
// To prevent this, ignore method reuse within 1 second.
|
||||
final long now = System.currentTimeMillis();
|
||||
if (now - lastTimeOldPlaybackMenuInvoked < 1000) {
|
||||
Logger.printDebug(() -> "Ignoring call to showOldPlaybackSpeedMenu");
|
||||
return;
|
||||
}
|
||||
lastTimeOldPlaybackMenuInvoked = now;
|
||||
|
||||
// Rest of the implementation added by patch.
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a modern custom dialog for adjusting video playback speed.
|
||||
* <p>
|
||||
|
||||
@@ -68,8 +68,9 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED = new BooleanSetting("revanced_remember_playback_speed_last_selected", FALSE);
|
||||
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_playback_speed_last_selected_toast", TRUE, false,
|
||||
parent(REMEMBER_PLAYBACK_SPEED_LAST_SELECTED));
|
||||
public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE);
|
||||
public static final FloatSetting PLAYBACK_SPEED_DEFAULT = new FloatSetting("revanced_playback_speed_default", -2.0f);
|
||||
public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE);
|
||||
public static final BooleanSetting RESTORE_OLD_SPEED_MENU = new BooleanSetting("revanced_restore_old_speed_menu", FALSE, parent(CUSTOM_SPEED_MENU));
|
||||
public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds",
|
||||
"0.25\n0.5\n0.75\n1.0\n1.25\n1.5\n1.75\n2.0\n2.5\n3.0\n4.0\n5.0\n6.0\n7.0\n8.0", true);
|
||||
|
||||
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.32.0-dev.4
|
||||
version = 5.33.0-dev.1
|
||||
|
||||
@@ -8,12 +8,7 @@ val hideVideoAdsPatch = bytecodePatch(
|
||||
name = "Hide music video ads",
|
||||
description = "Hides ads that appear while listening to or streaming music videos, podcasts, or songs.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
navigate(showVideoAdsParentFingerprint.originalMethod)
|
||||
|
||||
@@ -8,12 +8,7 @@ val enableExclusiveAudioPlaybackPatch = bytecodePatch(
|
||||
name = "Enable exclusive audio playback",
|
||||
description = "Enables the option to play audio without video.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
allowExclusiveAudioPlaybackFingerprint.method.returnEarly(true)
|
||||
|
||||
@@ -11,12 +11,7 @@ val permanentRepeatPatch = bytecodePatch(
|
||||
description = "Permanently remember your repeating preference even if the playlist ends or another track is played.",
|
||||
use = false,
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
val startIndex = repeatTrackFingerprint.patternMatch!!.endIndex
|
||||
|
||||
@@ -7,18 +7,9 @@ import app.revanced.patcher.patch.bytecodePatch
|
||||
@Suppress("unused")
|
||||
val permanentShufflePatch = bytecodePatch(
|
||||
description = "Permanently remember your shuffle preference " +
|
||||
"even if the playlist ends or another track is played.",
|
||||
use = false,
|
||||
"even if the playlist ends or another track is played."
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"6.45.54",
|
||||
"6.51.53",
|
||||
"7.01.53",
|
||||
"7.02.52",
|
||||
"7.03.52",
|
||||
),
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
disableShuffleFingerprint.method.addInstruction(0, "return-void")
|
||||
|
||||
@@ -11,12 +11,7 @@ val hideCategoryBar = bytecodePatch(
|
||||
description = "Hides the category bar at the top of the homepage.",
|
||||
use = false,
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
constructCategoryBarFingerprint.method.apply {
|
||||
|
||||
@@ -11,12 +11,7 @@ val hideGetPremiumPatch = bytecodePatch(
|
||||
name = "Hide 'Get Music Premium' label",
|
||||
description = "Hides the \"Get Music Premium\" label from the account menu and settings.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
hideGetPremiumFingerprint.method.apply {
|
||||
|
||||
@@ -18,12 +18,7 @@ val removeUpgradeButtonPatch = bytecodePatch(
|
||||
name = "Remove upgrade button",
|
||||
description = "Removes the upgrade tab from the pivot bar.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
pivotBarConstructorFingerprint.method.apply {
|
||||
|
||||
@@ -8,12 +8,7 @@ val bypassCertificateChecksPatch = bytecodePatch(
|
||||
name = "Bypass certificate checks",
|
||||
description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
checkCertificateFingerprint.method.returnEarly(true)
|
||||
|
||||
@@ -8,12 +8,7 @@ val backgroundPlaybackPatch = bytecodePatch(
|
||||
name = "Remove background playback restrictions",
|
||||
description = "Removes restrictions on background playback, including playing kids videos in the background.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
execute {
|
||||
kidsBackgroundPlaybackPolicyControllerFingerprint.method.addInstruction(
|
||||
|
||||
@@ -25,12 +25,7 @@ val spoofClientPatch = bytecodePatch(
|
||||
name = "Spoof client",
|
||||
description = "Spoofs the client to fix playback.",
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.16.53",
|
||||
"8.05.51"
|
||||
)
|
||||
)
|
||||
compatibleWith("com.google.android.apps.youtube.music")
|
||||
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
|
||||
@@ -99,7 +99,7 @@ val hideInfoCardsPatch = bytecodePatch(
|
||||
)
|
||||
|
||||
// Info cards can also appear as Litho components.
|
||||
val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/components/HideInfoCardsFilterPatch;"
|
||||
val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/components/HideInfoCardsFilter;"
|
||||
addLithoFilter(filterClassDescriptor)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch;"
|
||||
|
||||
private const val FILTER_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilterPatch;"
|
||||
"Lapp/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter;"
|
||||
|
||||
val returnYouTubeDislikePatch = bytecodePatch(
|
||||
name = "Return YouTube Dislike",
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
package app.revanced.patches.youtube.video.speed.custom
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.instructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.patches.shared.misc.mapping.get
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappings
|
||||
import app.revanced.patches.shared.misc.settings.preference.InputType
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||
@@ -18,18 +26,34 @@ import app.revanced.patches.youtube.misc.recyclerviewtree.hook.addRecyclerViewTr
|
||||
import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch
|
||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||
import app.revanced.patches.youtube.video.speed.settingsMenuVideoSpeedGroup
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstLiteralInstruction
|
||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableField
|
||||
|
||||
private const val FILTER_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch;"
|
||||
"Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter;"
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
internal const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;"
|
||||
|
||||
internal var speedUnavailableId = -1L
|
||||
private set
|
||||
|
||||
private val customPlaybackSpeedResourcePatch = resourcePatch {
|
||||
dependsOn(resourceMappingPatch)
|
||||
|
||||
execute {
|
||||
speedUnavailableId = resourceMappings["string", "varispeed_unavailable_message"]
|
||||
}
|
||||
}
|
||||
|
||||
internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
description = "Adds custom playback speed options.",
|
||||
) {
|
||||
@@ -39,7 +63,8 @@ internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
addResourcesPatch,
|
||||
lithoFilterPatch,
|
||||
versionCheckPatch,
|
||||
recyclerViewTreeHookPatch
|
||||
recyclerViewTreeHookPatch,
|
||||
customPlaybackSpeedResourcePatch
|
||||
)
|
||||
|
||||
execute {
|
||||
@@ -48,6 +73,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
settingsMenuVideoSpeedGroup.addAll(
|
||||
listOf(
|
||||
SwitchPreference("revanced_custom_speed_menu"),
|
||||
SwitchPreference("revanced_restore_old_speed_menu"),
|
||||
TextPreference(
|
||||
"revanced_custom_playback_speeds",
|
||||
inputType = InputType.TEXT_MULTI_LINE
|
||||
@@ -77,15 +103,88 @@ internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
replaceInstruction(limitMaxIndex, "const/high16 v$limitMaxRegister, 8.0f")
|
||||
}
|
||||
|
||||
|
||||
// Replace the speeds float array with custom speeds.
|
||||
// These speeds are used if the speed menu is immediately opened after a video is opened.
|
||||
speedArrayGeneratorFingerprint.method.apply {
|
||||
val sizeCallIndex = indexOfFirstInstructionOrThrow { getReference<MethodReference>()?.name == "size" }
|
||||
val sizeCallResultRegister = getInstruction<OneRegisterInstruction>(sizeCallIndex + 1).registerA
|
||||
|
||||
replaceInstruction(sizeCallIndex + 1, "const/4 v$sizeCallResultRegister, 0x0")
|
||||
|
||||
val arrayLengthConstIndex = indexOfFirstLiteralInstructionOrThrow(7)
|
||||
val arrayLengthConstDestination = getInstruction<OneRegisterInstruction>(arrayLengthConstIndex).registerA
|
||||
val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F"
|
||||
|
||||
addInstructions(
|
||||
arrayLengthConstIndex + 1,
|
||||
"""
|
||||
sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType
|
||||
array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination
|
||||
""",
|
||||
)
|
||||
|
||||
val originalArrayFetchIndex = indexOfFirstInstructionOrThrow {
|
||||
val reference = getReference<FieldReference>()
|
||||
reference?.type == "[F" && reference.definingClass.endsWith("/PlayerConfigModel;")
|
||||
}
|
||||
val originalArrayFetchDestination =
|
||||
getInstruction<OneRegisterInstruction>(originalArrayFetchIndex).registerA
|
||||
|
||||
replaceInstruction(
|
||||
originalArrayFetchIndex,
|
||||
"sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType",
|
||||
)
|
||||
}
|
||||
|
||||
// region Force old video quality menu.
|
||||
|
||||
// Add a static INSTANCE field to the class.
|
||||
// This is later used to call "showOldPlaybackSpeedMenu" on the instance.
|
||||
|
||||
val instanceField = ImmutableField(
|
||||
getOldPlaybackSpeedsFingerprint.originalClassDef.type,
|
||||
"INSTANCE",
|
||||
getOldPlaybackSpeedsFingerprint.originalClassDef.type,
|
||||
AccessFlags.PUBLIC.value or AccessFlags.STATIC.value,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
).toMutable()
|
||||
|
||||
getOldPlaybackSpeedsFingerprint.classDef.staticFields.add(instanceField)
|
||||
// Set the INSTANCE field to the instance of the class.
|
||||
// In order to prevent a conflict with another patch, add the instruction at index 1.
|
||||
getOldPlaybackSpeedsFingerprint.method.addInstruction(1, "sput-object p0, $instanceField")
|
||||
|
||||
// Get the "showOldPlaybackSpeedMenu" method.
|
||||
// This is later called on the field INSTANCE.
|
||||
val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.match(
|
||||
getOldPlaybackSpeedsFingerprint.classDef,
|
||||
).method
|
||||
|
||||
// Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE.
|
||||
showOldPlaybackSpeedMenuExtensionFingerprint.method.apply {
|
||||
addInstructionsWithLabels(
|
||||
instructions.lastIndex,
|
||||
"""
|
||||
sget-object v0, $instanceField
|
||||
if-nez v0, :not_null
|
||||
return-void
|
||||
:not_null
|
||||
invoke-virtual { v0 }, $showOldPlaybackSpeedMenuMethod
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// Close the unpatched playback dialog and show the modern custom dialog.
|
||||
addRecyclerViewTreeHook(EXTENSION_CLASS_DESCRIPTOR)
|
||||
|
||||
// Required to check if the playback speed menu is currently shown.
|
||||
addLithoFilter(FILTER_CLASS_DESCRIPTOR)
|
||||
|
||||
// endregion
|
||||
|
||||
|
||||
// region Custom tap and hold 2x speed.
|
||||
|
||||
if (is_19_25_or_greater) {
|
||||
|
||||
@@ -3,10 +3,33 @@ package app.revanced.patches.youtube.video.speed.custom
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.literal
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||
|
||||
internal val getOldPlaybackSpeedsFingerprint = fingerprint {
|
||||
parameters("[L", "I")
|
||||
strings("menu_item_playback_speed")
|
||||
}
|
||||
|
||||
internal val showOldPlaybackSpeedMenuFingerprint = fingerprint {
|
||||
literal { speedUnavailableId }
|
||||
}
|
||||
|
||||
internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint {
|
||||
custom { method, classDef ->
|
||||
method.name == "showOldPlaybackSpeedMenu" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
|
||||
}
|
||||
}
|
||||
|
||||
internal val speedArrayGeneratorFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("[L")
|
||||
parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;")
|
||||
strings("0.0#")
|
||||
}
|
||||
|
||||
internal val speedLimiterFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("V")
|
||||
|
||||
@@ -137,6 +137,7 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
|
||||
<string name="revanced_debug_logs_disabled">Sazlama qeydi qapalıdır</string>
|
||||
<string name="revanced_debug_logs_none_found">Qeydlər tapılmadı</string>
|
||||
<string name="revanced_debug_logs_copied_to_clipboard">Qeydlər köçürüldü</string>
|
||||
<string name="revanced_debug_logs_failed_to_export">Qeydləri ixrac etmək alınmadı: %s</string>
|
||||
<string name="revanced_debug_logs_clear_buffer_title">Sazlama qeydlərini təmizlə</string>
|
||||
<string name="revanced_debug_logs_clear_buffer_summary">Saxlanılan bütün ReVanced sazlama qeydlərini təmizləyir</string>
|
||||
<string name="revanced_debug_logs_clear_toast">Qeydlər silindi</string>
|
||||
@@ -467,7 +468,15 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_on">Yükləmə düyməsi, xarici yükləyicinizi açır</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_off">Yükləmə düyməsi tətbiqə xas yükləyicini açır</string>
|
||||
<string name="revanced_external_downloader_name_title">Yükləyici paketi adı</string>
|
||||
<string name="revanced_external_downloader_name_summary">Quraşdırılan xarici yükləyici tətbiqinizin paket adı</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">Paket adını yerləşdir</string>
|
||||
<string name="revanced_external_downloader_other_item">Digər</string>
|
||||
<string name="revanced_external_downloader_not_found_title">Tətbiq quraşdırılmayıb</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">%s quraşdırılmayıb. Lütfən, bunu quraşdır.</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"Paket adı ilə quraşdırılan tətbiq tapılmadı: %s
|
||||
|
||||
Paket adının düzgün olduğun yoxla və tətbiqi quraşdırın"</string>
|
||||
<string name="revanced_external_downloader_empty_warning">Paket adı boş ola bilməz</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.disablePreciseSeekingGesturePatch">
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">Dəqiq axtarış jestini qapadın</string>
|
||||
|
||||
@@ -168,6 +168,13 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Kelluva mikrofonipainike on piilotettu haussa</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Kelluva mikrofonipainike näytetään haussa</string>
|
||||
<string name="revanced_hide_horizontal_shelves_title">Piilota vaakasuuntaiset hyllyt</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">"Vaakahyllyt on piilotettu, kuten:
|
||||
• Tuoreimmat uutiset
|
||||
• Jatka katselua
|
||||
• Tutustu useampiin kanaviin
|
||||
• Olennaisimmat
|
||||
• Ostokset
|
||||
• Katso uudelleen"</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_off">Vaakasuuntaiset hyllyt näytetään</string>
|
||||
<string name="revanced_hide_image_shelf_title">Piilota kuvahylly</string>
|
||||
<string name="revanced_hide_image_shelf_summary_on">Kuvahylly on piilotettu hakutuloksissa</string>
|
||||
@@ -202,6 +209,8 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Lippuhylly näytetään</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_video_recommendation_labels_title">Piilota videosuositusten tunnisteet</string>
|
||||
<string name="revanced_hide_video_recommendation_labels_summary_on">\'Ihmiset katsoivat myös\' ja \'Saatat myös pitää\' -merkinnät hakutuloksissa ovat piilotettuna</string>
|
||||
<string name="revanced_hide_video_recommendation_labels_summary_off">\"Ihmiset katsoivat myös\" ja \"Saatat myös pitää\" -otsikot näkyvät hakutuloksissa</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Piilota YouTube Doodlet</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Logon YouTube Doodles -animaatio on piilotettu</string>
|
||||
@@ -459,7 +468,15 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla"</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_on">Lataa-painike avaa ulkoisen lataajan</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_off">Lataa-painike avaa sovelluksen sisäisen lataajan</string>
|
||||
<string name="revanced_external_downloader_name_title">Lataajan paketin nimi</string>
|
||||
<string name="revanced_external_downloader_name_summary">Asennetun ulkoisen lataussovelluksen paketin nimi</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">Anna paketin nimi</string>
|
||||
<string name="revanced_external_downloader_other_item">Muu</string>
|
||||
<string name="revanced_external_downloader_not_found_title">Sovellusta ei ole asennettu</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">%s ei ole asennettu. Asenna se.</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"Ei löytynyt asennettua sovellusta paketin nimellä: %s
|
||||
|
||||
Tarkista, että paketin nimi on oikein ja sovellus on asennettu"</string>
|
||||
<string name="revanced_external_downloader_empty_warning">Paketin nimi ei voi olla tyhjä</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.disablePreciseSeekingGesturePatch">
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">Poista tarkka etsintäele käytöstä</string>
|
||||
|
||||
@@ -470,15 +470,15 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_external_downloader_action_button_summary_on">オフライン ボタンは外部ダウンローダーを呼び出します</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_off">オフライン ボタンはアプリ内のダウンローダーを呼び出します</string>
|
||||
<string name="revanced_external_downloader_name_title">外部ダウンローダーのパッケージ名</string>
|
||||
<string name="revanced_external_downloader_name_summary">インストールされている外部ダウンローダーアプリのパッケージ名</string>
|
||||
<string name="revanced_external_downloader_name_summary">インストールされている外部ダウンローダー アプリのパッケージ名</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">パッケージ名を入力してください</string>
|
||||
<string name="revanced_external_downloader_other_item">その他</string>
|
||||
<string name="revanced_external_downloader_not_found_title">アプリがインストールされていません</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">%s はインストールされていません。インストールしてください。</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"パッケージ名: %s のインストール済みアプリが見つかりませんでした
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"パッケージ名 %s のインストール済みアプリが見つかりませんでした
|
||||
|
||||
パッケージ名が正しいこと、およびアプリがインストールされていることを確認してください"</string>
|
||||
<string name="revanced_external_downloader_empty_warning">パッケージ名を空にすることはできません</string>
|
||||
<string name="revanced_external_downloader_empty_warning">パッケージ名は空欄にはできません</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.disablePreciseSeekingGesturePatch">
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">精密シークモードを無効にする</string>
|
||||
|
||||
@@ -378,7 +378,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
|
||||
<string name="revanced_hide_keyword_content_about_title">키워드 필터링 정보</string>
|
||||
<string name="revanced_hide_keyword_content_about_summary">"홈 / 구독 / 검색 결과가 필터링되어 키워드 구문과 일치하는 콘텐츠가 숨겨집니다
|
||||
|
||||
알려진 문제점:
|
||||
제한 사항:
|
||||
• 채널 이름으로 Shorts는 숨길 수 없습니다
|
||||
• 일부 화면 구성요소는 숨겨지지 않을 수 있습니다
|
||||
• 필터링 키워드를 검색하면 검색 결과가 표시되지 않을 수 있습니다"</string>
|
||||
@@ -912,7 +912,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
|
||||
<string name="revanced_ryd_shorts_title">Shorts에서 싫어요 수 표시하기</string>
|
||||
<string name="revanced_ryd_shorts_summary_on">"Shorts에서 싫어요 수를 표시합니다
|
||||
|
||||
알려진 문제점:
|
||||
제한 사항:
|
||||
• 사용자가 로그인을 하지 않았거나 시크릿 모드에서는 싫어요 수가 표시되지 않을 수 있습니다"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Shorts에서 싫어요 수를 표시하지 않습니다</string>
|
||||
<string name="revanced_ryd_dislike_percentage_title">싫어요 수를 퍼센트로 표시하기</string>
|
||||
@@ -1231,7 +1231,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
|
||||
<string name="revanced_change_start_page_always_title">앱 시작 페이지 항상 변경하기</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"앱 시작 페이지를 항상 변경합니다
|
||||
|
||||
알려진 문제점:
|
||||
제한 사항:
|
||||
• 툴바에서 '뒤로 가기' 버튼이 작동하지 않을 수 있습니다"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">앱 시작 페이지를 앱 시작 시에만 변경합니다</string>
|
||||
</patch>
|
||||
|
||||
@@ -468,7 +468,7 @@ Ova funkcija je dostupna samo za starije uređaje"</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_on">Dugme „Preuzmi” otvara spoljni program za preuzimanje</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_off">Dugme „Preuzmi” otvara izvorni program za preuzimanje u aplikaciji</string>
|
||||
<string name="revanced_external_downloader_name_title">Naziv paketa programa za preuzimanje</string>
|
||||
<string name="revanced_external_downloader_name_summary">Naziv paketa vaše instalirane spoljne aplikacije za preuzimanje</string>
|
||||
<string name="revanced_external_downloader_name_summary">Naziv paketa vašeg instaliranog spoljnog programa za preuzimanje</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">Unesite naziv paketa</string>
|
||||
<string name="revanced_external_downloader_other_item">Ostalo</string>
|
||||
<string name="revanced_external_downloader_not_found_title">Aplikacija nije instalirana</string>
|
||||
|
||||
@@ -468,14 +468,14 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_on">Дугме „Преузми” отвара спољни програм за преузимање</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_off">Дугме „Преузми” отвара изворни програм за преузимање у апликацији</string>
|
||||
<string name="revanced_external_downloader_name_title">Назив пакета програма за преузимање</string>
|
||||
<string name="revanced_external_downloader_name_summary">Назив пакета ваше инсталиране спољне апликације за преузимање</string>
|
||||
<string name="revanced_external_downloader_name_summary">Назив пакета вашег инсталираног спољног програма за преузимање</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">Унесите назив пакета</string>
|
||||
<string name="revanced_external_downloader_other_item">Остало</string>
|
||||
<string name="revanced_external_downloader_not_found_title">Апликација није инсталирана</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">%s није инсталиран. Инсталирајте га.</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"Није могуће пронаћи инсталирану апликацију са називом пакета: %s
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"Није пронађена инсталирана апликација са називом пакета: %s
|
||||
|
||||
Проверите да ли је назив пакета тачан и да ли је апликација инсталирана"</string>
|
||||
Проверите да ли је назив пакета исправан и да ли је апликација инсталирана"</string>
|
||||
<string name="revanced_external_downloader_empty_warning">Назив пакета не може бити празан</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.disablePreciseSeekingGesturePatch">
|
||||
|
||||
@@ -165,10 +165,10 @@ Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz."</string>
|
||||
<string name="revanced_hide_expandable_card_summary_on">Videoların altındaki genişletilebilir kart gizli</string>
|
||||
<string name="revanced_hide_expandable_card_summary_off">Videoların altındaki genişletilebilir kart görünür</string>
|
||||
<string name="revanced_hide_floating_microphone_button_title">Alttaki mikrofon düğmesini gizle</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Aramadaki hareketli mikrofon düğmesi gizli</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Aramada yüzen mikrofon düğmesi gösteriliyor</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Aramadaki yüzen mikrofon düğmesi gizli</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Aramadaki yüzen mikrofon düğmesi görünür</string>
|
||||
<string name="revanced_hide_horizontal_shelves_title">Yatay rafları gizle</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">"Yatay raflar gizlenir, örneğin:
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">"Şunlar gibi yatay raflar gizlenir:
|
||||
• Son dakika haberleri
|
||||
• İzlemeye devam et
|
||||
• Daha fazla kanal keşfet
|
||||
@@ -191,8 +191,8 @@ Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz."</string>
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the Subscriptions feed for future livestreams or unreleased videos. -->
|
||||
<string name="revanced_hide_notify_me_button_title">\'Hatırlatma oluştur\' düğmesini gizle</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Bana bildir düğmesi gizli</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Bana bildir düğmesi görünür</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Hatırlatma oluştur düğmesi gizli</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Hatırlatma oluştur düğmesi görünür</string>
|
||||
<string name="revanced_hide_playables_title">Hazır Oyunlar\'ı gizle</string>
|
||||
<string name="revanced_hide_playables_summary_on">Hazır Oyunlar gizli</string>
|
||||
<string name="revanced_hide_playables_summary_off">Hazır Oyunlar görünür</string>
|
||||
@@ -209,12 +209,12 @@ Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz."</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Bilet rafı görünür</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_video_recommendation_labels_title">Video öneri etiketlerini gizle</string>
|
||||
<string name="revanced_hide_video_recommendation_labels_summary_on">\"İnsanların İzlediği Diğer Videolar\" ve \"Şunlar da Hoşunuza Gidebilir\" etiketleri arama sonuçlarında gizli</string>
|
||||
<string name="revanced_hide_video_recommendation_labels_summary_off">\"İnsanların İzlediği Diğer Videolar\" ve \"Şunlar da Hoşunuza Gidebilir\" etiketleri arama sonuçlarında görünür</string>
|
||||
<string name="revanced_hide_video_recommendation_labels_summary_on">Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri gizli</string>
|
||||
<string name="revanced_hide_video_recommendation_labels_summary_off">Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri görünür</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodle\'larını gizle</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Logodaki YouTube Doodles animasyonu gizli</string>
|
||||
<string name="revanced_hide_doodles_summary_off">Logodaki YouTube Doodles animasyonu gösteriliyor</string>
|
||||
<string name="revanced_hide_doodles_summary_off">Logodaki YouTube Doodles animasyonu görünür</string>
|
||||
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles, her yıl birkaç gün gösterilir.
|
||||
|
||||
Bir Doodle şu anda bölgenizde gösteriliyorsa ve bu gizleme ayarı açıksa, arama çubuğunun altındaki filtre çubuğu da gizlenecektir."</string>
|
||||
@@ -418,10 +418,10 @@ Bu özellik yalnızca eski cihazlarda kullanılabilir"</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Kendine sponsor kartlar görünür</string>
|
||||
<string name="revanced_hide_shopping_links_title">Alışveriş bağlantılarını gizle</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Video açıklamasındaki alışveriş bağlantıları gizli</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Video açıklamasındaki alışveriş bağlantıları gösteriliyor</string>
|
||||
<string name="revanced_hide_view_products_banner_title">\"Ürünleri görüntüle\" afişini gizle</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Video bindirmesindeki ürünleri görüntüle afişi gizli</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Video bindirmesindeki ürünleri görüntüle afişi görünür</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Video açıklamasındaki alışveriş bağlantıları görünür</string>
|
||||
<string name="revanced_hide_view_products_banner_title">\'Ürünleri görüntüle\' afişini gizle</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Video katmanındaki ürünleri görüntüle afişi gizli</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Video katmanındaki ürünleri görüntüle afişi görünür</string>
|
||||
<string name="revanced_hide_web_search_results_title">Web arama sonuçlarını gizle</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Web arama sonuçları gizli</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Web arama sonuçları görünür</string>
|
||||
@@ -440,10 +440,10 @@ Bu özellik yalnızca eski cihazlarda kullanılabilir"</string>
|
||||
<string name="revanced_share_copy_url_success">URL panoya kopyalandı</string>
|
||||
<string name="revanced_share_copy_url_timestamp_success">Zaman damgalı URL kopyalandı</string>
|
||||
<string name="revanced_copy_video_url_title">Video URL\'sini kopyalama düğmesini göster</string>
|
||||
<string name="revanced_copy_video_url_summary_on">Düğme gösteriliyor. Video URL\'sini kopyalamak için dokunun. Zaman damgasıyla kopyalamak için dokunup basılı tutun</string>
|
||||
<string name="revanced_copy_video_url_summary_on">Düğme gösterilir. Video URL\'sini kopyalamak için dokunun. Zaman damgasıyla kopyalamak için dokunup basılı tutun</string>
|
||||
<string name="revanced_copy_video_url_summary_off">Düğme gösterilmez</string>
|
||||
<string name="revanced_copy_video_url_timestamp_title">Zaman damgalı URL\'yi kopyalama düğmesini göster</string>
|
||||
<string name="revanced_copy_video_url_timestamp_summary_on">Düğme gösteriliyor. Zaman damgalı video URL\'sini kopyalamak için dokunun. Zaman damgası olmadan kopyalamak için dokunup basılı tutun</string>
|
||||
<string name="revanced_copy_video_url_timestamp_summary_on">Düğme gösterilir. Zaman damgalı video URL\'sini kopyalamak için dokunun. Zaman damgası olmadan kopyalamak için dokunup basılı tutun</string>
|
||||
<string name="revanced_copy_video_url_timestamp_summary_off">Düğme gösterilmez</string>
|
||||
</patch>
|
||||
<patch id="interaction.dialog.removeViewerDiscretionDialogPatch">
|
||||
@@ -461,8 +461,8 @@ Bu özellik yalnızca eski cihazlarda kullanılabilir"</string>
|
||||
<string name="revanced_external_downloader_screen_title">Harici indirmeler</string>
|
||||
<string name="revanced_external_downloader_screen_summary">Harici indirici kullanımı için ayarlar</string>
|
||||
<string name="revanced_external_downloader_title">Harici indirme düğmesini göster</string>
|
||||
<string name="revanced_external_downloader_summary_on">Oynatıcıdaki indirme düğmesi gösteriliyor</string>
|
||||
<string name="revanced_external_downloader_summary_off">Oynatıcıdaki indirme düğmesi gösterilmiyor</string>
|
||||
<string name="revanced_external_downloader_summary_on">Oynatıcıda indirme düğmesi gösterilir</string>
|
||||
<string name="revanced_external_downloader_summary_off">Oynatıcıda indirme düğmesi gösterilmez</string>
|
||||
<!-- 'Download action button' should be translated using the same wording as the translation of 'revanced_hide_download_button_title'. -->
|
||||
<string name="revanced_external_downloader_action_button_title">İndirme eylem düğmesini kullan</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_on">İndirme düğmesi harici indiricinizi açar</string>
|
||||
@@ -479,9 +479,9 @@ Paket adının doğru olduğunu ve uygulamanın yüklü olduğunu doğrulayın"<
|
||||
<string name="revanced_external_downloader_empty_warning">Paket adı boş olamaz</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.disablePreciseSeekingGesturePatch">
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">Hassas sarma hareketini devre dışı bırak</string>
|
||||
<string name="revanced_disable_precise_seeking_gesture_summary_on">Hareket devre dışı</string>
|
||||
<string name="revanced_disable_precise_seeking_gesture_summary_off">Hareket etkin</string>
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">Hassas sardırma hareketini devre dışı bırak</string>
|
||||
<string name="revanced_disable_precise_seeking_gesture_summary_on">Hassas sardırma hareketi devre dışı</string>
|
||||
<string name="revanced_disable_precise_seeking_gesture_summary_off">Hassas sardırma hareketi etkin</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSeekbarTappingPatch">
|
||||
<string name="revanced_seekbar_tapping_title">Dokunarak sardırmayı etkinleştir</string>
|
||||
@@ -682,15 +682,15 @@ Bu ayarı değiştirmek etkili olmazsa, Gizli moda geçmeyi deneyin."</string>
|
||||
<string name="revanced_hide_player_flyout_lock_screen_summary_on">Ekranı kilitle menüsü gizli</string>
|
||||
<string name="revanced_hide_player_flyout_lock_screen_summary_off">Ekranı kilitle menüsü görünür</string>
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Ses parçası\'nı gizle</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Ses parçasını gizle</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Ses parçası menüsü gizli</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Ses parçası menüsü görünür</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Ses parçası menüsü gizli
|
||||
|
||||
Ses parçası menüsünü göstermek için \"Video akışlarını taklit et\" ayarını iOS TV olarak değiştirin"</string>
|
||||
Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayarını iOS TV olarak değiştirin"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">VR modunda izle\'yi gizle</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">VR modunda izlemeyi gizle</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">VR modunda izle menüsü gizli</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_off">VR modunda izle menüsü görünür</string>
|
||||
<string name="revanced_hide_player_flyout_video_quality_footer_title">Video kalite menüsü alt bilgisini gizle</string>
|
||||
@@ -710,10 +710,10 @@ Ses parçası menüsünü göstermek için \"Video akışlarını taklit et\" ay
|
||||
<string name="revanced_hide_cast_button_summary_off">Yayınla düğmesi görünür</string>
|
||||
<string name="revanced_hide_player_control_buttons_background_title">Oynatıcı kontrolleri arka planını gizle</string>
|
||||
<string name="revanced_hide_player_control_buttons_background_summary_on">Oynatıcı kontrolleri arka planı gizli</string>
|
||||
<string name="revanced_hide_player_control_buttons_background_summary_off">Oynatıcı kontrolleri arka planı gösteriliyor</string>
|
||||
<string name="revanced_hide_player_control_buttons_background_summary_off">Oynatıcı kontrolleri arka planı görünür</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_title">Önceki & Sonraki düğmelerini gizle</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Düğmeler gizli</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Düğmeler görünür</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Önceki & Sonraki düğmeleri gizli</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Önceki & Sonraki düğmeleri görünür</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Bitiş ekranı kartlarını gizle</string>
|
||||
@@ -815,12 +815,12 @@ Ses parçası menüsünü göstermek için \"Video akışlarını taklit et\" ay
|
||||
<string name="revanced_hide_shorts_use_sound_button_summary_off">Bu sesi kullan düğmesi gösteriliyor</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_title">Bu şablonu kullan düğmesini gizle</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_on">Bu şablonu kullan düğmesi gizli</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_off">Bu şablonu kullan düğmesi gösteriliyor</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_off">Bu şablonu kullan düğmesi görünür</string>
|
||||
<string name="revanced_hide_shorts_like_fountain_title">Beğeni düğmesi çeşme animasyonunu gizle</string>
|
||||
<string name="revanced_hide_shorts_like_fountain_summary_on">Beğeni düğmesi çeşme animasyonu gizli</string>
|
||||
<string name="revanced_hide_shorts_like_fountain_summary_off">Beğeni düğmesi çeşme animasyonu görünür</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Beğen düğmesini gizle</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Beğenme düğmesi gizli</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Beğen düğmesi gizli</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Beğen düğmesi görünür</string>
|
||||
<string name="revanced_hide_shorts_dislike_button_title">Beğenmeme düğmesini gizle</string>
|
||||
<string name="revanced_hide_shorts_dislike_button_summary_on">Beğenmeme düğmesi gizli</string>
|
||||
@@ -965,7 +965,7 @@ Zaman çubuğu küçük resimleri, mevcut video ile aynı kaliteyi kullanacaktı
|
||||
Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet bağlantısı kullanıldığında en iyi şekilde çalışır."</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_title">Eski zaman çubuğu küçük resimlerini geri getir</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">Zaman çubuğu küçük resimleri zaman çubuğunun üzerinde görünecek</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">Zaman çubuğu küçük resimleri tam ekranda gösterilecek</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">Zaman çubuğu küçük resimleri tam ekranda görünecek</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">SponsorBlock\'u etkinleştir</string>
|
||||
@@ -1029,7 +1029,7 @@ Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet
|
||||
<string name="revanced_sb_general_min_duration_invalid">Geçersiz süre</string>
|
||||
<string name="revanced_sb_general_uuid">Özel kullanıcı kimliğiniz</string>
|
||||
<string name="revanced_sb_general_uuid_sum">Bu gizli tutulmalıdır. Bu bir şifreye benzer ve başkalarıyla paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilirler</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">Özel kullanıcı kimliğiniz en az 30 karakter olmalıdır</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">Özel kullanıcı kimliği en az 30 karakter olmalıdır</string>
|
||||
<string name="revanced_sb_general_api_url">API URL\'sini değiştir</string>
|
||||
<string name="revanced_sb_general_api_url_sum">SponsorBlock\'un sunucuya çağrı yapmak için kullandığı adres</string>
|
||||
<string name="revanced_sb_api_url_reset">API URL\'si sıfırlandı</string>
|
||||
@@ -1042,28 +1042,28 @@ Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet
|
||||
<string name="revanced_sb_settings_import_successful">Ayarlar başarıyla içe aktarıldı</string>
|
||||
<string name="revanced_sb_settings_import_failed">İçe aktarılamadı: %s</string>
|
||||
<string name="revanced_sb_settings_export_failed">Dışa aktarılamadı: %s</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning">"Ayarlarınızda özel bir SponsorBlock kullanıcı kimliği var.
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning">"Ayarlarınız özel bir SponsorBlock kullanıcı kimliği içeriyor.
|
||||
|
||||
Kullanıcı kimliğiniz bir şifre gibidir ve asla paylaşılmamalıdır.
|
||||
Kullanıcı kimliğiniz bir parola gibidir ve asla paylaşılmamalıdır.
|
||||
"</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Bir daha gösterme</string>
|
||||
<string name="revanced_sb_diff_segments">Kısım davranışını değiştir</string>
|
||||
<string name="revanced_sb_segments_sponsor">Sponsor</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendi reklamı veya beğendiği amaçlara/üreticilere/sitelere/ürünlere atıfta bulunmalar için değil</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Karşılıksız/Kendi Reklamı</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Ücretsiz veya kendi reklamı olması dışında Sponsor\'a benzer. Ürünler, bağışlar veya kimlerle birlikte çalıştıkları hakkında kısımlar içerir</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Karşılıksız / Kendi Reklamı</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Ücretsiz veya kendi reklamı olması dışında Sponsor\'a benzer. Ürünler, bağışlar veya kimlerle birlikte çalıştıkları hakkında kısımları içerir</string>
|
||||
<string name="revanced_sb_segments_interaction">Etkileşim Hatırlatıcısı (Abone Ol)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">İçeriğin ortasında beğenme, abone olma veya takip etme için kısa hatırlatmalar. Eğer uzunsa veya belirli birşey hakkındaysa kendi reklamı kategorisinde olmalıdır</string>
|
||||
<string name="revanced_sb_segments_highlight">Vurgu</string>
|
||||
<string name="revanced_sb_segments_highlight_sum">Videonun çoğu kişinin aradığı bölümü</string>
|
||||
<string name="revanced_sb_segments_intro">Ara/Giriş Animasyonu</string>
|
||||
<string name="revanced_sb_segments_intro">Ara / Giriş Animasyonu</string>
|
||||
<string name="revanced_sb_segments_intro_sum">Gerçek içerik barındırmayan aralıklar. Duraklama, sabit kare veya tekrar eden bir animasyon olabilir. Bilgi içeren geçişleri içermez</string>
|
||||
<string name="revanced_sb_segments_outro">Bitiş Ekranı / Jenerik</string>
|
||||
<string name="revanced_sb_segments_outro_sum">Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil</string>
|
||||
<string name="revanced_sb_segments_preview">Ön İzleme/Özet/İma</string>
|
||||
<string name="revanced_sb_segments_preview">Önizleme / Özet / İma</string>
|
||||
<string name="revanced_sb_segments_preview_sum">Videoda veya bir dizinin diğer videolarında neler olduğunu ve nelerin geleceğini gösteren, tüm bilgilerin başka bir yerde tekrarlandığı klip koleksiyonu</string>
|
||||
<string name="revanced_sb_segments_filler">Konuyla Alakasız/Şaka</string>
|
||||
<string name="revanced_sb_segments_filler_sum">Videonun içeriğini anlamak için gerekli olmayan, sadece videoyu doldurmak veya mizah için eklenen alakasız sahneler. İçerik veya arka plan detaylarını içeren kısımları içermez</string>
|
||||
<string name="revanced_sb_segments_filler">Konuyla Alakasız / Şakalar</string>
|
||||
<string name="revanced_sb_segments_filler_sum">Videonun ana içeriğini anlamak için gerekli olmayan, sadece videoyu doldurmak veya mizah için eklenen alakasız sahneler. İçerik veya arka plan detaylarını içeren kısımları içermez</string>
|
||||
<string name="revanced_sb_segments_nomusic">Müzik: Müzik Olmayan Kısım</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">Yalnızca müzik videolarında kullanım içindir. Müzik videolarının başka bir kategorinin kapsamadığı müziksiz bölümleri</string>
|
||||
<string name="revanced_sb_skip_button_compact">Atla</string>
|
||||
@@ -1304,7 +1304,7 @@ Genişletmek veya kapatmak için kaydırın"</string>
|
||||
<string name="revanced_miniplayer_width_dip_invalid_toast">Piksel boyutu %1$s ve %2$s arasında olmalıdır</string>
|
||||
<string name="revanced_miniplayer_opacity_title">Katman opaklığı</string>
|
||||
<string name="revanced_miniplayer_opacity_summary">0-100 arasında opaklık değeri, 0 şeffaftır</string>
|
||||
<string name="revanced_miniplayer_opacity_invalid_toast">Katman opaklığı 0-100 arasında olmalıdır</string>
|
||||
<string name="revanced_miniplayer_opacity_invalid_toast">Mini oynatıcı katman opaklığı 0-100 arasında olmalıdır</string>
|
||||
</patch>
|
||||
<patch id="layout.theme.themePatch">
|
||||
<string name="revanced_gradient_loading_screen_title">Gradyan yükleme ekranını etkinleştir</string>
|
||||
@@ -1312,7 +1312,7 @@ Genişletmek veya kapatmak için kaydırın"</string>
|
||||
<string name="revanced_gradient_loading_screen_summary_off">Yükleme ekranı tek renk bir arka plana sahip olacak</string>
|
||||
<string name="revanced_splash_screen_animation_style_title">Açılış ekranı stili</string>
|
||||
<string name="revanced_splash_screen_animation_style_entry_1">Renk</string>
|
||||
<string name="revanced_splash_screen_animation_style_entry_2">Siyah ve beyaz</string>
|
||||
<string name="revanced_splash_screen_animation_style_entry_2">Siyah beyaz</string>
|
||||
<string name="revanced_seekbar_custom_color_title">Özel zaman çubuğu rengini etkinleştir</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_on">Özel zaman çubuğu rengi gösterilir</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_off">Orijinal zaman çubuğu rengi gösterilir</string>
|
||||
@@ -1412,8 +1412,8 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir"</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_summary_on">Bölümler titreşimi devre dışı</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_summary_off">Bölümler titreşimi etkin</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_title">Hassas sarma titreşimini devre dışı bırak</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_on">Hassas sarma titreşimi devre dışı</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_off">Hassas sarma titreşimi etkin</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_on">Hassas sardırma titreşimi devre dışı</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_off">Hassas sardırma titreşimi etkin</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_title">Sardırmayı geri alma titreşimini devre dışı bırak</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_summary_on">Sardırmayı geri alma titreşimi devre dışı</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_summary_off">Sardırmayı geri alma titreşimi etkin</string>
|
||||
|
||||
@@ -470,7 +470,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_external_downloader_name_title">Ім\'я пакета завантажувача</string>
|
||||
<string name="revanced_external_downloader_name_summary">Ім\'я пакета встановленого Вами застосунку зовнішнього завантажувача</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">Введіть ім\'я пакета</string>
|
||||
<string name="revanced_external_downloader_other_item">Вказати вручну</string>
|
||||
<string name="revanced_external_downloader_other_item">Вказати інший</string>
|
||||
<string name="revanced_external_downloader_not_found_title">Застосунок не встановлено</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">%s не встановлено. Встановіть його.</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"Не вдалося знайти встановлений застосунок з ім'ям пакета: %s
|
||||
|
||||
@@ -468,7 +468,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_on">下載按鈕會開啟你的外部下載器</string>
|
||||
<string name="revanced_external_downloader_action_button_summary_off">下載按鈕會開啟內建應用程式下載器</string>
|
||||
<string name="revanced_external_downloader_name_title">下載器套件名稱</string>
|
||||
<string name="revanced_external_downloader_name_summary">您已安裝的外部下載器應用程式的套件名稱</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">輸入套件名稱</string>
|
||||
<string name="revanced_external_downloader_other_item">其他</string>
|
||||
<string name="revanced_external_downloader_not_found_title">應用程式未安裝</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">未安裝 %s。請前往安裝。</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"無法找到已安裝的應用程式,套件名稱為:%s
|
||||
|
||||
請驗證套件名稱是否正確以及應用程式是否已安裝"</string>
|
||||
<string name="revanced_external_downloader_empty_warning">套件名稱不能為空</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.disablePreciseSeekingGesturePatch">
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">停用精準跳轉手勢</string>
|
||||
|
||||
@@ -1547,6 +1547,9 @@ Enabling this can unlock higher video qualities"</string>
|
||||
<string name="revanced_custom_speed_menu_title">Custom playback speed menu</string>
|
||||
<string name="revanced_custom_speed_menu_summary_on">Custom speed menu is shown</string>
|
||||
<string name="revanced_custom_speed_menu_summary_off">Custom speed menu is not shown</string>
|
||||
<string name="revanced_restore_old_speed_menu_title">Restore old playback speed menu</string>
|
||||
<string name="revanced_restore_old_speed_menu_summary_on">Old speed menu is shown</string>
|
||||
<string name="revanced_restore_old_speed_menu_summary_off">Modern speed menu is shown</string>
|
||||
<string name="revanced_custom_playback_speeds_title">Custom playback speeds</string>
|
||||
<string name="revanced_custom_playback_speeds_summary">Add or change the custom playback speeds</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">Custom speeds must be less than %s</string>
|
||||
|
||||
Reference in New Issue
Block a user