Compare commits

...

13 Commits

Author SHA1 Message Date
semantic-release-bot
7651ef0881 chore: Release v5.40.0-dev.10 [skip ci]
# [5.40.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.9...v5.40.0-dev.10) (2025-09-20)

### Bug Fixes

* **YouTube - Spoof video streams:** Add "Force original audio" disclaimer for Android Studio client ([f97d332](f97d33206b))
2025-09-20 18:13:06 +00:00
LisoUseInAIKyrios
f97d33206b fix(YouTube - Spoof video streams): Add "Force original audio" disclaimer for Android Studio client 2025-09-20 22:08:50 +04:00
semantic-release-bot
3d986e6716 chore: Release v5.40.0-dev.9 [skip ci]
# [5.40.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.8...v5.40.0-dev.9) (2025-09-20)

### Features

* **YouTube Music:** Support version `8.10.52` ([#5941](https://github.com/ReVanced/revanced-patches/issues/5941)) ([01c0f1b](01c0f1bd1a))
2025-09-20 16:12:57 +00:00
LisoUseInAIKyrios
01c0f1bd1a feat(YouTube Music): Support version 8.10.52 (#5941) 2025-09-20 20:09:52 +04:00
github-actions[bot]
4178e8a64f chore: Sync translations (#5943) 2025-09-20 20:09:07 +04:00
semantic-release-bot
7e1bb8f3c7 chore: Release v5.40.0-dev.8 [skip ci]
# [5.40.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.7...v5.40.0-dev.8) (2025-09-20)

### Features

* **YouTube:** Support version `20.14.43` ([#5940](https://github.com/ReVanced/revanced-patches/issues/5940)) ([f7f4a1b](f7f4a1b0f0))
2025-09-20 15:33:42 +00:00
LisoUseInAIKyrios
f7f4a1b0f0 feat(YouTube): Support version 20.14.43 (#5940) 2025-09-20 19:30:05 +04:00
semantic-release-bot
e89660d234 chore: Release v5.40.0-dev.7 [skip ci]
# [5.40.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.6...v5.40.0-dev.7) (2025-09-20)

### Features

* **YouTube - Hide video action buttons:** Add "Hide comments" button ([db796fb](db796fb883))
2025-09-20 15:03:00 +00:00
LisoUseInAIKyrios
db796fb883 feat(YouTube - Hide video action buttons): Add "Hide comments" button
Button is only shown when using YouTube 20.14+ and the video information area is collapsed to a compact state
2025-09-20 19:00:00 +04:00
LisoUseInAIKyrios
6bb8bad8d7 chore(YouTube Music): Fix fingerprint typo, change hide cast button to default off 2025-09-20 18:03:41 +04:00
semantic-release-bot
aa1fb41ad8 chore: Release v5.40.0-dev.6 [skip ci]
# [5.40.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.5...v5.40.0-dev.6) (2025-09-20)

### Features

* **YouTube Music:** Add `Enable debugging` patch ([#5939](https://github.com/ReVanced/revanced-patches/issues/5939)) ([418f594](418f5945c2))
2025-09-20 12:37:33 +00:00
LisoUseInAIKyrios
418f5945c2 feat(YouTube Music): Add Enable debugging patch (#5939) 2025-09-20 16:33:03 +04:00
github-actions[bot]
e26c971067 chore: Sync translations (#5942) 2025-09-20 16:32:50 +04:00
170 changed files with 2957 additions and 985 deletions

View File

@@ -1,3 +1,38 @@
# [5.40.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.9...v5.40.0-dev.10) (2025-09-20)
### Bug Fixes
* **YouTube - Spoof video streams:** Add "Force original audio" disclaimer for Android Studio client ([f97d332](https://github.com/ReVanced/revanced-patches/commit/f97d33206b4c97244f0bd0c672c4b91eaf477b0b))
# [5.40.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.8...v5.40.0-dev.9) (2025-09-20)
### Features
* **YouTube Music:** Support version `8.10.52` ([#5941](https://github.com/ReVanced/revanced-patches/issues/5941)) ([01c0f1b](https://github.com/ReVanced/revanced-patches/commit/01c0f1bd1ac6edb8aea758f88ffffcdea74a29b7))
# [5.40.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.7...v5.40.0-dev.8) (2025-09-20)
### Features
* **YouTube:** Support version `20.14.43` ([#5940](https://github.com/ReVanced/revanced-patches/issues/5940)) ([f7f4a1b](https://github.com/ReVanced/revanced-patches/commit/f7f4a1b0f0186598266b41a2c6a781fdee49e440))
# [5.40.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.6...v5.40.0-dev.7) (2025-09-20)
### Features
* **YouTube - Hide video action buttons:** Add "Hide comments" button ([db796fb](https://github.com/ReVanced/revanced-patches/commit/db796fb8830b813e1ed626d491c4a797171e69e7))
# [5.40.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.5...v5.40.0-dev.6) (2025-09-20)
### Features
* **YouTube Music:** Add `Enable debugging` patch ([#5939](https://github.com/ReVanced/revanced-patches/issues/5939)) ([418f594](https://github.com/ReVanced/revanced-patches/commit/418f5945c213313f9a77cac9a5c326d89c754dfd))
# [5.40.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.4...v5.40.0-dev.5) (2025-09-20)

View File

@@ -1,14 +0,0 @@
package app.revanced.extension.music.patches;
import app.revanced.extension.music.settings.Settings;
@SuppressWarnings("unused")
public class HideUpgradeButtonPatch {
/**
* Injection point
*/
public static boolean hideUpgradeButton() {
return Settings.HIDE_UPGRADE_BUTTON.get();
}
}

View File

@@ -15,10 +15,9 @@ public class Settings extends BaseSettings {
// Ads
public static final BooleanSetting HIDE_VIDEO_ADS = new BooleanSetting("revanced_music_hide_video_ads", TRUE, true);
public static final BooleanSetting HIDE_GET_PREMIUM_LABEL = new BooleanSetting("revanced_music_hide_get_premium_label", TRUE, true);
public static final BooleanSetting HIDE_UPGRADE_BUTTON = new BooleanSetting("revanced_music_hide_upgrade_button", TRUE, true);
// General
public static final BooleanSetting HIDE_CAST_BUTTON = new BooleanSetting("revanced_music_hide_cast_button", FALSE, false);
public static final BooleanSetting HIDE_CAST_BUTTON = new BooleanSetting("revanced_music_hide_cast_button", TRUE, false);
public static final BooleanSetting HIDE_CATEGORY_BAR = new BooleanSetting("revanced_music_hide_category_bar", FALSE, true);
public static final BooleanSetting HIDE_NAVIGATION_BAR_HOME_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_home_button", FALSE, true);
public static final BooleanSetting HIDE_NAVIGATION_BAR_SAMPLES_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_samples_button", FALSE, true);

View File

@@ -116,7 +116,7 @@ public class Utils {
}
/**
* @return The version name of the app, such as 19.11.43
* @return The version name of the app, such as 20.13.41
*/
public static String getAppVersionName() {
if (versionName == null) {

View File

@@ -1,4 +1,4 @@
package app.revanced.extension.youtube.patches;
package app.revanced.extension.shared.patches;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

View File

@@ -7,6 +7,10 @@ final class ButtonsFilter extends Filter {
private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.eml";
private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.eml";
private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.eml";
/**
* Video bar path when the video information is collapsed. Seems to shown only with 20.14+
*/
private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.eml";
private static final String ANIMATED_VECTOR_TYPE_PATH = "AnimatedVectorType";
private final StringFilterGroup likeSubscribeGlow;
@@ -82,6 +86,10 @@ final class ButtonsFilter extends Filter {
Settings.HIDE_STOP_ADS_BUTTON,
"yt_outline_slash_circle_left"
),
new ByteArrayFilterGroup(
Settings.HIDE_COMMENTS_BUTTON,
"yt_outline_message_bubble_right"
),
// Check for clip button both here and using a path filter,
// as there's a chance the path is a generic action button and won't contain 'clip_button'
new ByteArrayFilterGroup(
@@ -124,9 +132,8 @@ final class ButtonsFilter extends Filter {
}
if (matchedGroup == bufferFilterPathGroup) {
// Make sure the current path is the right one
// to avoid false positives.
return path.startsWith(VIDEO_ACTION_BAR_PATH)
// Make sure the current path is the right one to avoid false positives.
return (path.startsWith(VIDEO_ACTION_BAR_PATH) || path.startsWith(COMPACTIFY_VIDEO_ACTION_BAR_PATH))
&& bufferButtonsGroupList.check(buffer).isFiltered();
}

View File

@@ -32,6 +32,7 @@ import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehavi
import android.graphics.Color;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.Utils;
import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.shared.settings.BooleanSetting;
import app.revanced.extension.shared.settings.EnumSetting;
@@ -222,6 +223,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting DISABLE_LIKE_SUBSCRIBE_GLOW = new BooleanSetting("revanced_disable_like_subscribe_glow", FALSE);
public static final BooleanSetting HIDE_ASK_BUTTON = new BooleanSetting("revanced_hide_ask_button", FALSE);
public static final BooleanSetting HIDE_CLIP_BUTTON = new BooleanSetting("revanced_hide_clip_button", TRUE);
public static final BooleanSetting HIDE_COMMENTS_BUTTON = new BooleanSetting("revanced_hide_comments_button", TRUE);
public static final BooleanSetting HIDE_DOWNLOAD_BUTTON = new BooleanSetting("revanced_hide_download_button", FALSE);
public static final BooleanSetting HIDE_HYPE_BUTTON = new BooleanSetting("revanced_hide_hype_button", FALSE);
public static final BooleanSetting HIDE_LIKE_DISLIKE_BUTTON = new BooleanSetting("revanced_hide_like_dislike_button", FALSE);
@@ -513,10 +515,14 @@ public class Settings extends BaseSettings {
DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.resetToDefault();
}
// Old spoof versions that no longer work.
if (SPOOF_APP_VERSION_TARGET.get().compareTo(SPOOF_APP_VERSION_TARGET.defaultValue) < 0) {
Logger.printInfo(() -> "Resetting spoof app version target");
// Old spoof versions that no longer work,
// or is spoofing to a version the same or newer than this app.
if (!SPOOF_APP_VERSION_TARGET.isSetToDefault() &&
(SPOOF_APP_VERSION_TARGET.get().compareTo(SPOOF_APP_VERSION_TARGET.defaultValue) < 0
|| (Utils.getAppVersionName().compareTo(SPOOF_APP_VERSION_TARGET.get()) <= 0))) {
Logger.printInfo(() -> "Resetting spoof app version");
SPOOF_APP_VERSION_TARGET.resetToDefault();
SPOOF_APP_VERSION.resetToDefault();
}
// RYD requires manually migrating old settings since the lack of

View File

@@ -95,6 +95,7 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
+ '\n' + str("revanced_spoof_video_streams_about_kids_videos");
} else if (clientType == ClientType.ANDROID_CREATOR) {
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1")
+ '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio")
+ '\n' + str("revanced_spoof_video_streams_about_kids_videos");
}

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.40.0-dev.5
version = 5.40.0-dev.10

View File

@@ -401,6 +401,10 @@ public final class app/revanced/patches/music/misc/backgroundplayback/Background
public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/music/misc/debugging/EnableDebuggingPatchKt {
public static final fun getEnableDebuggingPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/music/misc/extension/SharedExtensionPatchKt {
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}

View File

@@ -24,7 +24,8 @@ val hideVideoAdsPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -17,7 +17,8 @@ val enableExclusiveAudioPlaybackPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -27,7 +27,8 @@ val permanentRepeatPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -11,7 +11,8 @@ val permanentShufflePatch = bytecodePatch(
) {
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -33,7 +33,8 @@ val hideCastButton = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -1,6 +1,5 @@
package app.revanced.patches.music.layout.compactheader
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.patch.bytecodePatch
@@ -10,7 +9,6 @@ import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.util.addInstructionsAtControlFlowLabel
import app.revanced.util.findFreeRegister
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@@ -29,7 +27,8 @@ val hideCategoryBar = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -1,11 +1,11 @@
package app.revanced.patches.music.layout.navigationbar
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.AccessFlags
import app.revanced.patcher.fingerprint
import app.revanced.util.containsLiteralInstruction
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.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -23,9 +23,9 @@ internal val tabLayoutTextFingerprint = fingerprint {
Opcode.MOVE_RESULT
)
strings("FEmusic_search")
literal { text1 }
custom { method, _ ->
indexOfGetVisibilityInstruction(method) >= 0
method.containsLiteralInstruction(text1)
&& indexOfGetVisibilityInstruction(method) >= 0
}
}

View File

@@ -40,7 +40,8 @@ val navigationBarPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -28,7 +28,8 @@ val hideGetPremiumPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -1,18 +0,0 @@
package app.revanced.patches.music.layout.upgradebutton
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.AccessFlags
import app.revanced.patcher.fingerprint
internal val pivotBarConstructorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
returns("V")
parameters("L", "Z")
opcodes(
Opcode.CHECK_CAST,
Opcode.INVOKE_INTERFACE,
Opcode.GOTO,
Opcode.IPUT_OBJECT,
Opcode.RETURN_VOID
)
}

View File

@@ -1,104 +1,12 @@
package app.revanced.patches.music.layout.upgradebutton
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.extensions.newLabel
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.smali.toInstructions
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction22t
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import app.revanced.patches.music.layout.navigationbar.navigationBarPatch
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideUpgradeButtonPatch;"
@Deprecated("This patch will be removed in the future.")
@Deprecated("Patch is obsolete and was replaced by navigation bar patch", ReplaceWith("navigationBarPatch"))
@Suppress("unused")
val hideUpgradeButton = bytecodePatch(
description = "Hides the upgrade tab from the pivot bar.",
) {
dependsOn(
sharedExtensionPatch,
settingsPatch,
addResourcesPatch,
)
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
addResources("music", "layout.upgradebutton.hideUpgradeButtonPatch")
// TODO: Add an extension patch to allow this to be enabled/disabled in app.
if (false) {
PreferenceScreen.ADS.addPreferences(
SwitchPreference("revanced_music_hide_upgrade_button")
)
}
pivotBarConstructorFingerprint.method.apply {
val pivotBarElementFieldReference =
getInstruction(pivotBarConstructorFingerprint.patternMatch!!.endIndex - 1)
.getReference<FieldReference>()
val register = getInstruction<FiveRegisterInstruction>(0).registerC
// First compile all the needed instructions.
val instructionList = """
invoke-interface { v0 }, Ljava/util/List;->size()I
move-result v1
const/4 v2, 0x4
invoke-interface {v0, v2}, Ljava/util/List;->remove(I)Ljava/lang/Object;
iput-object v0, v$register, $pivotBarElementFieldReference
""".toInstructions().toMutableList()
val endIndex = pivotBarConstructorFingerprint.patternMatch!!.endIndex
// Replace the instruction to retain the label at given index.
replaceInstruction(
endIndex - 1,
instructionList[0], // invoke-interface.
)
// Do not forget to remove this instruction since we added it already.
instructionList.removeFirst()
val exitInstruction = instructionList.last() // iput-object
addInstruction(
endIndex,
exitInstruction,
)
// Do not forget to remove this instruction since we added it already.
instructionList.removeLast()
// Add the necessary if statement to remove the upgrade tab button in case it exists.
instructionList.add(
2, // if-le.
BuilderInstruction22t(
Opcode.IF_LE,
1,
2,
newLabel(endIndex),
),
)
addInstructions(
endIndex,
instructionList,
)
}
}
val hideUpgradeButton = bytecodePatch{
dependsOn(navigationBarPatch)
}
@Deprecated("Patch was renamed", ReplaceWith("hideUpgradeButton"))

View File

@@ -17,7 +17,8 @@ val bypassCertificateChecksPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -17,7 +17,8 @@ val backgroundPlaybackPatch = bytecodePatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)

View File

@@ -0,0 +1,25 @@
package app.revanced.patches.music.misc.debugging
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.patches.shared.misc.debugging.enableDebuggingPatch
@Suppress("unused")
val enableDebuggingPatch = enableDebuggingPatch(
block = {
dependsOn(
sharedExtensionPatch,
settingsPatch,
)
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
},
// String feature flag does not appear to be present with YT Music.
hookStringFeatureFlag = false,
preferenceScreen = PreferenceScreen.MISC
)

View File

@@ -8,12 +8,16 @@ import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.settings.preference.*
import app.revanced.patches.shared.misc.settings.preference.BasePreference
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.settingsPatch
import app.revanced.util.*
import app.revanced.util.ResourceGroup
import app.revanced.util.copyResources
import app.revanced.util.copyXmlNode
import app.revanced.util.inputStreamFromBundledResource
import com.android.tools.smali.dexlib2.util.MethodUtil
private const val BASE_ACTIVITY_HOOK_CLASS_DESCRIPTOR =
@@ -23,7 +27,6 @@ private const val GOOGLE_API_ACTIVITY_HOOK_CLASS_DESCRIPTOR =
private val preferences = mutableSetOf<BasePreference>()
private val settingsResourcePatch = resourcePatch {
dependsOn(
resourceMappingPatch,
@@ -87,27 +90,6 @@ val settingsPatch = bytecodePatch(
addResources("music", "misc.settings.settingsPatch")
addResources("shared", "misc.debugging.enableDebuggingPatch")
// Should make a separate debugging patch, but for now include it with all installations.
PreferenceScreen.MISC.addPreferences(
PreferenceScreenPreference(
key = "revanced_debug_screen",
sorting = Sorting.UNSORTED,
preferences = setOf(
SwitchPreference("revanced_debug"),
NonInteractivePreference(
"revanced_debug_export_logs_to_clipboard",
tag = "app.revanced.extension.shared.settings.preference.ExportLogToClipboardPreference",
selectable = true
),
NonInteractivePreference(
"revanced_debug_logs_clear_buffer",
tag = "app.revanced.extension.shared.settings.preference.ClearLogBufferPreference",
selectable = true
)
)
)
)
// Add an "About" preference to the top.
preferences += NonInteractivePreference(
key = "revanced_settings_music_screen_0_about",
@@ -154,19 +136,19 @@ fun newIntent(settingsName: String) = IntentPreference.Intent(
object PreferenceScreen : BasePreferenceScreen() {
val ADS = Screen(
"revanced_settings_music_screen_1_ads",
key = "revanced_settings_music_screen_1_ads",
summaryKey = null
)
val GENERAL = Screen(
"revanced_settings_music_screen_2_general",
key = "revanced_settings_music_screen_2_general",
summaryKey = null
)
val PLAYER = Screen(
"revanced_settings_music_screen_3_player",
key = "revanced_settings_music_screen_3_player",
summaryKey = null
)
val MISC = Screen(
"revanced_settings_music_screen_4_misc",
key = "revanced_settings_music_screen_4_misc",
summaryKey = null
)

View File

@@ -33,7 +33,8 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
"7.29.52",
"8.10.52"
)
)
},

View File

@@ -0,0 +1,147 @@
package app.revanced.patches.shared.misc.debugging
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatchBuilder
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.BasePreference
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/shared/patches/EnableDebuggingPatch;"
/**
* Patch shared with YouTube and YT Music.
*/
internal fun enableDebuggingPatch(
block: BytecodePatchBuilder.() -> Unit = {},
executeBlock: BytecodePatchContext.() -> Unit = {},
hookStringFeatureFlag: Boolean,
preferenceScreen: BasePreferenceScreen.Screen,
additionalDebugPreferences: List<BasePreference> = emptyList()
) = bytecodePatch(
name = "Enable debugging",
description = "Adds options for debugging and exporting ReVanced logs to the clipboard.",
) {
dependsOn(addResourcesPatch)
block()
execute {
executeBlock()
addResources("shared", "misc.debugging.enableDebuggingPatch")
val preferences = mutableSetOf<BasePreference>(
SwitchPreference("revanced_debug"),
)
preferences.addAll(additionalDebugPreferences)
preferences.addAll(
listOf(
SwitchPreference("revanced_debug_stacktrace"),
SwitchPreference("revanced_debug_toast_on_error"),
NonInteractivePreference(
"revanced_debug_export_logs_to_clipboard",
tag = "app.revanced.extension.shared.settings.preference.ExportLogToClipboardPreference",
selectable = true
),
NonInteractivePreference(
"revanced_debug_logs_clear_buffer",
tag = "app.revanced.extension.shared.settings.preference.ClearLogBufferPreference",
selectable = true
)
)
)
preferenceScreen.addPreferences(
PreferenceScreenPreference(
key = "revanced_debug_screen",
sorting = Sorting.UNSORTED,
preferences = preferences,
)
)
// Hook the methods that look up if a feature flag is active.
experimentalBooleanFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index ->
val register = getInstruction<OneRegisterInstruction>(index).registerA
addInstructions(
index,
"""
invoke-static { v$register, p1 }, $EXTENSION_CLASS_DESCRIPTOR->isBooleanFeatureFlagEnabled(ZLjava/lang/Long;)Z
move-result v$register
"""
)
}
}
experimentalDoubleFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE)
addInstructions(
insertIndex,
"""
move-result-wide v0 # Also clobbers v1 (p0) since result is wide.
invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isDoubleFeatureFlagEnabled(DJD)D
move-result-wide v0
return-wide v0
"""
)
}
experimentalLongFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE)
addInstructions(
insertIndex,
"""
move-result-wide v0
invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isLongFeatureFlagEnabled(JJJ)J
move-result-wide v0
return-wide v0
"""
)
}
if (hookStringFeatureFlag) experimentalStringFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT)
addInstructions(
insertIndex,
"""
move-result-object v0
invoke-static { v0, p1, p2, p3 }, $EXTENSION_CLASS_DESCRIPTOR->isStringFeatureFlagEnabled(Ljava/lang/String;JLjava/lang/String;)Ljava/lang/String;
move-result-object v0
return-object v0
"""
)
}
// There exists other experimental accessor methods for byte[]
// and wrappers for obfuscated classes, but currently none of those are hooked.
}
}

View File

@@ -0,0 +1,35 @@
package app.revanced.patches.shared.misc.debugging
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal val experimentalFeatureFlagParentFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("L")
parameters("L", "J", "[B")
strings("Unable to parse proto typed experiment flag: ")
}
internal val experimentalBooleanFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Z")
parameters("L", "J", "Z")
}
internal val experimentalDoubleFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("D")
parameters("J", "D")
}
internal val experimentalLongFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("J")
parameters("J", "J")
}
internal val experimentalStringFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Ljava/lang/String;")
parameters("J", "Ljava/lang/String;")
}

View File

@@ -1,9 +1,13 @@
package app.revanced.patches.shared.misc.spoof
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.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val buildInitPlaybackRequestFingerprint = fingerprint {
returns("Lorg/chromium/net/UrlRequest\$Builder;")
@@ -37,10 +41,6 @@ internal val buildRequestFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder;
custom { methodDef, _ ->
if (indexOfNewUrlRequestBuilderInstruction(methodDef) < 0) {
return@custom false
}
// Different targets have slightly different parameters
// Earlier targets have parameters:
@@ -74,10 +74,10 @@ internal val buildRequestFingerprint = fingerprint {
val parameterTypesSize = parameterTypes.size
(parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) &&
parameterTypes[1] == "Ljava/util/Map;" // URL headers.
&& indexOfNewUrlRequestBuilderInstruction(methodDef) >= 0
}
}
internal val protobufClassParseByteBufferFingerprint = fingerprint {
accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC)
returns("L")
@@ -191,3 +191,13 @@ internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint {
returns("Z")
literal { PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG }
}
internal fun indexOfNewUrlRequestBuilderInstruction(method: Method) = method.indexOfFirstInstruction {
val reference = getReference<MethodReference>()
opcode == Opcode.INVOKE_VIRTUAL && reference?.definingClass == "Lorg/chromium/net/CronetEngine;"
&& reference.name == "newUrlRequestBuilder"
&& reference.parameterTypes.size == 3
&& reference.parameterTypes[0] == "Ljava/lang/String;"
&& reference.parameterTypes[1] == "Lorg/chromium/net/UrlRequest\$Callback;"
&& reference.parameterTypes[2] == "Ljava/util/concurrent/Executor;"
}

View File

@@ -16,20 +16,17 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.util.findFreeRegister
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.insertLiteralOverride
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
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.ImmutableMethod
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
@@ -337,12 +334,3 @@ fun spoofVideoStreamsPatch(
executeBlock()
}
}
internal fun indexOfNewUrlRequestBuilderInstruction(method: Method) = method.indexOfFirstInstruction {
opcode == Opcode.INVOKE_VIRTUAL && getReference<MethodReference>().toString() ==
"Lorg/chromium/net/CronetEngine;" +
"->newUrlRequestBuilder(" +
"Ljava/lang/String;Lorg/chromium/net/UrlRequest${'$'}Callback;" +
"Ljava/util/concurrent/Executor;" +
")Lorg/chromium/net/UrlRequest${'$'}Builder;"
}

View File

@@ -78,10 +78,9 @@ val hideAdsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -27,10 +27,9 @@ val hideGetPremiumPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -25,10 +25,9 @@ val videoAdsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -55,10 +55,9 @@ val copyVideoUrlPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -26,10 +26,9 @@ val removeViewerDiscretionDialogPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -29,8 +29,8 @@ val disableDoubleTapActionsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -76,10 +76,9 @@ val downloadsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -22,10 +22,9 @@ val seekbarPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)
}

View File

@@ -90,10 +90,9 @@ val swipeControlsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -26,10 +26,9 @@ val autoCaptionsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -45,10 +45,9 @@ val customBrandingPatch = resourcePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -95,10 +95,9 @@ val changeHeaderPatch = resourcePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -24,10 +24,9 @@ val hideButtonsPatch = resourcePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)
@@ -41,6 +40,7 @@ val hideButtonsPatch = resourcePatch(
SwitchPreference("revanced_disable_like_subscribe_glow"),
SwitchPreference("revanced_hide_ask_button"),
SwitchPreference("revanced_hide_clip_button"),
SwitchPreference("revanced_hide_comments_button"),
SwitchPreference("revanced_hide_download_button"),
SwitchPreference("revanced_hide_hype_button"),
SwitchPreference("revanced_hide_like_dislike_button"),

View File

@@ -42,10 +42,9 @@ val navigationButtonsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -60,10 +60,9 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -35,10 +35,9 @@ val changeFormFactorPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -61,10 +61,9 @@ val hideEndscreenCardsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -33,10 +33,9 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -31,10 +31,9 @@ val disableFullscreenAmbientModePatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -128,10 +128,9 @@ val hideLayoutComponentsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -59,10 +59,9 @@ val hideInfoCardsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -26,10 +26,9 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -50,10 +50,9 @@ val hideRelatedVideoOverlayPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -31,10 +31,9 @@ val disableRollingNumberAnimationPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -174,10 +174,9 @@ val hideShortsComponentsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -33,10 +33,9 @@ val disableSignInToTvPopupPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -23,10 +23,9 @@ val hideTimestampPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -155,10 +155,9 @@ val miniplayerPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -23,10 +23,9 @@ val playerPopupPanelsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -23,10 +23,9 @@ internal val exitFullscreenPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -25,10 +25,9 @@ val openVideosFullscreenPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -54,10 +54,9 @@ val customPlayerOverlayOpacityPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -63,10 +63,9 @@ val returnYouTubeDislikePatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -68,10 +68,9 @@ val wideSearchbarPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -46,10 +46,9 @@ val shortsAutoplayPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -66,10 +66,9 @@ val openShortsInRegularPlayerPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -128,10 +128,9 @@ val sponsorBlockPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -17,6 +17,7 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
@@ -60,10 +61,9 @@ val spoofAppVersionPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)
@@ -79,17 +79,21 @@ val spoofAppVersionPatch = bytecodePatch(
tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory",
preferences = setOf(
SwitchPreference("revanced_spoof_app_version"),
if (is_19_43_or_greater) {
if (is_20_14_or_greater) {
ListPreference("revanced_spoof_app_version_target")
} else if (is_19_43_or_greater) {
ListPreference(
key = "revanced_spoof_app_version_target",
summaryKey = null
summaryKey = null,
entriesKey = "revanced_spoof_app_version_target_legacy_20_13_entries",
entryValuesKey = "revanced_spoof_app_version_target_legacy_20_13_entry_values"
)
} else {
ListPreference(
key = "revanced_spoof_app_version_target",
summaryKey = null,
entriesKey = "revanced_spoof_app_version_target_legacy_entries",
entryValuesKey = "revanced_spoof_app_version_target_legacy_entry_values"
entriesKey = "revanced_spoof_app_version_target_legacy_19_34_entries",
entryValuesKey = "revanced_spoof_app_version_target_legacy_19_34_entry_values"
)
}
)

View File

@@ -34,10 +34,9 @@ val changeStartPagePatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -36,10 +36,9 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -206,10 +206,9 @@ val themePatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -35,10 +35,9 @@ val alternativeThumbnailsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -29,10 +29,9 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -25,10 +25,9 @@ val announcementsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -26,10 +26,9 @@ val autoRepeatPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -53,10 +53,9 @@ val backgroundPlaybackPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -1,144 +1,34 @@
package app.revanced.patches.youtube.misc.debugging
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
import app.revanced.patches.shared.misc.debugging.enableDebuggingPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/EnableDebuggingPatch;"
// TODO: Refactor this into a shared patch that can be used by both YT and YT Music.
// Almost all of the feature flag hooks are the same between both apps.
val enableDebuggingPatch = bytecodePatch(
name = "Enable debugging",
description = "Adds options for debugging and exporting ReVanced logs to the clipboard.",
) {
dependsOn(
sharedExtensionPatch,
settingsPatch,
addResourcesPatch,
versionCheckPatch
)
compatibleWith(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
@Suppress("unused")
val enableDebuggingPatch = enableDebuggingPatch(
block = {
dependsOn(
sharedExtensionPatch,
settingsPatch,
)
)
execute {
addResources("shared", "misc.debugging.enableDebuggingPatch")
compatibleWith(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"20.07.39",
"20.13.41",
"20.14.43",
)
)
},
executeBlock = {
addResources("youtube", "misc.debugging.enableDebuggingPatch")
PreferenceScreen.MISC.addPreferences(
PreferenceScreenPreference(
key = "revanced_debug_screen",
sorting = Sorting.UNSORTED,
preferences = setOf(
SwitchPreference("revanced_debug"),
SwitchPreference("revanced_debug_protobuffer"),
SwitchPreference("revanced_debug_stacktrace"),
SwitchPreference("revanced_debug_toast_on_error"),
NonInteractivePreference(
"revanced_debug_export_logs_to_clipboard",
tag = "app.revanced.extension.shared.settings.preference.ExportLogToClipboardPreference",
selectable = true
),
NonInteractivePreference(
"revanced_debug_logs_clear_buffer",
tag = "app.revanced.extension.shared.settings.preference.ClearLogBufferPreference",
selectable = true
),
),
),
)
// Hook the methods that look up if a feature flag is active.
experimentalBooleanFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index ->
val register = getInstruction<OneRegisterInstruction>(index).registerA
addInstructions(
index,
"""
invoke-static { v$register, p1 }, $EXTENSION_CLASS_DESCRIPTOR->isBooleanFeatureFlagEnabled(ZLjava/lang/Long;)Z
move-result v$register
"""
)
}
}
experimentalDoubleFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE)
addInstructions(
insertIndex,
"""
move-result-wide v0 # Also clobbers v1 (p0) since result is wide.
invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isDoubleFeatureFlagEnabled(DJD)D
move-result-wide v0
return-wide v0
"""
)
}
experimentalLongFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE)
addInstructions(
insertIndex,
"""
move-result-wide v0
invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isLongFeatureFlagEnabled(JJJ)J
move-result-wide v0
return-wide v0
"""
)
}
experimentalStringFeatureFlagFingerprint.match(
experimentalFeatureFlagParentFingerprint.originalClassDef
).method.apply {
val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT)
addInstructions(
insertIndex,
"""
move-result-object v0
invoke-static { v0, p1, p2, p3 }, $EXTENSION_CLASS_DESCRIPTOR->isStringFeatureFlagEnabled(Ljava/lang/String;JLjava/lang/String;)Ljava/lang/String;
move-result-object v0
return-object v0
"""
)
}
// There exists other experimental accessor methods for byte[]
// and wrappers for obfuscated classes, but currently none of those are hooked.
}
}
},
hookStringFeatureFlag = true,
preferenceScreen = PreferenceScreen.MISC,
additionalDebugPreferences = listOf(SwitchPreference("revanced_debug_protobuffer"))
)

View File

@@ -26,10 +26,9 @@ val spoofDeviceDimensionsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -23,10 +23,9 @@ val checkWatchHistoryDomainNameResolutionPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -1,8 +1,8 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.AccessFlags
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val scrollPositionFingerprint = fingerprint {
accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL)
@@ -24,30 +24,18 @@ internal val recyclerViewTopScrollingFingerprint = fingerprint {
returns("V")
parameters()
opcodes(
Opcode.IGET_OBJECT,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT,
Opcode.IF_EQZ,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.GOTO,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.INVOKE_INTERFACE
)
}
internal val recyclerViewTopScrollingParentFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("L", "L", "Landroid/view/ViewGroup;", "Landroid/view/ViewGroup;")
opcodes(
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
@@ -55,5 +43,8 @@ internal val recyclerViewTopScrollingParentFingerprint = fingerprint {
Opcode.CONST_16,
Opcode.INVOKE_VIRTUAL,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.RETURN_VOID
)
}

View File

@@ -15,13 +15,14 @@ internal val fixBackToExitGesturePatch = bytecodePatch(
) {
execute {
recyclerViewTopScrollingFingerprint.match(recyclerViewTopScrollingParentFingerprint.originalClassDef)
.let {
it.method.addInstruction(
it.patternMatch!!.endIndex,
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V"
)
}
recyclerViewTopScrollingFingerprint.match(
recyclerViewTopScrollingParentFingerprint.originalClassDef
).let {
it.method.addInstruction(
it.patternMatch!!.endIndex,
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V"
)
}
scrollPositionFingerprint.let {
navigate(it.originalMethod)

View File

@@ -37,10 +37,9 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch(
YOUTUBE_PACKAGE_NAME(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)
}

View File

@@ -28,10 +28,9 @@ val disableHapticFeedbackPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -34,10 +34,9 @@ val bypassURLRedirectsPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -43,10 +43,9 @@ val openLinksExternallyPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -32,10 +32,9 @@ val removeTrackingQueryParameterPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -24,10 +24,9 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -46,10 +46,9 @@ val forceOriginalAudioPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -56,10 +56,9 @@ val disableHdrPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -26,10 +26,9 @@ val videoQualityPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -30,10 +30,9 @@ val playbackSpeedPatch = bytecodePatch(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
"20.14.43",
)
)

View File

@@ -89,6 +89,7 @@ Second \"item\" text"</string>
<patch id="layout.buttons.action.hideButtonsPatch">
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
@@ -253,8 +254,17 @@ Second \"item\" text"</string>
</patch>
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
</patch>
<patch id="layout.castbutton.hideCastButton">
</patch>
<patch id="layout.compactheader.hideCategoryBar">
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
</patch>
<patch id="layout.upgradebutton.hideUpgradeButtonPatch">

View File

@@ -89,6 +89,7 @@ Second \"item\" text"</string>
<patch id="layout.buttons.action.hideButtonsPatch">
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
@@ -253,8 +254,17 @@ Second \"item\" text"</string>
</patch>
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
</patch>
<patch id="layout.castbutton.hideCastButton">
</patch>
<patch id="layout.compactheader.hideCategoryBar">
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
</patch>
<patch id="layout.upgradebutton.hideUpgradeButtonPatch">

View File

@@ -107,6 +107,15 @@ Second \"item\" text"</string>
<string name="revanced_debug_title">ØĒØŗØŦŲŠŲ„ ØĒØĩØ­ŲŠØ­ Ø§Ų„ØŖØŽØˇØ§ØĄ</string>
<string name="revanced_debug_summary_on">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† ØĒØŗØŦŲŠŲ„Ø§ØĒ ØĒØĩØ­ŲŠØ­ Ø§Ų„ØŖØŽØˇØ§ØĄ</string>
<string name="revanced_debug_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĒØŗØŦŲŠŲ„Ø§ØĒ ØĒØĩØ­ŲŠØ­ Ø§Ų„ØŖØŽØˇØ§ØĄ</string>
<string name="revanced_debug_stacktrace_title">ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_stacktrace_summary_on">ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_stacktrace_summary_off">Ų„Ø§ ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_toast_on_error_title">ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØšŲ†Ø¯ ؈ØŦŲˆØ¯ ØŽØˇØŖ ؁؊ ReVanced</string>
<string name="revanced_debug_toast_on_error_summary_on">؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string>
<string name="revanced_debug_toast_on_error_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"ŲŠØ¤Ø¯ŲŠ ØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„ Ų…Ų„Ø§Ø­Ø¸Ø§ØĒ Ø§Ų„ØŖØŽØˇØ§ØĄ ØĨŲ„Ų‰ ØĨØŽŲØ§ØĄ ŲƒØ§ŲØŠ ØĨØ´ØšØ§ØąØ§ØĒ ØŖØŽØˇØ§ØĄ ReVanced.
Ų„Ų† ؊ØĒŲ… ØĨØšŲ„Ø§Ų…Ųƒ Ø¨ØŖŲŠ ØŖØŽØˇØ§ØĄ ØēŲŠØą Ų…ØĒŲˆŲ‚ØšØŠ."</string>
<string name="revanced_debug_export_logs_to_clipboard_title">ØĒØĩØ¯ŲŠØą ØŗØŦŲ„Ø§ØĒ ØĒØĩØ­ŲŠØ­ Ø§Ų„ØŖØŽØˇØ§ØĄ</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">Ų†ØŗØŽ ØŗØŦŲ„Ø§ØĒ ØĒØĩØ­ŲŠØ­ ØŖØŽØˇØ§ØĄ ReVanced ØĨŲ„Ų‰ Ø§Ų„Ø­Ø§ŲØ¸ØŠ</string>
<string name="revanced_debug_logs_disabled">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĒØŗØŦŲŠŲ„Ø§ØĒ ØĒØĩØ­ŲŠØ­ Ø§Ų„ØŖØŽØˇØ§ØĄ</string>
@@ -151,15 +160,6 @@ Second \"item\" text"</string>
ŲŠŲ…ŲƒŲ† ØŖŲ† ŲŠØŗØ§ØšØ¯ Ų‡Ø°Ø§ ؁؊ ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„Ų…ŲƒŲˆŲ†Ø§ØĒ ØšŲ†Ø¯ ØĨŲ†Ø´Ø§ØĄ ØšŲˆØ§Ų…Ų„ ØĒØĩŲŲŠØŠ Ų…ØŽØĩØĩØŠ.
ŲˆŲ…Øš Ø°Ų„ŲƒØŒ ØŗŲŠØ¤Ø¯ŲŠ ØĒŲ…ŲƒŲŠŲ† Ų‡Ø°Ø§ ØŖŲŠØļŲ‹Ø§ ØĨŲ„Ų‰ ØĒØŗØŦŲŠŲ„ بؚØļ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… Ų…ØĢŲ„ ØšŲ†ŲˆØ§Ų† IP Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ."</string>
<string name="revanced_debug_stacktrace_title">ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_stacktrace_summary_on">ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_stacktrace_summary_off">Ų„Ø§ ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_toast_on_error_title">ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØšŲ†Ø¯ ؈ØŦŲˆØ¯ ØŽØˇØŖ ؁؊ ReVanced</string>
<string name="revanced_debug_toast_on_error_summary_on">؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string>
<string name="revanced_debug_toast_on_error_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"ŲŠØ¤Ø¯ŲŠ ØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„ Ų…Ų„Ø§Ø­Ø¸Ø§ØĒ Ø§Ų„ØŖØŽØˇØ§ØĄ ØĨŲ„Ų‰ ØĨØŽŲØ§ØĄ ŲƒØ§ŲØŠ ØĨØ´ØšØ§ØąØ§ØĒ ØŖØŽØˇØ§ØĄ ReVanced.
Ų„Ų† ؊ØĒŲ… ØĨØšŲ„Ø§Ų…Ųƒ Ø¨ØŖŲŠ ØŖØŽØˇØ§ØĄ ØēŲŠØą Ų…ØĒŲˆŲ‚ØšØŠ."</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_hide_album_cards_title">ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…</string>
@@ -586,6 +586,10 @@ Second \"item\" text"</string>
<string name="revanced_hide_stop_ads_button_title">ØĨØŽŲØ§ØĄ ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ</string>
<string name="revanced_hide_stop_ads_button_summary_on">Ø˛Øą ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ų…ØŽŲŲŠ</string>
<string name="revanced_hide_stop_ads_button_summary_off">Ø˛Øą ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ų…ØšØąŲˆØļ</string>
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<string name="revanced_hide_comments_button_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_button_summary_on">Ø˛Øą Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…ØŽŲŲŠ</string>
<string name="revanced_hide_comments_button_summary_off">Ø˛Øą Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ø¸Ø§Ų‡Øą</string>
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<string name="revanced_hide_report_button_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĨØ¨Ų„Ø§Øē</string>
@@ -1242,8 +1246,9 @@ Second \"item\" text"</string>
ØĨذا ØĒŲ… ØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„Ų‡ Ų„Ø§Ø­Ų‚Ų‹Ø§ØŒ Ų…Ų† Ø§Ų„Ų…ØŗØĒØ­ØŗŲ† Ų…ØŗØ­ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ų„Ų…Ų†Øš Ø­Ø¯ŲˆØĢ ØŖØŽØˇØ§ØĄ ؁؊ ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…."</string>
<string name="revanced_spoof_app_version_target_title">Ø§Ų„Ų‡Ø¯Ų Ų…Ų† ØĒØēŲŠŲŠØą ØĨØĩØ¯Ø§Øą Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Ø§ØŗØĒؚاد؊ ØŖŲŠŲ‚ŲˆŲ†Ø§ØĒ Ų…Ø´ØēŲ„ Shorts Ø§Ų„Ų‚Ø¯ŲŠŲ…ØŠ</string>
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Ø§ØŗØĒؚاد؊ ØŖŲŠŲ‚ŲˆŲ†Ø§ØĒ Ø§Ų„ØĒŲ†Ų‚Ų„ Ø§Ų„Ų‚Ø¯ŲŠŲ…ØŠ</string>
<string name="revanced_spoof_app_version_target_entry_1">20.13.41 - Ø§ØŗØĒؚاد؊ Ø´ØąŲŠØˇ ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ ØēŲŠØą Ø§Ų„Ų…ØˇŲˆŲŠ</string>
<string name="revanced_spoof_app_version_target_entry_2">19.35.36 - Ø§ØŗØĒؚاد؊ ØŖŲŠŲ‚ŲˆŲ†Ø§ØĒ Ų…Ø´ØēŲ„ Shorts Ø§Ų„Ų‚Ø¯ŲŠŲ…ØŠ</string>
<string name="revanced_spoof_app_version_target_entry_3">19.01.34 - Ø§ØŗØĒؚاد؊ ØŖŲŠŲ‚ŲˆŲ†Ø§ØĒ Ø§Ų„ØĒŲ†Ų‚Ų„ Ø§Ų„Ų‚Ø¯ŲŠŲ…ØŠ</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">ØĒØēŲŠŲŠØą ØĩŲØ­ØŠ Ø§Ų„Ø¨Ø¯Ø§ŲŠØŠ</string>
@@ -1585,11 +1590,46 @@ Second \"item\" text"</string>
<string name="revanced_music_play_permanent_repeat_summary_on">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØĒŲƒØąØ§Øą Ø§Ų„Ø¯Ø§ØĻŲ…</string>
<string name="revanced_music_play_permanent_repeat_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ Ø§Ų„ØĒŲƒØąØ§Øą Ø§Ų„Ø¯Ø§ØĻŲ…</string>
</patch>
<patch id="layout.castbutton.hideCastButton">
<string name="revanced_music_hide_cast_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØąØŗØ§Ų„</string>
<string name="revanced_music_hide_cast_button_summary_on">Ø˛Øą Ø§Ų„ØĨØąØŗØ§Ų„ Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_cast_button_summary_off">Ø˛Øą Ø§Ų„ØĨØąØŗØ§Ų„ Ø¸Ø§Ų‡Øą</string>
</patch>
<patch id="layout.compactheader.hideCategoryBar">
<string name="revanced_music_hide_category_bar_title">ØĨØŽŲØ§ØĄ Ø´ØąŲŠØˇ Ø§Ų„ŲØĻاØĒ</string>
<string name="revanced_music_hide_category_bar_summary_on">Ø´ØąŲŠØˇ Ø§Ų„ŲØĻاØĒ Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_category_bar_summary_off">Ø´ØąŲŠØˇ Ø§Ų„ŲØĻاØĒ Ų…ØšØąŲˆØļ</string>
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<string name="revanced_music_navigation_bar_screen_title">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„</string>
<string name="revanced_music_navigation_bar_screen_summary">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ØŖŲˆ ØĒØēŲŠŲŠØąŲ‡Ø§</string>
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_home_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \"Ø§Ų„ØąØĻŲŠØŗŲŠØŠ\"</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_on">Ø˛Øą \"Ø§Ų„ØąØĻŲŠØŗŲŠØŠ\" Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_off">Ø˛Øą \"Ø§Ų„ØąØĻŲŠØŗŲŠØŠ\" Ø¸Ø§Ų‡Øą</string>
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_samples_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \"Ø§Ų„Ų…Ų‚ØĒØˇŲØ§ØĒ\"</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_on">Ø˛Øą \"Ø§Ų„Ų…Ų‚ØĒØˇŲØ§ØĒ\" Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_off">Ø˛Øą \"Ø§Ų„Ų…Ų‚ØĒØˇŲØ§ØĒ\" Ø¸Ø§Ų‡Øą</string>
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_explore_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \"Ø§ØŗØĒŲƒØ´Ø§Ų\"</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_on">Ø˛Øą \"Ø§ØŗØĒŲƒØ´Ø§Ų\" Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_off">Ø˛Øą \"Ø§ØŗØĒŲƒØ´Ø§Ų\" Ø¸Ø§Ų‡Øą</string>
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_library_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \"Ø§Ų„Ų…ŲƒØĒب؊\"</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_on">Ø˛Øą \"Ø§Ų„Ų…ŲƒØĒب؊\" Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_off">Ø˛Øą \"Ø§Ų„Ų…ŲƒØĒب؊\" Ø¸Ø§Ų‡Øą</string>
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_upgrade_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \"Ø§Ų„ØĒØąŲ‚ŲŠØŠ\"</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_on">Ø˛Øą \"Ø§Ų„ØĒØąŲ‚ŲŠØŠ\" Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_off">Ø˛Øą \"Ø§Ų„ØĒØąŲ‚ŲŠØŠ\" Ø¸Ø§Ų‡Øą</string>
<string name="revanced_music_hide_navigation_bar_title">ØĨØŽŲØ§ØĄ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„</string>
<string name="revanced_music_hide_navigation_bar_summary_on">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ Ų…ØŽŲŲŠ</string>
<string name="revanced_music_hide_navigation_bar_summary_off">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ Ø¸Ø§Ų‡Øą</string>
<string name="revanced_music_hide_navigation_bar_labels_title">ØĨØŽŲØ§ØĄ ØĒØŗŲ…ŲŠØ§ØĒ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲ†Ų‚Ų„</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_on">Ø§Ų„ØĒØŗŲ…ŲŠØ§ØĒ Ų…ØŽŲŲŠØŠ</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_off">Ø§Ų„ØĒØŗŲ…ŲŠØ§ØĒ Ø¸Ø§Ų‡ØąØŠ</string>
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
<string name="revanced_music_hide_get_premium_label_title">ØĨØŽŲØ§ØĄ ØĒØŗŲ…ŲŠØŠ \'Ø§Ų„Ø­ØĩŲˆŲ„ ØšŲ„Ų‰ Music Premium\'</string>
<string name="revanced_music_hide_get_premium_label_summary_on">Ø§Ų„ØĒØŗŲ…ŲŠØŠ Ų…ØŽŲŲŠØŠ</string>

View File

@@ -89,6 +89,7 @@ Second \"item\" text"</string>
<patch id="layout.buttons.action.hideButtonsPatch">
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
@@ -255,8 +256,17 @@ Second \"item\" text"</string>
</patch>
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
</patch>
<patch id="layout.castbutton.hideCastButton">
</patch>
<patch id="layout.compactheader.hideCategoryBar">
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
</patch>
<patch id="layout.upgradebutton.hideUpgradeButtonPatch">

View File

@@ -107,6 +107,15 @@ Oynatma işləməyə bilər"</string>
<string name="revanced_debug_title">Sazlama jurnalÄą</string>
<string name="revanced_debug_summary_on">Sazlama jurnalÄą işləkdir</string>
<string name="revanced_debug_summary_off">Sazlama jurnalÄą qeyri-aktivdir</string>
<string name="revanced_debug_stacktrace_title">Yığın izləri jurnalı</string>
<string name="revanced_debug_stacktrace_summary_on">Sazlama jurnalına yığın izləri daxildir</string>
<string name="revanced_debug_stacktrace_summary_off">Sazlama jurnalına yığın izləri daxil deyil</string>
<string name="revanced_debug_toast_on_error_title">ReVanced xətasÄąnda ani bildiriş gÃļstər</string>
<string name="revanced_debug_toast_on_error_summary_on">Xəta baş verərsə ani bildiriş gÃļrÃŧnÃŧr</string>
<string name="revanced_debug_toast_on_error_summary_off">Xəta baş verərsə ani bildiriş gÃļrÃŧnmÃŧr</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"Xəta ani bildirişlərin qapatmaq, bÃŧtÃŧn ReVanced xəta bildirişlərin gizlədir.
GÃļzlənilməz hallardan xəbərdar olmayacaqsÄąnÄąz."</string>
<string name="revanced_debug_export_logs_to_clipboard_title">Sazlama qeydlərini ixrac edin</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">ReVanced sazlama qeydlərini buferə kÃļçÃŧrÃŧr</string>
<string name="revanced_debug_logs_disabled">Sazlama qeydi qapalÄądÄąr</string>
@@ -151,15 +160,6 @@ Oynatma işləməyə bilər"</string>
Bu, xÃŧsusi filtrlər yaradarkən quruluşlarÄą mÃŧəyyən etməyə kÃļmək edə bilər.
Hər halda, bunu aktivləşdirmə IP ÃŧnvanÄąnÄąz kimi bəzi istifadəçi məlumatÄąn da daxil edəcək."</string>
<string name="revanced_debug_stacktrace_title">Yığın izləri jurnalı</string>
<string name="revanced_debug_stacktrace_summary_on">Sazlama jurnalına yığın izləri daxildir</string>
<string name="revanced_debug_stacktrace_summary_off">Sazlama jurnalına yığın izləri daxil deyil</string>
<string name="revanced_debug_toast_on_error_title">ReVanced xətasÄąnda ani bildiriş gÃļstər</string>
<string name="revanced_debug_toast_on_error_summary_on">Xəta baş verərsə ani bildiriş gÃļrÃŧnÃŧr</string>
<string name="revanced_debug_toast_on_error_summary_off">Xəta baş verərsə ani bildiriş gÃļrÃŧnmÃŧr</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"Xəta ani bildirişlərin qapatmaq, bÃŧtÃŧn ReVanced xəta bildirişlərin gizlədir.
GÃļzlənilməz hallardan xəbərdar olmayacaqsÄąnÄąz."</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_hide_album_cards_title">Albom kartlarını gizlət</string>
@@ -586,6 +586,7 @@ EkranÄąn sağ tərəfində dÃŧzÃŧnə sÃŧrÃŧşdÃŧrərək səs səviyyəsini tənz
<string name="revanced_hide_stop_ads_button_title">Reklamları Dayandırın-ı gizlət</string>
<string name="revanced_hide_stop_ads_button_summary_on">ReklamlarÄą dayandÄąr dÃŧyməsi gizlidir</string>
<string name="revanced_hide_stop_ads_button_summary_off">ReklamlarÄą dayandÄąr dÃŧyməsi gÃļrÃŧnÃŧr</string>
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<string name="revanced_hide_report_button_title">\"Xəbər verin\"i gizlət</string>
@@ -1241,8 +1242,8 @@ Bu tətbiqin gÃļrÃŧnÃŧşÃŧn və xÃŧsusiyyətlərin dəyişdirəcək, lakin bilin
Sonradan qapadÄąlarsa, UI səhvlərin Ãļnləmək ÃŧçÃŧn tətbiq məlumatlarÄąn silmək tÃļvsiyə olunur."</string>
<string name="revanced_spoof_app_version_target_title">Saxta tətbiq versiyası hədəfi</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - KÃļhnə Shorts oynadÄącÄą işarələrin bərpa et</string>
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - KÃļhnə fəaliyyət simvollarÄąn bərpa et</string>
<string name="revanced_spoof_app_version_target_entry_2">19.35.36 - KÃļhnə Shorts oynadÄącÄą işarələrin bərpa et</string>
<string name="revanced_spoof_app_version_target_entry_3">19.01.34 - KÃļhnə fəaliyyət simvollarÄąn bərpa et</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">Başlatma səhifəsini dəyişdir</string>
@@ -1584,11 +1585,20 @@ Bunu aktivləşdirmə daha yÃŧksək video keyfiyyətləri əngəlin silə bilər
<string name="revanced_music_play_permanent_repeat_summary_on">Kəsintisiz təkrarlama aktivdir</string>
<string name="revanced_music_play_permanent_repeat_summary_off">Kəsintisiz təkrarlama qapalıdır</string>
</patch>
<patch id="layout.castbutton.hideCastButton">
</patch>
<patch id="layout.compactheader.hideCategoryBar">
<string name="revanced_music_hide_category_bar_title">Kateqoriya cizgisin gizlət</string>
<string name="revanced_music_hide_category_bar_summary_on">Kateqoriya cizgisi gizlidir</string>
<string name="revanced_music_hide_category_bar_summary_off">Kateqoriya cizgisi gÃļrÃŧnÃŧr</string>
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
<string name="revanced_music_hide_get_premium_label_title"> \'Musiqi Premiumu Əldə et\' etiketini gizlət</string>
<string name="revanced_music_hide_get_premium_label_summary_on">Etiket gizlidir</string>

View File

@@ -107,6 +107,15 @@ Second \"item\" text"</string>
<string name="revanced_debug_title">ЗаĐŋҖҁ адĐģадĐēŅ–</string>
<string name="revanced_debug_summary_on">Đ–ŅƒŅ€ĐŊаĐģŅ‹ адĐģадĐēŅ– ŅžĐēĐģŅŽŅ‡Đ°ĐŊŅ‹</string>
<string name="revanced_debug_summary_off">Đ–ŅƒŅ€ĐŊаĐģŅ‹ адĐģадĐēŅ– адĐēĐģŅŽŅ‡Đ°ĐŊŅ‹</string>
<string name="revanced_debug_stacktrace_title">ĐĄĐģŅĐ´Ņ‹ ŅŅ‚ŅĐēа ĐļŅƒŅ€ĐŊаĐģа</string>
<string name="revanced_debug_stacktrace_summary_on">Đ–ŅƒŅ€ĐŊаĐģŅ‹ адĐģадĐēŅ– ŅžĐēĐģŅŽŅ‡Đ°ŅŽŅ†ŅŒ Ņ‚Ņ€Đ°ŅŅ–Ņ€ĐžŅžĐē҃ ŅŅ‚ŅĐēа</string>
<string name="revanced_debug_stacktrace_summary_off">Đ–ŅƒŅ€ĐŊаĐģŅ‹ адĐģадĐēŅ– ĐŊĐĩ ŅžĐēĐģŅŽŅ‡Đ°ŅŽŅ†ŅŒ Ņ‚Ņ€Đ°ŅŅ–Ņ€ĐžŅžĐē҃ ŅŅ‚ŅĐēа</string>
<string name="revanced_debug_toast_on_error_title">ПаĐēĐ°ĐˇĐ°Ņ†ŅŒ Ņ‚ĐžŅŅ‚ ĐŋҀҋ ĐŋаĐŧŅ‹Đģ҆ҋ ReVanced</string>
<string name="revanced_debug_toast_on_error_summary_on">ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ toast ҃ Đ˛Ņ‹ĐŋадĐē҃ ĐŋаĐŧŅ‹ĐģĐēŅ–</string>
<string name="revanced_debug_toast_on_error_summary_off">НĐĩ ĐŋаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ toast ҃ Đ˛Ņ‹ĐŋадĐē҃ ĐŋаĐŧŅ‹ĐģĐēŅ–</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"АдĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŋавĐĩдаĐŧĐģĐĩĐŊĐŊŅŅž ĐŋŅ€Đ° ĐŋаĐŧŅ‹ĐģĐēŅ– ŅŅ…Đ°Đ˛Đ°Đĩ ŅžŅĐĩ аĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ– ReVanced ĐŋŅ€Đ° ĐŋаĐŧŅ‹ĐģĐēŅ–.
Đ’Ņ‹ ĐŊĐĩ ĐąŅƒĐ´ĐˇĐĩ҆Đĩ Đ°Ņ‚Ņ€Ņ‹ĐŧĐģŅ–Đ˛Đ°Ņ†ŅŒ аĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ– ĐŋŅ€Đ° ĐŊĐĩŅ‡Đ°ĐēаĐŊŅ‹Ņ ĐŋадСĐĩŅ–."</string>
<string name="revanced_debug_export_logs_to_clipboard_title">Đ­ĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°Ņ†ŅŒ адĐģĐ°Đ´Đ°Ņ‡ĐŊŅ‹Ņ ĐģĐ°ĐŗŅ–</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">КаĐŋŅ–Ņ€ŅƒĐĩ адĐģĐ°Đ´Đ°Ņ‡ĐŊŅ‹Ņ ĐģĐ°ĐŗŅ– ReVanced ҃ ĐąŅƒŅ„ĐĩŅ€ айĐŧĐĩĐŊ҃</string>
<string name="revanced_debug_logs_disabled">АдĐģĐ°Đ´Đ°Ņ‡ĐŊаĐĩ ĐģĐ°ĐŗĐ°Đ˛Đ°ĐŊĐŊĐĩ адĐēĐģŅŽŅ‡Đ°ĐŊа</string>
@@ -151,15 +160,6 @@ Second \"item\" text"</string>
Đ“ŅŅ‚Đ° ĐŧĐžĐļа даĐŋаĐŧĐ°ĐŗŅ‡Ņ‹ Ņ–Đ´ŅĐŊ҂ҋ҄ҖĐēĐ°Đ˛Đ°Ņ†ŅŒ ĐēаĐŧĐŋаĐŊĐĩĐŊ҂ҋ ĐŋҀҋ ŅŅ‚Đ˛Đ°Ņ€ŅĐŊĐŊŅ– ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°Ņ†ĐēŅ–Ņ… ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņž.
АдĐŊаĐē ҃ĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°ĐŗĐ° ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° Ņ‚Đ°ĐēŅĐ°Đŧа ĐąŅƒĐ´ĐˇĐĩ СаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ даĐŊŅ‹Ņ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа, Ņ‚Đ°ĐēŅ–Ņ ŅĐē Đ˛Đ°Ņˆ IP-Đ°Đ´Ņ€Đ°Ņ."</string>
<string name="revanced_debug_stacktrace_title">ĐĄĐģŅĐ´Ņ‹ ŅŅ‚ŅĐēа ĐļŅƒŅ€ĐŊаĐģа</string>
<string name="revanced_debug_stacktrace_summary_on">Đ–ŅƒŅ€ĐŊаĐģŅ‹ адĐģадĐēŅ– ŅžĐēĐģŅŽŅ‡Đ°ŅŽŅ†ŅŒ Ņ‚Ņ€Đ°ŅŅ–Ņ€ĐžŅžĐē҃ ŅŅ‚ŅĐēа</string>
<string name="revanced_debug_stacktrace_summary_off">Đ–ŅƒŅ€ĐŊаĐģŅ‹ адĐģадĐēŅ– ĐŊĐĩ ŅžĐēĐģŅŽŅ‡Đ°ŅŽŅ†ŅŒ Ņ‚Ņ€Đ°ŅŅ–Ņ€ĐžŅžĐē҃ ŅŅ‚ŅĐēа</string>
<string name="revanced_debug_toast_on_error_title">ПаĐēĐ°ĐˇĐ°Ņ†ŅŒ Ņ‚ĐžŅŅ‚ ĐŋҀҋ ĐŋаĐŧŅ‹Đģ҆ҋ ReVanced</string>
<string name="revanced_debug_toast_on_error_summary_on">ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ toast ҃ Đ˛Ņ‹ĐŋадĐē҃ ĐŋаĐŧŅ‹ĐģĐēŅ–</string>
<string name="revanced_debug_toast_on_error_summary_off">НĐĩ ĐŋаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ toast ҃ Đ˛Ņ‹ĐŋадĐē҃ ĐŋаĐŧŅ‹ĐģĐēŅ–</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"АдĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŋавĐĩдаĐŧĐģĐĩĐŊĐŊŅŅž ĐŋŅ€Đ° ĐŋаĐŧŅ‹ĐģĐēŅ– ŅŅ…Đ°Đ˛Đ°Đĩ ŅžŅĐĩ аĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ– ReVanced ĐŋŅ€Đ° ĐŋаĐŧŅ‹ĐģĐēŅ–.
Đ’Ņ‹ ĐŊĐĩ ĐąŅƒĐ´ĐˇĐĩ҆Đĩ Đ°Ņ‚Ņ€Ņ‹ĐŧĐģŅ–Đ˛Đ°Ņ†ŅŒ аĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ– ĐŋŅ€Đ° ĐŊĐĩŅ‡Đ°ĐēаĐŊŅ‹Ņ ĐŋадСĐĩŅ–."</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_hide_album_cards_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐ°Ņ€Ņ‚Ņ‹ аĐģŅŒĐąĐžĐŧа</string>
@@ -586,6 +586,10 @@ Second \"item\" text"</string>
<string name="revanced_hide_stop_ads_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐĄĐŋŅ‹ĐŊŅ–Ņ†ŅŒ Ņ€ŅĐēĐģаĐŧ҃</string>
<string name="revanced_hide_stop_ads_button_summary_on">КĐŊĐžĐŋĐēа \"ĐĄĐŋŅ‹ĐŊŅ–Ņ†ŅŒ Ņ€ŅĐēĐģаĐŧ҃\" ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_hide_stop_ads_button_summary_off">КĐŊĐžĐŋĐēа \"ĐĄĐŋŅ‹ĐŊŅ–Ņ†ŅŒ Ņ€ŅĐēĐģаĐŧ҃\" ĐŋаĐēаСаĐŊа</string>
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<string name="revanced_hide_comments_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēаĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ‹Ņ–</string>
<string name="revanced_hide_comments_button_summary_on">КĐŊĐžĐŋĐēа ĐēаĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ‹ŅŅž ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_hide_comments_button_summary_off">КĐŊĐžĐŋĐēа ĐēаĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ‹ŅŅž ĐŋаĐēаСаĐŊа</string>
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<string name="revanced_hide_report_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ҁĐŋŅ€Đ°Đ˛Đ°ĐˇĐ´Đ°Ņ‡Ņƒ</string>
@@ -1243,8 +1247,9 @@ Second \"item\" text"</string>
КаĐģŅ– ĐŋаСĐŊĐĩĐš ĐąŅƒĐ´ĐˇĐĩ адĐēĐģŅŽŅ‡Đ°ĐŊа, Ņ€ŅĐēаĐŧĐĩĐŊĐ´ŅƒĐĩŅ†Ņ†Đ° Đ°Ņ‡Ņ‹ŅŅ†Ņ–Ņ†ŅŒ даĐŊŅ‹Ņ ĐŋҀҋĐēĐģадаĐŊĐŊŅ, Đēай ĐŋаСйĐĩĐŗĐŊŅƒŅ†ŅŒ ĐŋаĐŧŅ‹ĐģаĐē ҃ Ņ–ĐŊŅ‚ŅŅ€Ņ„ĐĩĐšŅĐĩ."</string>
<string name="revanced_spoof_app_version_target_title">ĐŸĐ°Đ´Ņ€ĐžĐąĐēа ĐŧŅŅ‚Đ°Đ˛Đ°Đš вĐĩҀҁҖҖ ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 — Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Đĩ СĐŊĐ°Ņ‡Đēи ĐŋĐģĐĩĐĩŅ€Đ° Shorts</string>
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - АдĐŊĐ°ŅžĐģĐĩĐŊĐŊĐĩ ŅŅ‚Đ°Ņ€Ņ‹Ņ… СĐŊĐ°Ņ‡ĐēĐžŅž ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ–</string>
<string name="revanced_spoof_app_version_target_entry_1">20.13.41 - АдĐŊĐ°Đ˛Ņ–Ņ†ŅŒ ĐŊĐĩ ĐˇĐŗĐžŅ€ĐŊŅƒŅ‚Ņ‹ Ņ€Đ°Đ´ĐžĐē дСĐĩŅĐŊĐŊŅŅž Đ˛Ņ–Đ´ŅĐ°</string>
<string name="revanced_spoof_app_version_target_entry_2">19.35.36 — Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Đĩ СĐŊĐ°Ņ‡Đēи ĐŋĐģĐĩĐĩŅ€Đ° Shorts</string>
<string name="revanced_spoof_app_version_target_entry_3">19.01.34 - АдĐŊĐ°ŅžĐģĐĩĐŊĐŊĐĩ ŅŅ‚Đ°Ņ€Ņ‹Ņ… СĐŊĐ°Ņ‡ĐēĐžŅž ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ–</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">ЗĐŧŅĐŊŅ–Ņ†ŅŒ ŅŅ‚Đ°Ņ€Ņ‚Đ°Đ˛ŅƒŅŽ ŅŅ‚Đ°Ņ€ĐžĐŊĐē҃</string>
@@ -1586,11 +1591,46 @@ Second \"item\" text"</string>
<string name="revanced_music_play_permanent_repeat_summary_on">ĐŸĐ°ŅŅ‚Đ°ŅĐŊĐŊŅ‹ ĐŋĐ°ŅžŅ‚ĐžŅ€ ҃ĐēĐģŅŽŅ‡Đ°ĐŊŅ‹</string>
<string name="revanced_music_play_permanent_repeat_summary_off">ĐŸĐ°ŅŅ‚Đ°ŅĐŊĐŊŅ‹ ĐŋĐ°ŅžŅ‚ĐžŅ€ адĐēĐģŅŽŅ‡Đ°ĐŊŅ‹</string>
</patch>
<patch id="layout.castbutton.hideCastButton">
<string name="revanced_music_hide_cast_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐē҃ Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Ņ‹Ņ–</string>
<string name="revanced_music_hide_cast_button_summary_on">КĐŊĐžĐŋĐēа Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Ņ‹Ņ– ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_cast_button_summary_off">КĐŊĐžĐŋĐēа Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Ņ‹Ņ– ĐŋаĐēаСаĐŊа</string>
</patch>
<patch id="layout.compactheader.hideCategoryBar">
<string name="revanced_music_hide_category_bar_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋаĐŊŅĐģҌ ĐēĐ°Ņ‚ŅĐŗĐžŅ€Ņ‹Đš</string>
<string name="revanced_music_hide_category_bar_summary_on">ПаĐŊŅĐģҌ ĐēĐ°Ņ‚ŅĐŗĐžŅ€Ņ‹Đš ŅŅ…Đ°Đ˛Đ°ĐŊĐ°Ņ</string>
<string name="revanced_music_hide_category_bar_summary_off">ПаĐŊŅĐģҌ ĐēĐ°Ņ‚ŅĐŗĐžŅ€Ņ‹Đš ĐŋаĐēаСаĐŊĐ°Ņ</string>
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<string name="revanced_music_navigation_bar_screen_title">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ–</string>
<string name="revanced_music_navigation_bar_screen_summary">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ айО СĐŧŅĐŊŅ–Ņ†ŅŒ ĐēĐŊĐžĐŋĐēŅ– ĐŋаĐŊŅĐģŅ– ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ–</string>
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_home_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐē҃ \"ГаĐģĐžŅžĐŊĐ°Ņ\"</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_on">КĐŊĐžĐŋĐēа \"ГаĐģĐžŅžĐŊĐ°Ņ\" ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_off">КĐŊĐžĐŋĐēа \"ГаĐģĐžŅžĐŊĐ°Ņ\" ĐŋаĐēаСаĐŊа</string>
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_samples_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐē҃ \"ĐŖĐˇĐžŅ€Ņ‹\"</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_on">КĐŊĐžĐŋĐēа \"ĐŖĐˇĐžŅ€Ņ‹\" ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_off">КĐŊĐžĐŋĐēа \"ĐŖĐˇĐžŅ€Ņ‹\" ĐŋаĐēаСаĐŊа</string>
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_explore_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐē҃ \"ĐĐŗĐģŅĐ´\"</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_on">КĐŊĐžĐŋĐēа \"ĐĐŗĐģŅĐ´\" ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_off">КĐŊĐžĐŋĐēа \"ĐĐŗĐģŅĐ´\" ĐŋаĐēаСаĐŊа</string>
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_library_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐē҃ \"Đ‘Ņ–ĐąĐģŅ–ŅŅ‚ŅĐēа\"</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_on">КĐŊĐžĐŋĐēа \"Đ‘Ņ–ĐąĐģŅ–ŅŅ‚ŅĐēа\" ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_off">КĐŊĐžĐŋĐēа \"Đ‘Ņ–ĐąĐģŅ–ŅŅ‚ŅĐēа\" ĐŋаĐēаСаĐŊа</string>
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_upgrade_button_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐē҃ \"АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ\"</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_on">КĐŊĐžĐŋĐēа \"АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ\" ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_off">КĐŊĐžĐŋĐēа \"АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ\" ĐŋаĐēаСаĐŊа</string>
<string name="revanced_music_hide_navigation_bar_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ–</string>
<string name="revanced_music_hide_navigation_bar_summary_on">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– ŅŅ…Đ°Đ˛Đ°ĐŊа</string>
<string name="revanced_music_hide_navigation_bar_summary_off">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– ĐŋаĐēаСаĐŊа</string>
<string name="revanced_music_hide_navigation_bar_labels_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋОдĐŋҖҁҋ ĐēĐŊĐžĐŋаĐē ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ–</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_on">ПодĐŋҖҁҋ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_off">ПодĐŋҖҁҋ ĐŋаĐēаСаĐŊŅ‹</string>
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
<string name="revanced_music_hide_get_premium_label_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŊадĐŋҖҁ \"ĐŅ‚Ņ€Ņ‹ĐŧĐ°Ņ†ŅŒ Music Premium\"</string>
<string name="revanced_music_hide_get_premium_label_summary_on">НадĐŋҖҁ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹</string>

View File

@@ -107,6 +107,15 @@ Second \"item\" text"</string>
<string name="revanced_debug_title">ДĐŊĐĩвĐŊиĐē ĐŊа ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа ĐŗŅ€Đĩ҈Đēи</string>
<string name="revanced_debug_summary_on">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_debug_summary_off">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_debug_stacktrace_title">ĐĄĐģĐĩди ĐžŅ‚ ҁ҂ĐĩĐēа ĐŊа Đ´ĐŊĐĩвĐŊиĐēа</string>
<string name="revanced_debug_stacktrace_summary_on">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи ŅŅŠĐ´ŅŠŅ€Đļа ҁĐģĐĩди ĐžŅ‚ ҁ҂ĐĩĐēа</string>
<string name="revanced_debug_stacktrace_summary_off">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи ĐŊĐĩ ŅŅŠĐ´ŅŠŅ€Đļа ҁĐģĐĩди ĐžŅ‚ ҁ҂ĐĩĐēа</string>
<string name="revanced_debug_toast_on_error_title">ПоĐēаĐļи ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐž ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ReVanced ĐŗŅ€Đĩ҈Đēа</string>
<string name="revanced_debug_toast_on_error_summary_on">ПоĐēаСва ҁĐĩ toast, аĐēĐž Đ˛ŅŠĐˇĐŊиĐēĐŊĐĩ ĐŗŅ€Đĩ҈Đēа</string>
<string name="revanced_debug_toast_on_error_summary_off">НĐĩ ҁĐĩ ĐŋĐžĐēаСва toast, аĐēĐž Đ˛ŅŠĐˇĐŊиĐēĐŊĐĩ ĐŗŅ€Đĩ҈Đēа</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"ИСĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ¸ĐˇŅĐēĐ°Ņ‡Đ°Ņ‰Đ¸ ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ Са ĐŗŅ€Đĩ҈Đēи ĐēŅ€Đ¸Đĩ Đ˛ŅĐ¸Ņ‡Đēи иСвĐĩŅŅ‚Đ¸Ņ Са ĐŗŅ€Đĩ҈Đēи ĐŊа ReVanced.
ĐŅĐŧа да ĐąŅŠĐ´ĐĩŅ‚Đĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐĩĐŊи Са ĐŊĐĩĐžŅ‡Đ°ĐēваĐŊи ŅŅŠĐąĐ¸Ņ‚Đ¸Ņ."</string>
<string name="revanced_debug_export_logs_to_clipboard_title">ЕĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐģĐžĐŗĐžĐ˛Đĩ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">КоĐŋĐ¸Ņ€Đ° ĐģĐžĐŗĐžĐ˛ĐĩŅ‚Đĩ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи ĐŊа ReVanced в ĐēĐģиĐŋĐąĐžŅ€Đ´Đ°</string>
<string name="revanced_debug_logs_disabled">ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа ĐŗŅ€Đĩ҈Đēи Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž</string>
@@ -151,15 +160,6 @@ Second \"item\" text"</string>
ĐĸОва ĐŧĐžĐļĐĩ да ĐŋĐžĐŧĐžĐŗĐŊĐĩ Са идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ¸ ĐŋŅ€Đ¸ ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊи Ņ„Đ¸ĐģŅ‚Ņ€Đ¸.
АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐžĐąĐ°Ņ‡Đĩ ҉Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€Đ° и ĐŊŅĐēОи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēи даĐŊĐŊи, ĐēĐ°Ņ‚Đž ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ Đ˛Đ°ŅˆĐ¸Ņ IP Đ°Đ´Ņ€Đĩҁ."</string>
<string name="revanced_debug_stacktrace_title">ĐĄĐģĐĩди ĐžŅ‚ ҁ҂ĐĩĐēа ĐŊа Đ´ĐŊĐĩвĐŊиĐēа</string>
<string name="revanced_debug_stacktrace_summary_on">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи ŅŅŠĐ´ŅŠŅ€Đļа ҁĐģĐĩди ĐžŅ‚ ҁ҂ĐĩĐēа</string>
<string name="revanced_debug_stacktrace_summary_off">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи ĐŊĐĩ ŅŅŠĐ´ŅŠŅ€Đļа ҁĐģĐĩди ĐžŅ‚ ҁ҂ĐĩĐēа</string>
<string name="revanced_debug_toast_on_error_title">ПоĐēаĐļи ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐž ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ReVanced ĐŗŅ€Đĩ҈Đēа</string>
<string name="revanced_debug_toast_on_error_summary_on">ПоĐēаСва ҁĐĩ toast, аĐēĐž Đ˛ŅŠĐˇĐŊиĐēĐŊĐĩ ĐŗŅ€Đĩ҈Đēа</string>
<string name="revanced_debug_toast_on_error_summary_off">НĐĩ ҁĐĩ ĐŋĐžĐēаСва toast, аĐēĐž Đ˛ŅŠĐˇĐŊиĐēĐŊĐĩ ĐŗŅ€Đĩ҈Đēа</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"ИСĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ¸ĐˇŅĐēĐ°Ņ‡Đ°Ņ‰Đ¸ ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ Са ĐŗŅ€Đĩ҈Đēи ĐēŅ€Đ¸Đĩ Đ˛ŅĐ¸Ņ‡Đēи иСвĐĩŅŅ‚Đ¸Ņ Са ĐŗŅ€Đĩ҈Đēи ĐŊа ReVanced.
ĐŅĐŧа да ĐąŅŠĐ´ĐĩŅ‚Đĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐĩĐŊи Са ĐŊĐĩĐžŅ‡Đ°ĐēваĐŊи ŅŅŠĐąĐ¸Ņ‚Đ¸Ņ."</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_hide_album_cards_title">\"ĐšĐ°Ņ€Ņ‚Đ¸ ĐŊа аĐģĐąŅƒĐŧĐ¸Ņ‚Đĩ\"</string>
@@ -586,6 +586,10 @@ Second \"item\" text"</string>
<string name="revanced_hide_stop_ads_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа „СĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧи“</string>
<string name="revanced_hide_stop_ads_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ҁĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧи Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_stop_ads_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ҁĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧи Đĩ ĐŋĐžĐēаСаĐŊ</string>
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<string name="revanced_hide_comments_button_title">ĐĄĐēŅ€Đ¸Đš ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸</string>
<string name="revanced_hide_comments_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_comments_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<string name="revanced_hide_report_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са Đ´ĐžĐēĐģади</string>
@@ -1242,8 +1246,9 @@ Second \"item\" text"</string>
АĐēĐž ĐŋĐž-ĐēҊҁĐŊĐž ĐąŅŠĐ´Đĩ иСĐēĐģŅŽŅ‡ĐĩĐŊĐž, ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ¸Ņ‚ĐĩĐģĐŊĐž Đĩ да Đ¸ĐˇŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž, Са да ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ ĐŗŅ€Đĩ҈Đēи в ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐ¸Ņ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ."</string>
<string name="revanced_spoof_app_version_target_title">ПодĐģŅŠĐŗĐ˛Đ°ĐŊĐĩ Са вĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩŅ‚Đĩ ŅŅ‚Đ°Ņ€Đ¸Ņ‚Đĩ иĐēĐžĐŊи ĐŊа Shorts в ĐŋĐģĐĩĐšŅŠŅ€Đ°</string>
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅŅ‚Đ°Ņ€Đ¸ иĐēĐžĐŊи Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_spoof_app_version_target_entry_1">20.13.41 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŊĐĩŅĐŗŅŠĐ˛Đ°ĐĩĐŧа ĐģĐĩĐŊŅ‚Đ° ҁ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Са видĐĩĐž</string>
<string name="revanced_spoof_app_version_target_entry_2">19.35.36 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩŅ‚Đĩ ŅŅ‚Đ°Ņ€Đ¸Ņ‚Đĩ иĐēĐžĐŊи ĐŊа Shorts в ĐŋĐģĐĩĐšŅŠŅ€Đ°</string>
<string name="revanced_spoof_app_version_target_entry_3">19.01.34 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅŅ‚Đ°Ņ€Đ¸ иĐēĐžĐŊи Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŊĐ°Ņ‡Đ°ĐģĐŊĐ°Ņ‚Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°</string>
@@ -1585,11 +1590,46 @@ Second \"item\" text"</string>
<string name="revanced_music_play_permanent_repeat_summary_on">ĐŸĐžŅŅ‚ĐžŅĐŊĐŊĐžŅ‚Đž ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅĐŊĐĩ Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž</string>
<string name="revanced_music_play_permanent_repeat_summary_off">ĐŸĐžŅŅ‚ĐžŅĐŊĐŊĐžŅ‚Đž ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž</string>
</patch>
<patch id="layout.castbutton.hideCastButton">
<string name="revanced_music_hide_cast_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŋŅ€ĐĩдаваĐŊĐĩ</string>
<string name="revanced_music_hide_cast_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐŋŅ€ĐĩдаваĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_music_hide_cast_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐŋŅ€ĐĩдаваĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
</patch>
<patch id="layout.compactheader.hideCategoryBar">
<string name="revanced_music_hide_category_bar_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° ҁ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸</string>
<string name="revanced_music_hide_category_bar_summary_on">ЛĐĩĐŊŅ‚Đ°Ņ‚Đ° ҁ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_music_hide_category_bar_summary_off">ЛĐĩĐŊŅ‚Đ°Ņ‚Đ° ҁ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸ Đĩ ĐŋĐžĐēаСаĐŊа</string>
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<string name="revanced_music_navigation_bar_screen_title">ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊа ĐģĐĩĐŊŅ‚Đ°</string>
<string name="revanced_music_navigation_bar_screen_summary">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ иĐģи ĐŋŅ€ĐžĐŧŅĐŊа ĐŊа ĐąŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ°</string>
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_home_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа ĐĐ°Ņ‡Đ°ĐģĐž</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐĐ°Ņ‡Đ°ĐģĐž Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐĐ°Ņ‡Đ°ĐģĐž Đĩ ĐŋĐžĐēаСаĐŊ</string>
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_samples_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа ĐœĐžŅŅ‚Ņ€Đ¸</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐœĐžŅŅ‚Ņ€Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐœĐžŅŅ‚Ņ€Đ¸ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_explore_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа ĐŸŅ€ĐžŅƒŅ‡Đ˛Đ°ĐŊĐĩ</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐŸŅ€ĐžŅƒŅ‡Đ˛Đ°ĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐŸŅ€ĐžŅƒŅ‡Đ˛Đ°ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_library_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа БибĐģĐ¸ĐžŅ‚ĐĩĐēа</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ БибĐģĐ¸ĐžŅ‚ĐĩĐēа Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ БибĐģĐ¸ĐžŅ‚ĐĩĐēа Đĩ ĐŋĐžĐēаСаĐŊ</string>
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_upgrade_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа ĐĐ°Đ´ĐŗŅ€Đ°ĐļдаĐŊĐĩ</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐĐ°Đ´ĐŗŅ€Đ°ĐļдаĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐĐ°Đ´ĐŗŅ€Đ°ĐļдаĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_music_hide_navigation_bar_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ°</string>
<string name="revanced_music_hide_navigation_bar_summary_on">ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_music_hide_navigation_bar_summary_off">ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŋĐžĐēаСаĐŊа</string>
<string name="revanced_music_hide_navigation_bar_labels_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ‚Đĩ ĐŊа ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ ĐąŅƒŅ‚ĐžĐŊи</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_on">Đ•Ņ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_off">Đ•Ņ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ‚Đĩ ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
<string name="revanced_music_hide_get_premium_label_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ° „ВзĐĩĐŧĐĩŅ‚Đĩ Music Premium“</string>
<string name="revanced_music_hide_get_premium_label_summary_on">Đ•Ņ‚Đ¸ĐēĐĩŅ‚ŅŠŅ‚ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>

View File

@@ -107,6 +107,15 @@ MicroG-āĻāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ
<string name="revanced_debug_title">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ—āĻŋāĻ‚</string>
<string name="revanced_debug_summary_on">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āϏāĻ•ā§āϰāĻŋ⧟ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_debug_summary_off">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋ⧟ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_debug_stacktrace_title">āĻ¸ā§āĻŸā§‡āĻ• āĻŸā§āϰ⧇āϏ āϞāĻ—</string>
<string name="revanced_debug_stacktrace_summary_on">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āĻ¸ā§āĻŸā§‡āĻ• āĻŸā§āϰ⧇āϏ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇</string>
<string name="revanced_debug_stacktrace_summary_off">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āĻ¸ā§āĻŸā§‡āĻ• āĻŸā§āϰ⧇āϏ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇ āύāĻž</string>
<string name="revanced_debug_toast_on_error_title">ReVanced āĻāϰ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŸā§‹āĻ¸ā§āϟ āĻĻ⧇āĻ–āĻžāύ</string>
<string name="revanced_debug_toast_on_error_summary_on">āϝāĻĻāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āϘāĻŸā§‡ āϤāĻŦ⧇ toast āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇</string>
<string name="revanced_debug_toast_on_error_summary_off">āϝāĻĻāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āϘāĻŸā§‡ āϤāĻŦ⧇ toast āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇ āύāĻž</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"āĻ¤ā§āϰ⧁āϟāĻŋ \"toast\" āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇ ReVanced āĻ¤ā§āϰ⧁āϟāĻŋ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āĻšāϝāĻŧāĨ¤
āφāĻĒāύāĻŋ āϕ⧋āύāĻ“ āĻ…āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āϘāϟāύāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āĻ…āĻŦāĻšāĻŋāϤ āĻšāĻŦ⧇āύ āύāĻžāĨ¤"</string>
<string name="revanced_debug_export_logs_to_clipboard_title">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ—āϗ⧁āϞāĻŋ āϰāĻĢāϤāĻžāύāĻŋ āĻ•āϰ⧁āύ</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">āĻ•ā§āϞāĻŋāĻĒāĻŦā§‹āĻ°ā§āĻĄā§‡ ReVanced āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ—āϗ⧁āϞāĻŋ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋ āĻ•āϰ⧇</string>
<string name="revanced_debug_logs_disabled">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ—āĻŋāĻ‚ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇</string>
@@ -147,15 +156,6 @@ MicroG-āĻāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ
<string name="revanced_debug_protobuffer_summary_on">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āĻĒā§āϰāĻŸā§‹āĻ•āϞ āĻŦāĻžāĻĢāĻžāϰ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇</string>
<string name="revanced_debug_protobuffer_summary_off">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āĻĒā§āϰāĻŸā§‹āĻ•āϞ āĻŦāĻžāĻĢāĻžāϰ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇ āύāĻž</string>
<string name="revanced_debug_protobuffer_user_dialog_message">"āĻāχ āϏ⧇āϟāĻŋāĻ‚āϏ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϞ⧇ āĻ•āĻŋāϛ⧁ UI āωāĻĒāĻžāĻĻāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āύ-āĻ¸ā§āĻ•ā§āϰ⧀āύ āĻĒāĻžāĻ ā§āϝ āϏāĻš āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϞ⧇āφāωāϟ āĻĄā§‡āϟāĻž āϞāĻ— āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤\n\nāĻāϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āωāĻĒāĻžāĻĻāĻžāύ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāϤāĻŦ⧇, āĻāϟāĻŋ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāϞ⧇ āφāĻĒāύāĻžāϰ āφāχāĻĒāĻŋ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āĻŽāϤ⧋ āĻ•āĻŋāϛ⧁ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻžāĻ“ āϞāĻ— āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤"</string>
<string name="revanced_debug_stacktrace_title">āĻ¸ā§āĻŸā§‡āĻ• āĻŸā§āϰ⧇āϏ āϞāĻ—</string>
<string name="revanced_debug_stacktrace_summary_on">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āĻ¸ā§āĻŸā§‡āĻ• āĻŸā§āϰ⧇āϏ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇</string>
<string name="revanced_debug_stacktrace_summary_off">āĻĄāĻŋāĻŦāĻžāĻ— āϞāĻ— āĻ¸ā§āĻŸā§‡āĻ• āĻŸā§āϰ⧇āϏ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇ āύāĻž</string>
<string name="revanced_debug_toast_on_error_title">ReVanced āĻāϰ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŸā§‹āĻ¸ā§āϟ āĻĻ⧇āĻ–āĻžāύ</string>
<string name="revanced_debug_toast_on_error_summary_on">āϝāĻĻāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āϘāĻŸā§‡ āϤāĻŦ⧇ toast āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇</string>
<string name="revanced_debug_toast_on_error_summary_off">āϝāĻĻāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āϘāĻŸā§‡ āϤāĻŦ⧇ toast āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇ āύāĻž</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"āĻ¤ā§āϰ⧁āϟāĻŋ \"toast\" āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇ ReVanced āĻ¤ā§āϰ⧁āϟāĻŋ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āĻšāϝāĻŧāĨ¤
āφāĻĒāύāĻŋ āϕ⧋āύāĻ“ āĻ…āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āϘāϟāύāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āĻ…āĻŦāĻšāĻŋāϤ āĻšāĻŦ⧇āύ āύāĻžāĨ¤"</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_hide_album_cards_title">āĻ…ā§āϝāĻžāϞāĻŦāĻžāĻŽ āĻ•āĻžāĻ°ā§āĻĄ āϞ⧁āĻ•āĻžāύ</string>
@@ -582,6 +582,10 @@ MicroG-āĻāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ
<string name="revanced_hide_stop_ads_button_title">āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāύ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_hide_stop_ads_button_summary_on">āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāύ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ āĻŦā§‹āϤāĻžāĻŽāϟāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_hide_stop_ads_button_summary_off">āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāύ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ āĻŦā§‹āϤāĻžāĻŽāϟāĻŋ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string>
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<string name="revanced_hide_comments_button_title">āĻŽāĻ¨ā§āϤāĻŦā§āϝ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_hide_comments_button_summary_on">āĻŽāĻ¨ā§āϤāĻŦā§āϝ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_hide_comments_button_summary_off">āĻŽāĻ¨ā§āϤāĻŦā§āϝ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<string name="revanced_hide_report_button_title">Report āϞ⧁āĻ•āĻžāύ</string>
@@ -1238,8 +1242,9 @@ YouTube āϏ⧇āϟāĻŋāĻ‚āϏ⧇ āĻ…āĻŸā§‹ āĻĒā§āϞ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ
āĻĒāϰ⧇ āϝāĻĻāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻž āĻšāϝāĻŧ, UI āĻŦāĻžāĻ— āĻāĻĄāĻŧāĻžāϤ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻžāϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤"</string>
<string name="revanced_spoof_app_version_target_title">āĻ¸ā§āĻĒ⧁āĻĢ āĻ…ā§āϝāĻžāĻĒ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āϞāĻ•ā§āĻˇā§āϝ</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - āĻĒ⧁āϰāύ⧋ Shorts āĻĒā§āϞ⧇āϝāĻŧāĻžāϰ āφāχāĻ•āύ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧁āύ</string>
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - āĻĒ⧁āϰāύ⧋ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āφāχāĻ•āύ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧁āύ</string>
<string name="revanced_spoof_app_version_target_entry_1">20.13.41 - āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āύ⧟ āĻāĻŽāύ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻŦāĻžāϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧁āύ</string>
<string name="revanced_spoof_app_version_target_entry_2">19.35.36 - āĻĒ⧁āϰāύ⧋ Shorts āĻĒā§āϞ⧇āϝāĻŧāĻžāϰ āφāχāĻ•āύ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧁āύ</string>
<string name="revanced_spoof_app_version_target_entry_3">19.01.34 - āĻĒ⧁āϰāύ⧋ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āφāχāĻ•āύ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧁āύ</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">āĻļ⧁āϰ⧁āϰ āĻĒ⧃āĻˇā§āĻ āĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ</string>
@@ -1581,11 +1586,46 @@ DeArrow āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϜāĻžāύāϤ⧇ āĻāĻ–āĻžāύ⧇ āϟ
<string name="revanced_music_play_permanent_repeat_summary_on">āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇</string>
<string name="revanced_music_play_permanent_repeat_summary_off">āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻ…āĻ•ā§āώāĻŽ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇</string>
</patch>
<patch id="layout.castbutton.hideCastButton">
<string name="revanced_music_hide_cast_button_title">āĻ•āĻžāĻ¸ā§āϟ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_cast_button_summary_on">āĻ•āĻžāĻ¸ā§āϟ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_cast_button_summary_off">āĻ•āĻžāĻ¸ā§āϟ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
</patch>
<patch id="layout.compactheader.hideCategoryBar">
<string name="revanced_music_hide_category_bar_title">āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋ āĻŦāĻžāϰ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_category_bar_summary_on">āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋ āĻŦāĻžāϰ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_category_bar_summary_off">āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋ āĻŦāĻžāϰ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<string name="revanced_music_navigation_bar_screen_title">āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ</string>
<string name="revanced_music_navigation_bar_screen_summary">āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ⧇āϰ āĻŦā§‹āϤāĻžāĻŽāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ āĻŦāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ</string>
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_home_button_title">āĻšā§‹āĻŽ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_on">āĻšā§‹āĻŽ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_home_button_summary_off">āĻšā§‹āĻŽ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_samples_button_title">āĻ¸ā§āϝāĻžāĻŽā§āĻĒāϞ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_on">āĻ¸ā§āϝāĻžāĻŽā§āĻĒāϞ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_samples_button_summary_off">āĻ¸ā§āϝāĻžāĻŽā§āĻĒāϞ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_explore_button_title">āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_on">āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_explore_button_summary_off">āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_library_button_title">āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_on">āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_library_button_summary_off">āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
<string name="revanced_music_hide_navigation_bar_upgrade_button_title">āφāĻĒāĻ—ā§āϰ⧇āĻĄ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_on">āφāĻĒāĻ—ā§āϰ⧇āĻĄ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_upgrade_button_summary_off">āφāĻĒāĻ—ā§āϰ⧇āĻĄ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_title">āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_summary_on">āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_summary_off">āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_labels_title">āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦā§‹āϤāĻžāĻŽā§‡āϰ āϞ⧇āĻŦ⧇āϞāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_on">āϞ⧇āĻŦ⧇āϞāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_music_hide_navigation_bar_labels_summary_off">āϞ⧇āĻŦ⧇āϞāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻžāύ⧋ āφāϛ⧇</string>
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
<string name="revanced_music_hide_get_premium_label_title">\'āϗ⧇āϟ āĻŽāĻŋāωāϜāĻŋāĻ• āĻĒā§āϰāĻŋāĻŽāĻŋāϝāĻŧāĻžāĻŽ\' āϞ⧇āĻŦ⧇āϞ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_music_hide_get_premium_label_summary_on">āϞ⧇āĻŦ⧇āϞ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>

View File

@@ -89,6 +89,7 @@ Second \"item\" text"</string>
<patch id="layout.buttons.action.hideButtonsPatch">
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
<!-- Button does not have any text and is only shown as an icon, and only when the video information area is collapsed to a compact state. -->
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually only shows on live streams. -->
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
@@ -253,8 +254,17 @@ Second \"item\" text"</string>
</patch>
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
</patch>
<patch id="layout.castbutton.hideCastButton">
</patch>
<patch id="layout.compactheader.hideCategoryBar">
</patch>
<patch id="layout.navigationbar.navigationBarPatch">
<!-- 'Home' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Samples' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Explore' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Library' should be translated using the same localized wording YouTube Music displays for the tab. -->
<!-- 'Upgrade' should be translated using the same localized wording YouTube Music displays for the tab. -->
</patch>
<patch id="layout.premium.hideGetPremiumPatch">
</patch>
<patch id="layout.upgradebutton.hideUpgradeButtonPatch">

Some files were not shown because too many files have changed in this diff Show More