diff --git a/CHANGELOG.md b/CHANGELOG.md
index 64c7f0178..a4857ca84 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,53 @@
+# [5.44.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.3...v5.44.0-dev.4) (2025-10-24)
+
+
+### Features
+
+* Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931))
+* **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e))
+
+# [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22)
+
+
+### Features
+
+* **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16))
+
+# [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22)
+
+
+### Bug Fixes
+
+* **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634))
+
+# [5.44.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.3...v5.44.0-dev.1) (2025-10-22)
+
+
+### Features
+
+* **Samsung Radio:** Add `Disable device checks` patch ([#6145](https://github.com/ReVanced/revanced-patches/issues/6145)) ([de97562](https://github.com/ReVanced/revanced-patches/commit/de97562c5ddc8ec707761c1e04e74c4e18f9c158))
+
+## [5.43.2-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.2...v5.43.2-dev.3) (2025-10-19)
+
+
+### Bug Fixes
+
+* **YouTube - Hide layout components:** Hide new kind of community post ([#6146](https://github.com/ReVanced/revanced-patches/issues/6146)) ([cfd244b](https://github.com/ReVanced/revanced-patches/commit/cfd244b4088daacd2788ec38357ac521e4b296d5))
+
+## [5.43.2-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.1...v5.43.2-dev.2) (2025-10-17)
+
+
+### Bug Fixes
+
+* **YouTube Music:** Resolve patching 7.29 target ([2e4c6fd](https://github.com/ReVanced/revanced-patches/commit/2e4c6fdcadeef45a80733e374421d52e5e8af910))
+
+## [5.43.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.43.2-dev.1) (2025-10-16)
+
+
+### Bug Fixes
+
+* **X / Twitter - Change link sharing domain:** Use bytecode patching to resolve patching with Manager ([#6125](https://github.com/ReVanced/revanced-patches/issues/6125)) ([0af8c8a](https://github.com/ReVanced/revanced-patches/commit/0af8c8a766ae4ba6926404d59da2f14d649f91f7))
+
## [5.43.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.0...v5.43.1) (2025-10-15)
diff --git a/extensions/samsung/radio/build.gradle.kts b/extensions/samsung/radio/build.gradle.kts
new file mode 100644
index 000000000..0eadeef26
--- /dev/null
+++ b/extensions/samsung/radio/build.gradle.kts
@@ -0,0 +1,4 @@
+dependencies {
+ compileOnly(project(":extensions:shared:library"))
+ compileOnly(project(":extensions:samsung:radio:stub"))
+}
diff --git a/extensions/samsung/radio/src/main/AndroidManifest.xml b/extensions/samsung/radio/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..9b65eb06c
--- /dev/null
+++ b/extensions/samsung/radio/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java
new file mode 100644
index 000000000..72c5addc4
--- /dev/null
+++ b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java
@@ -0,0 +1,24 @@
+package app.revanced.extension.samsung.radio.misc.fix.crash;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@SuppressWarnings("unused")
+public final class FixCrashPatch {
+ /**
+ * Injection point.
+ *
+ * Add the required permissions to the request list to avoid crashes on API 34+.
+ **/
+ public static final String[] fixPermissionRequestList(String[] perms) {
+ List permsList = new ArrayList<>(Arrays.asList(perms));
+ if (permsList.contains("android.permission.POST_NOTIFICATIONS")) {
+ permsList.addAll(Arrays.asList("android.permission.RECORD_AUDIO", "android.permission.READ_PHONE_STATE", "android.permission.FOREGROUND_SERVICE_MICROPHONE"));
+ }
+ if (permsList.contains("android.permission.RECORD_AUDIO")) {
+ permsList.add("android.permission.FOREGROUND_SERVICE_MICROPHONE");
+ }
+ return permsList.toArray(new String[0]);
+ }
+}
diff --git a/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java
new file mode 100644
index 000000000..19b6c3e82
--- /dev/null
+++ b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java
@@ -0,0 +1,19 @@
+package app.revanced.extension.samsung.radio.restrictions.device;
+
+import android.os.SemSystemProperties;
+
+import java.util.Arrays;
+
+@SuppressWarnings("unused")
+public final class BypassDeviceChecksPatch {
+
+ /**
+ * Injection point.
+ *
+ * Check if the device has the required hardware
+ **/
+ public static final boolean checkIfDeviceIsIncompatible(String[] deviceList) {
+ String currentDevice = SemSystemProperties.getSalesCode();
+ return Arrays.asList(deviceList).contains(currentDevice);
+ }
+}
diff --git a/extensions/samsung/radio/stub/build.gradle.kts b/extensions/samsung/radio/stub/build.gradle.kts
new file mode 100644
index 000000000..b4bee8809
--- /dev/null
+++ b/extensions/samsung/radio/stub/build.gradle.kts
@@ -0,0 +1,17 @@
+plugins {
+ alias(libs.plugins.android.library)
+}
+
+android {
+ namespace = "app.revanced.extension"
+ compileSdk = 34
+
+ defaultConfig {
+ minSdk = 24
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
diff --git a/extensions/samsung/radio/stub/src/main/AndroidManifest.xml b/extensions/samsung/radio/stub/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..15e7c2ae6
--- /dev/null
+++ b/extensions/samsung/radio/stub/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java b/extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java
new file mode 100644
index 000000000..33a4b4400
--- /dev/null
+++ b/extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java
@@ -0,0 +1,7 @@
+package android.os;
+
+public class SemSystemProperties {
+ public static String getSalesCode() {
+ throw new UnsupportedOperationException("Stub");
+ }
+}
\ No newline at end of file
diff --git a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java
index 60b2d5cb5..0be07403b 100644
--- a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java
+++ b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java
@@ -11,6 +11,16 @@ public final class ChangeLinkSharingDomainPatch {
return "";
}
+ // TODO remove this once changeLinkSharingDomainResourcePatch is restored
+ /**
+ * Injection point.
+ */
+ public static String formatResourceLink(Object... formatArgs) {
+ String username = (String) formatArgs[0];
+ String tweetId = (String) formatArgs[1];
+ return String.format(LINK_FORMAT, getShareDomain(), username, tweetId);
+ }
+
/**
* Injection point.
*/
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java
index 9b1aa94dc..c096e17e8 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java
@@ -87,7 +87,8 @@ public final class LayoutComponentsFilter extends Filter {
"post_shelf_slim.e",
"videos_post_responsive_root.e",
"text_post_responsive_root.e",
- "poll_post_responsive_root.e"
+ "poll_post_responsive_root.e",
+ "shared_post_root.e"
);
final var subscribersCommunityGuidelines = new StringFilterGroup(
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java
deleted file mode 100644
index 93d53c9a5..000000000
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package app.revanced.extension.youtube.patches.theme;
-
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import app.revanced.extension.youtube.patches.HideSeekbarPatch;
-import app.revanced.extension.youtube.settings.Settings;
-
-/**
- * Used by {@link SeekbarColorPatch} change the color of the seekbar.
- * and {@link HideSeekbarPatch} to hide the seekbar of the feed and watch history.
- */
-@SuppressWarnings("unused")
-public class ProgressBarDrawable extends Drawable {
-
- private final Paint paint = new Paint();
- {
- paint.setColor(SeekbarColorPatch.getSeekbarColor());
- }
-
- @Override
- public void draw(@NonNull Canvas canvas) {
- if (Settings.HIDE_SEEKBAR_THUMBNAIL.get()) {
- return;
- }
-
- canvas.drawRect(getBounds(), paint);
- }
-
- @Override
- public void setAlpha(int alpha) {
- paint.setAlpha(alpha);
- }
-
- @Override
- public void setColorFilter(@Nullable ColorFilter colorFilter) {
- paint.setColorFilter(colorFilter);
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
-}
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java
index 72b74fc94..270576700 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java
@@ -4,9 +4,7 @@ import static app.revanced.extension.shared.StringRef.str;
import static app.revanced.extension.shared.Utils.clamp;
import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle;
-import android.content.res.Resources;
import android.graphics.Color;
-import android.graphics.drawable.AnimatedVectorDrawable;
import com.airbnb.lottie.LottieAnimationView;
@@ -15,7 +13,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
-import java.util.Locale;
import java.util.Scanner;
import app.revanced.extension.shared.Logger;
@@ -104,27 +101,6 @@ public final class SeekbarColorPatch {
return customSeekbarColor;
}
- private static int colorChannelTo3Bits(int channel8Bits) {
- final float channel3Bits = channel8Bits * 7 / 255f;
-
- // If a color channel is near zero, then allow rounding up so values between
- // 0x12 and 0x23 will show as 0x24. But always round down when the channel is
- // near full saturation, otherwise rounding to nearest will cause all values
- // between 0xEC and 0xFE to always show as full saturation (0xFF).
- return channel3Bits < 6
- ? Math.round(channel3Bits)
- : (int) channel3Bits;
- }
-
- @SuppressWarnings("SameParameterValue")
- private static String get9BitStyleIdentifier(int color24Bit) {
- final int r3 = colorChannelTo3Bits(Color.red(color24Bit));
- final int g3 = colorChannelTo3Bits(Color.green(color24Bit));
- final int b3 = colorChannelTo3Bits(Color.blue(color24Bit));
-
- return String.format(Locale.US, "splash_seekbar_color_style_%d_%d_%d", r3, g3, b3);
- }
-
/**
* injection point.
*/
@@ -135,36 +111,6 @@ public final class SeekbarColorPatch {
return original; // false = drawable style, true = lottie style.
}
- /**
- * Injection point.
- * Old drawable style launch screen.
- */
- public static void setSplashAnimationDrawableTheme(AnimatedVectorDrawable vectorDrawable) {
- // Alternatively a ColorMatrixColorFilter can be used to change the color of the drawable
- // without using any styles, but a color filter cannot selectively change the seekbar
- // while keeping the red YT logo untouched.
- // Even if the seekbar color xml value is changed to a completely different color (such as green),
- // a color filter still cannot be selectively applied when the drawable has more than 1 color.
- try {
- // Must set the color even if custom seekbar is off,
- // because the xml color was replaced with a themed value.
- String seekbarStyle = get9BitStyleIdentifier(customSeekbarColor);
- Logger.printDebug(() -> "Using splash seekbar style: " + seekbarStyle);
-
- final int styleIdentifierDefault = Utils.getResourceIdentifierOrThrow(
- seekbarStyle,
- "style"
- );
-
- Resources.Theme theme = Utils.getContext().getResources().newTheme();
- theme.applyStyle(styleIdentifierDefault, true);
-
- vectorDrawable.applyTheme(theme);
- } catch (Exception ex) {
- Logger.printException(() -> "setSplashAnimationDrawableTheme failure", ex);
- }
- }
-
/**
* Injection point.
* Modern Lottie style animation.
diff --git a/gradle.properties b/gradle.properties
index f53b377e9..0c351eeb4 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
-version = 5.43.1
+version = 5.44.0-dev.4
diff --git a/patches/api/patches.api b/patches/api/patches.api
index dfc890bf2..1341b5ff8 100644
--- a/patches/api/patches.api
+++ b/patches/api/patches.api
@@ -184,6 +184,10 @@ public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatchKt {
public static final fun getEnableDebugMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
+public final class app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatchKt {
+ public static final fun getSkipEnergyRechargeAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
public final class app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatchKt {
public static final fun getHideSponsoredStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -481,7 +485,9 @@ public final class app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatc
public final class app/revanced/patches/music/playservice/VersionCheckPatchKt {
public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
+ public static final fun is_7_16_or_greater ()Z
public static final fun is_7_33_or_greater ()Z
+ public static final fun is_8_05_or_greater ()Z
public static final fun is_8_10_or_greater ()Z
public static final fun is_8_11_or_greater ()Z
public static final fun is_8_15_or_greater ()Z
@@ -762,6 +768,14 @@ public final class app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQuer
public static final fun getSanitizeUrlQueryPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
+public final class app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatchKt {
+ public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
+public final class app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatchKt {
+ public static final fun getBypassDeviceChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
public final class app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatchKt {
public static final fun getRootDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt
new file mode 100644
index 000000000..009758977
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt
@@ -0,0 +1,182 @@
+package app.revanced.patches.all.misc.customcertificates
+
+import app.revanced.patcher.patch.PatchException
+import app.revanced.patcher.patch.booleanOption
+import app.revanced.patcher.patch.resourcePatch
+import app.revanced.patcher.patch.stringsOption
+import app.revanced.util.Utils.trimIndentMultiline
+import app.revanced.util.getNode
+import org.w3c.dom.Element
+import java.io.File
+
+
+
+
+val customNetworkSecurityPatch = resourcePatch(
+ name = "Custom network security",
+ description = "Allows trusting custom certificate authorities for a specific domain.",
+ use = false
+) {
+
+ val targetDomains by stringsOption(
+ key = "targetDomains",
+ title = "Target domains",
+ description = "List of domains to which the custom trust configuration will be applied (one domain per entry).",
+ default = listOf("example.com"),
+ required = true
+ )
+
+ val includeSubdomains by booleanOption(
+ key = "includeSubdomains",
+ title = "Include subdomains",
+ description = "Applies the configuration to all subdomains of the target domains.",
+ default = false,
+ required = true
+ )
+
+ val customCAFilePaths by stringsOption(
+ key = "customCAFilePaths",
+ title = "Custom CA file paths",
+ description = """
+ List of paths to files in PEM or DER format (one file path per entry).
+
+ Makes an app trust the provided custom certificate authorities (CAs),
+ for the specified domains, and if the option "Include Subdomains" is enabled then also the subdomains.
+
+
+ CA files will be bundled in res/raw/ of resulting APK
+ """.trimIndentMultiline(),
+ default = null,
+ required = false
+ )
+
+ val allowUserCerts by booleanOption(
+ key = "allowUserCerts",
+ title = "Trust user added CAs",
+ description = "Makes an app trust certificates from the Android user store for the specified domains, and if the option \"Include Subdomains\" is enabled then also the subdomains.",
+
+ default = false,
+ required = true
+ )
+
+ val allowSystemCerts by booleanOption(
+ key = "allowSystemCerts",
+ title = "Trust system CAs",
+ description = "Makes an app trust certificates from the Android system store for the specified domains, and and if the option \"Include Subdomains\" is enabled then also the subdomains.",
+
+ default = true,
+ required = true
+ )
+
+ val allowCleartextTraffic by booleanOption(
+ key = "allowCleartextTraffic",
+ title = "Allow cleartext traffic (HTTP)",
+ description = "Allows unencrypted HTTP traffic for the specified domains, and if \"Include Subdomains\" is enabled then also the subdomains.",
+
+ default = false,
+ required = true
+ )
+
+ val overridePins by booleanOption(
+ key = "overridePins",
+ title = "Override certificate pinning",
+ description = "Overrides certificate pinning for the specified domains and their subdomains if the option \"Include Subdomains\" is enabled to allow inspecting app traffic via a proxy.",
+
+ default = false,
+ required = true
+ )
+
+ fun generateNetworkSecurityConfig(): String {
+ val targetDomains = targetDomains ?: emptyList()
+ val includeSubdomains = includeSubdomains ?: false
+ val customCAFilePaths = customCAFilePaths ?: emptyList()
+ val allowUserCerts = allowUserCerts ?: false
+ val allowSystemCerts = allowSystemCerts ?: true
+ val allowCleartextTraffic = allowCleartextTraffic ?: false
+ val overridePins = overridePins ?: false
+
+ val domainsXML = buildString {
+ targetDomains.forEach {
+ appendLine(""" $it""")
+ }
+ }.trimEnd()
+
+ val trustAnchorsXML = buildString {
+ if (allowSystemCerts) {
+ appendLine(""" """)
+ }
+ if (allowUserCerts) {
+ appendLine(""" """)
+ }
+ customCAFilePaths.forEach { path ->
+ val fileName = path.substringAfterLast('/').substringBeforeLast('.')
+ appendLine(""" """)
+ }
+ }
+
+ if (trustAnchorsXML.isBlank()) {
+ throw PatchException("At least one trust anchor (System, User, or Custom CA) must be enabled.")
+ }
+
+ return """
+
+
+
+$domainsXML
+
+${trustAnchorsXML.trimEnd()}
+
+
+
+ """.trimIndent()
+ }
+
+
+ execute {
+ val nscFileNameBare = "network_security_config"
+ val resXmlDir = "res/xml"
+ val resRawDir = "res/raw"
+ val nscFileNameWithSuffix = "$nscFileNameBare.xml"
+
+
+ document("AndroidManifest.xml").use { document ->
+ val applicationNode = document.getNode("application") as Element
+ applicationNode.setAttribute("android:networkSecurityConfig", "@xml/$nscFileNameBare")
+ }
+
+
+ File(get(resXmlDir), nscFileNameWithSuffix).apply {
+ writeText(generateNetworkSecurityConfig())
+ }
+
+
+
+ for (customCAFilePath in customCAFilePaths ?: emptyList()) {
+ val file = File(customCAFilePath)
+ if (!file.exists()) {
+ throw PatchException(
+ "The custom CA file path cannot be found: " +
+ file.absolutePath
+ )
+ }
+
+ if (!file.isFile) {
+ throw PatchException(
+ "The custom CA file path must be a file: "
+ + file.absolutePath
+ )
+ }
+ val caFileNameWithoutSuffix = customCAFilePath.substringAfterLast('/').substringBefore('.')
+ val caFile = File(customCAFilePath)
+ File(
+ get(resRawDir),
+ caFileNameWithoutSuffix
+ ).writeText(
+ caFile.readText()
+ )
+
+ }
+
+
+ }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt
index 833f9dd7d..a507352e8 100644
--- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt
@@ -1,26 +1,35 @@
package app.revanced.patches.duolingo.debug
-import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
-import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
+import app.revanced.util.returnEarly
+import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val enableDebugMenuPatch = bytecodePatch(
name = "Enable debug menu",
- use = false,
+ use = false
) {
- compatibleWith("com.duolingo"("5.158.4"))
+ compatibleWith("com.duolingo")
execute {
- initializeBuildConfigProviderFingerprint.method.apply {
- val insertIndex = initializeBuildConfigProviderFingerprint.patternMatch!!.startIndex
- val register = getInstruction(insertIndex).registerA
+ // It seems all categories are allowed on release. Force this on anyway.
+ debugCategoryAllowOnReleaseBuildsFingerprint.method.returnEarly(true)
- addInstructions(
- insertIndex,
- "const/4 v$register, 0x1",
- )
+ // Change build config debug build flag.
+ buildConfigProviderConstructorFingerprint.match(
+ buildConfigProviderToStringFingerprint.classDef
+ ).let {
+ val index = it.patternMatch!!.startIndex
+
+ it.method.apply {
+ val register = getInstruction(index).registerA
+ addInstruction(
+ index + 1,
+ "const/4 v$register, 0x1"
+ )
+ }
}
}
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt
index 543e40b43..c3d663c83 100644
--- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt
@@ -4,16 +4,25 @@ import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
-/**
- * The `BuildConfigProvider` class has two booleans:
- *
- * - `isChina`: (usually) compares "play" with "china"...except for builds in China
- * - `isDebug`: compares "release" with "debug" <-- we want to force this to `true`
- */
-
-internal val initializeBuildConfigProviderFingerprint = fingerprint {
- accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
- returns("V")
- opcodes(Opcode.IPUT_BOOLEAN)
- strings("debug", "release", "china")
+internal val debugCategoryAllowOnReleaseBuildsFingerprint = fingerprint {
+ returns("Z")
+ parameters()
+ custom { method, classDef ->
+ method.name == "getAllowOnReleaseBuilds" && classDef.type == "Lcom/duolingo/debug/DebugCategory;"
+ }
+}
+
+internal val buildConfigProviderConstructorFingerprint = fingerprint {
+ accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
+ parameters()
+ opcodes(Opcode.CONST_4)
+}
+
+internal val buildConfigProviderToStringFingerprint = fingerprint {
+ parameters()
+ returns("Ljava/lang/String;")
+ strings("BuildConfigProvider(") // Partial string match.
+ custom { method, _ ->
+ method.name == "toString"
+ }
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt
new file mode 100644
index 000000000..73dbcf304
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt
@@ -0,0 +1,21 @@
+package app.revanced.patches.duolingo.energy
+
+import app.revanced.patcher.fingerprint
+import com.android.tools.smali.dexlib2.AccessFlags
+import com.android.tools.smali.dexlib2.Opcode
+
+/**
+ * Matches the class found in [energyConfigToStringFingerprint].
+ */
+internal val initializeEnergyConfigFingerprint = fingerprint {
+ accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
+ opcodes(Opcode.RETURN_VOID)
+}
+
+// Class name currently is not obfuscated but it may be in the future.
+internal val energyConfigToStringFingerprint = fingerprint {
+ parameters()
+ returns("Ljava/lang/String;")
+ strings("EnergyConfig(", "maxEnergy=") // Partial string matches.
+ custom { method, _ -> method.name == "toString" }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt
new file mode 100644
index 000000000..bec800f50
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt
@@ -0,0 +1,31 @@
+package app.revanced.patches.duolingo.energy
+
+import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
+import app.revanced.patcher.patch.bytecodePatch
+import app.revanced.util.findFieldFromToString
+
+@Suppress("unused")
+val skipEnergyRechargeAdsPatch = bytecodePatch(
+ name = "Skip energy recharge ads",
+ description = "Skips watching ads to recharge energy."
+) {
+ compatibleWith("com.duolingo")
+
+ execute {
+ initializeEnergyConfigFingerprint
+ .match(energyConfigToStringFingerprint.classDef)
+ .method.apply {
+ val energyField = energyConfigToStringFingerprint.method
+ .findFieldFromToString("energy=")
+ val insertIndex = initializeEnergyConfigFingerprint.patternMatch!!.startIndex
+
+ addInstructions(
+ insertIndex,
+ """
+ const/16 v0, 99
+ iput v0, p0, $energyField
+ """
+ )
+ }
+ }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt
index 4c0be2b77..db6158d27 100644
--- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt
@@ -47,6 +47,7 @@ val spoofFeaturesPatch = bytecodePatch(
"com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2024_EXPERIENCE",
"com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE",
+ "com.google.android.feature.PIXEL_2025_EXPERIENCE",
),
title = "Features to disable",
description = "Google Pixel exclusive features to disable." +
diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt
index 93c294480..e4268330d 100644
--- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt
@@ -6,6 +6,7 @@ import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint
import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.music.misc.settings.settingsPatch
+import app.revanced.patches.music.playservice.is_7_16_or_greater
import app.revanced.patches.music.playservice.is_7_33_or_greater
import app.revanced.patches.music.playservice.is_8_11_or_greater
import app.revanced.patches.music.playservice.is_8_15_or_greater
@@ -18,7 +19,7 @@ import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch
val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
extensionClassDescriptor = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;",
mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint,
- fixMediaFetchHotConfig = { true },
+ fixMediaFetchHotConfig = { is_7_16_or_greater },
fixMediaFetchHotConfigAlternative = { is_8_11_or_greater && !is_8_15_or_greater },
fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater },
diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt
index f5f170d54..09be85c56 100644
--- a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt
@@ -3,14 +3,11 @@ package app.revanced.patches.music.misc.tracks
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.music.playservice.is_8_10_or_greater
+import app.revanced.patches.music.playservice.is_8_05_or_greater
import app.revanced.patches.music.playservice.versionCheckPatch
import app.revanced.patches.music.shared.mainActivityOnCreateFingerprint
import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch
-private const val EXTENSION_CLASS_DESCRIPTOR =
- "Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;"
-
@Suppress("unused")
val forceOriginalAudioPatch = forceOriginalAudioPatch(
block = {
@@ -27,8 +24,8 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch(
)
)
},
- fixUseLocalizedAudioTrackFlag = { is_8_10_or_greater },
+ fixUseLocalizedAudioTrackFlag = { is_8_05_or_greater },
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
- subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR,
+ subclassExtensionClassDescriptor = "Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;",
preferenceScreen = PreferenceScreen.MISC,
)
diff --git a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt
index d923c954f..d8f1fd709 100644
--- a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt
@@ -8,8 +8,12 @@ import kotlin.properties.Delegates
// Use notNull delegate so an exception is thrown if these fields are accessed before they are set.
+var is_7_16_or_greater: Boolean by Delegates.notNull()
+ private set
var is_7_33_or_greater: Boolean by Delegates.notNull()
private set
+var is_8_05_or_greater: Boolean by Delegates.notNull()
+ private set
var is_8_10_or_greater: Boolean by Delegates.notNull()
private set
var is_8_11_or_greater: Boolean by Delegates.notNull()
@@ -26,8 +30,10 @@ val versionCheckPatch = resourcePatch(
val playStoreServicesVersion = findPlayStoreServicesVersion()
// All bug fix releases always seem to use the same play store version as the minor version.
+ is_7_16_or_greater = 243499000 <= playStoreServicesVersion
is_7_33_or_greater = 245199000 <= playStoreServicesVersion
- is_8_10_or_greater = 244799000 <= playStoreServicesVersion
+ is_8_05_or_greater = 250599000 <= playStoreServicesVersion
+ is_8_10_or_greater = 251099000 <= playStoreServicesVersion
is_8_11_or_greater = 251199000 <= playStoreServicesVersion
is_8_15_or_greater = 251530000 <= playStoreServicesVersion
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt
new file mode 100644
index 000000000..35641f2e7
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt
@@ -0,0 +1,34 @@
+package app.revanced.patches.samsung.radio.misc.fix.crash
+
+import app.revanced.patcher.patch.resourcePatch
+import app.revanced.util.asSequence
+import org.w3c.dom.Element
+
+@Suppress("unused")
+internal val addManifestPermissionsPatch = resourcePatch {
+
+ val requiredPermissions = listOf(
+ "android.permission.READ_PHONE_STATE",
+ "android.permission.FOREGROUND_SERVICE_MICROPHONE",
+ "android.permission.RECORD_AUDIO",
+ )
+
+ execute {
+ document("AndroidManifest.xml").use { document ->
+ document.getElementsByTagName("manifest").item(0).let { manifestEl ->
+
+ // Check which permissions are missing
+ val existingPermissionNames = document.getElementsByTagName("uses-permission").asSequence()
+ .mapNotNull { (it as? Element)?.getAttribute("android:name") }.toSet()
+ val missingPermissions = requiredPermissions.filterNot { it in existingPermissionNames }
+
+ // Then add them
+ for (permission in missingPermissions) {
+ val element = document.createElement("uses-permission")
+ element.setAttribute("android:name", permission)
+ manifestEl.appendChild(element)
+ }
+ }
+ }
+ }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt
new file mode 100644
index 000000000..f842a45cc
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt
@@ -0,0 +1,18 @@
+@file:Suppress("unused")
+
+package app.revanced.patches.samsung.radio.misc.fix.crash
+
+import app.revanced.patcher.fingerprint
+import app.revanced.patches.all.misc.transformation.IMethodCall
+import app.revanced.patches.all.misc.transformation.fromMethodReference
+import app.revanced.util.getReference
+import com.android.tools.smali.dexlib2.iface.reference.MethodReference
+
+internal val permissionRequestListFingerprint = fingerprint {
+ strings(
+ "android.permission.POST_NOTIFICATIONS",
+ "android.permission.READ_MEDIA_AUDIO",
+ "android.permission.RECORD_AUDIO"
+ )
+ custom { method, _ -> method.name == "" }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt
new file mode 100644
index 000000000..a076ca830
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt
@@ -0,0 +1,42 @@
+@file:Suppress("unused")
+
+package app.revanced.patches.samsung.radio.misc.fix.crash
+
+import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
+import app.revanced.patcher.patch.bytecodePatch
+import app.revanced.patches.samsung.radio.restrictions.device.bypassDeviceChecksPatch
+import app.revanced.util.findInstructionIndicesReversedOrThrow
+import app.revanced.util.indexOfFirstInstruction
+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/samsung/radio/misc/fix/crash/FixCrashPatch;"
+
+val fixCrashPatch = bytecodePatch(
+ name = "Fix crashes", description = "Prevents the app from crashing because of missing system permissions."
+) {
+ dependsOn(addManifestPermissionsPatch, bypassDeviceChecksPatch)
+ extendWith("extensions/samsung/radio.rve")
+ compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11"))
+
+ execute {
+ permissionRequestListFingerprint.method.apply {
+ findInstructionIndicesReversedOrThrow(Opcode.FILLED_NEW_ARRAY).forEach { filledNewArrayIndex ->
+ val moveResultIndex = indexOfFirstInstruction(filledNewArrayIndex, Opcode.MOVE_RESULT_OBJECT)
+ if (moveResultIndex < 0) return@forEach // No move-result-object found after the filled-new-array
+
+ // Get the register where the array is saved
+ val arrayRegister = getInstruction(moveResultIndex).registerA
+
+ // Invoke the method from the extension
+ addInstructions(
+ moveResultIndex + 1, """
+ invoke-static { v$arrayRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->fixPermissionRequestList([Ljava/lang/String;)[Ljava/lang/String;
+ move-result-object v$arrayRegister
+ """
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt
new file mode 100644
index 000000000..68ef9a801
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt
@@ -0,0 +1,55 @@
+package app.revanced.patches.samsung.radio.restrictions.device
+
+import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
+import app.revanced.patcher.patch.bytecodePatch
+import app.revanced.util.findFreeRegister
+import app.revanced.util.getReference
+import app.revanced.util.indexOfFirstInstructionOrThrow
+import com.android.tools.smali.dexlib2.Opcode
+import com.android.tools.smali.dexlib2.iface.reference.StringReference
+
+private const val EXTENSION_CLASS_DESCRIPTOR =
+ "Lapp/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch;"
+
+@Suppress("unused")
+val bypassDeviceChecksPatch = bytecodePatch(
+ name = "Bypass device checks",
+ description = "Removes firmware and region blacklisting. " +
+ "This patch will still not allow the app to run on devices that do not have the required hardware.",
+) {
+ extendWith("extensions/samsung/radio.rve")
+ compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11"))
+
+ execute {
+ // Return false = The device is not blacklisted
+ checkDeviceFingerprint.method.apply {
+ // Find the first string that start with "SM-", that's the list of incompatible devices
+ val firstStringIndex = indexOfFirstInstructionOrThrow {
+ opcode == Opcode.CONST_STRING &&
+ getReference()?.string?.startsWith("SM-") == true
+ }
+
+ // Find the following filled-new-array (or filled-new-array/range) instruction
+ val filledNewArrayIndex = indexOfFirstInstructionOrThrow(firstStringIndex + 1) {
+ opcode == Opcode.FILLED_NEW_ARRAY || opcode == Opcode.FILLED_NEW_ARRAY_RANGE
+ }
+
+ // Find an available register for our use
+ val resultRegister = findFreeRegister(filledNewArrayIndex + 1)
+
+ // Store the array there and invoke the method that we added to the class earlier
+ addInstructions(
+ filledNewArrayIndex + 1, """
+ move-result-object v$resultRegister
+ invoke-static { v$resultRegister }, $EXTENSION_CLASS_DESCRIPTOR->checkIfDeviceIsIncompatible([Ljava/lang/String;)Z
+ move-result v$resultRegister
+ return v$resultRegister
+ """
+ )
+
+ // Remove the instructions before our strings
+ removeInstructions(0, firstStringIndex)
+ }
+ }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt
new file mode 100644
index 000000000..476823591
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt
@@ -0,0 +1,61 @@
+package app.revanced.patches.samsung.radio.restrictions.device
+
+import app.revanced.patcher.fingerprint
+import app.revanced.patches.all.misc.transformation.IMethodCall
+import app.revanced.patches.all.misc.transformation.fromMethodReference
+import app.revanced.util.getReference
+import com.android.tools.smali.dexlib2.iface.reference.MethodReference
+
+internal val checkDeviceFingerprint = fingerprint {
+ returns("Z")
+ custom { method, _ ->
+ /* Check for methods call to:
+ - Landroid/os/SemSystemProperties;->getSalesCode()Ljava/lang/String;
+ - Landroid/os/SemSystemProperties;->getCountryIso()Ljava/lang/String;
+ */
+
+ val impl = method.implementation ?: return@custom false
+
+ // Track which target methods we've found
+ val foundMethods = mutableSetOf()
+
+ // Scan method instructions for calls to our target methods
+ for (instr in impl.instructions) {
+ val ref = instr.getReference() ?: continue
+ val mc = fromMethodReference(ref) ?: continue
+
+ if (mc == MethodCall.GetSalesCode || mc == MethodCall.GetCountryIso) {
+ foundMethods.add(mc)
+
+ // If we found both methods, return success
+ if (foundMethods.size == 2) {
+ return@custom true
+ }
+ }
+ }
+
+ // Only match if both methods are present
+ return@custom false
+ }
+}
+
+// Information about method calls we want to replace
+private enum class MethodCall(
+ override val definedClassName: String,
+ override val methodName: String,
+ override val methodParams: Array,
+ override val returnType: String,
+) : IMethodCall {
+ GetSalesCode(
+ "Landroid/os/SemSystemProperties;",
+ "getSalesCode",
+ arrayOf(),
+ "Ljava/lang/String;",
+ ),
+ GetCountryIso(
+ "Landroid/os/SemSystemProperties;",
+ "getCountryIso",
+ arrayOf(),
+ "Ljava/lang/String;",
+ ),
+}
\ No newline at end of file
diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt
index 78cf1f284..6d6b0b662 100644
--- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt
@@ -1,7 +1,7 @@
package app.revanced.patches.shared.misc.audio
import app.revanced.patcher.fingerprint
-import app.revanced.util.containsLiteralInstruction
+import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags
internal val formatStreamModelToStringFingerprint = fingerprint {
@@ -20,10 +20,7 @@ internal val formatStreamModelToStringFingerprint = fingerprint {
internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L
internal val selectAudioStreamFingerprint = fingerprint {
- accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
- returns("L")
- custom { method, _ ->
- method.parameters.size > 2 // Method has a large number of parameters and may change.
- && method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG)
+ literal {
+ AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG
}
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt
index 465ce8030..010a7143e 100644
--- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt
@@ -34,7 +34,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
internal fun forceOriginalAudioPatch(
block: BytecodePatchBuilder.() -> Unit = {},
executeBlock: BytecodePatchContext.() -> Unit = {},
- fixUseLocalizedAudioTrackFlag: () -> Boolean,
+ fixUseLocalizedAudioTrackFlag: BytecodePatchContext.() -> Boolean,
mainActivityOnCreateFingerprint: Fingerprint,
subclassExtensionClassDescriptor: String,
preferenceScreen: BasePreferenceScreen.Screen
diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt
index 57120d70b..e69a44965 100644
--- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt
@@ -1,14 +1,17 @@
package app.revanced.patches.twitter.misc.links
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.patch.bytecodePatch
-import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN
import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN
import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch
-import app.revanced.util.findElementByAttributeValueOrThrow
+import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.returnEarly
+import com.android.tools.smali.dexlib2.Opcode
+import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import java.net.InetAddress
import java.net.UnknownHostException
import java.util.logging.Logger
@@ -40,6 +43,8 @@ internal val domainNameOption = stringOption(
true
}
+// TODO restore this once Manager uses a fixed version of Patcher
+/*
internal val changeLinkSharingDomainResourcePatch = resourcePatch {
execute {
val domainName = domainNameOption.value!!
@@ -54,15 +59,15 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch {
}
}
}
+*/
@Suppress("unused")
val changeLinkSharingDomainPatch = bytecodePatch(
name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN,
- description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN,
+ description = "$PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN Including this patch can prevent making posts that quote other posts.",
use = false
) {
dependsOn(
- changeLinkSharingDomainResourcePatch,
sharedExtensionPatch,
)
@@ -88,5 +93,22 @@ val changeLinkSharingDomainPatch = bytecodePatch(
return-object p0
"""
)
+
+ // TODO remove this once changeLinkSharingDomainResourcePatch is restored
+ // Replace the domain name in the "Share via..." dialog.
+ linkResourceGetterFingerprint.method.apply {
+ val templateIdConstIndex = indexOfFirstInstructionOrThrow(Opcode.CONST)
+
+ // Format the link with the new domain name register (1 instruction below the const).
+ val formatLinkCallIndex = templateIdConstIndex + 1
+ val register = getInstruction(formatLinkCallIndex).registerE
+
+ // Replace the original method call with the new method call.
+ replaceInstruction(
+ formatLinkCallIndex,
+ "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->" +
+ "formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;",
+ )
+ }
}
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt
index 9dbd7aeb1..6117798eb 100644
--- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt
@@ -1,6 +1,7 @@
package app.revanced.patches.twitter.misc.links
import app.revanced.patcher.fingerprint
+import com.android.tools.smali.dexlib2.AccessFlags
internal val openLinkFingerprint = fingerprint {
returns("V")
@@ -17,6 +18,18 @@ internal val linkBuilderFingerprint = fingerprint {
strings("/%1\$s/status/%2\$d")
}
+// TODO remove this once changeLinkSharingDomainResourcePatch is restored
+// Returns a shareable link for the "Share via..." dialog.
+internal val linkResourceGetterFingerprint = fingerprint {
+ accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
+ parameters("Landroid/content/res/Resources;")
+ custom { _, classDef ->
+ classDef.fields.any { field ->
+ field.type.startsWith("Lcom/twitter/model/core/")
+ }
+ }
+}
+
internal val linkSharingDomainHelperFingerprint = fingerprint {
custom { method, classDef ->
method.name == "getShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt
index f89175c8f..f7332f5c3 100644
--- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt
@@ -1,11 +1,9 @@
package app.revanced.patches.youtube.layout.seekbar
import app.revanced.patcher.Fingerprint
-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.patch.PatchException
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
@@ -17,17 +15,13 @@ import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.mapping.resourceMappings
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
-import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
-import app.revanced.util.copyXmlNode
-import app.revanced.util.findElementByAttributeValueOrThrow
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
-import app.revanced.util.inputStreamFromBundledResource
import app.revanced.util.insertLiteralOverride
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
@@ -38,9 +32,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
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
-import org.w3c.dom.Element
-import java.io.ByteArrayInputStream
-import kotlin.use
internal var reelTimeBarPlayedColorId = -1L
private set
@@ -57,8 +48,6 @@ internal var ytTextSecondaryId = -1L
internal var inlineTimeBarLiveSeekableRangeId = -1L
private set
-internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
-
private val seekbarColorResourcePatch = resourcePatch {
dependsOn(
settingsPatch,
@@ -92,21 +81,6 @@ private val seekbarColorResourcePatch = resourcePatch {
"inline_time_bar_live_seekable_range"
]
- // Modify the resume playback drawable and replace the progress bar with a custom drawable.
- document("res/drawable/resume_playback_progressbar_drawable.xml").use { document ->
- val layerList = document.getElementsByTagName("layer-list").item(0) as Element
- val progressNode = layerList.getElementsByTagName("item").item(1) as Element
- if (!progressNode.getAttributeNode("android:id").value.endsWith("progress")) {
- throw PatchException("Could not find progress bar")
- }
- val scaleNode = progressNode.getElementsByTagName("scale").item(0) as Element
- val shapeNode = scaleNode.getElementsByTagName("shape").item(0) as Element
- val replacementNode = document.createElement(
- "app.revanced.extension.youtube.patches.theme.ProgressBarDrawable",
- )
- scaleNode.replaceChild(replacementNode, shapeNode)
- }
-
ytYoutubeMagentaColorId = resourceMappings[
"color",
"yt_youtube_magenta",
@@ -115,99 +89,9 @@ private val seekbarColorResourcePatch = resourcePatch {
"attr",
"ytStaticBrandRed",
]
-
- // Add attribute and styles for splash screen custom color.
- // Using a style is the only way to selectively change just the seekbar fill color.
- //
- // Because the style colors must be hard coded for all color possibilities,
- // instead of allowing 24 bit color the style is restricted to 9-bit (3 bits per color channel)
- // and the style color closest to the users custom color is used for the splash screen.
- arrayOf(
- inputStreamFromBundledResource("seekbar/values", "attrs.xml")!! to "res/values/attrs.xml",
- ByteArrayInputStream(create9BitSeekbarColorStyles().toByteArray()) to "res/values/styles.xml"
- ).forEach { (source, destination) ->
- "resources".copyXmlNode(
- document(source),
- document(destination),
- ).close()
- }
-
- fun setSplashDrawablePathFillColor(xmlFileNames: Iterable, vararg resourceNames: String) {
- xmlFileNames.forEach { xmlFileName ->
- document(xmlFileName).use { document ->
- val childNodes = document.childNodes
-
- resourceNames.forEach { elementId ->
- val element = childNodes.findElementByAttributeValueOrThrow(
- "android:name",
- elementId
- )
-
- val attribute = "android:fillColor"
- if (!element.hasAttribute(attribute)) {
- throw PatchException("Could not find $attribute for $elementId")
- }
-
- element.setAttribute(attribute, "?attr/$splashSeekbarColorAttributeName")
- }
- }
- }
- }
-
- setSplashDrawablePathFillColor(
- listOf(
- "res/drawable/\$startup_animation_light__0.xml",
- "res/drawable/\$startup_animation_dark__0.xml"
- ),
- "_R_G_L_10_G_D_0_P_0"
- )
-
- if (!is_19_46_or_greater) {
- // Resources removed in 19.46+
- setSplashDrawablePathFillColor(
- listOf(
- "res/drawable/\$buenos_aires_animation_light__0.xml",
- "res/drawable/\$buenos_aires_animation_dark__0.xml"
- ),
- "_R_G_L_8_G_D_0_P_0"
- )
- }
}
}
-/**
- * Generate a style xml with all combinations of 9-bit colors.
- */
-private fun create9BitSeekbarColorStyles(): String = StringBuilder().apply {
- append("")
- append("\n")
-
- for (red in 0..7) {
- for (green in 0..7) {
- for (blue in 0..7) {
- val name = "${red}_${green}_${blue}"
-
- fun roundTo3BitHex(channel8Bits: Int) =
- (channel8Bits * 255 / 7).toString(16).padStart(2, '0')
- val r = roundTo3BitHex(red)
- val g = roundTo3BitHex(green)
- val b = roundTo3BitHex(blue)
- val color = "#ff$r$g$b"
-
- append(
- """
-
- """
- )
- }
- }
- }
-
- append("")
-}.toString()
-
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/theme/SeekbarColorPatch;"
val seekbarColorPatch = bytecodePatch(
@@ -344,21 +228,6 @@ val seekbarColorPatch = bytecodePatch(
// Hook the splash animation to set the a seekbar color.
mainActivityOnCreateFingerprint.method.apply {
- val drawableIndex = indexOfFirstInstructionOrThrow {
- val reference = getReference()
- reference?.definingClass == "Landroid/widget/ImageView;"
- && reference.name == "getDrawable"
- }
- val checkCastIndex = indexOfFirstInstructionOrThrow(drawableIndex, Opcode.CHECK_CAST)
- val drawableRegister = getInstruction(checkCastIndex).registerA
-
- addInstruction(
- checkCastIndex + 1,
- "invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" +
- "setSplashAnimationDrawableTheme(Landroid/graphics/drawable/AnimatedVectorDrawable;)V"
- )
-
- // Replace the Lottie animation view setAnimation(int) call.
val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name
findInstructionIndicesReversedOrThrow {
@@ -371,13 +240,11 @@ val seekbarColorPatch = bytecodePatch(
replaceInstruction(
index,
"invoke-static { v${instruction.registerC}, v${instruction.registerD} }, " +
- "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie" +
- "(Lcom/airbnb/lottie/LottieAnimationView;I)V"
+ "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie(Lcom/airbnb/lottie/LottieAnimationView;I)V"
)
}
}
-
// Add non obfuscated method aliases for `setAnimation(int)`
// and `setAnimation(InputStream, String)` so extension code can call them.
lottieAnimationViewSetAnimationIntFingerprint.classDef.methods.apply {
diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt
index 390fe6c4a..ea1fed89b 100644
--- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt
@@ -8,9 +8,6 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
-private const val EXTENSION_CLASS_DESCRIPTOR =
- "Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;"
-
@Suppress("unused")
val forceOriginalAudioPatch = forceOriginalAudioPatch(
block = {
@@ -31,6 +28,6 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch(
},
fixUseLocalizedAudioTrackFlag = { is_20_07_or_greater },
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
- subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR,
+ subclassExtensionClassDescriptor = "Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;",
preferenceScreen = PreferenceScreen.VIDEO,
)
diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml
index 5c3bd1b87..adf2063f5 100644
--- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml
+++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml
@@ -218,9 +218,9 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum
İcma elanların gizlət
İcma elanları gizlədilib
İcma elanları göstərilir
- Yığcam etiketləri gizlət
- Yığcam etiketlər gizlidir
- Yığcam etiketlər göstərilir
+ Yığcam afişaları gizlət
+ Yığcam afişalar gizlidir
+ Yığcam afişalar görünür
İanə qutusunu gizlət
İanə qutusu gizlidir
İanə qutusu göstərilir
@@ -471,9 +471,9 @@ Məhdudiyyətlər
Yaradıcı mağaza bölümün gizlət
Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir
Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür
- Son ekran mağaza etiketini gizlət
- Son ekran alış-veriş etiketi gizlədilib
- Son ekran alış-veriş etiketi görünür
+ Son ekran mağaza afişasın gizlət
+ Son ekran mağaza afişası gizlidir
+ Son ekran mağaza afişası görünür
Tam ekran reklamlarını gizlət
"Tam ekran reklamları gizlidir
@@ -484,9 +484,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"
Ümumi reklamları gizlət
Ümumi reklamlar gizlidir
Ümumi reklamlar göstərilir
- Məhsul etiketlərini gizlət
- Məhsul etiketləri gizlədilir
- Məhsul etiketləri göstərilir
+ Məhsul afişaların gizlət
+ Məhsul afişaları gizlədilir
+ Məhsul afişaları görünür
Ödənişli tanıtım etiketini gizlət
Ödənişli reklam etiketi gizlədilib
Ödənişli reklam etiketi göstərilir
@@ -496,7 +496,7 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"
Alış-veriş linklərini gizlət
Alış-veriş linkləri video təsvirdə gizlidir
Alış-veriş linkləri video təsvirdə görünür
- “Məhsullara baxın” panelin gizlət
+ “Məhsullara baxın” afişasın gizlət
Məhsullara baxış etiketi video örtüyündə gizlidir
Məhsullara baxış etiketi video örtüyündə görünür
Veb axtarış nəticələrini gizlət
diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml
index 4e5ccb0f9..4662ae628 100644
--- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml
+++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml
@@ -1158,13 +1158,13 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
Se osa videota, jota useimmat ihmiset etsivät
Tauko/Introanimaatio
Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys tai toistuva animaatio. Ei sisällä siirtymiä, jotka sisältävät tietoa
- Loppukortit / Tekijätiedot
+ Loppukortit / -tekstit
Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille, joissa on tietoa
Koukku / Tervehdykset
Kertovat trailerit tulevasta videosta, tervehdykset ja hyvästelyt. Ei sisällä osioita, jotka lisäävät lisäsisältöä
- Esikatselu / Yhteenveto
+ Esikatselu / Kertaus
Kokoelma leikkeitä, jotka osoittavat, mitä on tulossa tai mitä tapahtui videossa tai muissa sarjan videoissa, joiden kaikki informaatio toistuu muualla
- Tangentti / Vitsit
+ Toissijaiset kohtaukset / Vitsit
Epäolennaiset kohtaukset tai vitsit, joita ei tarvita videon pääsisällön ymmärtämiseen. Ei sisällä osioita, jotka tarjoavat kontekstia tai taustatietoja
Musiikki: Musiikiton osa
Vain musiikkivideoille. Musiikkivideoiden osiot ilman musiikkia, jotka eivät jo kuulu toiseen kategoriaan
@@ -1182,7 +1182,7 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
Ohita esikatselu
Ohita esikatselu
Ohita kertaus
- Ohita Tangentti
+ Ohita toissijainen kohtaus
Ohita musiikiton
Ohita osio
Sponsori ohitettiin
@@ -1193,11 +1193,11 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
Tauko ohitettiin
Tauko ohitettiin
Outro ohitettiin
- Ohitettu koukku
+ Koukku ohitettiin
Esikatselu ohitettiin
Esikatselu ohitettiin
Kertaus ohitettiin
- Ohitettu tangentti
+ Toissijainen kohtaus ohitettiin
Musiikiton osio ohitettiin
Lähettämätön osio ohitettiin
Useita osioita ohitettiin
@@ -1254,7 +1254,7 @@ Oletko valmis lähettämään?"
Annettu aika on virheellinen
Tilastot
- Tilastot eivät tilapäisesti saatavilla (API ei ole käytettävissä)
+ Tilastot eivät ole tilapäisesti saatavilla (API ei ole käytettävissä)
Ladataan...
SponsorBlock ei ole käytössä
Käyttäjänimesi: <b>%s</b>
@@ -1265,11 +1265,11 @@ Oletko valmis lähettämään?"
Olet luonut <b>%s</b> osiota
Napauta tästä nähdäksesi osiosi
SponsorBlock-tulostaulu
- Olet pelastanut ihmisiä <b>%s</b> segmentiltä
+ Olet pelastanut ihmisiä <b>%s</b> osiolta
Napauta tästä nähdäksesi globaalit tilastot ja parhaat osallistujat
Se on <b>%s</b> heidän elämistään.<br>Napauta tästä nähdäksesi tulostaulun
Olet ohittanut <b>%s</b> osiota
- Tuo on <b>%s</b>
+ Se on <b>%s</b>
Nollataanko ohitettujen osioiden laskuri?
%1$s tuntia %2$s minuuttia
%1$s minuuttia %2$s sekuntia
diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml
index c4e413064..5469dd10c 100644
--- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml
+++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml
@@ -24,7 +24,7 @@ Second \"item\" text"
Nom de l\'application
- Personnalisée
+ Personnalisé
Icône de l\'application
Originale
diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml
index 496a69f74..ff9a063ad 100644
--- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml
+++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml
@@ -555,87 +555,85 @@ Níl an ghné seo ar fáil ach do ghléasanna níos sine"
Eile
Níl an aip suiteáilte
Níl %s suiteáilte. Suiteáil é le do thoil.
- "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s
-
-Deimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte"
- Ní féidir le hainm an phacáiste a bheith folamh
+ "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s\n\nDeimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte"
+ Ní féidir ainm an phacáiste a fhágáil folamh
Díchumasaigh comhartha cuardaigh beacht
- Tá comhartha míchumasaithe
- Tá comhartha cumasaithe
+ Tá gotha cuardaigh chruinn díchumasaithe
+ Tá gotha cuardaigh chruinn cumasaithe
- Cumasaigh sconna chun lorg a dhéanamh
- Tá sconna chun cuardach a dhéanamh cumasaithe
- Tá sconna chun lorg a dhéanamh díchumasaithe
+ Cumasaigh tapáil chun cuardach a dhéanamh
+ Tá tapáil chun cuardach cumasaithe
+ Tá tapáil chun cuardach a dhíchumasaithe
- Cumasaigh comhartha gile
- "Tá swipe gile lánscáileáin cumasaithe
+ Cumasaigh gotha gile
+ "Tá swipeáil gile lánscáileáin cumasaithe
-Coigeartaigh gile trí swipe a dhéanamh go hingearach ar thaobh na láimhe clé den scáileán"
- Tá swipe gile lánscáileáin díchumasaithe
- Cumasaigh comhartha toirte
- "Tá an haiscairt toirte lánscáileáin cumasaithe.
+Coigeartaigh gile trí swipeáil go hingearach ar thaobh clé an scáileáin"
+ Tá svaidhpeáil gile lánscáileáin díchumasaithe
+ Cumasaigh gotha toirte
+ "Tá swipeáil toirte lánscáileáin cumasaithe
-Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáileáin"
- Tá an haiscairt toirte lánscáileáin díchumasaithe
- Cumasaigh brúigh chun haisc a chur i ngníomh
- Tá brúigh chun haisc a chur i ngníomh cumasaithe
- Tá brúigh chun haisc a chur i ngníomh díchumasaithe
+Coigeartaigh an toirt trí swipeáil go hingearach ar thaobh na láimhe deise den scáileán"
+ Tá swipeáil toirte lánscáileáin díchumasaithe
+ Cumasaigh gotha brúigh chun svaidhpeáil
+ Tá brúigh chun svaidhpeáil cumasaithe
+ Tá brúigh chun svaidhpeáil díchumasaithe
Cumasaigh aiseolas haptic
Tá aiseolas haptic cumasaithe
- Tá aiseolas haptic míchumasaithe
+ Tá aiseolas haptic díchumasaithe
Sábháil agus athchóirigh gile
Sábháil agus cuir gile ar ais agus tú ag imeacht nó ag dul isteach i lánscáileán
- Ná sábháil agus athchóirigh gile agus tú ag imeacht nó ag dul isteach sa scáileán iomlán
- Cumasaigh gotha uathoibríoch
- Cumasaíonn scioradh síos go dtí an luach is ísle den chomhartha gile uathoibríoch
- Ní chumasaíonn uathoibríoch a tharraingt síos go dtí an luach is ísle
+ Ná sábháil agus ná hathchóirigh gile agus tú ag imeacht nó ag dul isteach sa lánscáileán
+ Cumasaigh gotha gile uathoibríoch
+ Cumasaíonn tú gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle den ghluaiseacht gile
+ Ní chumasaítear gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle
Uathoibríoch
- Amach forleagtha Swipe
- Tá méid na milleasoicind an forleagan le feiceáil
- Réabhlóid thrasláiteachta na gcúlra léaráidí
- Luach léaráidí idir 0-100
- Caithfidh léaráidí traslaithe a bheith idir 0-100
- Dath gile forleagan swipe
- Dath an bharra dul chun cinn do rialuithe gile
- Dath toirte forleagan swipe
+ Am scoir forleagan svaidhpeála
+ An méid milleasoicind atá an forleagan le feiceáil
+ Teimhneacht chúlra forleagan svaidhpeála
+ Luach teimhneachta idir 0-100
+ Teimhneacht svaidhpeála idir 0-100
+ Dath gile forleagan svaidhpeála
+ Dath an bharra dul chun cinn le haghaidh rialuithe gile
+ Dath toirte forleagan svaidhpeála
Dath an bharra dul chun cinn do rialuithe toirte
- Méid téacs an fhorleagain swipe
- Méid téacs an fhorleagain swipe idir 1-30
- Caithfidh an méid téacs a bheith idir 1-30
- Tairseach méid swipe
- Méid an tairseach le haghaidh sruthú tarlú
- Íogaireacht swipe toirte
- An méid a athraíonn an toirt in aghaidh gach swipe
- Stíl forleagain swipe
+ Méid téacs forleagan svaidhpeála
+ Méid an téacs le haghaidh forleagan svaidhpeála idir 1-30
+ Caithfidh méid an téacs a bheith idir 1-30
+ Tairseach méide svaidhpeála
+ An méid tairsí le go dtarlóidh svaidhpeáil
+ Íogaireacht svaidhpeáil toirte
+ Cé mhéad a athraíonn an toirt in aghaidh an svaidhpeála
+ Stíl forleagan svaidhpeála
Forleagan cothrománach
- Forleagan cothrománach (íosta - barr)
- Forleagan cothrománach (íosta - lár)
+ Forleagan cothrománach (íosmhéid - barr)
+ Forleagan cothrománach (íosmhéid - lár)
Forleagan ciorclach
- Forleagan ciorclach (íosta)
+ Forleagan ciorclach (íosmhéid)
Forleagan ingearach
- Forleagan ingearach (íosta)
- Cumasaigh swipe chun físeáin a athrú
- Achlaigh i mód lán-scáile chun athrú go dtí an físeán chéanna/arís
- Ní athróidh achlaigh i mód lán-scáile go dtí an físeán chéanna/arís
+ Forleagan ingearach (íosmhéid)
+ Cumasaigh svaidhpeáil chun físeáin a athrú
+ Athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo
+ Ní athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo
- Díchumasaigh fotheidil uathoibríoch
+ Díchumasaigh fotheidil uathoibríocha
Tá fotheidil uathoibríocha díchumasaithe
Tá fotheidil uathoibríocha cumasaithe
- Cnaipí gníomh
+ Cnaipí gníomhaíochta
Folaigh nó taispeáin cnaipí faoi fhíseáin
Díchumasaigh lonradh na cnaipí Cosúil / Liostáil
- Ní lonróidh an cnaipe \'Cosúil\' agus \'Liostáil\' nuair a luafaí
- Lonróidh an cnaipe Cosúil agus Liostáil nuair a luaitear
+ Ní bheidh na cnaipe Is maith liom agus Liostáil ag lonrú nuair a luaitear iad
+ Lonróidh na cnaipe Is maith liom agus Liostáil nuair a luaitear iad
Folaigh Like agus Dislike
- Tá cnaipí Cosúil agus Dislike i bhfolach
- Taispeántar cnaipí Cosúil agus Dislike
+ Tá cnaipí Like agus Dislike i bhfolach
+ Taispeántar cnaipí Like agus Dislike
Folaigh Comhroinn
Tá cnaipe Comhroinn i bhfolach
@@ -643,11 +641,11 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile
Folaigh Stad fógraí
Tá cnaipe stad fógraí i bhfolach
- Tá cnaipe stad fógraí taispeánta
+ Taispeántar an cnaipe Stad fógraí
- Folaigh Tuairimí
- Tá cnaipe na dTuairimí folaithe
- Tá cnaipe na dTuairimí taispeánta
+ Folaigh Tráchtanna
+ Tá an cnaipe tráchtanna i bhfolach
+ Taispeántar an cnaipe tráchtanna
Folaigh Tuairisc
@@ -663,22 +661,22 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile
Taispeántar cnaipe íoslódáil
- Folaigh Borradh
+ Folaigh Hype
Tá cnaipe an Hype i bhfolach
- Tá an cnaipe Hype ar taispeáint
+ Taispeántar cnaipe Hype
Folaigh Cur Chun Cinn
- Tá an cnaipe Cur Chun Cinn folaithe
- Tá an cnaipe Cur Chun Cinn taispeánta
+ Tá an cnaipe cur chun cinn i bhfolach
+ Taispeántar an cnaipe cur chun cinn
- Folaigh Go raibh maith agat
+ Folaigh Buíochas
Tá cnaipe buíochas i bhfolach
Taispeántar cnaipe buíochas
- Folaigh Fiafraigh
- Tá cnaipe Fiafraigh i bhfolach
- Taispeántar cnaipe Fiafraigh
+ Folaigh Iarr
+ Tá an cnaipe Iarr i bhfolach
+ Taispeántar cnaipe Iarr
Folaigh Gearrthóg
Tá an cnaipe gearrthóg i bhfolach
@@ -686,11 +684,11 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile
Folaigh Siopa
Tá cnaipe an tSiopa i bhfolach
- Tá cnaipe an tSiopa ar taispeáint
+ Taispeántar an cnaipe siopa
Folaigh Sábháil
Tá cnaipe sábhála i bhfolach
- Tá cnaipe sábhála taispeánta
+ Taispeántar an cnaipe Sábháil
Cnaipí nascleanúna
@@ -726,22 +724,22 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a
Folaigh lipéid cnaipe nascleanú
Tá lipéid i bhfolach
Taispeántar lipéid
- Díchumas trasúlacht staidéir a dhíchumas
- Tá an barra stádais neamhshainiúil
- Tá an barra stádais neamhshainiúil nó tríluchtúil
- Ar roinnt feistí, má chuirtear an ghné seo ar siúl, is féidir an barra nascleanúna córais a athrú go trédhearcach.
- Díchumas barra soiléir trasúlachta
- Tá barra nascleanúna mód soiléir dochrach
- Tá an barra nascleanúna sa mód solas neamhshainiúil nó tríluchtúil
- Díchoigearrd an barra tríluchtúil dorcha
- Tá barra nascleanúna mód dorcha dochrach
- Tá an barra nascleanúna sa mód dorcha neamhshainiúil nó tríluchtúil
+ Díchumasaigh barra stádais tréshoilseach
+ Tá an barra stádais teimhneach
+ Tá an barra stádais teimhneach nó tréshoilseach
+ Ar roinnt gléasanna, is féidir leis an ngné seo a chumasú barra nascleanúna an chórais a athrú go trédhearcach.
+ Díchumasaigh barra tréshoilseach solais
+ Tá an barra nascleanúna i mód solais teimhneach
+ Tá barra nascleanúna mód solais teimhneach nó tréshoilseach
+ Díchumasaigh barra tréshoilseach dorcha
+ Tá an barra nascleanúna i mód dorcha teimhneach
+ Tá barra nascleanúna mód dorcha teimhneach nó tréshoilseach
- Folaigh cnaipe an Uathoimh
- Tá cnaipe Autoplay i bhfolach
+ Folaigh an cnaipe Uath-imirt
+ Tá an cnaipe uath-sheinm i bhfolach
Taispeántar cnaipe Autoplay
- Folaigh cnaipe na dTeidil
+ Folaigh cnaipe fotheidil
Tá cnaipe fotheidil i bhfolach
Taispeántar cnaipe fotheidil
- Folaigh cnaipe an Chasta
- Tá cnaipe teilgthe i bhfolach
- Taispeántar cnaipe teilgthe
+ Folaigh cnaipe Cast
+ Tá cnaipe Cast i bhfolach
+ Taispeántar cnaipe Cast
Folaigh cúlra rialuithe an imreora
Tá cúlra rialuithe an imreora i bhfolach
Taispeántar cúlra rialuithe an imreora
- Folaigh Cnaipí Roimhe & Ar Aghaidh
- Tá cnaipí i bhfolach
- Taispeántar cnaipí
+ Folaigh cnaipí Roimhe Seo & Ar Aghaidh
+ Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach
+ Taispeántar cnaipí Roimhe Seo & Ar Aghaidh
Folaigh cártaí scáileáin deireadh
@@ -823,7 +821,7 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr
Taispeántar cártaí scáileáin deireadh
- Díchumasaigh mód Timpeallachta i scáileán iomlán
+ Díchumasaigh mód comhthimpeallach i lánscáileán
Díchumasaíodh mód comhthimpeallach
Mód comhthimpeallach cumasaithe
@@ -833,8 +831,8 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr
Taispeántar cártaí faisnéise
- Díchumasaigh beochan uimhreacha
- Níl uimhreacha rollta beoite
+ Díchumasaigh beochana uimhreacha rollta
+ Ní bhíonn uimhreacha rollta beoite
Tá uimhreacha rollta beoite
@@ -842,9 +840,9 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr
Tá barra cuardaigh seinnteoir físe i bhfolach
Taispeántar barra cuardaigh an t-imreoir físeán
- Folaigh barra cuardaigh mionsamhlaí físeáin
- Tá barra cuardaigh mionsamhlaí físeáin i bhfolach
- Tá barra cuardaigh mionsamhlaí físeáin taispeánta
+ Folaigh barra cuardaigh mionsamhlacha físeáin
+ Tá barra cuardaigh mionsamhlacha físeáin i bhfolach
+ Taispeántar barra cuardaigh mionsamhlacha físe
Shorts seinnteoir
@@ -854,91 +852,91 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr
I bhfolach sa fhotha Baile agus físeáin ghaolmhara
Taispeánta sa fhotha Baile agus físeáin ghaolmhara
Folaigh Shorts i dtorthaí cuardaigh
- Folaithe i dtorthaí cuardaigh
- Tá ar taispeáint sna torthaí cuardaigh
+ Folaigh i dtorthaí cuardaigh
+ Taispeáin i dtorthaí cuardaigh
Folaigh Shorts sa fhotha Liostálaí
I bhfolach sa fhotha Liostálaí
Taispeánta sa fhotha Liostálaí
Folaigh Shorts i stair féachana
- Faolithe sa stair féachana
+ I bhfolach i stair féachana
Taispeántar i stair féachana
- Folaigh cnaipe \'Ceannaigh Super Thanks\'
- Cnaipe \'Ceannaigh Super Thanks\' i bhfolach
- Cnaipe \'Ceannaigh Super Thanks\' taispeánta
- Folaigh cnaipe éifeachta
- Tá an cnaipe Éifeacht i bhfolach
- Tá an cnaipe Éifeacht taispeánta
- Folaigh cnaipe \'Scáileán glas\'
- Tá cnaipe an scáileáin glas i bhfolach
- Taispeántar cnaipe an scáileáin glas
- Folaigh an cnaipe hashtag
- Tá cnaipe hashtag i bhfolach
- Taispeántar an cnaipe hashtag
+ Folaigh cnaipe Ceannaigh Super Thanks
+ Cnaipe Ceannaigh Super Thanks i bhfolach
+ Taispeántar an cnaipe Ceannaigh Super Thanks
+ Folaigh cnaipe Éifeacht
+ Tá cnaipe Éifeacht i bhfolach
+ Taispeántar cnaipe Éifeacht
+ Folaigh cnaipe Scáileáin Ghlais
+ Tá cnaipe Scáileáin Ghlais i bhfolach
+ Taispeántar cnaipe Scáileáin Ghlais
+ Folaigh cnaipe Hashtag
+ Tá cnaipe Hashtag i bhfolach
+ Taispeántar cnaipe hashtag
- Folaigh cnaipe \'Bí\'
- Tá an cnaipe Bí i bhfolach
- Taispeántar an cnaipe Bí isteach
+ Folaigh cnaipe Glac páirt
+ Tá cnaipe Glac páirt i bhfolach
+ Taispeántar cnaipe Glac páirt
Folaigh lipéad suímh
Tá lipéad suímh i bhfolach
Taispeántar lipéad suímh
- Folaigh cnaipe na bpostálacha nua
- Tá cnaipe na bpostálacha nua i bhfolach
- Taispeántar cnaipe na bpostálacha nua
- Folaigh na cnaipí forleagan sosaithe
- Tá cnaipí forleagtha sos i bhfolach
- Taispeántar cnaipí forleagtha sos
- Folaigh réamhamharc ar an nóta tráchta
- Tá réamhamharc ar an nóta tráchta i bhfolach
- Taispeántar réamhamharc ar an nóta tráchta
- Folaigh cnaipe \'Sábháil ceol\'
- Tá an cnaipe Sábháil ceoil i bhfolach
- Taispeántar an cnaipe Sábháil ceoil
+ Folaigh Cnaipe Poist nua
+ Tá cnaipe Poist nua i bhfolach
+ Taispeántar cnaipe Poist nua
+ Folaigh cnaipí forleagan ar sos
+ Tá cnaipí forleagan ar sos i bhfolach
+ Taispeántar cnaipí forleagan ar sos
+ Folaigh trácht réamhamhairc
+ Tá an trácht réamhamhairc i bhfolach
+ Taispeántar réamhamharc tráchta
+ Folaigh an cnaipe Sábháil Ceoil
+ Tá an cnaipe sábháil ceoil i bhfolach
+ Taispeántar an cnaipe sábháil ceoil
Folaigh moltaí cuardaigh
Tá moltaí cuardaigh i bhfolach
Taispeántar moltaí cuardaigh
- Folaigh cnaipe an Siopa
+ Folaigh cnaipe Siopa
Tá cnaipe siopa i bhfolach
Taispeántar cnaipe siopa
Folaigh greamáin
Tá greamáin i bhfolach
Taispeántar greamáin
- Folaigh cnaipe \'Liostáil\'
- Tá cnaipe liostáil i bhfolach
- Taispeántar cnaipe liostáil
+ Folaigh cnaipe Liostáil
+ Tá an cnaipe Liostáil i bhfolach
+ Taispeántar cnaipe Liostáil
Folaigh táirgí clibeáilte
- Tá táirgí clib i bhfolach
+ Tá táirgí clibeáilte i bhfolach
Taispeántar táirgí clibeáilte
- Folaigh cnaipe \'Le teacht\'
- Tá cnaipe atá le teacht i bhfolach
- Taispeántar an cnaipe atá le teacht
- Folaigh an cnaipe \"Úsáid an fhuaim seo\"
- Tá an cnaipe \"Úsáid an fhuaim seo\" folaithe
- Tá an cnaipe \"Úsáid an fhuaim seo\" taispeánta
- Folaigh an cnaipe Bain úsáid as an teimpléad seo
- Tá an cnaipe \"Úsáid an teimpléad seo\" folaithe
- Taispeántar an cnaipe Bain úsáid as an teimpléad seo
- Folaigh an beochan fhoinse cnaipe Cosúil
- Cosúil le beochan tobair cnaipe i bhfolach
- Taispeántar beochan tobair cnaipe cosúil le cnaipe
- Folaigh cnaipe Cosúil
- Tá an cnaipe Cosúil i bhfolach
- Taispeántar an cnaipe Cosúil
- Folaigh cnaipe Mhíchlú
- Taispeántar an cnaipe nach dtaitníonn leis
- Taispeántar an cnaipe nach dtaitníonn leis
+ Folaigh cnaipe Ag Teacht
+ Tá cnaipe Ag Teacht i bhfolach
+ Taispeántar an cnaipe Ag Teacht
+ Folaigh Úsáid an cnaipe fuaime seo
+ Tá an cnaipe Úsáid an fhuaim seo i bhfolach
+ Taispeántar an cnaipe Úsáid an fhuaim seo
+ Folaigh an cnaipe Úsáid an teimpléad seo
+ Tá an cnaipe Úsáid an teimpléid seo i bhfolach
+ Taispeántar an cnaipe Úsáid an teimpléid seo
+ Folaigh an cnaipe Is maith liom \'beochan tobair\'
+ Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach
+ Taispeántar an cnaipe Is maith liom \'beochan tobair\'
+ Folaigh cnaipe Is maith liom
+ Tá an cnaipe Is maith liom i bhfolach
+ Taispeántar an cnaipe Is maith liom
+ Folaigh cnaipe Ní maith liom
+ Tá an cnaipe Ní maith liom i bhfolach
+ Taispeántar an cnaipe Ní maith liom
Folaigh cnaipe na Tuairimí
Tá an cnaipe tuairimí i bhfolach
Taispeántar cnaipe tuairimí
- Folaigh cnaipe \'Roinn\'
- Tá cnaipe Comhroinn i bhfolach
- Taispeántar an cnaipe Comhroinn
+ Folaigh cnaipe Roinn
+ Tá cnaipe Roinn i bhfolach
+ Taispeántar an cnaipe Roinn
- Folaigh cnaipe an Athchóiriú
- Tá cnaipe Remix i bhfolach
- Taispeántar cnaipe Remix
- Folaigh an cnaipe fuaime
+ Folaigh cnaipe Athmheasc
+ Tá cnaipe Athmheasc i bhfolach
+ Taispeántar cnaipe Athmheasc
+ Folaigh cnaipe Fuaime
Tá cnaipe fuaime i bhfolach
Taispeántar cnaipe fuaime
Folaigh painéal faisnéise
@@ -949,29 +947,29 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr
Taispeántar barra cainéal
Folaigh teideal físeáin
Teideal físeáin i bhfolach
- Teideal físeáin taispeánta
+ Taispeántar teideal físeáin
Folaigh lipéad meiteashonraí fuaime
Lipéad meiteashonraí fuaime i bhfolach
- Lipéad meiteashonraí fuaime taispeánta
+ Taispeántar Lipéad meiteashonraí fuaime
Folaigh lipéad nasc físeáin
- Tá lipéad nasc físe i bhfolach
- Taispeántar lipéad nasc físe
+ Tá lipéad nasc físeáin i bhfolach
+ Taispeántar lipéad nasc físeáin
Folaigh barra nascleanúna
Tá barra nascleanúna i bhfolach
Taispeántar barra nascleanúna
Folaigh físeán molta deireadh scáileáin
- "Folaítear físeán molta deireadh scáileáin nuair a bhíonn an uathshein múchta
+ "Bíonn an físeán molta don scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta
-Is féidir an uathshein a athrú i socruithe YouTube:
-Socruithe → Athsheinm → Uathshein físeán eile"
+Is féidir an t-uathsheinm a athrú i socruithe YouTube:
+Socruithe → Athsheinm → Uathsheinm an chéad fhíseán eile"
Taispeántar físeán molta deireadh scáileáin
Folaigh forleagan físeáin ghaolmhara
- Forleagan físeáin ghaolmhara i scáileán iomlán i bhfolach
- Forleagan físeáin ghaolmhara i scáileán iomlán taispeánta
+ Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach
+ Taispeántar forleagan físeáin ghaolmhara i lánscáileán
Folaigh stampa ama an fhíseáin
@@ -979,85 +977,85 @@ Socruithe → Athsheinm → Uathshein físeán eile"
Taispeántar stampa ama
- Baint á âmód éadaéin iomlán lán iomlán ar deireadh na físe
- Déchumasaithe
- Portait
- Téacscaoileadh
- Portait agus téacscaoileadh
+ Scoir an mód lánscáileáin ag deireadh an fhíseáin
+ Díchumasaithe
+ Portráid
+ Tírdhreach
+ Portráid agus tírdhreach
- Oscail físeáin i módh scáileáin iomláin portráit
- Osclaítear físeáin i scáileán iomlán
- Ní osclaítear físeáin i scáileán iomlán
+ Oscail físeáin i bportráid lánscáileáin
+ Osclaítear físeáin i mód lánscáileáin
+ Ní osclaítear físeáin i mód lánscáileáin
- Trédhearcacht forleagtha an imreoir
- Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach
- Caithfidh trédhearcacht forleagtha imreoirí a bheith idir 0-100
+ Teimhneacht fhorleagan imreora
+ Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht
+ Teimhneacht fhorleagan an imreora idir 0-100
- Ní dtaitníonn sé ar fáil go sealadach (API amuigh amach)
- Ní dtaitníonn sé ar fáil (stádas %d)
- Níl easaontais ar fáil (teorainn API an chliaint)
- Ní dtaitníonn sé ar fáil (%s)
+ Níl dí-mhaith ar fáil faoi láthair (API am istigh)
+ Níl \'Ní maith liom\' ar fáil (stádas %d)
+ Níl \'Ní maith liom\' ar fáil (teorainn API cliaint)
+ Níl \'Ní maith liom\' ar fáil (%s)
- Athlódáil físeán chun vótáil ag baint úsáide as Return YouTube Dislike
+ Athlódáil físeán vótáil trí Return YouTube Dislike
- I bhfolach ag úinéir
- Taispeántar rudaí nach dtaitníonn leo
- Ní thaispeántar nach dtaitníonn leat
- Taispeáin neamhthaitníonn ar Shorts
- "Taispeántar easaontais ar Shorts
+ I bhfolach ag an úinéir
+ Taispeántar \'Ní maith liom\'
+ Ní thaispeántar \'Ní maith liom\'
+ Taispeáin \'ní maith liom\' ar Shorts
+ "Taispeántar 'Ní thaitníonn' ar Shorts
-Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito"
- Ní thaispeántar easaontais ar Shorts
- Ní dtaitníonn mar chéatadán
- Taispeántar easaontais mar chéatadán
- Taispeántar easaontais mar uimhir
+Teorainn: B’fhéidir nach dtaispeánfar 'Ní thaitníonn' i mód incognito"
+ Ní thaispeántar \'Ní maith liom\' ar Shorts
+ \'Ní maith liom\' mar chéatadán
+ Taispeántar \'Ní thaitníonn\' mar chéatadán
+ Taispeántar \'Ní maith liom\' mar uimhir
- Cnaipe Cosúil dlúth
- Cosúil le cnaipe stíleáilte don leithead íosta
- Cosúil le cnaipe stíleáilte don chuma is fearr
- Taispeáin na rudaí is maith leis
- Taispeánann físeáin le maith díchumasaithe comhaireamh measta maith
- Ní thaispeántar maith measta
+ Cnaipe dlúth \'Is maith liom\'
+ Cnaipe \'Is maith liom\' stílithe don leithead íosta
+ Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr
+ Taispeáin \'is maith liom\' measta
+ Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo
+ Ní thaispeántar líon na \'is maith leis\' measta
Taispeáin tósta mura bhfuil API ar fáil
Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil
- Ní thaispeántar tóst mura bhfuil Return YouTube Dislike ar fáil
- Soláthraíonn an API Return YouTube Dislike sonraí. Tapáil anseo chun tuilleadh a fhoghlaim
+ Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil
+ Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil
- Staitisticí API returnieYouTubeDislike den fheiste seo
+ Staitisticí API ReturnYouTubeDislike an ghléis seo
Am freagartha API, meán
Am freagartha API, íosmhéid
Am freagartha API, uasmhéid
Am freagartha API, físeán deireanach
Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm
- Vótaí a fháil API, líon na nglaonna
- Ní dhéantar aon ghlaonna líonra
+ Vótaí aisghabhála API, líon na nglaonna
+ Níor rinneadh aon ghlaonna líonra
%d glaonna líonra déanta
- Vótaí a fháil API, líon na n-imeachtaí ama
- Níor aimsíodh aon ghlaonna líonra
- Chuaigh %d glaoch líonra thar am
+ Vótaí aisghabhála API, líon na sosanna ama
+ Níl aon ghlaonna líonra imithe in éag
+ %d glaonna líonra imithe thar an am
Teorainneacha ráta cliant API
- Níor tharla aon teorainneacha rátaí cliant
- Bhí teorainn ráta cliant ag teacht %d uair
+ Níor aimsíodh aon teorainneacha ráta cliant
+ Teorainn ráta cliant a bhíonn le fáil %d uair
%d milleasoicind
Cumasaigh barra cuardaigh leathan
Tá barra cuardaigh leathan cumasaithe
- Tá barra cuardaigh leathan míchumasaithe
+ Tá an barra cuardaigh leathan díchumasaithe
Cumasaigh mionsamhlacha ardchaighdeáin
Tá mionsamhlacha Seekbar ardchaighdeáin
- Tá mionsamhlacha barra cuardaigh de chaighdeán meánach
+ Tá mionsamhlacha Seekbar ar chaighdeán meánach
"Cuirfidh sé seo na miontaispeántais ar ais ar shruth beo nach bhfuil miontaispeántais cuardaigh acu.
Úsáidfidh miontaispeántais cuardaigh an caighdeán céanna leis an bhfíseán reatha.
@@ -1071,65 +1069,65 @@ Oibríonn an ghné seo is fearr le caighdeán físeáin 720p nó níos ísle agu
Cumasaigh SponsorBlock
Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais
Dealramh
- Taispeáin cnaipe vótá
- Taispeántar cnaipe vótála deigh
- Ní thaispeántar cnaipe vótála deireadh
- Úsáid leagan amach cearnógach
+ Taispeáin an cnaipe vótála
+ Taispeántar cnaipe vótála deighleog
+ Ní thaispeántar cnaipe vótála deighleog
+ Úsáid leagan amach cearnach
Tá cnaipí agus rialtáin cearnach
Tá cnaipí agus rialuithe cruinn
- Úsáid cnaipe Dlúthscipeála
- Sceip cnaipe stíleáilte don leithead íosta
- Sceip cnaipe stíleáilte chun an chuma is fearr
- Folaigh cnaipe Scipeála go huathoibríoch
- Folaíonn cnaipe scipeáil tar éis cúpla soicindí
- Taispeántar cnaipe Scipeála don deighleog iomlán
- Fad an chnaipe scipeála
- Cá fhad chun na cnaipí scipeála agus scipeála go dtí an aibhsigh a thaispeáint sula bhfolóidh siad go huathoibríoch
- Taispeáin teast cealaigh scipeála
- Taispeántar teast nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra teast chun an scipeáil a chealú
- Ní thaispeántar an tóstas
- Fad an tóstais scipeála
- Cá fhad chun an fógra dísciption a thaispeáint
+ Úsáid an cnaipe Scipeáil dlúth
+ Cnaipe Scipeáil stílithe don leithead íosta
+ Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr
+ Folaigh an cnaipe Scipeáil go huathoibríoch
+ Folaítear an cnaipe Scipeáil tar éis cúpla soicind
+ Taispeántar an cnaipe Scipeáil don deighleog iomlán
+ Fad an chnaipe Scipeáil
+ Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad
+ Taispeáin an tósta cealaithe scipeáilte
+ Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú
+ Ní thaispeántar tósta
+ Scipeáil fad an tósta
+ Cá fhad a thaispeántar an tósta cealaithe scipeála
1 soicind
2 soicind
3 soicind
4 soicind
5 soicind
6 soicind
- 7 soicindí
- 8 soicindí
- 9 soicindí
- 10 soicindí
- Taispeáin fad físeáin gan codanna
+ 7 soicind
+ 8 soicind
+ 9 soicind
+ 10 soicind
+ Taispeáin fad an fhíseáin gan deighleog
Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh
Taispeántar fad físe iomlán
Deighleoga nua a chruthú
Taispeáin cnaipe Cruthaigh deighleog nua
- Taispeántar cnaipe deighleog nua Cruthaigh
- Ní thaispeántar cnaipe deighleog nua Cruthaigh
+ Taispeántar an cnaipe cruthaigh deighleog nua
+ Ní thaispeántar an cnaipe cruthaigh deighleog nua
Coigeartaigh céim deighleog nua
Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú
Caithfidh luach a bheith ina uimhir dheimhneach
- Féach treoirlín
+ Féach ar threoirlínte
Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua
Lean na treoirlínte
- Léigh na treoirlínte SponsorBlock sula gcruthóidh tú
+ Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua
Léigh cheana féin
Taispeáin dom
Ginearálta
Taispeáin tósta mura bhfuil API ar fáil
Taispeántar tósta mura bhfuil SponsorBlock ar fáil
Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil
- Cumasaigh scip-rianú comhairimh
- Ligeann sí do chlár ceannairí SponsorBlock cá mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannairí gach uair a fhágtar mírlíne
+ Cumasaigh rianú comhaireamh scipeála
+ Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog
Níl rianú comhaireamh scipeála cumasaithe
Fad íosta deighleog
Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí)
Fad ama neamhbhailí
- Do id úsáideora príobháideach
+ D\'aitheantas úsáideora príobháideach
Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort
- Caithfidh id úsáideora príobháideach a bheith 30 carachtar ar a laghad
+ Caithfidh Id príobháideach a bheith ≥30 carachtar
Athraigh URL API
An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí
Athshocrú URL API
@@ -1150,75 +1148,75 @@ Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh
Athraigh iompar deighleog
Urraitheoir
Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo
- Neamhíocta/Féin-Chur Chun Cinn
- Cosúil le Fear gnótha ach amháin le haghaidh cur chun cinn neamhíoctha nó féin-thacaíochta. Áirítear roinntí faoi earraí, bronntanais, nó faisnéis faoi cé a oibrigh siad le chéile
+ Neamhíoctha/Féin-chur chun cinn
+ Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad
Meabhrúchán Idirghníomhaíochta (Liostáil)
- Meabhrúchán gairid ar mhaith leat, liostáil leo nó iad a leanúint i lár an ábhair. Má tá sé fada nó thart ar rud éigin ar leith, ba chóir é a chur chun cinn féin
+ Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin
Aibhsigh
An chuid den fhíseán atá ag cuardach mórchuid na ndaoine
- Beochan Idirmheán/Intro
+ Beochan Eatramh / Réamhrá
Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis
- Cártaí Deiridh / Creidiúintí
+ Cártaí Deiridh / Creidmheasanna
Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis
- Hook / Beannachtaí
+ Crúca / Beannachtaí
Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis
Réamhamharc / Achoimre
Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile
Seachrán / Scéalta Grinn
Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra
Ceol: Rannóg Neamh-Cheoil
- Le húsáid amháin i bhfíseáin ceoil. Rannóga d\'fhíseáin ceoil gan ceol, nach bhfuil clúdaithe ag catagóir eile cheana féin
- Scip
+ Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile
+ Scipeáil
Aibhsigh
- Scip urraitheoir
- Scip réamhfhógrán
- Scip idirghníomhú
- Scip go dtí an buaicphointe
- Scip intreoir
- Scip idirghabháil
- Scip idirghabháil
- Scip an forchríoch
+ Scipeáil urraitheoir
+ Scipeáil promóisean
+ Scipeáil idirghníomhú
+ Scipeáil go dtí aird a tharraingt
+ Scipeáil réamhrá
+ Scipeáil briseadh
+ Scipeáil briseadh
+ Scipeáil an chuid deiridh
Scipeáil crúca
- Scip réamhamharc
- Scip réamhamharc
- Scip an achoimre
- Scipeáil imeall
- Scip neamh-cheol
- Scip deighleog
- Urra scipeáilte
- Féin-chur chun cinn scipeáilte
- Meabhrúchán ciapach scipeáilte
- Scipeáilte chun aird a tharraingt
- Réamhrá scipeáilte
- Idirmheas scipeáilte
- Idirmheas scipeáilte
- Scipeáilte an forchríoch
- Crúca scipeáilte
- Scipeáilte an réamhléiriú
- Scipeáilte an réamhléiriú
- Athbhreithniú scipeáilte
- Imeall scipeáilte
- Scaoileadh rannán neamh-cheoil
+ Scipeáil réamhamharc
+ Scipeáil réamhamharc
+ Scipeáil achoimre
+ Scipeáil tadhlaí
+ Scipeáil neamh-cheol
+ Scipeáil deighleog
+ Scipeáilte urraitheoir
+ Scipeáilte féin-chur chun cinn
+ Scipeáilte meabhrúchán cráite
+ Scipeáilte aird a tharraingt
+ Scipeáilte réamhrá
+ Scipeáilte briseadh
+ Scipeáilte briseadh
+ Scipeáilte an chuid deiridh
+ Scipeáilte crúca
+ Scipeáilte réamhamharc
+ Scipeáilte réamhamharc
+ Achoimre scipeáilte
+ Tadhlaí scipeáilte
+ Scipeáladh cuid nach ceolmhar í
Deighleog gan curtha isteach scipeáilte
- Scipeáilte go leor deighleoga
- Scip go huathoibríoch
- Scip go huathoibríoch uair amháin
- Taispeáin cnaipe Scipeála
+ Scipeáilte iomadúil deighleoga
+ Scipeáil go huathoibríoch
+ Scipeáil go huathoibríoch uair amháin
+ Taispeáin cnaipe Scipeáil
Taispeáin i mbarra lorg
Díchumasaigh
Ní féidir deighleog a chur isteach: %s
Tá SponsorBlock síos go sealadach
Ní féidir deighleog a chur isteach (stádas: %1$d %2$s)
- Ní féidir an chuid a chur isteach. Teoranta (ró-iomadú ó úsáideoir nó ó IP céanna)
+ Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna)
Ní féidir an deighleog a chur isteach: %s
- "Ní féidir an chuid a chur isteach.
+ "Ní féidir deighleog a chur isteach.
Tá sé ann cheana féin"
- Déileog curtha isteach go rathúil
+ Cuireadh an deighleog isteach go rathúil
- Níl SponsorBlock ar fáil go sealadach (API amuigh amach)
+ Níl SponsorBlock ar fáil go sealadach (API am istigh)
Níl SponsorBlock ar fáil go sealadach (stádas %d)
Níl SponsorBlock ar fáil go sealadach
- Ní féidir vótáil a dhéanamh don deighleog (API amuigh amach)
+ Ní féidir vótáil don deighleog (API am istigh)
Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s)
Ní féidir vótáil a dhéanamh don deighleog: %s
Vótáil suas
@@ -1228,7 +1226,7 @@ Tá sé ann cheana féin"
%1$s go %2$s
Roghnaigh catagóir deighleog
- Tá catagóir díchumasaithe i socruithe. Cumasaigh catagóir a chur isteach.
+ Catagóir díchumasaithe. Cumasaigh í le cur isteach.
Deighleog nua SponsorBlock
Socraigh %s mar thús nó deireadh deighleog nua?
Tosaigh
@@ -1237,36 +1235,36 @@ Tá sé ann cheana féin"
Am a thosaíonn an deighleog ag
Am a chríochnaíonn an deighleog ag
An bhfuil na hamanna ceart?
- "Tagann an clipe
+ "Tá an deighleog ó
%1$s
-gu chuig
+go
%2$s
(%3$s)
-Maithe chun cur isteach?"
+Réidh le cur isteach?"
Caithfidh an tús a bheith roimh an deireadh
Marcáil dhá shuíomh ar an mbarra ama ar dtús
- Réamhamharc ar an deighleog, agus cinntigh go scipeánann sé
- Cuir uainiú deighleog in eagar
+ Féach ar an deighleog agus cinntigh léim réidh
+ Cuir am an deighleog in eagar de láimh
Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog?
Am neamhbhailí tugtha
Staitisticí
- Níl stats ar fáil go sealadach (tá API síos)
- Á lódáil...
- Tá SponsorBlock míchumasaithe
+ Níl staitisticí ar fáil faoi láthair (tá an API síos)
+ Ag lódáil...
+ Tá SponsorBlock díchumasaithe
D\'ainm úsáideora: <b>%s</b>
Tapáil anseo chun d\'ainm úsáideora a athrú
Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s
- Athraíodh ainm úsáideora
- Tá do chlú <b>%.2f</b>
+ Athraíodh ainm úsáideora go rathúil
+ Is é do chlú <b>%.2f</b>
Chruthaigh tú <b>%s</b> deighleoga
- Tapáil anseo chun do mhíreanna a fheiceáil
+ Tapáil anseo chun do dheighleoga a fheiceáil
Clár ceannairí SponsorBlock
Tá daoine sábháilte agat ó <b>%s</b> deighleoga
- Tapáil anseo chun na stats domhanda agus na rannpháirtithe is fearr a fheiceáil
+ Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil
Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil
Rinne tú scipeáil ar <b>%s</b> deighleoga
Sin é <b>%s</b>
@@ -1277,45 +1275,45 @@ Maithe chun cur isteach?"
Teimhneacht:
Dath:
Maidir
- Soláthraíonn an API SponsorBlock sonraí. Tapáil anseo chun níos mó a fhoghlaim agus íoslódálacha a fheiceáil d\'ardáin eile
+ Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil
- Fábos fóirmeanna foirmiúin
- Réamhshocrúch
- Fón
- Táibhléad
- Gluaisrothar
- "Áirítear ar na hathruithe:
+ Fachtóir foirme leagan amach
+ Réamhshocrú
+ Guthán
+ Táibléad
+ Gluaisteán
+ "Áirítear leis na hathruithe:
-Leagan amach an táibléid
-• Tá postálacha pobail i bhfolach
+Leagan amach táibléid
+• Tá poist phobail i bhfolach
-Leagan amach feithicleach
-• Osclaítear Shorts sa ghnáthsheinnteoir
-• Eagraítear an fotha de réir topaicí agus bealaí"
+Leagan amach gluaisteán
+• Gearrscannáin oscailte sa ghnáth-imreoir
+• Tá an fotha eagraithe de réir topaicí agus bealaí"
- Leagan aip spoof
- Leagan spoofed
- Leagan gan bhfoláiste
- "Déanfar leagan an aip a spoofadh go leagan níos sine de YouTube.
+ Leagan aip bréige
+ Leagan bréagach
+ Leagan gan bréag
+ "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube.
-Athróidh sé seo cuma agus gnéithe an aip, ach d'fhéadfadh fo-iarsmaí anaithnid a bheith ann.
+Athróidh sé seo cuma agus gnéithe na haipe, ach d'fhéadfadh fo-iarsmaí anaithnide tarlú.
-Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buganna UI a chosc."
- Sprioc leagan aip spoof
- 20.13.41 - Cuir an barra gníomhaíochta físe neamhchomhbhrúite ar ais
- 20.05.46 - Athchóirigh feidhmiúlacht tras-scríbhinne
- 19.35.36 - Athchóirigh sean-deilbhíní imreoir Shorts
- 19.01.34 - Athchóiriú Sean Icóin Treorach
+Má mhúchtar é níos déanaí, moltar sonraí na haipe a ghlanadh chun fabhtanna UI a chosc."
+ Sprioc leagan aip bréagach
+ 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú
+ 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn
+ 19.35.36 - Athchóirigh deilbhíní sean-imreoir Shorts
+ 19.01.34 - Athchóirigh deilbhíní nascleanúna sean
Athraigh an leathanach tosaigh
- Réamhshocraithe
- Uile shuibhscríbhinní
+ Réamhshocrú
+ Gach síntiús
Brabhsáil cainéil
Cúrsaí / Foghlaim
- Déan iniúchadh
+ Taiscéal
Faisean & Áilleacht
Cluichíocht
Stair
@@ -1332,9 +1330,9 @@ Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buga
Spóirt
Síntiúis
Ag treocht
- Fíor-Rialtas
- Féach ar níos déanaí
- Do chlipbhoirt
+ Réaltacht Fhíorúil
+ Féach níos déanaí
+ Do ghearrthóga
Athraigh an leathanach tosaigh i gcónaí
"Athraítear an leathanach tosaigh i gcónaí
@@ -1342,28 +1340,28 @@ Teorainn: Seans nach n-oibreoidh úsáid a bhaint as an gcnaipe cúil ar an mbar
Ní athraítear an leathanach tosaigh ach amháin ar tosú an aip
- Díchumasaigh an t-imreoir Shorts atá ag tosú arís
- Ní thosóidh an t-imreoir Shorts ar thosú an aip
- Athosóidh an t-imreoir Shorts ar thosú an aip
+ Díchumasaigh atosú seinnteoir Shorts
+ Ní atosóidh seinnteoir Shorts nuair a thosófar an aip
+ Atosóidh seinnteoir Shorts nuair a thosóidh an aip arís
Oscail Shorts le
Shorts seinnteoir
- Imreoir Rialaigh
- Imreoir Rialaigh lán-scáileán
+ Imreoir rialta
+ Lánscáileáin imreoir rialta
- Shorts Autoplay
+ Shorts Uathsheinn
Seinnfidh Shorts go huathoibríoch
Déanfaidh Shorts arís
- Cluiche Cúlra Shorts Autoplay
+ Uathsheinn Shorts Cúlra sheinn
Déanfar súgradh cúlra Shorts go huathoibríoch
- Athdhéanfar súgradh cúlra Shorts
+ Athdhéanfar athsheinm Shorts cúlra sheinn
- Minipléir
+ Mion seinnteoir
Athraigh stíl an imreora íoslaghdaithe in-aip
- Cineál Miniplayer
+ Cineál Mion seinnteoir
Díchumasaithe
Réamhshocraithe
Íosta
diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml
index 996b775e5..a354c8430 100644
--- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml
+++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml
@@ -28,8 +28,8 @@ Second \"item\" text"
アプリアイコン
オリジナル
- ReVanced (シンプル)
- ReVanced (ロゴ拡大)
+ ReVanced(シンプル)
+ ReVanced(ロゴ拡大)
カスタム
@@ -342,8 +342,8 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
文字起こしセクションを非表示
文字起こしセクションは表示されません
文字起こしセクションは表示されます
- 動画の概要欄
- 動画の概要欄のコンポーネントを表示または非表示にします
+ 概要欄
+ 概要欄のコンポーネントを表示または非表示にします
フィルタバー
フィード、関連動画、検索結果、および再生履歴でフィルタバーを表示または非表示にします
フィードで非表示
@@ -496,8 +496,8 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
自己スポンサー カードは表示されません
自己スポンサー カードは表示されます
商品へのリンクを非表示
- 動画の概要欄にある商品へのリンクは表示されません
- 動画の概要欄にある商品へのリンクは表示されます
+ 動画の概要欄の商品へのリンクは表示されません
+ 動画の概要欄の商品へのリンクは表示されます
「商品を表示」バナーを非表示
動画オーバーレイの「商品を表示」バナーは表示されません
動画オーバーレイの「商品を表示」バナーは表示されます
@@ -614,12 +614,12 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
スワイプによる音量の変化量
オーバーレイのスタイル
横型
- 横型 (シンプル - 画面上部)
- 横型 (シンプル - 画面中央)
+ 横型(シンプル - 画面上部)
+ 横型(シンプル - 画面中央)
円形
- 円形 (シンプル)
+ 円形(シンプル)
縦型
- 縦型 (シンプル)
+ 縦型(シンプル)
スワイプによる動画の切り替えを有効化
全画面表示中に左 / 右にスワイプすると、前 / 次の動画に切り替わります
全画面表示中に左 / 右にスワイプしても、前 / 次の動画に切り替わりません
@@ -967,7 +967,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
"終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます
自動再生の設定は YouTube の設定で変更できます:
-[設定] → [再生] → [次の動画を自動再生]"
+[設定] > [再生] > [次の動画を自動再生]"
終了画面の「関連動画」は表示されます
@@ -1159,9 +1159,9 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
動画内に挿入される視聴者への高評価、チャンネル登録、フォローなどの時間的に短い催促。時間的に長い催促またはイベントなどの個別具体的なものに関する催促は、「視聴者への催促」ではなく「自己宣伝」に分類すべきです
ハイライト
動画の中で最も重要な場面
- 幕間 / オープニング
+ 幕間 / オープニング (OP)
実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリーではありません
- 終了画面 / クレジット
+ 終了画面 / クレジット (ED)
クレジット、または YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリーには含まれません
フック / あいさつ
今後の動画のナレーション付きの予告編、および開幕と別れのあいさつ。重複しない内容や情報を追加する場面は含まれません
@@ -1177,10 +1177,10 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
自己宣伝をスキップ
催促をスキップ
ハイライトまでスキップ
- オープニングをスキップ
+ OP をスキップ
幕間をスキップ
幕間をスキップ
- エンディングをスキップ
+ ED をスキップ
フックをスキップ
予告編をスキップ
予告編をスキップ
@@ -1192,10 +1192,10 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
自己宣伝をスキップしました
催促をスキップしました
ハイライトまでスキップしました
- オープニングをスキップしました
+ OP をスキップしました
幕間をスキップしました
幕間をスキップしました
- エンディングをスキップしました
+ ED をスキップしました
フックをスキップしました
予告編をスキップしました
予告編をスキップしました
@@ -1309,7 +1309,7 @@ Automotive レイアウト
アプリバージョンの偽装先
20.13.41 - アクション ボタンの文字表示を復元
20.05.46 - 文字起こし機能を復元
- 19.35.36 - 古いショート プレーヤーのアイコンを復元
+ 19.35.36 - ショート プレーヤーの古いアイコンを復元
19.01.34 - 古いナビゲーション アイコンを復元
@@ -1359,7 +1359,7 @@ Automotive レイアウト
ショート動画の自動再生
ショート動画は自動再生されます
ショート動画はループ再生されます
- ショート動画の自動再生(バックグラウンド)
+ ショート動画の自動再生 (バックグラウンド)
バックグラウンドのショート動画は自動再生されます
バックグラウンドのショート動画はループ再生されます
@@ -1433,7 +1433,7 @@ Automotive レイアウト
デフォルト
標準
- ReVanced (シンプル)
+ ReVanced(シンプル)
カスタム
@@ -1546,13 +1546,13 @@ Automotive レイアウト
画質の変更時にトーストを表示
デフォルトの画質が変更された場合にトースト通知が表示されます
デフォルトの画質が変更された場合にトースト通知は表示されません
- デフォルトの画質(Wi-Fi)
- デフォルトの画質(携帯回線)
+ デフォルトの画質 (Wi-Fi)
+ デフォルトの画質 (携帯回線)
ショートの画質の変更を保存
画質の変更はすべてのショート動画に適用されます
画質の変更は現在のショート動画にのみ適用されます
- デフォルトのショートの画質(Wi-Fi)
- デフォルトのショートの画質(携帯回線)
+ デフォルトのショートの画質 (Wi-Fi)
+ デフォルトのショートの画質 (携帯回線)
携帯回線
Wi-Fi
デフォルトの画質の変更 (%1$s): %2$s
diff --git a/patches/src/main/resources/seekbar/values/attrs.xml b/patches/src/main/resources/seekbar/values/attrs.xml
deleted file mode 100644
index 2bf349f0d..000000000
--- a/patches/src/main/resources/seekbar/values/attrs.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file