diff --git a/CHANGELOG.md b/CHANGELOG.md index be06e75fe..92d156f85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,60 @@ +# [5.35.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.4...v5.35.0-dev.5) (2025-09-06) + + +### Features + +* **BaconReader:** Add `Fix Redgifs API` patch ([#5761](https://github.com/ReVanced/revanced-patches/issues/5761)) ([08868c0](https://github.com/ReVanced/revanced-patches/commit/08868c00d3c4f1f37f4a77f333a03ca5a3259b59)) +* **Instagram:** Add `Hide Stories from Home` patch ([#5756](https://github.com/ReVanced/revanced-patches/issues/5756)) ([3ae3251](https://github.com/ReVanced/revanced-patches/commit/3ae3251dc0317b6ced136fe9aa14be369642f203)) + +# [5.35.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.3...v5.35.0-dev.4) (2025-09-04) + + +### Features + +* **Boost/Sync for Reddit:** Add `Fix Redgifs` patch ([#5725](https://github.com/ReVanced/revanced-patches/issues/5725)) ([c5e8079](https://github.com/ReVanced/revanced-patches/commit/c5e8079eab08075a72078cd0fa79f3beb1f75d98)) + +# [5.35.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.2...v5.35.0-dev.3) (2025-09-04) + + +### Bug Fixes + +* **Instagram - Hide navigation buttons:** Fix Manager patching error ([0d10e94](https://github.com/ReVanced/revanced-patches/commit/0d10e94663283fac09f3efc57c9b9805c38c4e13)) + +# [5.35.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.1...v5.35.0-dev.2) (2025-09-04) + + +### Bug Fixes + +* Revert dependency updates to fix Manager pre-release patching ([4c7a1a8](https://github.com/ReVanced/revanced-patches/commit/4c7a1a8554c67797bf663e5230f566c5a9b229af)) + +# [5.35.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.34.1-dev.3...v5.35.0-dev.1) (2025-09-03) + + +### Features + +* **Instagram:** Add `Hide navigation buttons` patch ([#5678](https://github.com/ReVanced/revanced-patches/issues/5678)) ([415cf0f](https://github.com/ReVanced/revanced-patches/commit/415cf0fb5b9b3dcaf4592943a69eea1c10447b07)) + +## [5.34.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.34.1-dev.2...v5.34.1-dev.3) (2025-08-24) + + +### Bug Fixes + +* **YouTube - Hide layout components:** Hide Playable shelf header ([fbb5046](https://github.com/ReVanced/revanced-patches/commit/fbb50463f0e3f533a278c5251cfbce59f09ce641)) + +## [5.34.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.34.1-dev.1...v5.34.1-dev.2) (2025-08-22) + + +### Bug Fixes + +* **Proton mail:** Constrain patches to last working app target ([21c34b9](https://github.com/ReVanced/revanced-patches/commit/21c34b908e07a97de8c31c7c828b44a8cc4739b6)) + +## [5.34.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.34.0...v5.34.1-dev.1) (2025-08-21) + + +### Bug Fixes + +* **Spotify - Unlock Premium:** Make compatible with latest versions again by fixing fingerprint ([#5684](https://github.com/ReVanced/revanced-patches/issues/5684)) ([30dcff1](https://github.com/ReVanced/revanced-patches/commit/30dcff13a56883efc499b71faadb403877cd1c67)) + # [5.34.0](https://github.com/ReVanced/revanced-patches/compare/v5.33.0...v5.34.0) (2025-08-19) diff --git a/extensions/baconreader/build.gradle.kts b/extensions/baconreader/build.gradle.kts new file mode 100644 index 000000000..804e90884 --- /dev/null +++ b/extensions/baconreader/build.gradle.kts @@ -0,0 +1,5 @@ +dependencies { + compileOnly(project(":extensions:shared:library")) + compileOnly(libs.annotation) + compileOnly(libs.okhttp) +} diff --git a/extensions/baconreader/src/main/AndroidManifest.xml b/extensions/baconreader/src/main/AndroidManifest.xml new file mode 100644 index 000000000..9b65eb06c --- /dev/null +++ b/extensions/baconreader/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java b/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java new file mode 100644 index 000000000..943da63fa --- /dev/null +++ b/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java @@ -0,0 +1,22 @@ +package app.revanced.extension.baconreader; + +import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch; +import okhttp3.OkHttpClient; + +/** + * @noinspection unused + */ +public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch { + static { + INSTANCE = new FixRedgifsApiPatch(); + } + + public String getDefaultUserAgent() { + // BaconReader uses a static user agent for Redgifs API calls + return "BaconReader"; + } + + public static OkHttpClient install(OkHttpClient.Builder builder) { + return builder.addInterceptor(INSTANCE).build(); + } +} diff --git a/extensions/boostforreddit/build.gradle.kts b/extensions/boostforreddit/build.gradle.kts index 54c06871b..4f79f5a79 100644 --- a/extensions/boostforreddit/build.gradle.kts +++ b/extensions/boostforreddit/build.gradle.kts @@ -1,4 +1,6 @@ dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:boostforreddit:stub")) + compileOnly(libs.annotation) + compileOnly(libs.okhttp) } diff --git a/extensions/boostforreddit/src/main/java/app/revanced/extension/boostforreddit/FixRedgifsApiPatch.java b/extensions/boostforreddit/src/main/java/app/revanced/extension/boostforreddit/FixRedgifsApiPatch.java new file mode 100644 index 000000000..92757dabf --- /dev/null +++ b/extensions/boostforreddit/src/main/java/app/revanced/extension/boostforreddit/FixRedgifsApiPatch.java @@ -0,0 +1,22 @@ +package app.revanced.extension.boostforreddit; + +import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch; +import okhttp3.OkHttpClient; + +/** + * @noinspection unused + */ +public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch { + static { + INSTANCE = new FixRedgifsApiPatch(); + } + + public String getDefaultUserAgent() { + // Boost uses a static user agent for Redgifs API calls + return "Boost"; + } + + public static OkHttpClient createClient() { + return new OkHttpClient.Builder().addInterceptor(INSTANCE).build(); + } +} diff --git a/extensions/shared/build.gradle.kts b/extensions/shared/build.gradle.kts index 2da2e1e89..8f037894c 100644 --- a/extensions/shared/build.gradle.kts +++ b/extensions/shared/build.gradle.kts @@ -1,3 +1,4 @@ dependencies { implementation(project(":extensions:shared:library")) + compileOnly(libs.okhttp) } diff --git a/extensions/shared/library/build.gradle.kts b/extensions/shared/library/build.gradle.kts index 95969234f..100de7ae1 100644 --- a/extensions/shared/library/build.gradle.kts +++ b/extensions/shared/library/build.gradle.kts @@ -18,4 +18,5 @@ android { dependencies { compileOnly(libs.annotation) + compileOnly(libs.okhttp) } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java new file mode 100644 index 000000000..b6fa2caa0 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java @@ -0,0 +1,71 @@ +package app.revanced.extension.shared.fixes.redgifs; + +import androidx.annotation.NonNull; + +import org.json.JSONException; + +import java.io.IOException; +import java.net.HttpURLConnection; + +import app.revanced.extension.shared.Logger; +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + + +public abstract class BaseFixRedgifsApiPatch implements Interceptor { + protected static BaseFixRedgifsApiPatch INSTANCE; + public abstract String getDefaultUserAgent(); + + @NonNull + @Override + public Response intercept(@NonNull Chain chain) throws IOException { + Request request = chain.request(); + if (!request.url().host().equals("api.redgifs.com")) { + return chain.proceed(request); + } + + String userAgent = getDefaultUserAgent(); + + if (request.header("Authorization") != null) { + Response response = chain.proceed(request.newBuilder().header("User-Agent", userAgent).build()); + if (response.isSuccessful()) { + return response; + } + // It's possible that the user agent is being overwritten later down in the interceptor + // chain, so make sure we grab the new user agent from the request headers. + userAgent = response.request().header("User-Agent"); + response.close(); + } + + try { + RedgifsTokenManager.RedgifsToken token = RedgifsTokenManager.refreshToken(userAgent); + + // Emulate response for old OAuth endpoint + if (request.url().encodedPath().equals("/v2/oauth/client")) { + String responseBody = RedgifsTokenManager.getEmulatedOAuthResponseBody(token); + return new Response.Builder() + .message("OK") + .code(HttpURLConnection.HTTP_OK) + .protocol(Protocol.HTTP_1_1) + .request(request) + .header("Content-Type", "application/json") + .body(ResponseBody.create( + responseBody, MediaType.get("application/json"))) + .build(); + } + + Request modifiedRequest = request.newBuilder() + .header("Authorization", "Bearer " + token.getAccessToken()) + .header("User-Agent", userAgent) + .build(); + return chain.proceed(modifiedRequest); + } catch (JSONException ex) { + Logger.printException(() -> "Could not parse Redgifs response", ex); + throw new IOException(ex); + } + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/RedgifsTokenManager.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/RedgifsTokenManager.java new file mode 100644 index 000000000..792465a89 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/RedgifsTokenManager.java @@ -0,0 +1,94 @@ +package app.revanced.extension.shared.fixes.redgifs; + +import static app.revanced.extension.shared.requests.Route.Method.GET; + +import androidx.annotation.GuardedBy; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import app.revanced.extension.shared.requests.Requester; + + +/** + * Manages Redgifs token lifecycle. + */ +public class RedgifsTokenManager { + public static class RedgifsToken { + // Expire after 23 hours to provide some breathing room + private static final long EXPIRY_SECONDS = 23 * 60 * 60; + + private final String accessToken; + private final long refreshTimeInSeconds; + + public RedgifsToken(String accessToken, long refreshTime) { + this.accessToken = accessToken; + this.refreshTimeInSeconds = refreshTime; + } + + public String getAccessToken() { + return accessToken; + } + + public long getExpiryTimeInSeconds() { + return refreshTimeInSeconds + EXPIRY_SECONDS; + } + + public boolean isValid() { + if (accessToken == null) return false; + return getExpiryTimeInSeconds() >= System.currentTimeMillis() / 1000; + } + } + public static final String REDGIFS_API_HOST = "https://api.redgifs.com"; + private static final String GET_TEMPORARY_TOKEN = REDGIFS_API_HOST + "/v2/auth/temporary"; + @GuardedBy("itself") + private static final Map tokenMap = new HashMap<>(); + + private static String getToken(String userAgent) throws IOException, JSONException { + HttpURLConnection connection = (HttpURLConnection) new URL(GET_TEMPORARY_TOKEN).openConnection(); + connection.setFixedLengthStreamingMode(0); + connection.setRequestMethod(GET.name()); + connection.setRequestProperty("User-Agent", userAgent); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + connection.setUseCaches(false); + + JSONObject responseObject = Requester.parseJSONObject(connection); + return responseObject.getString("token"); + } + + public static RedgifsToken refreshToken(String userAgent) throws IOException, JSONException { + synchronized(tokenMap) { + // Reference: https://github.com/JeffreyCA/Apollo-ImprovedCustomApi/pull/67 + RedgifsToken token = tokenMap.get(userAgent); + if (token != null && token.isValid()) { + return token; + } + + // Copy user agent from original request if present because Redgifs verifies + // that the user agent in subsequent requests matches the one in the OAuth token. + String accessToken = getToken(userAgent); + long refreshTime = System.currentTimeMillis() / 1000; + token = new RedgifsToken(accessToken, refreshTime); + tokenMap.put(userAgent, token); + return token; + } + } + + public static String getEmulatedOAuthResponseBody(RedgifsToken token) throws JSONException { + // Reference: https://github.com/JeffreyCA/Apollo-ImprovedCustomApi/pull/67 + JSONObject responseObject = new JSONObject(); + responseObject.put("access_token", token.accessToken); + responseObject.put("expiry_time", token.getExpiryTimeInSeconds() - (System.currentTimeMillis() / 1000)); + responseObject.put("scope", "read"); + responseObject.put("token_type", "Bearer"); + return responseObject.toString(); + } +} diff --git a/extensions/syncforreddit/build.gradle.kts b/extensions/syncforreddit/build.gradle.kts index a2b2899db..ae95bb48f 100644 --- a/extensions/syncforreddit/build.gradle.kts +++ b/extensions/syncforreddit/build.gradle.kts @@ -2,4 +2,5 @@ dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:syncforreddit:stub")) compileOnly(libs.annotation) + compileOnly(libs.okhttp) } diff --git a/extensions/syncforreddit/src/main/java/app/revanced/extension/syncforreddit/FixRedgifsApiPatch.java b/extensions/syncforreddit/src/main/java/app/revanced/extension/syncforreddit/FixRedgifsApiPatch.java new file mode 100644 index 000000000..78c910ecf --- /dev/null +++ b/extensions/syncforreddit/src/main/java/app/revanced/extension/syncforreddit/FixRedgifsApiPatch.java @@ -0,0 +1,22 @@ +package app.revanced.extension.syncforreddit; + +import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch; +import okhttp3.OkHttpClient; + +/** + * @noinspection unused + */ +public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch { + static { + INSTANCE = new FixRedgifsApiPatch(); + } + + public String getDefaultUserAgent() { + // To be filled in by patch + return ""; + } + + public static OkHttpClient install(OkHttpClient.Builder builder) { + return builder.addInterceptor(INSTANCE).build(); + } +} 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 6033f26fe..e04b7a182 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 @@ -45,6 +45,7 @@ public final class LayoutComponentsFilter extends Filter { private final StringFilterGroup chipBar; private final StringFilterGroup channelProfile; private final ByteArrayFilterGroupList channelProfileBuffer; + private final ByteArrayFilterGroup playablesBuffer; public LayoutComponentsFilter() { exceptions.addPatterns( @@ -190,6 +191,12 @@ public final class LayoutComponentsFilter extends Filter { "mini_game_card.eml" ); + // Playable horizontal shelf header. + playablesBuffer = new ByteArrayFilterGroup( + Settings.HIDE_PLAYABLES, + "mini_game" + ); + final var quickActions = new StringFilterGroup( Settings.HIDE_QUICK_ACTIONS, "quick_actions" @@ -342,7 +349,9 @@ public final class LayoutComponentsFilter extends Filter { } if (matchedGroup == horizontalShelves) { - return contentIndex == 0 && (hideShelves() || ticketShelf.check(buffer).isFiltered()); + return contentIndex == 0 && (hideShelves() + || ticketShelf.check(buffer).isFiltered() + || playablesBuffer.check(buffer).isFiltered()); } if (matchedGroup == chipBar) { diff --git a/gradle.properties b/gradle.properties index 080bfa2b2..3f4f9aab6 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.34.0 +version = 5.35.0-dev.5 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6af604481..f55818425 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,8 +11,8 @@ appcompat = "1.7.0" okhttp = "5.0.0-alpha.14" retrofit = "2.11.0" guava = "33.4.0-jre" -protobuf-javalite = "4.31.1" -protoc = "4.31.1" +protobuf-javalite = "4.32.0" +protoc = "4.32.0" protobuf = "0.9.5" antlr4 = "4.13.2" nanohttpd = "2.3.1" diff --git a/patches/api/patches.api b/patches/api/patches.api index aae1502c1..d57f9cd93 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -264,6 +264,10 @@ public final class app/revanced/patches/instagram/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/instagram/hide/navigation/HideNavigationButtonsKt { + public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt { public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -508,6 +512,13 @@ public final class app/revanced/patches/reddit/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/reddit/customclients/FixRedgifsApiPatchKt { + public static final field CREATE_NEW_CLIENT_METHOD Ljava/lang/String; + public static final field INSTALL_NEW_CLIENT_METHOD Ljava/lang/String; + public static final fun fixRedgifsApiPatch (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun fixRedgifsApiPatch$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/reddit/customclients/FixSLinksPatchKt { public static final field RESOLVE_S_LINK_METHOD Ljava/lang/String; public static final field SET_ACCESS_TOKEN_METHOD Ljava/lang/String; @@ -524,6 +535,14 @@ public final class app/revanced/patches/reddit/customclients/baconreader/api/Spo public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatchKt { + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatchKt { + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatchKt { public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -536,6 +555,10 @@ public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/ public static final fun getFixAudioMissingInDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatchKt { + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatchKt { public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String; public static final fun getFixSlinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; @@ -606,6 +629,10 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatchKt { + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatchKt { public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String; public static final fun getFixSLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt new file mode 100644 index 000000000..3b401a842 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -0,0 +1,29 @@ + +package app.revanced.patches.instagram.hide.navigation + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode + +internal val tabCreateButtonsLoopStartFingerprint = fingerprint { + returns("V") + strings("InstagramMainActivity.createTabButtons") + opcodes( + //Loop Start + Opcode.IF_GE, // Check if index is finished (index, size) + //Injection + Opcode.INVOKE_INTERFACE, + Opcode.MOVE_RESULT_OBJECT + ) +} + +internal val tabCreateButtonsLoopEndFingerprint = fingerprint { + returns("V") + strings("InstagramMainActivity.createTabButtons") + opcodes( + Opcode.IPUT_OBJECT, + // Injection Jump + Opcode.ADD_INT_LIT8, //Increase Index + Opcode.GOTO_16 // Jump to loopStart + // LoopEnd + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt new file mode 100644 index 000000000..b0f751d20 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt @@ -0,0 +1,80 @@ +package app.revanced.patches.instagram.hide.navigation + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.booleanOption +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.util.findFreeRegister +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import java.util.logging.Logger + +@Suppress("unused") +val hideNavigationButtonsPatch = bytecodePatch( + name = "Hide navigation buttons", + description = "Hides navigation bar buttons, such as the Reels and Create button.", + use = false +) { + compatibleWith("com.instagram.android") + + val hideReels by booleanOption( + key = "hideReels", + default = true, + title = "Hide Reels", + description = "Permanently hides the Reels button." + ) + + val hideCreate by booleanOption( + key = "hideCreate", + default = true, + title = "Hide Create", + description = "Permanently hides the Create button." + ) + + execute { + if (!hideReels!! && !hideCreate!!) { + return@execute Logger.getLogger(this::class.java.name).warning( + "No hide navigation buttons options are enabled. No changes made." + ) + } + + tabCreateButtonsLoopStartFingerprint.method.apply { + // Check the current loop index, and skip over adding the + // navigation button view if the index matches a given button. + + val startIndex = tabCreateButtonsLoopStartFingerprint.patternMatch!!.startIndex + val endIndex = tabCreateButtonsLoopEndFingerprint.patternMatch!!.endIndex + val insertIndex = startIndex + 1 + val loopIndexRegister = getInstruction(startIndex).registerA + val freeRegister = findFreeRegister(insertIndex, loopIndexRegister) + val instruction = getInstruction(endIndex - 1) + + var instructions = buildString { + if (hideCreate!!) { + appendLine( + """ + const v$freeRegister, 0x2 + if-eq v$freeRegister, v$loopIndexRegister, :skipAddView + """ + ) + } + + if (hideReels!!) { + appendLine( + """ + const v$freeRegister, 0x3 + if-eq v$freeRegister, v$loopIndexRegister, :skipAddView + """ + ) + } + } + + addInstructionsWithLabels( + insertIndex, + instructions, + ExternalLabel("skipAddView", instruction) + ) + } + } + } + diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt new file mode 100644 index 000000000..3b58aa8c2 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt @@ -0,0 +1,17 @@ +package app.revanced.patches.instagram.hide.stories +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode + + +internal val getOrCreateAvatarViewFingerprint = fingerprint { + parameters() + returns("L") + custom { method, classDef -> + classDef.type == "Lcom/instagram/reels/ui/views/reelavatar/RecyclerReelAvatarView;" + } + opcodes( + Opcode.INVOKE_VIRTUAL, + Opcode.IPUT_OBJECT, + Opcode.INVOKE_VIRTUAL // Add View (Story) + ) + } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt new file mode 100644 index 000000000..65c51cf36 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.instagram.hide.stories +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.patch.bytecodePatch + +@Suppress("unused") +val hideStoriesPatch = bytecodePatch( + name = "Hide Stories from Home", + description = "Hides Stories from the main page, by removing the buttons.", + use = false +) { + compatibleWith("com.instagram.android") + + execute { + val addStoryMethod = getOrCreateAvatarViewFingerprint.method // Creates Story + val addStoryEndIndex = getOrCreateAvatarViewFingerprint.patternMatch!!.endIndex + + // Remove addView of Story. + addStoryMethod.removeInstruction(addStoryEndIndex) + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt index 473d8d400..cd81f1bb4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt @@ -8,7 +8,7 @@ val removeFreeAccountsLimitPatch = resourcePatch( name = "Remove free accounts limit", description = "Removes the limit for maximum free accounts logged in.", ) { - compatibleWith("ch.protonmail.android") + compatibleWith("ch.protonmail.android"("4.15.0")) execute { document("res/values/integers.xml").use { document -> diff --git a/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt index a59b8e7dd..44098a2df 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt @@ -10,7 +10,7 @@ val removeSentFromSignaturePatch = resourcePatch( name = "Remove 'Sent from' signature", description = "Removes the 'Sent from Proton Mail mobile' signature from emails.", ) { - compatibleWith("ch.protonmail.android") + compatibleWith("ch.protonmail.android"("4.15.0")) execute { val stringResourceFiles = mutableListOf() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt new file mode 100644 index 000000000..92ff76f9e --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt @@ -0,0 +1,17 @@ +package app.revanced.patches.reddit.customclients + +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.Patch +import app.revanced.patcher.patch.bytecodePatch + +const val INSTALL_NEW_CLIENT_METHOD = "install(Lokhttp3/OkHttpClient${'$'}Builder;)Lokhttp3/OkHttpClient;" +const val CREATE_NEW_CLIENT_METHOD = "createClient()Lokhttp3/OkHttpClient;" + +fun fixRedgifsApiPatch( + extensionPatch: Patch<*>, + block: BytecodePatchBuilder.() -> Unit = {}, +) = bytecodePatch(name = "Fix Redgifs API") { + dependsOn(extensionPatch) + + block() +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt new file mode 100644 index 000000000..524beeea0 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + + +internal val getOkHttpClientFingerprint = fingerprint { + returns("Lokhttp3/OkHttpClient;") + parameters() + custom { method, classDef -> + classDef.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;" && method.name == "getOkhttpClient" + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt new file mode 100644 index 000000000..4cd9db006 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt @@ -0,0 +1,53 @@ +package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs + +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD +import app.revanced.patches.reddit.customclients.baconreader.misc.extension.sharedExtensionPatch +import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.reference.TypeReference + +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/baconreader/FixRedgifsApiPatch;" + +@Suppress("unused") +val fixRedgifsApi = fixRedgifsApiPatch( + extensionPatch = sharedExtensionPatch +) { + compatibleWith( + "com.onelouder.baconreader", + "com.onelouder.baconreader.premium", + ) + + execute { + // region Patch Redgifs OkHttp3 client. + + getOkHttpClientFingerprint.method.apply { + // Remove conflicting OkHttp interceptors. + val originalInterceptorInstallIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.NEW_INSTANCE && getReference()?.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager\$HeaderInterceptor;" + } + removeInstructions(originalInterceptorInstallIndex, 5) + + val index = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" + } + val register = getInstruction(index).registerC + replaceInstruction( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD + """ + ) + } + + // endregion + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt new file mode 100644 index 000000000..64291f761 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt @@ -0,0 +1,6 @@ +package app.revanced.patches.reddit.customclients.baconreader.misc.extension + +import app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks.initHook +import app.revanced.patches.shared.misc.extension.sharedExtensionPatch + +val sharedExtensionPatch = sharedExtensionPatch("baconreader", initHook) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt new file mode 100644 index 000000000..fe644145b --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks + +import app.revanced.patches.shared.misc.extension.extensionHook + +internal val initHook = extensionHook { + custom { method, _ -> + method.definingClass == "Lcom/onelouder/baconreader/BaconReader;" && method.name == "onCreate" + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt new file mode 100644 index 000000000..1f3560d73 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal val createOkHttpClientFingerprint = fingerprint { + accessFlags(AccessFlags.PRIVATE) + opcodes( + Opcode.NEW_INSTANCE, + Opcode.INVOKE_DIRECT, + Opcode.NEW_INSTANCE, + Opcode.INVOKE_DIRECT, + Opcode.NEW_INSTANCE, + Opcode.INVOKE_DIRECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_OBJECT + ) + custom { _, classDef -> classDef.sourceFile == "RedGifsAPIv2.java" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt new file mode 100644 index 000000000..f19a5964d --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt @@ -0,0 +1,38 @@ +package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs + +import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patches.reddit.customclients.CREATE_NEW_CLIENT_METHOD +import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch +import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/boostforreddit/FixRedgifsApiPatch;" + +@Suppress("unused") +val fixRedgifsApi = fixRedgifsApiPatch( + extensionPatch = sharedExtensionPatch +) { + compatibleWith("com.rubenmayayo.reddit") + + execute { + // region Patch Redgifs OkHttp3 client. + + createOkHttpClientFingerprint.method.apply { + val index = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" + } + replaceInstruction( + index, + """ + invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->$CREATE_NEW_CLIENT_METHOD + """ + ) + } + + // endregion + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt new file mode 100644 index 000000000..16dfa4620 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt @@ -0,0 +1,39 @@ +package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs + +import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.fingerprint +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.writeRegister +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11n + + +internal val createOkHttpClientFingerprint = fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("V") + parameters() + custom { method, classDef -> + // There are four functions (each creating a client) defined in this file with very similar fingerprints. + // We're looking for the one that only creates one object (the builder) and sets client options true + // (thus never reloading the register with a 0). + classDef.sourceFile == "OkHttpHelper.java" && + method.instructions.count { it.opcode == Opcode.NEW_INSTANCE } == 1 && + method.indexOfFirstInstruction { + opcode == Opcode.CONST_4 && writeRegister == 1 && (this as Instruction11n).narrowLiteral == 0 + } == -1 + } +} + +internal val getDefaultUserAgentFingerprint = fingerprint { + custom { method, classDef -> + method.name == "getDefaultUserAgent" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} + +internal val getOriginalUserAgentFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { _, classDef -> classDef.sourceFile == "AccountSingleton.java" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt new file mode 100644 index 000000000..a4f3842f9 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt @@ -0,0 +1,56 @@ +package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD +import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch +import app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.sharedExtensionPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/syncforreddit/FixRedgifsApiPatch;" + +@Suppress("unused") +val fixRedgifsApi = fixRedgifsApiPatch( + extensionPatch = sharedExtensionPatch +) { + compatibleWith( + "com.laurencedawson.reddit_sync", + "com.laurencedawson.reddit_sync.pro", + "com.laurencedawson.reddit_sync.dev", + ) + + execute { + // region Patch Redgifs OkHttp3 client. + + createOkHttpClientFingerprint.method.apply { + val index = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" + } + val register = getInstruction(index).registerC + replaceInstruction( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD + """ + ) + } + + getDefaultUserAgentFingerprint.method.apply { + addInstructions( + 0, + """ + invoke-static { }, ${getOriginalUserAgentFingerprint.method} + move-result-object v0 + return-object v0 + """ + ) + } + + // endregion + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt index 2d7155a53..5ad833222 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt @@ -49,8 +49,8 @@ internal val contextMenuViewModelConstructorFingerprint = fingerprint { /** * Used to find the interface name of a context menu item. */ -internal val removeAdsContextMenuItemClassFingerprint = fingerprint { - strings("remove_ads_item", "ui_navigate") +internal val removeItemFromPlaylistContextMenuItemClassFingerprint = fingerprint { + strings("spotify:playlist:", "REMOVE_TRACK") } internal const val CONTEXT_MENU_ITEM_CLASS_DESCRIPTOR_PLACEHOLDER = "Lapp/revanced/ContextMenuItemPlaceholder;" diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 6883776e6..993fa820b 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -132,6 +132,7 @@ internal val Instruction.registersUsed: List get() = when (this) { is FiveRegisterInstruction -> { when (registerCount) { + 0 -> listOf() 1 -> listOf(registerC) 2 -> listOf(registerC, registerD) 3 -> listOf(registerC, registerD, registerE) diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index b45989a12..73ba5aefc 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -61,7 +61,7 @@ Um neue Sprachen zu übersetzen, besuchen Sie translate.revanced.app" ReVanced-Einstellungen importieren/exportieren Sie verwenden ReVanced-Patches Version <i>%s</i> - Anmerkung + Notiz Diese Version ist eine Vorabversion, es kann zu unerwarteten Problemen kommen Offizielle Links diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index f05fcf947..29b99f4e8 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -33,12 +33,12 @@ Second \"item\" text" הגדרות - האם בטוח שברצונך להמשיך? + האם אתה בטוח שברצונך להמשיך? איפוס אפס צבע צבע לא חוקי - יש להפעיל מחדש - יש להפעיל מחדש את האפליקציה כדי שהשינוי ישפיע. + נדרשת הפעלה מחדש + יש להפעיל מחדש את היישום כדי שהשינוי ייכנס לתוקף. הפעלה מחדש ייבוא העתק @@ -137,7 +137,7 @@ Second \"item\" text" תיעוד איתור באגים מושבת לא נמצאו יומנים היומנים הועתקו - נכשל ייצוא יומנים: %s + נכשל לייצא יומנים: %s נקה יומני איתור באגים מנקה את כל היומנים לאיתור באגים של Revanced המאוחסנים היומנים נוקו @@ -161,21 +161,21 @@ Second \"item\" text" הסתר תיבת מימון המונים תיבת מימון המונים מוסתרת תיבת מימון המונים מוצגת - הסתר כרטיס מתרחב - כרטיס מתרחב מתחת לסרטונים מוסתר - כרטיס מתרחב מתחת לסרטונים מוצג + הסתר כרטיס הניתן להרחבה + כרטיס הניתן להרחבה מתחת לסרטונים מוסתר + כרטיס הניתן להרחבה מתחת לסרטונים מוצג הסתר לחצן מיקרופון צף - כפתור מיקרופון צף בחיפוש מוסתר - כפתור מיקרופון צף בחיפוש מוצג + לחצן מיקרופון צף בחיפוש מוסתר + לחצן מיקרופון צף בחיפוש מוצג הסתר מדפים אופקיים "מדפים אופקיים מוסתרים, כגון: -• חדשות חמות +• מבזקי חדשות • המשך צפייה -• חקור עוד ערוצים -• הרלוונטיים ביותר +• גלה עוד ערוצים +• רלוונטיות • קניות • צפה שוב" - מוצגים מדפים אופקיים + מדפים אופקיים מוצגים הסתר מדף תמונות מדף תמונות בתוצאות חיפוש מוסתר מדף תמונות בתוצאות חיפוש מוצג @@ -191,30 +191,30 @@ Second \"item\" text" הסתר לחצן \'אני רוצה לקבל התראה\' - כפתור \'הודע לי\' מוסתר - כפתור \"הודע לי\" מוצג + הלחצן \'הודע לי\' מוסתר + הלחצן \'הודע לי\' מוצג הסתר משחקייה המשחקייה מוסתרת המשחקייה מוצגת הסתר לחצן \'הצג עוד\' - כפתור \"הצג עוד\" בתוצאות חיפוש מוסתר - כפתור הצג עוד בתוצאות החיפוש מוצג + הלחצן \'הצג עוד\' בתוצאות חיפוש מוסתר + הלחצן \'הצג עוד\' בתוצאות החיפוש מוצג הסתר סקרים - סקרים מוסתרים - סקרים מוצגים + הסקרים מוסתרים + הסקרים מוצגים הסתר מדף כרטיסים מדף כרטיסים מוסתר מדף כרטיסים מוצג - הסתר תוויות המלצות וידאו - בתוצאות החיפוש מוסתרות - תוויות \"אנשים גם צפו\" ו\"אולי תאהב גם\" בתוצאות חיפוש מוצגות + הסתר תוויות המלצות סרטונים + התוויות \'אנשים גם צפו\' ו\'אולי תאהב גם\' בתוצאות החיפוש מוסתרות + התוויות \'אנשים גם צפו\' ו\'אולי תאהב גם\' בתוצאות חיפוש מוצגות הסתר YouTube Doodles - אנימציית Doodles של YouTube על הלוגו מוסתרת - אנימציית YouTube Doodles על הלוגו מוצגת + הנפשת YouTube Doodles על הלוגו מוסתרת + הנפשת YouTube Doodles על הלוגו מוצגת "שרבוטים (Doodles) של YouTube מוצגים למשך כמה ימים בכל שנה. אם Doodle מוצג כרגע באזור שלך והגדרת ההסתרה הזו מופעלת, אז גם סרגל הסינון שמתחת לסרגל החיפוש יוסתר." @@ -233,8 +233,8 @@ Second \"item\" text" הסתר לחצן להצטרפות - כפתור \'הצטרף\' מוסתר - כפתור הצטרפות מוצג + לחצן הצטרפות מוסתר + לחצן הצטרפות מוצג הסתר לוחות רפואיים לוחות רפואיים מוסתרים לוחות רפואיים מוצגים @@ -251,8 +251,8 @@ Second \"item\" text" תגובות באמוג\'י מתוזמנות מוסתרות תגובות באמוג\'י מתוזמנות מוצגות הסתר את \'סיכום הווידאו שנוצר על ידי בינה מלאכותית\' - קטע סיכום וידאו שנוצר על ידי בינה מלאכותית מוסתר - קטע סיכום וידאו שנוצר על ידי AI מוצג + קטע סיכום סרטון הנוצר על ידי AI מוסתר + קטע סיכום סרטון הנוצר על ידי AI מוצג הסתר Ask מדור Ask מוסתר מדור Ask מוצג @@ -280,7 +280,7 @@ Second \"item\" text" תיאור סרטון הסתר או הצג רכיבי תיאור סרטון סרגל סינון - הסתר או הצג את סרגל הסינון בפידים, סרטונים קשורים, תוצאות חיפוש והיסטוריית צפייה + הסתר או הצג את סרגל הסינון בפידים, סרטונים קשורים, תוצאות חיפוש, והיסטוריית צפייה הסתר בפידים מוסתר בפידים מוצג בפידים @@ -297,8 +297,8 @@ Second \"item\" text" הסתר או הצג רכיבי דף ערוץ הסתר מדף \'בשבילך\' - מדף \"בשבילך\" מוסתר - מדף \"בשבילך\" מוצג + המדף \'בשבילך\' מוסתר + המדף \'בשבילך\' מוצג הסתר תצוגה מקדימה של קישורים תצוגה מקדימה של קישורים מוסתרת תצוגה מקדימה של קישורים מוצגת @@ -306,21 +306,21 @@ Second \"item\" text" מדף חברים מוסתר מדף חברים מוצג - הסתר את הלחצן \"בקר בקהילה\" - לחצן \"בקר בקהילה\" מוסתר - כפתור \"בקר בקהילה\" מוצג + הסתר את הלחצן \'מעבר לקהילה\' + הלחצן \'מעבר לקהילה\' מוסתר + הלחצן \'מעבר לקהילה\' מוצג הסתר לחצן \'בקר בחנות\' - כפתור \"בקר בחנות\" מוסתר - כפתור \"בקר בחנות\" מוצג + הלחצן \'בקר בחנות\' מוסתר + הלחצן \'בקר בחנות\' מוצג תגובות הסתר או הצג רכיבי מדור תגובות - הסתר סיכום צ\'אט בינה מלאכותית - סיכום צ\'אט בינה מלאכותית מוסתר - סיכום צ\'אט בינה מלאכותית מוצג + הסתר סיכום AI של צ\'אט + סיכום AI של צ\'אט מוסתר + סיכום AI של צ\'אט מוצג הסתר סיכום תגובות AI - סיכום תגובות בינה מלאכותית מוסתר - סיכום תגובות בינה מלאכותית מוצג + סיכום AI של תגובות מוסתר + סיכום AI של תגובות מוצג הסתר הנחיות ערוץ הנחיות הערוץ מוסתרות הנחיות הערוץ מוצגות @@ -392,10 +392,10 @@ Second \"item\" text" הסתר מדף חנות היוצר - מדף חנות היוצר מתחת לנגן הווידאו מוסתר - מדף חנות היוצר מתחת לנגן הווידאו מוצג + מדף חנות היוצר מתחת לנגן הוידאו מוסתר + מדף חנות היוצר מתחת לנגן הוידאו מוצג הסתר כרזת חנות של מסך סיום - באנר חנות מסך סיום מוסתר + באנר החנות של מסך סיום מוסתר באנר החנות של מסך הסיום מוצג הסתר מודעות מסך מלא "מודעות במסך מלא מוסתרות @@ -419,8 +419,8 @@ Second \"item\" text" הסתר קישורי קניות קישורי קניות בתיאור הסרטון מוסתרים קישורי קניות בתיאור הסרטון מוצגים - הסתר באנר \'צפה במוצרים\' - באנר הצגת המוצרים בשכבת-על של הווידאו מוסתר + הסתר באנר צפייה במוצרים + באנר צפייה במוצרים בשכבת-על של וידאו מוסתר באנר צפייה במוצרים בשכבת-על של וידאו מוצג הסתר תוצאות חיפוש באינטרנט תוצאות חיפוש באינטרנט מוסתרות @@ -453,14 +453,14 @@ Second \"item\" text" זה לא עוקף את מגבלת הגיל. זה רק מסכים לזה באופן אוטומטי. - השבתת חלון קופץ של כניסה לטלוויזיה + השבת חלון קופץ של כניסה לטלוויזיה חלון קופץ של כניסה לטלוויזיה מושבת חלון קופץ של כניסה לטלוויזיה מופעל - ביטול דילוג פרקים בלחיצה כפולה - לחיצה כפולה לעולם לא תפעיל דילוג לפרק הבא/הקודם - לחיצה כפולה יכולה להפעיל מדי פעם דילוג לפרק הבא/הקודם + השבת דילוג פרקים בהקשה כפולה + הקשה כפולה לעולם לא יכולה לגרום דילוג לפרק הבא/הקודם + הקשה כפולה יכולה לגרום מדי פעם דילוג לפרק הבא/הקודם הורדות חיצוניות @@ -473,14 +473,14 @@ Second \"item\" text" לחצן ההורדה פותח את המוריד החיצוני שלך לחצן ההורדה פותח את המוריד המקומי בתוך היישום שם חבילת מוריד - שם חבילה של אפליקציית ההורדה החיצונית המותקנת שלך + שם החבילה של יישום ההורדות החיצוני המותקן שלך הזן את שם החבילה אחר - האפליקציה לא מותקנת + היישום לא מותקן %s אינו מותקן. נא להתקין אותו. - "לא ניתן למצוא אפליקציה מותקנת עם שם החבילה: %s + "לא ניתן למצוא יישום מותקן עם שם חבילה: %s -ודא/י ששם החבילה נכון ושהאפליקציה מותקנת" +יש לוודא ששם החבילה נכון ושהיישום מותקן" שם החבילה אינו יכול להיות ריק @@ -564,9 +564,9 @@ Second \"item\" text" לחצן שיתוף מוסתר לחצן שיתוף מוצג - הסתר עצור מודעות - כפתור עצירת הפרסומות מוסתר - כפתור עצירת הפרסומות מוצג + הסתר עצירת מודעות + לחצן עצירת מודעות מוסתר + לחצן עצירת מודעות מוצג הסתר דיווח @@ -582,13 +582,13 @@ Second \"item\" text" לחצן הורדה מוצג - הסתר הייפ - כפתור הייפ מוסתר - כפתור ההייפ מוצג + הסתר באז + לחצן באז מוסתר + לחצן באז מוצג הסתר קידום - כפתור קידום מוסתר - כפתור קידום מוצג + הלחצן \'קידום\' מוסתר + הלחצן \'קידום\' מוצג הסתר תודה לחצן תודה מוסתר @@ -603,9 +603,9 @@ Second \"item\" text" לחצן קליפ מוסתר לחצן קליפ מוצג - הסתר שמירה - כפתור השמירה מוסתר - כפתור השמירה מוצג + הסתר \'שמירה\' + הלחצן \'שמירה\' מוסתר + הלחצן שמירה\' מוצג לחצני ניווט @@ -707,9 +707,9 @@ Second \"item\" text" הסתר \'צפה ב-VR\' תפריט \'צפה ב-VR\' מוסתר תפריט \'צפה ב-VR\' מוצג - הסתר תפריט איכות וידאו - תפריט איכות הסרטון מוסתר - תפריט איכות הסרטון מוצג + הסתר תפריט איכות סרטון + תפריט איכות סרטון מוסתר + תפריט איכות סרטון מוצג הסתר כותרת תחתונה של תפריט איכות סרטון כותרת תחתונה של תפריט איכות סרטון מוסתרת כותרת תחתונה של תפריט איכות סרטון מוצגת @@ -725,7 +725,7 @@ Second \"item\" text" הסתר לחצן העברה לחצן העברה מוסתר לחצן העברה מוצג - הסתר רקע פקדי נגן + הסתר רקע פקדי הנגן רקע פקדי הנגן מוסתר רקע פקדי הנגן מוצג הסתר לחצני הקודם & הבא @@ -753,20 +753,20 @@ Second \"item\" text" מספרים מתגלגלים מונפשים - הסתר סרגל חיפוש נגן וידאו + הסתר סרגל דילוג של נגן וידאו סרגל דילוג של נגן וידאו מוסתר סרגל דילוג של נגן וידאו מוצג - הסתר סרגל חיפוש תמונות ממוזערות של וידאו - סרגל חיפוש תמונות ממוזערות של וידאו מוסתר - סרגל חיפוש תמונות ממוזערות של וידאו מוצג + הסתר סרגל דילוג עם תמונות ממוזערות של סרטון + סרגל דילוג עם תמונות ממוזערות של סרטון מוסתר + סרגל דילוג עם תמונות ממוזערות של סרטון מוצג נגן Shorts הסתר או הצג רכיבי נגן Shorts להסתיר Shorts בפיד הבית - מוסתר בפיד הבית וסרטונים קשורים + מוסתר בפיד הבית ובסרטונים קשורים מוצג בפיד הבית ובסרטונים קשורים הסתר Shorts בתוצאות חיפוש מוסתר בתוצאות חיפוש @@ -774,16 +774,16 @@ Second \"item\" text" להסתיר Shorts בפיד המינויים מוסתר בפיד המנויים - מוצג בפיד מינויים + מוצג בפיד המינויים הסתר Shorts בהיסטוריית הצפייה מוסתר בהיסטוריית הצפייה מוצג בהיסטוריית הצפייה הסתר לחצן קנה סופר תודה - כפתור \'קנה תודה רבה\' מוסתר - כפתור קניית Super Thanks מוצג - הסתר כפתור אפקט - כפתור האפקט מוסתר - כפתור האפקט מוצג + הלחצן \'קנה סופר תודה\' מוסתר + הלחצן \'קנה סופר תודה\' מוצג + הסתר לחצן \'אפקט\' + הלחצן \'אפקט\' מוסתר + הלחצן \'אפקט\' מוצג הסתר לחצן מסך ירוק לחצן מסך ירוק מוסתר לחצן מסך ירוק מוצג @@ -827,12 +827,12 @@ Second \"item\" text" הסתר לחצן \'בקרוב\' לחצן \'בקרוב\' מוסתר לחצן \'בקרוב\' מוצג - הסתר את כפתור \"השתמש בצליל זה\" - כפתור \"השתמש בצליל זה\" מוסתר - כפתור \"השתמש בצליל זה\" מוצג - הסתר כפתור השתמש בתבנית זו - כפתור \"השתמש בתבנית זו\" מוסתר - כפתור השתמש בתבנית זו מוצג + הסתר לחצן \'השתמש בצליל זה\' + הלחצן \'השתמש בצליל זה\' מוסתר + הלחצן \'השתמש בצליל זה\' מוצג + הסתר לחצן השתמש בתבנית זו + הלחצן \'השתמש בתבנית זו\' מוסתר + הלחצן \'השתמש בתבנית זו\' מוצג הסתר הנפשת מזרקה של לחצן אהבתי הנפשת מזרקה של לחצן אהבתי מוסתרת הנפשת מזרקה של לחצן אהבתי מוצגת @@ -866,8 +866,8 @@ Second \"item\" text" כותרת הסרטון מוסתרת כותרת הסרטון מוצגת הסתר תווית מטא-נתונים של סאונד - תווית מטא-נתונים של צליל מוסתרת - תווית מטא-נתונים של צליל מוצגת + תווית מטא-נתונים של שמע מוסתרת + תווית מטא-נתונים של שמע מוצגת הסתר תווית קישור לסרטון תווית קישור סרטון מוסתרת תווית קישור סרטון מוצגת @@ -887,7 +887,7 @@ Second \"item\" text" הסתר שכבת-על של סרטונים קשורים שכבת-על של סרטונים קשורים במסך מלא מוסתרת - שכבת סרטונים קשורים במסך מלא מוצגת + שכבת-על של סרטונים קשורים במסך מלא מוצגת הסתר חותמת זמן של סרטון @@ -1003,14 +1003,14 @@ Second \"item\" text" לחצן דילוג נעלם לאחר כמה שניות לחצן דילוג מוצג עבור כל המקטע משך לחצן הדילוג - כמה זמן להציג את כפתורי הדילוג ודילוג לסימון לפני הסתרה אוטומטית + למשך כמה זמן להציג את לחצני הדילוג והדילוג לגולת הכותרת לפני הסתרה אוטומטית הצג הודעה קופצת לביטול דילוג הודעה קופצת מוצגת כאשר קטע מדולג אוטומטית. הקש על ההודעה הקופצת כדי לבטל את הדילוג - הטוסט לא מוצג - משך טוסט הדילוג - כמה זמן להציג את הודעת \"טוסט\" ביטול הדילוג + ההודעה הקופצת אינה מוצגת + משך הודעת דילוג קופצת + למשך כמה זמן להציג את ההודעה הקופצת לביטול הדילוג שנייה אחת - שתי שניות + 2 שניות 3 שניות 4 שניות 5 שניות @@ -1020,7 +1020,7 @@ Second \"item\" text" 9 שניות 10 שניות הצג אורך סרטון ללא מקטעים - אורך הסרטון פחות כל המקטעים מוצג על פס הניווט + אורך הסרטון פחות כל המקטעים מוצג על סרגל הדילוג אורך סרטון מלא מוצג יוצר מקטעים חדשים הצג לחצן יצירת מקטע חדש @@ -1353,10 +1353,10 @@ Second \"item\" text" כרטיסיית דף הבית - מינויים + כרטיסיית מינויים כרטיסיית הדף שלי - פלייליסטים והמלצות של נגן + פלייליסטים & המלצות של נגן תוצאות חיפוש תמונות ממוזערות מקוריות תמונות ממוזערות מקוריות & DeArrow @@ -1464,9 +1464,9 @@ Second \"item\" text" זכור שינויי איכות סרטון שינויי איכות חלים על כל הסרטונים שינויי איכות חלים רק על הסרטון הנוכחי - הצג הודעה קופצת בעת שינויים באיכות הווידאו - מוצגת הודעה קופצת כאשר איכות הווידאו המוגדרת כברירת מחדל משתנה - הודעה קופצת אינה מוצגת כאשר איכות הווידאו המוגדרת כברירת מחדל משתנה + הצג הודעה קופצת בעת שינויים באיכות הסרטון + מוצגת הודעה קופצת כאשר איכות הסרטון ברירת המחדל משתנה + לא מוצגת הודעה קופצת כאשר איכות הסרטון ברירת המחדל משתנה איכות סרטון ברירת מחדל ברשת אלחוטית איכות סרטון ברירת מחדל ברשת סלולרית זכור שינויי איכות Shorts @@ -1485,8 +1485,8 @@ Second \"item\" text" הלחצן אינו מוצג - הצג כפתור איכות וידאו - הלחצן מוצג. גע והחזק כדי לאפס את האיכות לברירת מחדל + הצג לחצן איכות סרטון + הלחצן מוצג. הקש והחזק כדי לאפס את האיכות לברירת מחדל הלחצן אינו מוצג @@ -1509,8 +1509,8 @@ Second \"item\" text" שינויי מהירות הפעלה חלים על כל הסרטונים שינויי מהירות הפעלה חלים רק על הסרטון הנוכחי הצג הודעה קופצת בעת שינויים במהירות ההפעלה - מוצגת הודעה קופצת כאשר מהירות ההפעלה המוגדרת כברירת מחדל משתנה - הודעה קופצת אינה מוצגת כאשר מהירות ההפעלה המוגדרת כברירת מחדל משתנה + מוצגת הודעה קופצת כאשר מהירות ההפעלה ברירת המחדל משתנה + לא מוצגת הודעה קוצפת כאשר מהירות ההפעלה ברירת המחדל משתנה מהירות הפעלה ברירת מחדל מהירות ברירת המחדל שונתה ל: %s @@ -1581,7 +1581,7 @@ Second \"item\" text" מודעות סרטון אינן חסומות - הודעה נמחקה + ההודעה נמחקה הצג הודעות שנמחקו אל תציג הודעות שנמחקו הסתר מודעות שנמחקו מאחורי ספויילר @@ -1602,7 +1602,7 @@ Second \"item\" text" הגדרות ReVanced אודות אודות ReVanced - חסימת פרסומות + חסימת מודעות הגדרות חסימת מודעות צ\'אט הגדרות צ\'אט 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 23d203e21..eb37b8a57 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -195,9 +195,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 「通知を受け取る」ボタンを非表示 「通知を受け取る」ボタンは表示されません 「通知を受け取る」ボタンは表示されます - ゲームを非表示 - ゲームは表示されません - ゲームは表示されます + ゲームルームを非表示 + ゲームルームは表示されません + ゲームルームは表示されます 「もっと見る」ボタンを非表示 @@ -486,47 +486,47 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に パッケージ名は空欄にはできません - 精密シークモードを無効にする - シークバーを上へスワイプしても、精密シークモードになりません - シークバーを上へスワイプすると、精密シークモードになります + 精密シーク ジェスチャーを無効化 + 精密シーク ジェスチャーは無効です。シークバーを上へスワイプしても、「再生位置の細かい調整」モードにはなりません + 精密シーク ジェスチャーは有効です。シークバーを上へスワイプすると、「再生位置の細かい調整」モードになります - タップによるシークを有効にする - シークバーをタップすると、タップした位置にシークします - シークバーをタップしても、タップした位置にシークしません + タップによるシークを有効化 + タップによるシークは有効です。シークバーをタップすると、タップした位置に移動します + タップによるシークは無効です。シークバーをタップしても、タップした位置に移動しません - 明るさジェスチャーを有効にする + 明るさジェスチャーを有効化 "全画面表示中の明るさジェスチャーは有効です 画面左側を縦にスワイプして明るさを調節します" 全画面表示中の明るさジェスチャーは無効です - 音量ジェスチャーを有効にする + 音量ジェスチャーを有効化 "全画面表示中の音量ジェスチャーは有効です 画面右側を縦にスワイプして音量を調節します" 全画面表示中の音量ジェスチャーは無効です - 長押しスワイプを有効にする - 全画面表示中、画面を長押ししてから縦にスワイプして明るさや音量を調節します - 全画面表示中、画面を縦にスワイプして明るさや音量を調節します - 触覚フィードバックを有効にする + 長押しスワイプ ジェスチャーを有効化 + 長押しスワイプは有効です\n\n画面を長押ししてから縦にスワイプすると、明るさ / 音量ジェスチャーとして認識されます + 長押しスワイプは無効です\n\n画面を縦にスワイプすると、明るさ / 音量ジェスチャーとして認識されます + 触覚フィードバックを有効化 触覚フィードバックは有効です 触覚フィードバックは無効です - 明るさを保存する - 全画面表示を開始 / 解除するとき、明るさを復元 / 保存します - 全画面表示を開始 / 解除するとき、明るさを復元 / 保存しません - 明るさジェスチャーの自動調節を有効にする - ジェスチャーで明るさを最小値まで下げると、明るさが自動調節されます - ジェスチャーで明るさを最小値まで下げても、明るさは自動調節されません + 明るさを保存&復元 + 全画面表示を終了 / 開始するときに明るさを保存 / 復元します + 全画面表示を終了 / 開始するときに明るさを保存 / 復元しません + 明るさジェスチャーの自動調節を有効化 + ジェスチャーで明るさを最小値まで下げると、明るさが自動で調節されます + ジェスチャーで明るさを最小値まで下げても、明るさは自動で調節されません 自動 オーバーレイのタイムアウト スワイプ オーバーレイが表示される時間 (ミリ秒) オーバーレイの背景の透明度 透明度の範囲は 0-100 で、0 が透明です スワイプ: 透明度の範囲は 0-100 です - 明るさグラフの色 + オーバーレイの明るさグラフの色 スワイプ中の明るさの現在値を視覚的に表示するグラフの色 - 音量グラフの色 + オーバーレイの音量グラフの色 スワイプ中の音量の現在値を視覚的に表示するグラフの色 オーバーレイのテキストサイズ スワイプ オーバーレイのテキストサイズ (1-30) @@ -536,21 +536,21 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 音量ジェスチャーのスワイプ感度 スワイプによる音量の変化量 オーバーレイのスタイル - 横長 - 横長 (最小限 - 画面上部) - 横長 (最小限 - 画面中央) + 横型 + 横型 (最小限 - 画面上部) + 横型 (最小限 - 画面中央) 円形 円形 (最小限) - 縦長 - 縦長 (最小限) - スワイプして動画を切り替える - 全画面表示でスワイプすると、次 / 前の動画に切り替わります - 全画面表示でスワイプしても、次 / 前の動画に切り替わりません + 縦型 + 縦型 (最小限) + スワイプによる動画の切り替えを有効化 + 全画面表示中に左 / 右にスワイプすると、前 / 次の動画に切り替わります + 全画面表示中に左 / 右にスワイプしても、前 / 次の動画に切り替わりません 自動字幕表示を無効化 - 自動字幕表示は無効です\n\n動画を開いた際にデフォルトで字幕は表示されません - 自動字幕表示は有効です\n\n動画を開いた際にデフォルトで字幕が表示される場合があります + 自動字幕表示は無効です\n\n字幕がオフの状態で動画を開きます + 自動字幕表示は有効です\n\n字幕がオンの状態で動画を開く場合があります アクション ボタン @@ -588,18 +588,18 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に ハイプボタンは表示されません ハイプボタンは表示されます - プロモート ボタンを非表示 - プロモート ボタンは表示されません - プロモート ボタンは表示されます + プロモーション ボタンを非表示 + プロモーション ボタンは表示されません + プロモーション ボタンは表示されます Thanks ボタンを非表示 Thanks ボタンは表示されません Thanks ボタンは表示されます - 質問ボタンを非表示 - 質問ボタンは表示されません - 質問ボタンは表示されます + 「質問する」ボタンを非表示 + 「質問する」ボタンは表示されません + 「質問する」ボタンは表示されます クリップボタンを非表示 クリップボタンは表示されません @@ -755,13 +755,13 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 数字の回転アニメーションは有効です - 動画プレーヤーのシークバーを非表示 + プレーヤーのシークバーを非表示 動画プレーヤーのシークバーは表示されません 動画プレーヤーのシークバーは表示されます - 動画のサムネイルのシークバーを非表示 - フィードや再生履歴などの動画のサムネイルのシークバーは表示されません - フィードや再生履歴などの動画のサムネイルのシークバーは表示されます + サムネイルのシークバーを非表示 + フィードや再生履歴などに表示される動画のサムネイルのシークバーは表示されません + フィードや再生履歴などに表示される動画のサムネイルのシークバーは表示されます ショート プレーヤー @@ -878,12 +878,12 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に ナビゲーション バーは表示されます - 再生終了時の「関連動画」を非表示 - "再生が終了したときに、「関連動画」はプレーヤー画面に表示されませんが、自動再生がオンの場合は次の動画が自動で再生されます + 終了画面の「関連動画」を非表示 + "終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます 自動再生の設定は YouTube の設定で変更できます: 設定 → 再生 → 次の動画を自動再生" - 再生が終了したときに「関連動画」がプレーヤー画面に表示されます + 終了画面の「関連動画」は表示されます 関連動画オーバーレイを非表示 @@ -891,9 +891,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 全画面表示の関連動画オーバーレイは表示されます - タイムスタンプを非表示 - タイムスタンプは表示されません - タイムスタンプは表示されます + 動画のタイムスタンプを非表示 + 動画の現在位置を示すタイムスタンプは表示されません + 動画の現在位置を示すタイムスタンプは表示されます プレーヤー ポップアップ パネルを非表示 @@ -919,51 +919,51 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に - 低評価表示は一時的に利用できません (API タイムアウト) - 低評価表示は利用できません (ステータス %d) - 低評価表示は利用できません (クライアント API のレート制限) - 低評価表示は利用できません (%s) + 低評価数表示は一時的に利用できません (API タイムアウト) + 低評価数表示は利用できません (status %d) + 低評価数表示は利用できません (API のレート制限) + 低評価数表示は利用できません (%s) - Return YouTube Dislike を有効にして投票するには、動画をリロードしてください + Return YouTube Dislike: 投票するには、再読み込みが必要です - 所有者によって非表示 - 低評価は表示されます - 低評価は表示されません - ショート動画の低評価を表示する - "ショート動画の低評価は表示されます + 非公開 + 低評価数は表示されます + 低評価数は表示されません + ショート動画の低評価数を表示 + "ショート動画の低評価数は表示されます -制限事項: シークレット モードでは低評価が表示されない場合があります" - ショート動画の低評価は表示されません - 低評価をパーセントで表示する - 低評価はパーセンテージで表示されます +制限事項: シークレット モードでは低評価数が表示されない場合があります" + ショート動画の低評価数は表示されません + 低評価をパーセントで表示 + 低評価はパーセントで表示されます 低評価は投票数で表示されます コンパクトな高評価ボタン - コンパクトな高評価ボタンが表示されます + コンパクトな横幅の高評価ボタンが表示されます 通常の高評価ボタンが表示されます - 高評価の推定値を表示する - 高評価が非公開の動画には、推定値が表示されます + 高評価の推定値を表示 + 高評価数が非公開の動画には推定値が表示されます 高評価の推定値は表示されません API 利用不可時にトーストを表示 - Return YouTube Dislike が利用できない場合、トーストが表示されます - Return YouTube Dislike が利用できない場合でも、トーストは表示されません + Return YouTube Dislike が利用できない場合にトースト通知が表示されます + Return YouTube Dislike が利用できない場合にトースト通知は表示されません データは Return YouTube Dislike API によって提供されています。詳細は、ここをタップしてください - このデバイスの Return YouTube Dislike API 統計情報 - API 応答時間 (平均) - API 応答時間 (最小) - API 応答時間 (最大) - API 応答時間 (直近) - 低評価表示は一時的に利用できません - クライアント API のレート制限が原因です - API 投票取得 (呼び出し回数) - ネットワーク通信は行われていません - %d 回のネットワーク通信が行われました - API 投票取得 (タイムアウト回数) - ネットワーク通信はタイムアウトしていません - %d 回のネットワーク通信がタイムアウトしました + このデバイスの ReturnYouTubeDislike API 統計情報 + API の応答時間 (平均) + API の応答時間 (最小) + API の応答時間 (最大) + API の応答時間 (直近) + 低評価数表示は一時的に利用できません。クライアント API のレート制限が原因です + API の投票数取得 (呼び出し回数) + ネットワーク呼び出しは実行されていません + %d 回のネットワーク呼び出しが実行されました + API の投票数取得 (タイムアウト回数) + ネットワーク呼び出しはタイムアウトしていません + %d 回のネットワーク呼び出しがタイムアウトしました API クライアントのレート制限 - クライアント レート制限は発生していません - %d 回のクライアント レート制限が発生しました + クライアントのレート制限には遭遇していません + クライアントのレート制限に %d 回遭遇しました %d ミリ秒 @@ -972,32 +972,32 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に ワイド検索バーは無効です - 高画質サムネイルを有効にする - シークバーのサムネイルは高画質です - シークバーのサムネイルは中画質です + 高画質サムネイルを有効化 + シークバー サムネイルは高画質です + シークバー サムネイルは中画質です プレーヤー画面全体表示のサムネイルは高画質です プレーヤー画面全体表示のサムネイルは中画質です "この機能を有効にすると、シークバー サムネイルを保持していないライブ配信でもシークバー サムネイルが表示されるようになります。 -シークバー サムネイルは、動画の再生中の画質と同じ画質になります。 +シークバー サムネイルは、再生中の動画と同じ画質になります。 この機能は、非常に高速なインターネット接続を使用して 720P 以下の画質で動画を視聴する場合に最適です。" - 古いシークバー サムネイルを復元 + 古いスタイルのシークバー サムネイルを復元 シーク中のサムネイルはシークバーの上に表示されます シーク中のサムネイルはプレーヤー画面全体に表示されます - SponsorBlock を有効にする - SponsorBlock は、ユーザーからの情報提供により YouTube 動画のわずらわしい部分を定義してスキップする機能です + SponsorBlock を有効化 + SponsorBlock は、ユーザーからの情報提供により YouTube 動画のわずらわしい部分をスキップする機能です 外観 - 投票ボタンを表示する - セグメントへの投票ボタンは、プレーヤー オーバーレイに表示されます - セグメントへの投票ボタンは、プレーヤー オーバーレイに表示されません - 四角ボタンを使用する + 投票ボタンを表示 + セグメントへの投票ボタンがプレーヤー オーバーレイに表示されます + セグメントへの投票ボタンはプレーヤー オーバーレイに表示されません + 四角ボタンを使用 ボタンとコントロールの角は直角です ボタンとコントロールの角は丸角です - コンパクトなスキップボタンを使用する + コンパクトなスキップボタンを使用 コンパクトなスキップボタンが表示されます 通常のスキップボタンが表示されます スキップボタンを自動的に非表示 @@ -1005,11 +1005,11 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に スキップボタンは、セグメントの開始から終了まで表示されます スキップボタンの表示時間 自動非表示設定のスキップボタンと「ハイライトまでスキップ」ボタンが表示される時間の長さ - スキップ取り消しトーストを表示 - セグメントが自動的にスキップされたとき、トーストが表示されます。このトースト通知をタップすると、スキップが取り消されます - セグメントが自動的にスキップされたとき、トーストは表示されません + 自動スキップ時にトーストを表示 + セグメントが自動的にスキップされたときにトースト通知が表示されます。このトースト通知をタップすると、スキップを取り消すことができます + セグメントが自動的にスキップされたときにトースト通知は表示されません。このトースト通知をタップすると、スキップを取り消すことができます スキップ トーストの表示時間 - スキップ取り消しトーストが表示される時間の長さ + 自動スキップ時にトースト通知が表示される時間の長さ 1 秒 2 秒 3 秒 @@ -1023,11 +1023,11 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に セグメントを除いた再生時間を表示 すべてのセグメントを除いた再生時間がシークバーに表示されます 動画全体の再生時間のみがシークバーに表示されます - セグメントの作成 + 新しいセグメントの作成 セグメント作成ボタンを表示 - セグメント作成ボタンはプレーヤー オーバーレイに表示されます + セグメント作成ボタンがプレーヤー オーバーレイに表示されます セグメント作成ボタンはプレーヤー オーバーレイに表示されません - セグメントの時間調整幅 + セグメントの位置調整幅 セグメント作成メニュー内の早送り / 巻き戻しボタンで移動する時間 (ミリ秒) 値は正の整数でなければなりません ガイドラインを見る @@ -1037,15 +1037,15 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 既読 表示する その他 - API 利用不可時にトーストを表示する - SponsorBlock が利用できない場合は、トーストが表示されます - SponsorBlock が利用できない場合でも、トーストは表示されません - スキップデータを送信する + API 利用不可時にトーストを表示 + SponsorBlock が利用できない場合にトースト通知が表示されます + SponsorBlock が利用できない場合にトースト通知は表示されません + スキップデータの収集を有効化 SponsorBlock リーダーボード にスキップによって節約した時間を送信します。セグメントをスキップする度にデータが送信されます - スキップデータは送信されません + スキップデータの収集は無効です セグメントの長さのしきい値 この値 (秒) よりも短い時間のセグメントは、スキップもプレーヤーに表示もされません - 時間の値が無効です + 時間 (長さ) の値が無効です 非公開ユーザー ID この ID は公開すべきではありません。パスワードのようなものであり、誰とも共有すべきではありません。もし誰かがこの ID を手に入れた場合、あなたになりすますことができます 非公開ユーザー ID は 30 文字以上必要です @@ -1061,9 +1061,11 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 設定のインポートに成功しました インポートに失敗しました: %s エクスポートに失敗しました: %s - "設定には、SponsorBlock の非公開ユーザー ID が含まれています。この ID はパスワードのようなものであり、決して共有すべきではありません。" + "設定には、SponsorBlock の非公開ユーザー ID が含まれています。 + +このユーザー ID は、パスワードのようなものであり、決して共有すべきではありません。" 今後表示しない - セグメントの挙動を変更 + セグメントに対する動作を変更 スポンサー 有料の宣伝 、有料の紹介、直接的な広告。自己宣伝や好意をもって行う、慈善活動、クリエーター、ウェブサイト、製品などの無償の紹介は含まれません 無報酬の宣伝 / 自己宣伝 @@ -1073,7 +1075,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に ハイライト 動画の中で最も重要な場面 幕間 / オープニング - 実際のコンテンツを含まない区間。このカテゴリーは、一時停止、静止画、繰り返しアニメーションなどを含みます。情報を含むトランジッション (場面転換) は含まれません + 実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリーではありません 終了画面 / クレジット クレジット、または YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリーには含まれません 予告編 / 総集編 / フック @@ -1081,7 +1083,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 尺稼ぎの余談 / 冗談 動画の本筋を理解するために必要のない、尺稼ぎやユーモアのみを目的として追加された脱線的な場面。コンテキストや背景情報を提供する場面は、このカテゴリーに含まれません 音楽: 楽曲以外の区間 - ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間。このカテゴリーのセグメントは、他のカテゴリーのセグメントと重なる場合があります + ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間であり、公式や他のメディアの音源に存在しない区間 スキップ ハイライト スポンサーをスキップ @@ -1120,7 +1122,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 無効 セグメントの送信に失敗しました: %s SponsorBlock は一時的にダウンしています - セグメントの送信に失敗しました (ステータス: %1$d %2$s) + セグメントの送信に失敗しました (status: %1$d %2$s) セグメントの送信に失敗しました (レート制限: 同じユーザー / IP からの通信が多すぎます) セグメントを送信できません: %s "セグメントを送信できません。 @@ -1128,27 +1130,27 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に セグメントの送信に成功しました SponsorBlock は一時的に利用できません (API タイムアウト) - SponsorBlock は一時的に利用できません (ステータス %d) + SponsorBlock は一時的に利用できません (status %d) SponsorBlock は一時的に利用できません セグメントへの投票に失敗しました (API タイムアウト) - セグメントへの投票に失敗しました (ステータス: %1$d %2$s) + セグメントへの投票に失敗しました (status: %1$d %2$s) セグメントへの投票に失敗しました: %s 高評価 低評価 カテゴリーの変更 - 投票できるセグメントがありません + 投票先のセグメントが指定されていません %1$s ~ %2$s セグメントのカテゴリーを選択してください - カテゴリーが設定で無効になっています。送信するには、カテゴリーを有効にしてください。 - セグメント作成 - %s を新しいセグメントの開始時間 / 終了時間に設定しますか? - 開始 - 終了 - 現在 - セグメントの開始時間 - セグメントの終了時間 - 時間は正確ですか? + カテゴリーが設定で無効になっています。送信するには、このカテゴリーを有効にしてください。 + 新しいセグメント + %s を新しいセグメント (SponsorBlock) の開始位置 / 終了位置に設定しますか? + 開始位置 + 終了位置 + 現在の再生位置 + セグメントの開始位置 + セグメントの終了位置 + 範囲は正確ですか? "セグメントの範囲: %1$s @@ -1158,12 +1160,12 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に (%3$s) 送信しますか?" - 開始時間は終了時間より前でなければなりません - 開始時間と終了時間を設定してください + 開始位置を終了位置よりも前にしてください + 先に開始位置と終了位置を設定してください セグメントをプレビューして、スムーズにスキップすることを確認してください セグメントの範囲を手動で編集 - セグメントの開始時間または終了時間を編集しますか? - 時間の値が無効です + セグメントの開始位置または終了位置を編集しますか? + 時間 (位置) の値が無効です 統計 統計情報は一時的に利用できません (API がダウンしています) @@ -1171,7 +1173,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に SponsorBlock は無効です ユーザー名: <b>%s</b> ユーザー名を変更するには、ここをタップしてください - ユーザー名の変更に失敗しました (ステータス: %1$d %2$s) + ユーザー名の変更に失敗しました (status: %1$d %2$s) ユーザー名の変更に成功しました あなたの評価は <b>%.2f</b> です 合計で <b>%s</b> 個のセグメントを作成しました @@ -1324,13 +1326,13 @@ Automotive レイアウト スプラッシュ画面のスタイル カラー 白黒 - 編集したシークバーの色を使用する - 編集したシークバーの色が表示されます - デフォルトのシークバーの色が表示されます + 編集したシークバーの色を有効化 + シークバーは編集した色で表示されます + シークバーはデフォルトの色で表示されます シークバーの色 - シークバーの色の値を編集します + シークバーの色を編集します シークバーのアクセント カラー - シークバーのアクセントカラーの値を編集します + シークバーのアクセントカラーを編集します シークバーの色の値が無効です @@ -1379,7 +1381,7 @@ Automotive レイアウト 動画の中盤 動画の終盤 - DeArrow は一時的に利用できません (ステータス コード: %s) + DeArrow は一時的に利用できません (status code: %s) DeArrow は一時的に利用できません @@ -1421,9 +1423,9 @@ Automotive レイアウト チャプターの触覚フィードバックを無効にする チャプターの触覚フィードバックは無効です チャプターの触覚フィードバックは有効です - 精密シークモードの触覚フィードバックを無効にする - 精密シークモードの触覚フィードバックは無効です - 精密シークモードの触覚フィードバックは有効です + 精密シークの触覚フィードバックを無効化 + 精密シークの触覚フィードバックは無効です + 精密シークの触覚フィードバックは有効です シーク取り消しの触覚フィードバックを無効にする シーク取り消しの触覚フィードバックは無効です シーク取り消しの触覚フィードバックは有効です @@ -1451,8 +1453,8 @@ Automotive レイアウト オリジナルの音声を強制的に使用 - オリジナルの音声トラック (言語) を使用します - アプリが選択した音声トラック (言語) を使用します + オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用しません + アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックを使用する場合があります この機能を使用するには、「動画ストリームを偽装」のクライアントを iOS TV に変更してください @@ -1523,9 +1525,9 @@ Automotive レイアウト 通常の画質メニューが表示されます - スライドしてシークする機能を有効にする - スライドしてシークする機能が有効になっています - スライドしてシークする機能は無効になっています + スライドによるシークを有効化 + スライドによるシークは有効です。プレーヤー画面を左右にスライドすると、前後にシークします + スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません 動画ストリームを偽装 diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 26e27fab7..9eba09648 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -158,9 +158,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 소형 배너 숨기기 소형 배너가 숨겨집니다 소형 배너가 표시됩니다 - 크라우드 펀딩 박스 숨기기 - 플레이어 하단에서 크라우드 펀딩 박스가 숨겨집니다 - 플레이어 하단에서 크라우드 펀딩 박스가 표시됩니다 + 모금 행사 패널 숨기기 + 모금 행사 패널이 숨겨집니다 + 모금 행사 패널이 표시됩니다 펼쳐볼 수 있는 정보 숨기기 썸네일 하단에서 다음 정보들이 숨겨집니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. 썸네일 하단에서 다음 정보들이 표시됩니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. @@ -196,9 +196,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 \'알림 받기\' 버튼 숨기기 에정 동영상 하단에서 \'알림 받기\' 버튼이 숨겨집니다 예전 동영상 하단에서 \'알림 받기\' 버튼이 표시됩니다 - Playables(게임 룸) 선반 숨기기 - 게임 룸 선반이 숨겨집니다 - 게임 룸 선반이 표시됩니다 + 게임 룸 숨기기 + 게임 룸이 숨겨집니다 + 게임 룸이 표시됩니다 \'자세히 보기\' 버튼 숨기기 @@ -402,7 +402,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 전체 화면 광고 숨기기 "전체 화면 광고가 숨겨집니다 -이 설정은 구형 기기에서만 사용할 수 있습니다" +이 기능은 구형 기기에서만 사용할 수 있습니다" 전체 화면 광고가 표시됩니다 \'전체 화면 광고 숨기기\'는 구형 기기에서만 사용할 수 있습니다 @@ -701,7 +701,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 "오디오 트랙 메뉴가 숨겨집니다 -오디오 트랙 메뉴를 표시하려면 '스트리밍 데이터 변경하기'에서 기본 클라이언트를 iOS TV로 변경하세요" +오디오 트랙 메뉴를 표시하려면, '동영상 스트림 변경하기'에서 기본 클라이언트를 iOS TV로 변경하세요" VR로 보기 메뉴 숨기기 VR로 보기 메뉴가 숨겨집니다 @@ -775,8 +775,8 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 구독 피드에서 숨겨집니다 구독 피드에서 표시됩니다 시청 기록에서 Shorts 숨기기 - 시청 기록에서 Shorts가 숨겨집니다 - 시청 기록에서 Shorts가 표시됩니다 + 시청 기록에서 숨겨집니다 + 시청 기록에서 표시됩니다 Super Thanks 구매 버튼 숨기기 Super Thanks 구매 버튼이 숨겨집니다 Super Thanks 구매 버튼이 표시됩니다 @@ -823,15 +823,15 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 태그된 제품 숨기기 태그된 제품이 숨겨집니다 태그된 제품이 표시됩니다 - 예정 버튼 숨기기 - 예정 버튼이 숨겨집니다 - 예정 버튼이 표시됩니다 - \'이 사운드 사용\' 버튼 숨기기 - \'이 사운드 사용\' 버튼이 숨겨집니다 - \'이 사운드 사용\' 버튼이 표시됩니다 - \'이 템플릿 사용\' 버튼 숨기기 - \'이 템플릿 사용\' 버튼이 숨겨집니다 - \'이 템플릿 사용\' 버튼이 표시됩니다 + 예정된 라이브 버튼 숨기기 + 예정된 라이브 버튼이 숨겨집니다 + 예정된 라이브 버튼이 표시됩니다 + 이 사운드 사용 버튼 숨기기 + 이 사운드 사용 버튼이 숨겨집니다 + 이 사운드 사용 버튼이 표시됩니다 + 템플릿 사용 버튼 숨기기 + 템플릿 사용 버튼이 숨겨집니다 + 템플릿 사용 버튼이 표시됩니다 좋아요 버튼 애니메이션을 비활성화하기 좋아요 버튼 상단에 표시되는 애니메이션을 비활성화합니다 좋아요 버튼 상단에 표시되는 애니메이션을 활성화합니다 @@ -975,11 +975,11 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 일반 화질 재생바 썸네일을 활성화합니다 전체 화면 고화질 재생바 썸네일을 활성화합니다 전체 화면 일반 화질 재생바 썸네일을 활성화합니다 - "이 설정을 활성화하면 재생바 썸네일이 없는 실시간 스트림의 썸네일도 복원됩니다. + "이 기능을 활성화하면 재생바 썸네일이 없는 실시간 스트림의 썸네일도 복원됩니다. 재생바 썸네일에는 현재 동영상과 동일한 화질 값이 사용됩니다. -이 설정은 동영상 화질 값이 720p 이하이고 인터넷 연결 상태가 매우 빠를 때 가장 잘 작동합니다." +이 기능은 동영상 화질 값이 720p 이하이고 인터넷 연결 상태가 매우 빠를 때 가장 잘 작동합니다." 이전 재생바 썸네일 복원하기 재생바 상단에서 최소화된 썸네일을 표시합니다 플레이어에서 전체 화면으로 된 썸네일을 표시합니다 @@ -1214,7 +1214,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 이 경우 앱 레이아웃과 기능이 변경되지만 알려지지 않은 부작용이 발생할 수 있습니다. -나중에 이 설정을 비활성화하면 앱 레이아웃 버그를 방지하기 위해 앱 데이터를 지우는 것이 좋습니다." +나중에 이 기능을 비활성화하면 앱 레이아웃 버그를 방지하기 위해 앱 데이터를 지우는 것이 좋습니다." 변경할 앱 버전 19.35.36 - 이전 Shorts 플레이어 아이콘을 복원합니다 19.01.34 - 이전 하단바 아이콘을 복원합니다 @@ -1352,7 +1352,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 이미지 호스트로 yt4.ggpht.com를 사용합니다 "기본 이미지 호스트를 사용합니다 -이 설정을 활성화하면 일부 국가에서 차단된 이미지를 수신할 수 있습니다" +이 기능을 활성화하면 일부 국가에서 차단된 이미지를 수신할 수 있습니다" @@ -1361,7 +1361,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 구독 탭 내 페이지 탭 - 플레이어: 재생목록, 관련 동영상, etc. + 플레이어 재생목록 & 추천 동영상 검색 결과 원본 썸네일 DeArrow & 원본 썸네일 @@ -1461,7 +1461,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" 원본 오디오 스트림 언어를 사용 중입니다 기본 오디오 스트림 언어를 사용 중입니다 - 이 설정을 사용하려면, \'스트리밍 데이터 변경하기\' 설정에서 기본 클라이언트를 iOS TV로 변경하세요 + 이 기능을 사용하려면, \'동영상 스트림 변경하기\'에서 기본 클라이언트를 iOS TV로 변경하세요 @@ -1535,11 +1535,11 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" 슬라이드하여 탐색을 비활성화합니다 - 스트리밍 데이터 변경하기 - 스트리밍 데이터를 변경하여 재생 문제를 방지할 수 있습니다 - 스트리밍 데이터 변경하기 - 스트리밍 데이터를 변경합니다 - "스트리밍 데이터를 변경하지 않습니다 + 동영상 스트림 변경하기 + 클라이언트 동영상 스트림을 변경하여 재생 문제를 방지할 수 있습니다 + 동영상 스트림 변경하기 + 동영상 스트림을 변경합니다 + "동영상 스트림을 변경하지 않습니다 동영상 재생 문제가 발생할 수 있습니다" 이 설정을 비활성화하면 동영상 재생 문제가 발생할 수 있습니다. 기본 클라이언트 @@ -1560,8 +1560,8 @@ AVC의 최대 화질 값은 1080p이고, OPUS 코덱을 사용불가 및 HDR 동 • AV1 코덱이 지원되지 않습니다 • Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다 전문 통계에서 표시하기 - 스트리밍 데이터를 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시됩니다 - 스트리밍 데이터를 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시되지 않습니다 + 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시됩니다 + 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시되지 않습니다 VR 기본 오디오 스트림 언어 diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 6a8d09a56..5186d5796 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -583,8 +583,8 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Dölj Hajp - Hype-knappen är dold - Knappen Hype visas + Knappen Hajp är dold + Knappen Hajp visas Dölj Marknadsför Knappen Marknadsför är dold @@ -917,7 +917,7 @@ Inställningar → Uppspelning → Spela upp nästa video automatiskt" - Ogilla-mark. är ej tillg. just nu (API-tidsgräns nådd) + Ogilla-markeringar är för tillfället inte tillgängliga (API-tidsgräns nådd) Ogilla-markeringar är inte tillgängliga (status %d) Ogilla-markeringar är inte tillgängliga (API-gräns för klienten) Ogilla-markeringar är inte tillgängliga (%s) @@ -1125,7 +1125,7 @@ Ditt användar-id är som ett lösenord och det bör aldrig delas." Finns redan" Segmentet har skickats - SponsorBlock ej tillgängligt just nu (API-tidsgräns nådd) + SponsorBlock är för tillfället inte tillgängligt (API-tidsgräns nådd) SponsorBlock är för tillfället inte tillgängligt (status %d) SponsorBlock är för tillfället inte tillgängligt Det gick inte att rösta på segment (API-tidsgräns nådd) diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index e98108462..62b0bb3ff 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -582,11 +582,11 @@ Ekranın sağ tarafında dikey olarak kaydırarak sesi ayarlayın" İndir düğmesi görünür - Abartıyı Gizle - Coşku düğmesi gizli + Hype\'ı gizle + Hype düğmesi gizli Hype düğmesi görünür - Tanıt\'ı Gizle + Tanıt\'ı gizle Tanıt düğmesi gizli Tanıt düğmesi görünür diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index fadc1dd18..734dadba4 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -582,7 +582,13 @@ Second \"item\" text" 已顯示「下載」按鈕 + 隱藏「熱推」 + 「熱推」按鈕已隱藏 + 「熱推」按鈕已顯示 + 隱藏推廣 + 「推廣」按鈕已隱藏 + 「推廣」按鈕已顯示 隱藏感謝 已隱藏「感謝」按鈕