Compare commits

..

4 Commits

Author SHA1 Message Date
semantic-release-bot
0572d48fde chore: Release v5.18.1-dev.2 [skip ci]
## [5.18.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.18.1-dev.1...v5.18.1-dev.2) (2025-04-01)

### Bug Fixes

* **YouTube:** Combine multiple seekbar patches into a single patch ([#4705](https://github.com/ReVanced/revanced-patches/issues/4705)) ([37984b8](37984b8b99))
2025-04-01 19:00:31 +00:00
LisoUseInAIKyrios
37984b8b99 fix(YouTube): Combine multiple seekbar patches into a single patch (#4705) 2025-04-01 20:57:03 +02:00
github-actions[bot]
6e63193f06 chore: Sync translations (#4713) 2025-04-01 20:51:16 +02:00
LisoUseInAIKyrios
b2384b22a5 refactor: Add more opcodes to findFreeRegister 2025-04-01 20:17:00 +02:00
17 changed files with 208 additions and 148 deletions

View File

@@ -1,3 +1,10 @@
## [5.18.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.18.1-dev.1...v5.18.1-dev.2) (2025-04-01)
### Bug Fixes
* **YouTube:** Combine multiple seekbar patches into a single patch ([#4705](https://github.com/ReVanced/revanced-patches/issues/4705)) ([503b7eb](https://github.com/ReVanced/revanced-patches/commit/503b7eb8d413ef7f248394f128f3b2a6f3192ba6))
## [5.18.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.18.0...v5.18.1-dev.1) (2025-03-31)

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.18.1-dev.1
version = 5.18.1-dev.2

View File

@@ -1096,6 +1096,14 @@ public final class app/revanced/patches/youtube/interaction/seekbar/EnableSlideT
public static final fun getEnableSlideToSeekPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatchKt {
public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/youtube/interaction/seekbar/SeekbarPatchKt {
public static final fun getSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatchKt {
public static final fun getSeekbarThumbnailsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}

View File

@@ -11,8 +11,10 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/DisablePreciseSeekingGesturePatch;"
val disablePreciseSeekingGesturePatch = bytecodePatch(
name = "Disable precise seeking gesture",
description = "Adds an option to disable precise seeking when swiping up on the seekbar.",
) {
dependsOn(
@@ -21,25 +23,12 @@ val disablePreciseSeekingGesturePatch = bytecodePatch(
addResourcesPatch,
)
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
),
)
execute {
addResources("youtube", "interaction.seekbar.disablePreciseSeekingGesturePatch")
PreferenceScreen.SEEKBAR.addPreferences(
SwitchPreference("revanced_disable_precise_seeking_gesture"),
)
val extensionMethodDescriptor =
"Lapp/revanced/extension/youtube/patches/DisablePreciseSeekingGesturePatch;"
allowSwipingUpGestureFingerprint.match(
swipingUpGestureParentFingerprint.originalClassDef,
@@ -47,7 +36,7 @@ val disablePreciseSeekingGesturePatch = bytecodePatch(
addInstructionsWithLabels(
0,
"""
invoke-static { }, $extensionMethodDescriptor->isGestureDisabled()Z
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->isGestureDisabled()Z
move-result v0
if-eqz v0, :disabled
return-void
@@ -62,7 +51,7 @@ val disablePreciseSeekingGesturePatch = bytecodePatch(
addInstructionsWithLabels(
0,
"""
invoke-static { }, $extensionMethodDescriptor->isGestureDisabled()Z
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->isGestureDisabled()Z
move-result v0
if-eqz v0, :disabled
const/4 v0, 0x0

View File

@@ -15,7 +15,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
val enableSeekbarTappingPatch = bytecodePatch(
name = "Enable tap to seek",
description = "Adds an option to enable tap to seek on the seekbar of the video player.",
) {
dependsOn(
@@ -24,17 +23,6 @@ val enableSeekbarTappingPatch = bytecodePatch(
addResourcesPatch,
)
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
),
)
execute {
addResources("youtube", "interaction.seekbar.enableSeekbarTappingPatch")

View File

@@ -18,11 +18,9 @@ import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal const val EXTENSION_METHOD_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/SlideToSeekPatch;->isSlideToSeekDisabled(Z)Z"
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/SlideToSeekPatch;"
val enableSlideToSeekPatch = bytecodePatch(
name = "Enable slide to seek",
description = "Adds an option to enable slide to seek " +
"instead of playing at 2x speed when pressing and holding in the video player."
) {
@@ -33,17 +31,6 @@ val enableSlideToSeekPatch = bytecodePatch(
versionCheckPatch,
)
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
),
)
execute {
addResources("youtube", "interaction.seekbar.enableSlideToSeekPatch")
@@ -59,6 +46,8 @@ val enableSlideToSeekPatch = bytecodePatch(
val checkReference = slideToSeekFingerprint.method.getInstruction(checkIndex)
.getReference<MethodReference>()!!
val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->isSlideToSeekDisabled(Z)Z"
// A/B check method was only called on this class.
slideToSeekFingerprint.classDef.methods.forEach { method ->
method.findInstructionIndicesReversed {
@@ -70,7 +59,7 @@ val enableSlideToSeekPatch = bytecodePatch(
addInstructions(
index + 2,
"""
invoke-static { v$register }, $EXTENSION_METHOD_DESCRIPTOR
invoke-static { v$register }, $extensionMethodDescriptor
move-result v$register
""",
)
@@ -95,7 +84,7 @@ val enableSlideToSeekPatch = bytecodePatch(
addInstructions(
targetIndex + 1,
"""
invoke-static { v$targetRegister }, $EXTENSION_METHOD_DESCRIPTOR
invoke-static { v$targetRegister }, $extensionMethodDescriptor
move-result v$targetRegister
""",
)
@@ -109,7 +98,7 @@ val enableSlideToSeekPatch = bytecodePatch(
addInstructions(
insertIndex,
"""
invoke-static { v$targetRegister }, $EXTENSION_METHOD_DESCRIPTOR
invoke-static { v$targetRegister }, $extensionMethodDescriptor
move-result v$targetRegister
""",
)

View File

@@ -0,0 +1,46 @@
package app.revanced.patches.youtube.interaction.seekbar
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
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.SwitchPreference
import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.seekbarFingerprint
import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint
val hideSeekbarPatch = bytecodePatch(
description = "Adds an option to hide the seekbar.",
) {
dependsOn(
sharedExtensionPatch,
settingsPatch,
seekbarColorPatch,
addResourcesPatch,
)
execute {
addResources("youtube", "layout.hide.seekbar.hideSeekbarPatch")
PreferenceScreen.SEEKBAR.addPreferences(
SwitchPreference("revanced_hide_seekbar"),
SwitchPreference("revanced_hide_seekbar_thumbnail"),
)
seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.addInstructionsWithLabels(
0,
"""
const/4 v0, 0x0
invoke-static { }, Lapp/revanced/extension/youtube/patches/HideSeekbarPatch;->hideSeekbar()Z
move-result v0
if-eqz v0, :hide_seekbar
return-void
:hide_seekbar
nop
""",
)
}
}

View File

@@ -0,0 +1,31 @@
package app.revanced.patches.youtube.interaction.seekbar
import app.revanced.patcher.patch.bytecodePatch
@Suppress("unused")
val seekbarPatch = bytecodePatch(
name = "Seekbar",
description = "Adds options to disable precise seeking when swiping up on the seekbar, " +
"slide to seek instead of playing at 2x speed when pressing and holding, " +
"tapping the player seekbar to seek, " +
"and hiding the video player seekbar."
) {
dependsOn(
disablePreciseSeekingGesturePatch,
enableSlideToSeekPatch,
enableSeekbarTappingPatch,
hideSeekbarPatch,
seekbarThumbnailsPatch
)
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
)
)
}

View File

@@ -10,6 +10,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.layout.seekbar.fullscreenSeekbarThumbnailsFingerprint
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
@@ -17,7 +18,6 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/SeekbarThumbnailsPatch;"
val seekbarThumbnailsPatch = bytecodePatch(
name = "Seekbar thumbnails",
description = "Adds an option to use high quality fullscreen seekbar thumbnails. " +
"Patching 19.16.39 adds an option to restore old seekbar thumbnails.",
) {
@@ -27,18 +27,13 @@ val seekbarThumbnailsPatch = bytecodePatch(
versionCheckPatch,
)
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
)
)
execute {
if (is_20_09_or_greater) {
// High quality seekbar thumbnails is partially broken in 20.09
// and the code is completely removed in 20.10+
return@execute
}
addResources("youtube", "layout.seekbar.seekbarThumbnailsPatch")
if (is_19_17_or_greater) {

View File

@@ -269,7 +269,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
move-object v$returnEmptyComponentRegister, p1 # Required for 19.47
goto :return_empty_component
:show
const/4 v$freeRegister, 0x0 # Restore register, required for 19.16
nop
""",
ExternalLabel("return_empty_component", returnEmptyComponentInstruction),
)

View File

@@ -1,58 +1,11 @@
package app.revanced.patches.youtube.layout.hide.seekbar
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
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.SwitchPreference
import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.seekbarFingerprint
import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint
import app.revanced.patches.youtube.interaction.seekbar.hideSeekbarPatch
val hideSeekbarPatch = bytecodePatch(
name = "Hide seekbar",
description = "Adds an option to hide the seekbar.",
) {
@Deprecated("Patch was moved to app.revanced.patches.youtube.interaction.seekbar")
val hideSeekbarPatch = bytecodePatch {
dependsOn(
sharedExtensionPatch,
settingsPatch,
seekbarColorPatch,
addResourcesPatch,
hideSeekbarPatch
)
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
),
)
execute {
addResources("youtube", "layout.hide.seekbar.hideSeekbarPatch")
PreferenceScreen.SEEKBAR.addPreferences(
SwitchPreference("revanced_hide_seekbar"),
SwitchPreference("revanced_hide_seekbar_thumbnail"),
)
seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.addInstructionsWithLabels(
0,
"""
const/4 v0, 0x0
invoke-static { }, Lapp/revanced/extension/youtube/patches/HideSeekbarPatch;->hideSeekbar()Z
move-result v0
if-eqz v0, :hide_seekbar
return-void
:hide_seekbar
nop
""",
)
}
}

View File

@@ -179,9 +179,6 @@ val returnYouTubeDislikePatch = bytecodePatch(
// region Hook rolling numbers.
// Do this last to allow patching old unsupported versions (if the user really wants),
// On older unsupported version this will fail to match and throw an exception,
// but everything will still work correctly anyway.
val dislikesIndex = rollingNumberSetterFingerprint.patternMatch!!.endIndex
rollingNumberSetterFingerprint.method.apply {

View File

@@ -70,21 +70,53 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
}
val writeOpcodes = EnumSet.of(
ARRAY_LENGTH,
NEW_INSTANCE, NEW_ARRAY,
MOVE, MOVE_FROM16, MOVE_16, MOVE_WIDE, MOVE_WIDE_FROM16, MOVE_WIDE_16, MOVE_OBJECT,
MOVE_OBJECT_FROM16, MOVE_OBJECT_16, MOVE_RESULT, MOVE_RESULT_WIDE, MOVE_RESULT_OBJECT, MOVE_EXCEPTION,
CONST, CONST_4, CONST_16, CONST_HIGH16, CONST_WIDE_16, CONST_WIDE_32,
CONST_WIDE, CONST_WIDE_HIGH16, CONST_STRING, CONST_STRING_JUMBO,
IGET, IGET_WIDE, IGET_OBJECT, IGET_BOOLEAN, IGET_BYTE, IGET_CHAR, IGET_SHORT,
IGET_VOLATILE, IGET_WIDE_VOLATILE, IGET_OBJECT_VOLATILE,
SGET, SGET_WIDE, SGET_OBJECT, SGET_BOOLEAN, SGET_BYTE, SGET_CHAR, SGET_SHORT,
SGET_VOLATILE, SGET_WIDE_VOLATILE, SGET_OBJECT_VOLATILE,
AGET, AGET_WIDE, AGET_OBJECT, AGET_BOOLEAN, AGET_BYTE, AGET_CHAR, AGET_SHORT,
// Arithmetic and logical operations.
ADD_DOUBLE_2ADDR, ADD_DOUBLE, ADD_FLOAT_2ADDR, ADD_FLOAT, ADD_INT_2ADDR,
ADD_INT_LIT8, ADD_INT, ADD_LONG_2ADDR, ADD_LONG, ADD_INT_LIT16,
AND_INT_2ADDR, AND_INT_LIT8, AND_INT_LIT16, AND_INT, AND_LONG_2ADDR, AND_LONG,
DIV_DOUBLE_2ADDR, DIV_DOUBLE, DIV_FLOAT_2ADDR, DIV_FLOAT, DIV_INT_2ADDR,
DIV_INT_LIT16, DIV_INT_LIT8, DIV_INT, DIV_LONG_2ADDR, DIV_LONG,
DOUBLE_TO_FLOAT, DOUBLE_TO_INT, DOUBLE_TO_LONG,
FLOAT_TO_DOUBLE, FLOAT_TO_INT, FLOAT_TO_LONG,
INT_TO_BYTE, INT_TO_CHAR, INT_TO_DOUBLE, INT_TO_FLOAT, INT_TO_LONG, INT_TO_SHORT,
LONG_TO_DOUBLE, LONG_TO_FLOAT, LONG_TO_INT,
MUL_DOUBLE_2ADDR, MUL_DOUBLE, MUL_FLOAT_2ADDR, MUL_FLOAT, MUL_INT_2ADDR,
MUL_INT_LIT16, MUL_INT_LIT8, MUL_INT, MUL_LONG_2ADDR, MUL_LONG,
NEG_DOUBLE, NEG_FLOAT, NEG_INT, NEG_LONG,
NOT_INT, NOT_LONG,
OR_INT_2ADDR, OR_INT_LIT16, OR_INT_LIT8, OR_INT, OR_LONG_2ADDR, OR_LONG,
REM_DOUBLE_2ADDR, REM_DOUBLE, REM_FLOAT_2ADDR, REM_FLOAT, REM_INT_2ADDR,
REM_INT_LIT16, REM_INT_LIT8, REM_INT, REM_LONG_2ADDR, REM_LONG,
RSUB_INT_LIT8, RSUB_INT,
SHL_INT_2ADDR, SHL_INT_LIT8, SHL_INT, SHL_LONG_2ADDR, SHL_LONG,
SHR_INT_2ADDR, SHR_INT_LIT8, SHR_INT, SHR_LONG_2ADDR, SHR_LONG,
SUB_DOUBLE_2ADDR, SUB_DOUBLE, SUB_FLOAT_2ADDR, SUB_FLOAT, SUB_INT_2ADDR,
SUB_INT, SUB_LONG_2ADDR, SUB_LONG,
USHR_INT_2ADDR, USHR_INT_LIT8, USHR_INT, USHR_LONG_2ADDR, USHR_LONG,
XOR_INT_2ADDR, XOR_INT_LIT16, XOR_INT_LIT8, XOR_INT, XOR_LONG_2ADDR, XOR_LONG,
)
val branchOpcodes = EnumSet.of(
GOTO, GOTO_16, GOTO_32,
IF_EQ, IF_NE, IF_LT, IF_GE, IF_GT, IF_LE,
IF_EQZ, IF_NEZ, IF_LTZ, IF_GEZ, IF_GTZ, IF_LEZ,
PACKED_SWITCH_PAYLOAD, SPARSE_SWITCH_PAYLOAD
)
val returnOpcodes = EnumSet.of(
RETURN_VOID, RETURN, RETURN_WIDE, RETURN_OBJECT,
RETURN_VOID, RETURN, RETURN_WIDE, RETURN_OBJECT, RETURN_VOID_NO_BARRIER,
THROW
)
// Highest 4-bit register available, exclusive. Ideally return a free register less than this.
@@ -94,9 +126,13 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
for (i in startIndex until instructions.count()) {
val instruction = getInstruction(i)
val instructionRegisters = instruction.getRegistersUsed()
if (instruction.opcode in returnOpcodes) {
// Method returns. Use lowest register that hasn't been encountered.
// Method returns.
usedRegisters.addAll(instructionRegisters)
// Use lowest register that hasn't been encountered.
val freeRegister = (0 until implementation!!.registerCount).find {
it !in usedRegisters
}
@@ -122,26 +158,32 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
}
if (instruction.opcode in writeOpcodes) {
val freeRegister = instruction.getRegisterWritten()
if (freeRegister !in usedRegisters) {
if (freeRegister < maxRegister4Bits) {
// Found an ideal register.
return freeRegister
}
val writeRegister = instruction.getRegisterWritten()
// Continue searching for a 4-bit register if available.
if (bestFreeRegisterFound == null || freeRegister < bestFreeRegisterFound) {
bestFreeRegisterFound = freeRegister
if (writeRegister !in usedRegisters) {
// Verify the register is only used for write and not also as a parameter.
// If the instruction uses the write register once then it's not also a read register.
if (instructionRegisters.count { register -> register == writeRegister } == 1) {
if (writeRegister < maxRegister4Bits) {
// Found an ideal register.
return writeRegister
}
// Continue searching for a 4-bit register if available.
if (bestFreeRegisterFound == null || writeRegister < bestFreeRegisterFound) {
bestFreeRegisterFound = writeRegister
}
}
}
}
usedRegisters.addAll(instruction.getRegistersUsed())
usedRegisters.addAll(instructionRegisters)
}
// Cannot be reached since a branch or return statement will
// be encountered before the end of the method.
throw IllegalStateException()
// Some methods can have array payloads at the end of the method after a return statement.
// But in normal usage this cannot be reached since a branch or return statement
// will be encountered before the end of the method.
throw IllegalArgumentException("Start index is outside the range of normal control flow: $startIndex")
}

View File

@@ -226,6 +226,8 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
<string name="revanced_hide_artist_cards_title">Piilota artistikortit</string>
<string name="revanced_hide_artist_cards_summary_on">Artistikortit on piilotettu</string>
<string name="revanced_hide_artist_cards_summary_off">Artistikortit näytetään</string>
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Videon yhteenveto-osio on piilotettu</string>
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Videon yhteenveto-osio näytetään</string>
<string name="revanced_hide_attributes_section_title">Piilota Määritteet</string>
<string name="revanced_hide_attributes_section_summary_on">Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot on piilotettu</string>
<string name="revanced_hide_attributes_section_summary_off">Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot näytetään</string>
@@ -264,6 +266,8 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
<string name="revanced_comments_screen_summary">Piilota tai näytä kommenttiosion osia</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_on">Chat-yhteenveto on piilotettu</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_off">Chat-yhteenveto näytetään</string>
<string name="revanced_hide_comments_ai_summary_summary_on">Kommenttien yhteenveto on piilotettu</string>
<string name="revanced_hide_comments_ai_summary_summary_off">Kommenttien yhteenveto näytetään</string>
<string name="revanced_hide_comments_by_members_header_title">Piilota \"Jäsenten kommentit\" -ylätunniste</string>
<string name="revanced_hide_comments_by_members_header_summary_on">Jäsenten kommentit -ylätunniste on piilotettu</string>
<string name="revanced_hide_comments_by_members_header_summary_off">Jäsenten kommentit -ylätunniste näytetään</string>
@@ -423,6 +427,9 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla"</string>
<string name="revanced_disable_precise_seeking_gesture_summary_off">Ele on käytössä</string>
</patch>
<patch id="interaction.seekbar.enableSeekbarTappingPatch">
<string name="revanced_seekbar_tapping_title">Ota kelaus napauttamalla käyttöön</string>
<string name="revanced_seekbar_tapping_summary_on">Kelaus napauttamalla on käytössä</string>
<string name="revanced_seekbar_tapping_summary_off">Kelaus napauttamalla ei ole käytössä</string>
</patch>
<patch id="interaction.swipecontrols.swipeControlsResourcePatch">
<string name="revanced_swipe_brightness_title">Ota kirkkauden ele käyttöön</string>
@@ -435,6 +442,9 @@ Säädä kirkkautta pyyhkäisemällä pystysuoraan näytön vasemmalla puolella"
Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta puolella"</string>
<string name="revanced_swipe_volume_summary_off">Koko näytön äänenvoimakkuuden pyyhkäisy ei ole käytössä</string>
<string name="revanced_swipe_press_to_engage_title">Ota pyyhkäise painamalla -ele käyttöön</string>
<string name="revanced_swipe_press_to_engage_summary_on">Pyyhkäise painamalla -ele on käytössä</string>
<string name="revanced_swipe_press_to_engage_summary_off">Pyyhkäise painamalla -ele ei ole käytössä</string>
<string name="revanced_swipe_haptic_feedback_title">Ota haptinen palaute käyttöön</string>
<string name="revanced_swipe_haptic_feedback_summary_on">Haptinen palaute on käytössä</string>
<string name="revanced_swipe_haptic_feedback_summary_off">Haptinen palaute ei ole käytössä</string>
@@ -542,6 +552,7 @@ Jos tämän asetuksen muuttaminen ei tule voimaan, kokeile vaihtaa Incognito-til
<string name="revanced_disable_translucent_status_bar_title">Poista läpikuultava tilapalkki käytöstä</string>
<string name="revanced_disable_translucent_status_bar_summary_on">Tilapalkki on läpinäkymätön</string>
<string name="revanced_disable_translucent_status_bar_summary_off">Tilapalkki on läpinäkymätön tai läpikuultava</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">Joillakin laitteilla tämän ominaisuuden käyttöönotto voi muuttaa järjestelmän navigointipalkin läpinäkyväksi.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">Poista vaalea läpikuultava palkki käytöstä</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">Vaalean tilan navigointipalkki on läpinäkymätön</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">Vaalean tilan navigointipalkki on läpinäkymätön tai läpikuultava</string>
@@ -1161,6 +1172,9 @@ Minisoitin voidaan vetää mihin tahansa näytön kulmaan"</string>
Minisoitin voidaan vetää pois näytöltä vasemmalle tai oikealle"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">Vaakasuuntainen vetoele ei ole käytössä</string>
<string name="revanced_miniplayer_hide_overlay_buttons_title">Piilota peittokuvan painikkeet</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Peittokuvan painikkeet on piilotettu</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Peittokuvan painikkeet näytetään</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Piilota laajenna- ja sulje-painikkeet</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Painikkeet piilotetaan

View File

@@ -448,7 +448,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
画面右側を縦にスワイプして音量を調節します"</string>
<string name="revanced_swipe_volume_summary_off">全画面表示中の音量ジェスチャーは無効です</string>
<string name="revanced_swipe_press_to_engage_title">長押しスワイプを有効にする</string>
<string name="revanced_swipe_press_to_engage_summary_on">全画面表示中、長押し後に画面を縦にスワイプして明るさや音量を調節します</string>
<string name="revanced_swipe_press_to_engage_summary_on">全画面表示中、画面を長押ししてから縦にスワイプして明るさや音量を調節します</string>
<string name="revanced_swipe_press_to_engage_summary_off">全画面表示中、画面を縦にスワイプして明るさや音量を調節します</string>
<string name="revanced_swipe_haptic_feedback_title">触覚フィードバックを有効にする</string>
<string name="revanced_swipe_haptic_feedback_summary_on">触覚フィードバックは有効です</string>
@@ -889,10 +889,10 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">スキップボタンは数秒後に非表示になります</string>
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">セグメント全体に「スキップ」ボタンが表示されます</string>
<string name="revanced_sb_general_skiptoast">スキップ時にトーストを表示</string>
<string name="revanced_sb_general_skiptoast_sum_on">セグメントが自動的にスキップされたときにトースト ポップアップが表示されます。例を見るにはここをタップしてください</string>
<string name="revanced_sb_general_skiptoast_sum_on">セグメントが自動的にスキップされたときにトースト ポップアップが表示されます。ここをタップすると、サンプルが表示されます</string>
<string name="revanced_sb_general_skiptoast_sum_off">トースト ポップアップは表示されません。例を見るにはここをタップしてください</string>
<string name="revanced_sb_general_time_without">セグメントを除いた再生時間を表示</string>
<string name="revanced_sb_general_time_without_sum_on">動画全体からセグメントを除いた再生時間が、動画全体の再生時間の横に括弧付きで表示されます</string>
<string name="revanced_sb_general_time_without_sum_on">セグメントを除いた再生時間が、動画全体の再生時間の横に括弧付きで表示されます</string>
<string name="revanced_sb_general_time_without_sum_off">動画全体の再生時間のみが表示されます</string>
<string name="revanced_sb_create_segment_category">新しいセグメントを作成する</string>
<string name="revanced_sb_enable_create_segment">新しいセグメント作成ボタンを表示</string>
@@ -943,8 +943,8 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
<string name="revanced_sb_segments_selfpromo_sum">スポンサーと同様に、無給または自己宣伝の場合。商品、寄付、またはコラボレーション相手に関する情報を記載したセクションが含まれます</string>
<string name="revanced_sb_segments_interaction">インタラクション リマインダー (チャンネル登録)</string>
<string name="revanced_sb_segments_interaction_sum">コンテンツの途中で、購読したりフォローしたりするための短いリマインダーです。 それが長いまたは特定の何かについてである場合、それは代わりに自己宣伝の下にあるべきである。</string>
<string name="revanced_sb_segments_highlight">強調表示</string>
<string name="revanced_sb_segments_highlight_sum">動画の中で多くの人々が見たい部分</string>
<string name="revanced_sb_segments_highlight">ハイライト</string>
<string name="revanced_sb_segments_highlight_sum">動画の中で最も興味を引く場面</string>
<string name="revanced_sb_segments_intro">休憩/イントロ アニメーション</string>
<string name="revanced_sb_segments_intro_sum">実際のコンテンツを含まない間隔。一時停止、固定フレーム、繰り返しアニメーションを使用できます。情報を含むトランジションは含まれません。</string>
<string name="revanced_sb_segments_outro">エンドカード/クレジット</string>
@@ -953,14 +953,14 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
<string name="revanced_sb_segments_preview_sum">ビデオやシリーズの他のビデオで何が起こったのかを示すクリップのコレクション 全ての情報が他の場所で繰り返されます</string>
<string name="revanced_sb_segments_filler">無駄な脱線/冗談</string>
<string name="revanced_sb_segments_filler_sum">Tangential シーンは、ビデオの主な内容を理解する必要がないフィラーやユーモアにのみ追加されました。 コンテキストや背景の詳細を提供するセグメントが含まれていません</string>
<string name="revanced_sb_segments_nomusic">音楽: 音楽ではない区間</string>
<string name="revanced_sb_segments_nomusic_sum">ミュージックビデオでのみ使用できます。音楽がないミュージックビデオのセクションでは、別のカテゴリでカバーされていません。</string>
<string name="revanced_sb_segments_nomusic">音楽: 楽曲以外の区間</string>
<string name="revanced_sb_segments_nomusic_sum">ミュージックビデオ専用。ミュージックビデオの中の楽曲以外の区間、公式の音源やミュージックビデオに含まれていない区間</string>
<string name="revanced_sb_skip_button_compact">スキップ</string>
<string name="revanced_sb_skip_button_compact_highlight">強調表示</string>
<string name="revanced_sb_skip_button_compact_highlight">ハイライト</string>
<string name="revanced_sb_skip_button_sponsor">スポンサーをスキップ</string>
<string name="revanced_sb_skip_button_selfpromo">プロモーションをスキップ</string>
<string name="revanced_sb_skip_button_interaction">対話をスキップ</string>
<string name="revanced_sb_skip_button_highlight">スキップ</string>
<string name="revanced_sb_skip_button_highlight">ハイライトまでスキップ</string>
<string name="revanced_sb_skip_button_intro_beginning">イントロをスキップ</string>
<string name="revanced_sb_skip_button_intro_middle">間隔をスキップ</string>
<string name="revanced_sb_skip_button_intro_end">間隔をスキップ</string>
@@ -969,12 +969,12 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
<string name="revanced_sb_skip_button_preview_middle">プレビューをスキップ</string>
<string name="revanced_sb_skip_button_preview_end">要約をスキップ</string>
<string name="revanced_sb_skip_button_filler">フィラーをスキップ</string>
<string name="revanced_sb_skip_button_nomusic">楽以外をスキップ</string>
<string name="revanced_sb_skip_button_nomusic">以外をスキップ</string>
<string name="revanced_sb_skip_button_unsubmitted">セグメントをスキップ</string>
<string name="revanced_sb_skipped_sponsor">スキップしたスポンサー</string>
<string name="revanced_sb_skipped_selfpromo">スキップしたセルフプロモーション</string>
<string name="revanced_sb_skipped_interaction">スキップした迷惑なリマインダー</string>
<string name="revanced_sb_skipped_highlight">ハイライト表示にスキップ</string>
<string name="revanced_sb_skipped_highlight">ハイライトまでスキップしました</string>
<string name="revanced_sb_skipped_intro_beginning">スキップしたイントロ</string>
<string name="revanced_sb_skipped_intro_middle">スキップされた休憩時間</string>
<string name="revanced_sb_skipped_intro_end">スキップされた休憩時間</string>
@@ -983,7 +983,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
<string name="revanced_sb_skipped_preview_middle">スキップしたプレビュー</string>
<string name="revanced_sb_skipped_preview_end">スキップされた要約</string>
<string name="revanced_sb_skipped_filler">つなぎシーンをスキップしました</string>
<string name="revanced_sb_skipped_nomusic">スキップした無音</string>
<string name="revanced_sb_skipped_nomusic">楽曲以外の区間をスキップしまし</string>
<string name="revanced_sb_skipped_unsubmitted">未送信のセグメントをスキップしました</string>
<string name="revanced_sb_skipped_multiple_segments">複数のセグメントをスキップ</string>
<string name="revanced_sb_skip_automatically">自動的にスキップ</string>
@@ -1100,11 +1100,11 @@ Automotive レイアウト
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - ナビゲーション アイコンが旧バージョン</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">起動画面</string>
<string name="revanced_change_start_page_title">スタート画面</string>
<string name="revanced_change_start_page_entry_default">デフォルト</string>
<string name="revanced_change_start_page_entry_all_subscriptions">すべての登録チャンネル</string>
<string name="revanced_change_start_page_entry_browse">チャンネル一覧</string>
<string name="revanced_change_start_page_entry_courses">コース / 学び</string>
<string name="revanced_change_start_page_entry_courses">学び</string>
<string name="revanced_change_start_page_entry_explore">探索</string>
<string name="revanced_change_start_page_entry_fashion">ファッションと美容</string>
<string name="revanced_change_start_page_entry_gaming">ゲーム</string>
@@ -1112,7 +1112,7 @@ Automotive レイアウト
<string name="revanced_change_start_page_entry_library">マイページ</string>
<string name="revanced_change_start_page_entry_liked_videos">高く評価した動画</string>
<string name="revanced_change_start_page_entry_live">ライブ</string>
<string name="revanced_change_start_page_entry_movies">ムービーTV</string>
<string name="revanced_change_start_page_entry_movies">映画とテレビ</string>
<string name="revanced_change_start_page_entry_music">音楽</string>
<string name="revanced_change_start_page_entry_news">ニュース</string>
<string name="revanced_change_start_page_entry_notifications">通知</string>
@@ -1385,8 +1385,8 @@ DeArrow の詳細については、ここをタップしてください"</string
AVC の最大解像度は 1080p であり、Opus オーディオ コーデックは使用できず、動画の再生時に VP9 や AV1 より多くの通信量を使用します。"</string>
<string name="revanced_spoof_video_streams_about_ios_tv_title">iOS クライアントの副作用</string>
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• 映画や有料動画が再生されない場合があります
• 一定音量は使用できません
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• 映画や有料動画が再生されない可能性があります
• 一定音量は用できません
• 動画が 1 秒早く終了します"</string>
<string name="revanced_spoof_video_streams_about_android_title">Android クライアントの副作用</string>
<string name="revanced_spoof_video_streams_about_android_summary">"• 音声トラック メニューが表示されません

View File

@@ -409,8 +409,8 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
</patch>
<patch id="interaction.dialog.removeViewerDiscretionDialogPatch">
<string name="revanced_remove_viewer_discretion_dialog_title">시청 경고 다이얼로그 제거하기</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_on">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다:\n• 연령 제한 동영상\n• 혐오감을 주는 동영상\n• 자살 또는 자해와 관련된 동영상, etc.</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_off">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다:\n• 연령 제한 동영상\n• 혐오감을 주는 동영상\n• 자살 또는 자해와 관련된 동영상, etc.</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_on">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상\n• 일부 사용자에게 부적절한 동영상, etc.</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_off">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상\n• 일부 사용자에게 부적절한 동영상, etc.</string>
<string name="revanced_remove_viewer_discretion_dialog_user_dialog_message">이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다</string>
</patch>
<patch id="interaction.downloads.downloadsResourcePatch">

View File

@@ -455,7 +455,7 @@ Second \"item\" text"</string>
<string name="revanced_swipe_overlay_timeout_summary">覆蓋顯示的毫秒數</string>
<string name="revanced_swipe_overlay_background_opacity_title">滑動覆蓋背景透明度</string>
<string name="revanced_swipe_overlay_background_opacity_summary">不透明度值介於 0 到 100 之間</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast"> 滑動透明度必須介於 0 到 100 之間</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">滑動透明度必須介於 0 到 100 之間</string>
<string name="revanced_swipe_threshold_title">滑動幅度臨界點</string>
<string name="revanced_swipe_threshold_summary">滑動幅度臨界點</string>
<string name="revanced_swipe_show_circular_overlay_title">顯示圓形覆蓋</string>
@@ -1149,6 +1149,7 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_type_entry_4">現代 1</string>
<string name="revanced_miniplayer_type_entry_5">現代 2</string>
<string name="revanced_miniplayer_type_entry_6">現代 3</string>
<string name="revanced_miniplayer_type_entry_7">現代 4</string>
<string name="revanced_miniplayer_rounded_corners_title">啟用圓角</string>
<string name="revanced_miniplayer_rounded_corners_summary_on">已將角落設為圓角</string>
<string name="revanced_miniplayer_rounded_corners_summary_off">已將角落設為方角</string>