mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-17 00:03:57 +00:00
Compare commits
16 Commits
v5.30.0-de
...
v5.31.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90a3262f68 | ||
|
|
f7f49b834e | ||
|
|
89ec5d5bc6 | ||
|
|
e3bc8be936 | ||
|
|
6c5c3f5a4d | ||
|
|
629bd0644b | ||
|
|
b4005079e3 | ||
|
|
a354c443ad | ||
|
|
d1313e3ea1 | ||
|
|
11338008c6 | ||
|
|
8b9e04475d | ||
|
|
d3c9dc6ed7 | ||
|
|
d7ed32571f | ||
|
|
d3935f03c0 | ||
|
|
b2e601f0f0 | ||
|
|
d3ec219a29 |
65
CHANGELOG.md
65
CHANGELOG.md
@@ -1,3 +1,68 @@
|
||||
# [5.31.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.30.0...v5.31.0-dev.1) (2025-07-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SoundCloud:** Constrain patches to last working app target ([e8ea89f](https://github.com/ReVanced/revanced-patches/commit/e8ea89fc1a3f0531a0af7529663f13328aca4fe7))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Lightroom:** Constrain patches to last working version ([#5335](https://github.com/ReVanced/revanced-patches/issues/5335)) ([32ce70e](https://github.com/ReVanced/revanced-patches/commit/32ce70e994f354b9a569376bb89eb38b3190e6f9))
|
||||
|
||||
# [5.30.0](https://github.com/ReVanced/revanced-patches/compare/v5.29.0...v5.30.0) (2025-07-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Spoof client patch:** Block sending bad integrity verdicts to potentially fix account suspensions ([#5274](https://github.com/ReVanced/revanced-patches/issues/5274)) ([f7b574c](https://github.com/ReVanced/revanced-patches/commit/f7b574ca79c5a616cfe33a3fc75bd8cf68571f7d))
|
||||
* **Spotify - Spoof client:** Handle remaining edge cases to obtain a session ([#5285](https://github.com/ReVanced/revanced-patches/issues/5285)) ([2bb2d59](https://github.com/ReVanced/revanced-patches/commit/2bb2d594936093774e232ad8b274c81e805c5bf6))
|
||||
* **Spotify - Spoof client:** Skip native login screens ([#5228](https://github.com/ReVanced/revanced-patches/issues/5228)) ([c5ebc63](https://github.com/ReVanced/revanced-patches/commit/c5ebc6336ed17cc9cc7f1348282a2aa3c173fb95))
|
||||
* **Spotify - Unlock Premium:** Fix hiding context menu ads on newest versions ([#5318](https://github.com/ReVanced/revanced-patches/issues/5318)) ([73fd832](https://github.com/ReVanced/revanced-patches/commit/73fd83222e089a5fd6e1526e5c12f5a1e9893a35))
|
||||
* **Spotify - Unlock Premium:** Fix hiding context menu ads on newest versions by simplifying fingerprint ([#5318](https://github.com/ReVanced/revanced-patches/issues/5318)) ([dad0ff4](https://github.com/ReVanced/revanced-patches/commit/dad0ff4fba74c2b020fbde6c6d5eb66e10e6f1f7))
|
||||
* **Spotify:** Add `Spoof client` patch to fix various issues by using a web platform access token ([#5173](https://github.com/ReVanced/revanced-patches/issues/5173)) ([b7b75bb](https://github.com/ReVanced/revanced-patches/commit/b7b75bb9d8d5fd505121e752b8a20e61ff28d1b2))
|
||||
* **YouTube - Hide ads:** Fix "Hide shopping links" ([#5267](https://github.com/ReVanced/revanced-patches/issues/5267)) ([2fe4607](https://github.com/ReVanced/revanced-patches/commit/2fe46079d78ab98076d3a4cdf01c8bfdbdea45c0))
|
||||
* **YouTube - Hide layout components:** Fix "Hide AI Comments summary" in Comments ([#5284](https://github.com/ReVanced/revanced-patches/issues/5284)) ([d42370e](https://github.com/ReVanced/revanced-patches/commit/d42370ef71f4608abc64b6ef4a3fb0c5bd5e3eb6))
|
||||
* **YouTube - Hide layout components:** Fix "Hide AI-generated video summary" in video description ([#5269](https://github.com/ReVanced/revanced-patches/issues/5269)) ([5203da0](https://github.com/ReVanced/revanced-patches/commit/5203da0ae58e467657bc915ab0af5b9904c4f492))
|
||||
* **YouTube - Hide layout components:** Fix "Hide ticket shelf" hiding unwanted components ([#5292](https://github.com/ReVanced/revanced-patches/issues/5292)) ([d6b1f7a](https://github.com/ReVanced/revanced-patches/commit/d6b1f7a6e18b1c0eb4374c5e22a1c746dcb3a522))
|
||||
* **YouTube - Hide Shorts components:** Fix hiding of untoggled components ([#5266](https://github.com/ReVanced/revanced-patches/issues/5266)) ([008e192](https://github.com/ReVanced/revanced-patches/commit/008e192779a8658e894d5718baa732717bf96e40))
|
||||
* **YouTube - SponsorBlock:** Do not show undo skip if PiP is active ([#5314](https://github.com/ReVanced/revanced-patches/issues/5314)) ([18af8de](https://github.com/ReVanced/revanced-patches/commit/18af8dead2c6c7f0d99cd75b69948240e0bcd12c))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Spotify:** Remove ads section from browse ([#5193](https://github.com/ReVanced/revanced-patches/issues/5193)) ([ebd4dcc](https://github.com/ReVanced/revanced-patches/commit/ebd4dccf12a5fbd31d2d53c19a792c389a4641d7))
|
||||
* **YouTube - Hide layout components:** Add `Hide in history` option to filter bar ([#5271](https://github.com/ReVanced/revanced-patches/issues/5271)) ([ba242a3](https://github.com/ReVanced/revanced-patches/commit/ba242a36b040b82e84870e5e240734637125a472))
|
||||
* **YouTube - SponsorBlock:** Add "Undo automatic skip toast" ([#5277](https://github.com/ReVanced/revanced-patches/issues/5277)) ([7fa169a](https://github.com/ReVanced/revanced-patches/commit/7fa169ae262c880019c5a069a2d6bdc7f94885f1))
|
||||
|
||||
# [5.30.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.9...v5.30.0-dev.10) (2025-07-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Unlock Premium:** Fix hiding context menu ads on newest versions by simplifying fingerprint ([#5318](https://github.com/ReVanced/revanced-patches/issues/5318)) ([dad0ff4](https://github.com/ReVanced/revanced-patches/commit/dad0ff4fba74c2b020fbde6c6d5eb66e10e6f1f7))
|
||||
|
||||
# [5.30.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.8...v5.30.0-dev.9) (2025-07-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Unlock Premium:** Fix hiding context menu ads on newest versions ([#5318](https://github.com/ReVanced/revanced-patches/issues/5318)) ([73fd832](https://github.com/ReVanced/revanced-patches/commit/73fd83222e089a5fd6e1526e5c12f5a1e9893a35))
|
||||
|
||||
# [5.30.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.7...v5.30.0-dev.8) (2025-07-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Spoof client:** Skip native login screens ([#5228](https://github.com/ReVanced/revanced-patches/issues/5228)) ([c5ebc63](https://github.com/ReVanced/revanced-patches/commit/c5ebc6336ed17cc9cc7f1348282a2aa3c173fb95))
|
||||
|
||||
# [5.30.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.6...v5.30.0-dev.7) (2025-07-01)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Spoof client:** Handle remaining edge cases to obtain a session ([#5285](https://github.com/ReVanced/revanced-patches/issues/5285)) ([2bb2d59](https://github.com/ReVanced/revanced-patches/commit/2bb2d594936093774e232ad8b274c81e805c5bf6))
|
||||
|
||||
# [5.30.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.5...v5.30.0-dev.6) (2025-07-01)
|
||||
|
||||
|
||||
|
||||
@@ -14,11 +14,19 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Objects;
|
||||
|
||||
import static app.revanced.extension.spotify.misc.fix.Session.FAILED_TO_RENEW_SESSION;
|
||||
import static fi.iki.elonen.NanoHTTPD.Response.Status.INTERNAL_ERROR;
|
||||
|
||||
class LoginRequestListener extends NanoHTTPD {
|
||||
LoginRequestListener(int port) {
|
||||
super(port);
|
||||
|
||||
try {
|
||||
start();
|
||||
} catch (IOException ex) {
|
||||
Logger.printException(() -> "Failed to start login request listener on port " + port, ex);
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -31,8 +39,8 @@ class LoginRequestListener extends NanoHTTPD {
|
||||
LoginRequest loginRequest;
|
||||
try {
|
||||
loginRequest = LoginRequest.parseFrom(requestBodyInputStream);
|
||||
} catch (IOException e) {
|
||||
Logger.printException(() -> "Failed to parse LoginRequest", e);
|
||||
} catch (IOException ex) {
|
||||
Logger.printException(() -> "Failed to parse LoginRequest", ex);
|
||||
return newResponse(INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
@@ -42,52 +50,49 @@ class LoginRequestListener extends NanoHTTPD {
|
||||
// however a webview can only handle one request at a time due to singleton cookie manager.
|
||||
// Therefore, synchronize to ensure that only one webview handles the request at a time.
|
||||
synchronized (this) {
|
||||
loginResponse = getLoginResponse(loginRequest);
|
||||
try {
|
||||
loginResponse = getLoginResponse(loginRequest);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "Failed to get login response", ex);
|
||||
return newResponse(INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
if (loginResponse != null) {
|
||||
return newResponse(Response.Status.OK, loginResponse);
|
||||
}
|
||||
|
||||
return newResponse(INTERNAL_ERROR);
|
||||
return newResponse(Response.Status.OK, loginResponse);
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
private static LoginResponse getLoginResponse(@NonNull LoginRequest loginRequest) {
|
||||
Session session;
|
||||
|
||||
boolean isInitialLogin = !loginRequest.hasStoredCredential();
|
||||
if (isInitialLogin) {
|
||||
if (!loginRequest.hasStoredCredential()) {
|
||||
Logger.printInfo(() -> "Received request for initial login");
|
||||
session = WebApp.currentSession; // Session obtained from WebApp.login.
|
||||
session = WebApp.currentSession; // Session obtained from WebApp.launchLogin, can be null if still in progress.
|
||||
} else {
|
||||
Logger.printInfo(() -> "Received request to restore saved session");
|
||||
session = Session.read(loginRequest.getStoredCredential().getUsername());
|
||||
}
|
||||
|
||||
return toLoginResponse(session, isInitialLogin);
|
||||
return toLoginResponse(session);
|
||||
}
|
||||
|
||||
|
||||
private static LoginResponse toLoginResponse(Session session, boolean isInitialLogin) {
|
||||
private static LoginResponse toLoginResponse(@Nullable Session session) {
|
||||
LoginResponse.Builder builder = LoginResponse.newBuilder();
|
||||
|
||||
if (session == null) {
|
||||
if (isInitialLogin) {
|
||||
Logger.printInfo(() -> "Session is null, returning try again later error for initial login");
|
||||
builder.setError(LoginError.TRY_AGAIN_LATER);
|
||||
} else {
|
||||
Logger.printInfo(() -> "Session is null, returning invalid credentials error for stored credential login");
|
||||
builder.setError(LoginError.INVALID_CREDENTIALS);
|
||||
}
|
||||
} else if (session.username == null) {
|
||||
Logger.printInfo(() -> "Session username is null, returning invalid credentials error");
|
||||
builder.setError(LoginError.INVALID_CREDENTIALS);
|
||||
Logger.printException(() -> "Session is null. An initial login may still be in progress, returning try again later error");
|
||||
builder.setError(LoginError.TRY_AGAIN_LATER);
|
||||
} else if (session.accessTokenExpired()) {
|
||||
Logger.printInfo(() -> "Access token has expired, renewing session");
|
||||
WebApp.renewSession(session.cookies);
|
||||
return toLoginResponse(WebApp.currentSession, isInitialLogin);
|
||||
Logger.printInfo(() -> "Access token expired, renewing session");
|
||||
WebApp.renewSessionBlocking(session.cookies);
|
||||
return toLoginResponse(WebApp.currentSession);
|
||||
} else if (session.username == null) {
|
||||
Logger.printException(() -> "Session username is null, likely caused by invalid cookies, returning invalid credentials error");
|
||||
session.delete();
|
||||
builder.setError(LoginError.INVALID_CREDENTIALS);
|
||||
} else if (session == FAILED_TO_RENEW_SESSION) {
|
||||
Logger.printException(() -> "Failed to renew session, likely caused by a timeout, returning try again later error");
|
||||
builder.setError(LoginError.TRY_AGAIN_LATER);
|
||||
} else {
|
||||
session.save();
|
||||
Logger.printInfo(() -> "Returning session for username: " + session.username);
|
||||
|
||||
@@ -29,6 +29,11 @@ class Session {
|
||||
*/
|
||||
final String cookies;
|
||||
|
||||
/**
|
||||
* Session that represents a failed attempt to renew the session.
|
||||
*/
|
||||
static final Session FAILED_TO_RENEW_SESSION = new Session("", "", "");
|
||||
|
||||
/**
|
||||
* @param username Username of the account. Empty if this session does not have an authenticated user.
|
||||
* @param accessToken Access token for this session.
|
||||
@@ -87,6 +92,13 @@ class Session {
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
void delete() {
|
||||
Logger.printInfo(() -> "Deleting saved session for username: " + username);
|
||||
SharedPreferences.Editor editor = Utils.getContext().getSharedPreferences("revanced", MODE_PRIVATE).edit();
|
||||
editor.remove("session_" + username);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
static Session read(String username) {
|
||||
Logger.printInfo(() -> "Reading saved session for username: " + username);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package app.revanced.extension.spotify.misc.fix;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -10,20 +11,19 @@ public class SpoofClientPatch {
|
||||
/**
|
||||
* Injection point.
|
||||
* <br>
|
||||
* Start login server.
|
||||
* Launch login server.
|
||||
*/
|
||||
public static void listen(int port) {
|
||||
public static void launchListener(int port) {
|
||||
if (listener != null) {
|
||||
Logger.printInfo(() -> "Listener already running on port " + port);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
Logger.printInfo(() -> "Launching listener on port " + port);
|
||||
listener = new LoginRequestListener(port);
|
||||
listener.start();
|
||||
Logger.printInfo(() -> "Listener running on port " + port);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "listen failure", ex);
|
||||
Logger.printException(() -> "launchListener failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,23 @@ public class SpoofClientPatch {
|
||||
* <br>
|
||||
* Launch login web view.
|
||||
*/
|
||||
public static void login(LayoutInflater inflater) {
|
||||
public static void launchLogin(LayoutInflater inflater) {
|
||||
try {
|
||||
WebApp.login(inflater.getContext());
|
||||
WebApp.launchLogin(inflater.getContext());
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "login failure", ex);
|
||||
Logger.printException(() -> "launchLogin failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <br>
|
||||
* Set handler to call the native login after the webview login.
|
||||
*/
|
||||
public static void setNativeLoginHandler(View startLoginButton) {
|
||||
WebApp.nativeLoginHandler = (() -> {
|
||||
startLoginButton.setSoundEffectsEnabled(false);
|
||||
startLoginButton.performClick();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,135 +5,136 @@ import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Build;
|
||||
import android.view.*;
|
||||
import android.view.Window;
|
||||
import android.view.WindowInsets;
|
||||
import android.webkit.*;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.spotify.UserAgent;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.spotify.UserAgent;
|
||||
import static app.revanced.extension.spotify.misc.fix.Session.FAILED_TO_RENEW_SESSION;
|
||||
|
||||
class WebApp {
|
||||
private static final String OPEN_SPOTIFY_COM = "open.spotify.com";
|
||||
private static final String OPEN_SPOTIFY_COM_URL = "https://" + OPEN_SPOTIFY_COM;
|
||||
private static final String OPEN_SPOTIFY_COM_PREFERENCES_URL = OPEN_SPOTIFY_COM_URL + "/preferences";
|
||||
private static final String ACCOUNTS_SPOTIFY_COM_LOGIN_URL = "https://accounts.spotify.com/login?continue=" +
|
||||
"https%3A%2F%2Fopen.spotify.com%2Fpreferences";
|
||||
private static final String ACCOUNTS_SPOTIFY_COM_LOGIN_URL = "https://accounts.spotify.com/login?allow_password=1"
|
||||
+ "&continue=https%3A%2F%2Fopen.spotify.com%2Fpreferences";
|
||||
|
||||
private static final int GET_SESSION_TIMEOUT_SECONDS = 10;
|
||||
private static final String JAVASCRIPT_INTERFACE_NAME = "androidInterface";
|
||||
private static final String USER_AGENT = getWebUserAgent();
|
||||
|
||||
/**
|
||||
* Current webview in use. Any use of the object must be done on the main thread.
|
||||
* A session obtained from the webview after logging in.
|
||||
*/
|
||||
@Nullable
|
||||
static volatile Session currentSession = null;
|
||||
|
||||
/**
|
||||
* Current webview in use. Any use of the object must be done on the main thread.
|
||||
*/
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private static volatile WebView currentWebView;
|
||||
|
||||
/**
|
||||
* A session obtained from the webview after logging in or renewing the session.
|
||||
*/
|
||||
@Nullable
|
||||
static volatile Session currentSession;
|
||||
interface NativeLoginHandler {
|
||||
void login();
|
||||
}
|
||||
|
||||
static void login(Context context) {
|
||||
Logger.printInfo(() -> "Starting login");
|
||||
static NativeLoginHandler nativeLoginHandler;
|
||||
|
||||
Dialog dialog = new Dialog(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
|
||||
static void launchLogin(Context context) {
|
||||
final Dialog dialog = newDialog(context);
|
||||
|
||||
// Ensure that the keyboard does not cover the webview content.
|
||||
Window window = dialog.getWindow();
|
||||
//noinspection StatementWithEmptyBody
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
window.getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {
|
||||
v.setPadding(0, 0, 0, insets.getInsets(WindowInsets.Type.ime()).bottom);
|
||||
Utils.runOnBackgroundThread(() -> {
|
||||
Logger.printInfo(() -> "Launching login");
|
||||
|
||||
return WindowInsets.CONSUMED;
|
||||
});
|
||||
} else {
|
||||
// TODO: Implement for lower Android versions.
|
||||
}
|
||||
// A session must be obtained from a login. Repeat until a session is acquired.
|
||||
boolean isAcquired = false;
|
||||
do {
|
||||
CountDownLatch onLoggedInLatch = new CountDownLatch(1);
|
||||
CountDownLatch getSessionLatch = new CountDownLatch(1);
|
||||
|
||||
newWebView(
|
||||
// Can't use Utils.getContext() here, because autofill won't work.
|
||||
// See https://stackoverflow.com/a/79182053/11213244.
|
||||
context,
|
||||
new WebViewCallback() {
|
||||
launchWebView(context, ACCOUNTS_SPOTIFY_COM_LOGIN_URL, new WebViewCallback() {
|
||||
@Override
|
||||
void onInitialized(WebView webView) {
|
||||
// Ensure that cookies are cleared before loading the login page.
|
||||
CookieManager.getInstance().removeAllCookies((anyRemoved) -> {
|
||||
Logger.printInfo(() -> "Loading URL: " + ACCOUNTS_SPOTIFY_COM_LOGIN_URL);
|
||||
webView.loadUrl(ACCOUNTS_SPOTIFY_COM_LOGIN_URL);
|
||||
});
|
||||
super.onInitialized(webView);
|
||||
|
||||
dialog.setCancelable(false);
|
||||
dialog.setContentView(webView);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
void onLoggedIn(String cookies) {
|
||||
dialog.dismiss();
|
||||
onLoggedInLatch.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
void onReceivedSession(WebView webView, Session session) {
|
||||
Logger.printInfo(() -> "Received session from login: " + session);
|
||||
currentSession = session;
|
||||
currentWebView = null;
|
||||
webView.stopLoading();
|
||||
webView.destroy();
|
||||
void onReceivedSession(Session session) {
|
||||
super.onReceivedSession(session);
|
||||
|
||||
getSessionLatch.countDown();
|
||||
dialog.dismiss();
|
||||
|
||||
try {
|
||||
nativeLoginHandler.login();
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "nativeLoginHandler failure", ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
// Wait indefinitely until the user logs in.
|
||||
onLoggedInLatch.await();
|
||||
// Wait until the session is received, or timeout.
|
||||
isAcquired = getSessionLatch.await(GET_SESSION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.printException(() -> "Login interrupted", ex);
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
);
|
||||
} while (!isAcquired);
|
||||
});
|
||||
}
|
||||
|
||||
static void renewSession(String cookies) {
|
||||
static void renewSessionBlocking(String cookies) {
|
||||
Logger.printInfo(() -> "Renewing session with cookies: " + cookies);
|
||||
|
||||
CountDownLatch getSessionLatch = new CountDownLatch(1);
|
||||
|
||||
newWebView(
|
||||
Utils.getContext(),
|
||||
new WebViewCallback() {
|
||||
@Override
|
||||
public void onInitialized(WebView webView) {
|
||||
Logger.printInfo(() -> "Loading URL: " + OPEN_SPOTIFY_COM_PREFERENCES_URL +
|
||||
" with cookies: " + cookies);
|
||||
setCookies(cookies);
|
||||
webView.loadUrl(OPEN_SPOTIFY_COM_PREFERENCES_URL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceivedSession(WebView webView, Session session) {
|
||||
Logger.printInfo(() -> "Received session: " + session);
|
||||
currentSession = session;
|
||||
getSessionLatch.countDown();
|
||||
currentWebView = null;
|
||||
webView.stopLoading();
|
||||
webView.destroy();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
try {
|
||||
final boolean isAcquired = getSessionLatch.await(GET_SESSION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
|
||||
if (!isAcquired) {
|
||||
Logger.printException(() -> "Failed to retrieve session within " + GET_SESSION_TIMEOUT_SECONDS + " seconds");
|
||||
launchWebView(Utils.getContext(), OPEN_SPOTIFY_COM_PREFERENCES_URL, new WebViewCallback() {
|
||||
@Override
|
||||
public void onInitialized(WebView webView) {
|
||||
setCookies(cookies);
|
||||
super.onInitialized(webView);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Logger.printException(() -> "Interrupted while waiting to retrieve session", e);
|
||||
|
||||
public void onReceivedSession(Session session) {
|
||||
super.onReceivedSession(session);
|
||||
getSessionLatch.countDown();
|
||||
}
|
||||
});
|
||||
|
||||
boolean isAcquired = false;
|
||||
try {
|
||||
isAcquired = getSessionLatch.await(GET_SESSION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.printException(() -> "Session renewal interrupted", ex);
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
|
||||
// Cleanup.
|
||||
currentWebView = null;
|
||||
if (!isAcquired) {
|
||||
Logger.printException(() -> "Failed to retrieve session within " + GET_SESSION_TIMEOUT_SECONDS + " seconds");
|
||||
currentSession = FAILED_TO_RENEW_SESSION;
|
||||
destructWebView();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,36 +142,34 @@ class WebApp {
|
||||
*/
|
||||
abstract static class WebViewCallback {
|
||||
void onInitialized(WebView webView) {
|
||||
currentWebView = webView;
|
||||
currentSession = null; // Reset current session.
|
||||
}
|
||||
|
||||
void onLoggedIn(String cookies) {
|
||||
}
|
||||
|
||||
void onReceivedSession(WebView webView, Session session) {
|
||||
void onReceivedSession(Session session) {
|
||||
Logger.printInfo(() -> "Received session: " + session);
|
||||
currentSession = session;
|
||||
|
||||
destructWebView();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
private static void newWebView(
|
||||
private static void launchWebView(
|
||||
Context context,
|
||||
String initialUrl,
|
||||
WebViewCallback webViewCallback
|
||||
) {
|
||||
Utils.runOnMainThreadNowOrLater(() -> {
|
||||
WebView webView = currentWebView;
|
||||
if (webView != null) {
|
||||
// Old webview is still hanging around.
|
||||
// Could happen if the network request failed and thus no callback is made.
|
||||
// But in practice this never happens.
|
||||
Logger.printException(() -> "Cleaning up prior webview");
|
||||
webView.stopLoading();
|
||||
webView.destroy();
|
||||
}
|
||||
|
||||
webView = new WebView(context);
|
||||
WebView webView = new WebView(context);
|
||||
WebSettings settings = webView.getSettings();
|
||||
settings.setDomStorageEnabled(true);
|
||||
settings.setJavaScriptEnabled(true);
|
||||
settings.setUserAgentString(USER_AGENT);
|
||||
|
||||
// WebViewClient is always called off the main thread,
|
||||
// but callback interface methods are called on the main thread.
|
||||
webView.setWebViewClient(new WebViewClient() {
|
||||
@@ -209,31 +208,42 @@ class WebApp {
|
||||
" })" +
|
||||
" " +
|
||||
" }" +
|
||||
"});";
|
||||
"});" +
|
||||
"if (new URLSearchParams(window.location.search).get('_authfailed') != null) {" +
|
||||
" " + JAVASCRIPT_INTERFACE_NAME + ".getSession(null, null);" +
|
||||
"}";
|
||||
|
||||
view.evaluateJavascript(getSessionScript, null);
|
||||
}
|
||||
});
|
||||
|
||||
final WebView callbackWebView = webView;
|
||||
webView.addJavascriptInterface(new Object() {
|
||||
@SuppressWarnings("unused")
|
||||
@JavascriptInterface
|
||||
public void getSession(String username, String accessToken) {
|
||||
Session session = new Session(username, accessToken, getCurrentCookies());
|
||||
Utils.runOnMainThread(() -> webViewCallback.onReceivedSession(callbackWebView, session));
|
||||
Utils.runOnMainThread(() -> webViewCallback.onReceivedSession(session));
|
||||
}
|
||||
}, JAVASCRIPT_INTERFACE_NAME);
|
||||
|
||||
currentWebView = webView;
|
||||
|
||||
CookieManager.getInstance().removeAllCookies((anyRemoved) -> {
|
||||
Logger.printInfo(() -> "Loading URL: " + initialUrl);
|
||||
webView.loadUrl(initialUrl);
|
||||
|
||||
Logger.printInfo(() -> "WebView initialized with user agent: " + USER_AGENT);
|
||||
webViewCallback.onInitialized(currentWebView);
|
||||
webViewCallback.onInitialized(webView);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private static void destructWebView() {
|
||||
Utils.runOnMainThreadNowOrLater(() -> {
|
||||
currentWebView.stopLoading();
|
||||
currentWebView.destroy();
|
||||
currentWebView = null;
|
||||
});
|
||||
}
|
||||
|
||||
private static String getWebUserAgent() {
|
||||
String userAgentString = WebSettings.getDefaultUserAgent(Utils.getContext());
|
||||
try {
|
||||
@@ -241,16 +251,36 @@ class WebApp {
|
||||
.withCommentReplaced("Android", "Windows NT 10.0; Win64; x64")
|
||||
.withoutProduct("Mobile")
|
||||
.toString();
|
||||
} catch (IllegalArgumentException e) {
|
||||
} catch (IllegalArgumentException ex) {
|
||||
userAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
|
||||
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edge/137.0.0.0";
|
||||
String fallback = userAgentString;
|
||||
Logger.printException(() -> "Failed to get user agent, falling back to " + fallback, e);
|
||||
Logger.printException(() -> "Failed to get user agent, falling back to " + fallback, ex);
|
||||
}
|
||||
|
||||
return userAgentString;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static Dialog newDialog(Context context) {
|
||||
Dialog dialog = new Dialog(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
|
||||
dialog.setCancelable(false);
|
||||
|
||||
// Ensure that the keyboard does not cover the webview content.
|
||||
Window window = dialog.getWindow();
|
||||
//noinspection StatementWithEmptyBody
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
window.getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {
|
||||
v.setPadding(0, 0, 0, insets.getInsets(WindowInsets.Type.ime()).bottom);
|
||||
|
||||
return WindowInsets.CONSUMED;
|
||||
});
|
||||
} else {
|
||||
// TODO: Implement for lower Android versions.
|
||||
}
|
||||
return dialog;
|
||||
}
|
||||
|
||||
private static String getCurrentCookies() {
|
||||
CookieManager cookieManager = CookieManager.getInstance();
|
||||
return cookieManager.getCookie(OPEN_SPOTIFY_COM_URL);
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
package app.revanced;
|
||||
|
||||
public interface ContextMenuItemPlaceholder {
|
||||
Object getViewModel();
|
||||
}
|
||||
@@ -32,4 +32,4 @@ STRING
|
||||
|
||||
WS
|
||||
: [ \r\n]+
|
||||
;
|
||||
;
|
||||
|
||||
@@ -54,11 +54,11 @@ public class Settings extends BaseSettings {
|
||||
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2);
|
||||
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2);
|
||||
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE);
|
||||
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_video_quality_last_selected_toast", TRUE, false,
|
||||
parent(REMEMBER_VIDEO_QUALITY_LAST_SELECTED));
|
||||
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_shorts_quality_default_wifi", -2, true);
|
||||
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_shorts_quality_default_mobile", -2, true);
|
||||
public static final BooleanSetting REMEMBER_SHORTS_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_shorts_quality_last_selected", FALSE);
|
||||
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_video_quality_last_selected_toast", TRUE, false,
|
||||
parentsAny(REMEMBER_VIDEO_QUALITY_LAST_SELECTED, REMEMBER_SHORTS_QUALITY_LAST_SELECTED));
|
||||
public static final BooleanSetting ADVANCED_VIDEO_QUALITY_MENU = new BooleanSetting("revanced_advanced_video_quality_menu", TRUE);
|
||||
public static final BooleanSetting DISABLE_HDR_VIDEO = new BooleanSetting("revanced_disable_hdr_video", FALSE);
|
||||
// Speed
|
||||
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.30.0-dev.6
|
||||
version = 5.31.0-dev.1
|
||||
|
||||
1318
package-lock.json
generated
1318
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,6 @@
|
||||
"@semantic-release/changelog": "^6.0.3",
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"gradle-semantic-release-plugin": "^1.10.1",
|
||||
"semantic-release": "^24.2.5"
|
||||
"semantic-release": "^24.2.6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,10 +645,10 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook {
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt {
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import app.revanced.patcher.patch.bytecodePatch
|
||||
val disableMandatoryLoginPatch = bytecodePatch(
|
||||
name = "Disable mandatory login",
|
||||
) {
|
||||
compatibleWith("com.adobe.lrmobile"("10.0.2"))
|
||||
compatibleWith("com.adobe.lrmobile"("9.3.0"))
|
||||
|
||||
execute {
|
||||
isLoggedInFingerprint.method.apply {
|
||||
|
||||
@@ -7,7 +7,7 @@ import app.revanced.patcher.patch.bytecodePatch
|
||||
val unlockPremiumPatch = bytecodePatch(
|
||||
name = "Unlock Premium",
|
||||
) {
|
||||
compatibleWith("com.adobe.lrmobile"("10.0.2"))
|
||||
compatibleWith("com.adobe.lrmobile"("9.3.0"))
|
||||
|
||||
execute {
|
||||
// Set hasPremium = true.
|
||||
|
||||
@@ -87,8 +87,8 @@ fun sharedExtensionPatch(
|
||||
|
||||
class ExtensionHook internal constructor(
|
||||
internal val fingerprint: Fingerprint,
|
||||
private val insertIndexResolver: ((Method) -> Int),
|
||||
private val contextRegisterResolver: (Method) -> String,
|
||||
private val insertIndexResolver: BytecodePatchContext.(Method) -> Int,
|
||||
private val contextRegisterResolver: BytecodePatchContext.(Method) -> String,
|
||||
) {
|
||||
context(BytecodePatchContext)
|
||||
operator fun invoke(extensionClassDescriptor: String) {
|
||||
@@ -98,19 +98,19 @@ class ExtensionHook internal constructor(
|
||||
fingerprint.method.addInstruction(
|
||||
insertIndex,
|
||||
"invoke-static/range { $contextRegister .. $contextRegister }, " +
|
||||
"$extensionClassDescriptor->setContext(Landroid/content/Context;)V",
|
||||
"$extensionClassDescriptor->setContext(Landroid/content/Context;)V",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun extensionHook(
|
||||
insertIndexResolver: ((Method) -> Int) = { 0 },
|
||||
contextRegisterResolver: (Method) -> String = { "p0" },
|
||||
insertIndexResolver: BytecodePatchContext.(Method) -> Int = { 0 },
|
||||
contextRegisterResolver: BytecodePatchContext.(Method) -> String = { "p0" },
|
||||
fingerprint: Fingerprint,
|
||||
) = ExtensionHook(fingerprint, insertIndexResolver, contextRegisterResolver)
|
||||
|
||||
fun extensionHook(
|
||||
insertIndexResolver: ((Method) -> Int) = { 0 },
|
||||
contextRegisterResolver: (Method) -> String = { "p0" },
|
||||
insertIndexResolver: BytecodePatchContext.(Method) -> Int = { 0 },
|
||||
contextRegisterResolver: BytecodePatchContext.(Method) -> String = { "p0" },
|
||||
fingerprintBuilderBlock: FingerprintBuilder.() -> Unit,
|
||||
) = extensionHook(insertIndexResolver, contextRegisterResolver, fingerprint(block = fingerprintBuilderBlock))
|
||||
|
||||
@@ -12,7 +12,7 @@ import app.revanced.patches.soundcloud.shared.featureConstructorFingerprint
|
||||
val hideAdsPatch = bytecodePatch(
|
||||
name = "Hide ads",
|
||||
) {
|
||||
compatibleWith("com.soundcloud.android")
|
||||
compatibleWith("com.soundcloud.android"("2025.05.27-release"))
|
||||
|
||||
execute {
|
||||
// Enable a preset feature to disable audio ads by modifying the JSON server response.
|
||||
|
||||
@@ -8,7 +8,7 @@ val disableTelemetryPatch = bytecodePatch(
|
||||
name = "Disable telemetry",
|
||||
description = "Disables SoundCloud's telemetry system.",
|
||||
) {
|
||||
compatibleWith("com.soundcloud.android")
|
||||
compatibleWith("com.soundcloud.android"("2025.05.27-release"))
|
||||
|
||||
execute {
|
||||
// Empty the "backend" argument to abort the initializer.
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
val enableOfflineSync = bytecodePatch(
|
||||
name = "Enable offline sync",
|
||||
) {
|
||||
compatibleWith("com.soundcloud.android")
|
||||
compatibleWith("com.soundcloud.android"("2025.05.27-release"))
|
||||
|
||||
execute {
|
||||
// Enable the feature to allow offline track syncing by modifying the JSON server response.
|
||||
|
||||
@@ -42,7 +42,10 @@ internal val contextMenuViewModelClassFingerprint = fingerprint {
|
||||
strings("ContextMenuViewModel(header=")
|
||||
}
|
||||
|
||||
internal val contextMenuViewModelAddItemFingerprint = fingerprint {
|
||||
/**
|
||||
* Used in versions older than "9.0.60.128".
|
||||
*/
|
||||
internal val oldContextMenuViewModelAddItemFingerprint = fingerprint {
|
||||
parameters("L")
|
||||
returns("V")
|
||||
custom { method, _ ->
|
||||
@@ -52,6 +55,27 @@ internal val contextMenuViewModelAddItemFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val contextMenuViewModelConstructorFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to find the interface name of a context menu item.
|
||||
*/
|
||||
internal val browsePodcastsContextMenuItemClassFingerprint = fingerprint {
|
||||
strings("browse_podcast_item", "ui_navigate")
|
||||
}
|
||||
|
||||
internal const val CONTEXT_MENU_ITEM_CLASS_DESCRIPTOR_PLACEHOLDER = "Lapp/revanced/ContextMenuItemPlaceholder;"
|
||||
internal val extensionFilterContextMenuItemsFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Ljava/util/List;")
|
||||
parameters("Ljava/util/List;")
|
||||
custom { method, classDef ->
|
||||
method.name == "filterContextMenuItems" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
|
||||
}
|
||||
}
|
||||
|
||||
internal val getViewModelFingerprint = fingerprint {
|
||||
custom { method, _ -> method.name == "getViewModel" }
|
||||
}
|
||||
@@ -93,7 +117,7 @@ internal val abstractProtobufListEnsureIsMutableFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
private fun structureGetSectionsFingerprint(className: String) = fingerprint {
|
||||
internal fun structureGetSectionsFingerprint(className: String) = fingerprint {
|
||||
custom { method, classDef ->
|
||||
classDef.endsWith(className) && method.indexOfFirstInstruction {
|
||||
opcode == Opcode.IGET_OBJECT && getReference<FieldReference>()?.name == "sections_"
|
||||
@@ -109,7 +133,7 @@ internal val homeStructureGetSectionsFingerprint =
|
||||
structureGetSectionsFingerprint("homeapi/proto/HomeStructure;")
|
||||
|
||||
internal val browseSectionFingerprint = fingerprint {
|
||||
custom { _, classDef -> classDef.endsWith("browsita/v1/resolved/Section;") }
|
||||
custom { _, classDef-> classDef.endsWith("browsita/v1/resolved/Section;") }
|
||||
}
|
||||
|
||||
internal val browseStructureGetSectionsFingerprint =
|
||||
|
||||
@@ -2,4 +2,8 @@ package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
|
||||
|
||||
val sharedExtensionPatch = sharedExtensionPatch("spotify", mainActivityOnCreateHook)
|
||||
val sharedExtensionPatch = sharedExtensionPatch(
|
||||
"spotify",
|
||||
mainActivityOnCreateHook,
|
||||
loadOrbitLibraryHook
|
||||
)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val loadOrbitLibraryFingerprint = fingerprint {
|
||||
strings("OrbitLibraryLoader", "cst")
|
||||
}
|
||||
@@ -1,6 +1,26 @@
|
||||
package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patches.shared.misc.extension.extensionHook
|
||||
import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
internal val mainActivityOnCreateHook = extensionHook(fingerprint = mainActivityOnCreateFingerprint)
|
||||
|
||||
internal val loadOrbitLibraryHook = extensionHook(
|
||||
insertIndexResolver = {
|
||||
loadOrbitLibraryFingerprint.stringMatches!!.last().index
|
||||
},
|
||||
contextRegisterResolver = { method ->
|
||||
val contextReferenceIndex = method.indexOfFirstInstruction {
|
||||
getReference<FieldReference>()?.type == "Landroid/content/Context;"
|
||||
}
|
||||
val contextRegister = method.getInstruction<TwoRegisterInstruction>(contextReferenceIndex).registerA
|
||||
|
||||
"v$contextRegister"
|
||||
},
|
||||
fingerprint = loadOrbitLibraryFingerprint,
|
||||
)
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package app.revanced.patches.spotify.misc.fix
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal val getPackageInfoFingerprint = fingerprint {
|
||||
strings(
|
||||
@@ -9,7 +13,7 @@ internal val getPackageInfoFingerprint = fingerprint {
|
||||
)
|
||||
}
|
||||
|
||||
internal val startLiborbitFingerprint = fingerprint {
|
||||
internal val loadOrbitLibraryFingerprint = fingerprint {
|
||||
strings("/liborbit-jni-spotify.so")
|
||||
}
|
||||
|
||||
@@ -20,10 +24,38 @@ internal val startupPageLayoutInflateFingerprint = fingerprint {
|
||||
strings("blueprintContainer", "gradient", "valuePropositionTextView")
|
||||
}
|
||||
|
||||
internal val standardIntegrityTokenProviderBuilderFingerprint = fingerprint {
|
||||
strings(
|
||||
"standard_pi_init",
|
||||
"outcome",
|
||||
"success"
|
||||
)
|
||||
internal val renderStartLoginScreenFingerprint = fingerprint {
|
||||
strings("authenticationButtonFactory", "MORE_OPTIONS")
|
||||
}
|
||||
|
||||
internal val renderSecondLoginScreenFingerprint = fingerprint {
|
||||
strings("authenticationButtonFactory", "intent_login")
|
||||
}
|
||||
|
||||
internal val renderThirdLoginScreenFingerprint = fingerprint {
|
||||
strings("EMAIL_OR_USERNAME", "listener")
|
||||
}
|
||||
|
||||
internal val thirdLoginScreenLoginOnClickFingerprint = fingerprint {
|
||||
strings("login", "listener", "none")
|
||||
}
|
||||
|
||||
internal val runIntegrityVerificationFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("V")
|
||||
opcodes(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.INVOKE_STATIC, // Calendar.getInstance()
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_VIRTUAL, // instance.get(6)
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_EQ, // if (x == instance.get(6)) return
|
||||
)
|
||||
custom { method, _ ->
|
||||
method.indexOfFirstInstruction {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.definingClass == "Ljava/util/Calendar;" && reference.name == "get"
|
||||
} >= 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,11 +9,9 @@ import app.revanced.patcher.patch.intOption
|
||||
import app.revanced.patches.shared.misc.hex.HexPatchBuilder
|
||||
import app.revanced.patches.shared.misc.hex.hexPatch
|
||||
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
|
||||
import app.revanced.util.returnEarly
|
||||
import app.revanced.util.*
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@@ -24,8 +22,8 @@ val spoofClientPatch = bytecodePatch(
|
||||
name = "Spoof client",
|
||||
description = "Spoofs the client to fix various functions of the app.",
|
||||
) {
|
||||
val port by intOption(
|
||||
key = "port",
|
||||
val requestListenerPort by intOption(
|
||||
key = "requestListenerPort",
|
||||
default = 4345,
|
||||
title = " Login request listener port",
|
||||
description = "The port to use for the listener that intercepts and handles login requests. " +
|
||||
@@ -46,10 +44,10 @@ val spoofClientPatch = bytecodePatch(
|
||||
"x86",
|
||||
"x86_64"
|
||||
).forEach { architecture ->
|
||||
"https://login5.spotify.com/v3/login" to "http://127.0.0.1:$port/v3/login" inFile
|
||||
"https://login5.spotify.com/v3/login" to "http://127.0.0.1:$requestListenerPort/v3/login" inFile
|
||||
"lib/$architecture/liborbit-jni-spotify.so"
|
||||
|
||||
"https://login5.spotify.com/v4/login" to "http://127.0.0.1:$port/v4/login" inFile
|
||||
"https://login5.spotify.com/v4/login" to "http://127.0.0.1:$requestListenerPort/v4/login" inFile
|
||||
"lib/$architecture/liborbit-jni-spotify.so"
|
||||
}
|
||||
})
|
||||
@@ -58,6 +56,8 @@ val spoofClientPatch = bytecodePatch(
|
||||
compatibleWith("com.spotify.music")
|
||||
|
||||
execute {
|
||||
// region Spoof package info.
|
||||
|
||||
getPackageInfoFingerprint.method.apply {
|
||||
// region Spoof signature.
|
||||
|
||||
@@ -99,28 +99,93 @@ val spoofClientPatch = bytecodePatch(
|
||||
// endregion
|
||||
}
|
||||
|
||||
startLiborbitFingerprint.method.addInstructions(
|
||||
// endregion
|
||||
|
||||
// region Spoof client.
|
||||
|
||||
loadOrbitLibraryFingerprint.method.addInstructions(
|
||||
0,
|
||||
"""
|
||||
const/16 v0, $port
|
||||
invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->listen(I)V
|
||||
const/16 v0, $requestListenerPort
|
||||
invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->launchListener(I)V
|
||||
"""
|
||||
)
|
||||
|
||||
startupPageLayoutInflateFingerprint.method.apply {
|
||||
val openLoginWebViewDescriptor =
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->login(Landroid/view/LayoutInflater;)V"
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->launchLogin(Landroid/view/LayoutInflater;)V"
|
||||
|
||||
addInstructions(
|
||||
0,
|
||||
"invoke-static/range { p1 .. p1 }, $openLoginWebViewDescriptor"
|
||||
)
|
||||
}
|
||||
|
||||
renderStartLoginScreenFingerprint.method.apply {
|
||||
val onEventIndex = indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_INTERFACE && getReference<MethodReference>()?.name == "getView"
|
||||
}
|
||||
|
||||
val buttonRegister = getInstruction<OneRegisterInstruction>(onEventIndex + 1).registerA
|
||||
|
||||
addInstruction(
|
||||
onEventIndex + 2,
|
||||
"invoke-static { v$buttonRegister }, $EXTENSION_CLASS_DESCRIPTOR->setNativeLoginHandler(Landroid/view/View;)V"
|
||||
)
|
||||
}
|
||||
|
||||
renderSecondLoginScreenFingerprint.method.apply {
|
||||
val getViewIndex = indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_INTERFACE && getReference<MethodReference>()?.name == "getView"
|
||||
}
|
||||
|
||||
val buttonRegister = getInstruction<OneRegisterInstruction>(getViewIndex + 1).registerA
|
||||
|
||||
// Early return the render for loop since the first item of the loop is the login button.
|
||||
addInstructions(
|
||||
getViewIndex + 2,
|
||||
"""
|
||||
move-object/from16 v3, p1
|
||||
invoke-static { v3 }, $openLoginWebViewDescriptor
|
||||
invoke-virtual { v$buttonRegister }, Landroid/view/View;->performClick()Z
|
||||
return-void
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
renderThirdLoginScreenFingerprint.method.apply {
|
||||
val invokeSetListenerIndex = indexOfFirstInstructionOrThrow {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.definingClass == "Landroid/view/View;" && reference.name == "setOnClickListener"
|
||||
}
|
||||
|
||||
val buttonRegister = getInstruction<FiveRegisterInstruction>(invokeSetListenerIndex).registerC
|
||||
|
||||
addInstruction(
|
||||
invokeSetListenerIndex + 1,
|
||||
"invoke-virtual { v$buttonRegister }, Landroid/view/View;->performClick()Z"
|
||||
)
|
||||
}
|
||||
|
||||
thirdLoginScreenLoginOnClickFingerprint.method.apply {
|
||||
// Use placeholder credentials to pass the login screen.
|
||||
val loginActionIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN_VOID) - 1
|
||||
val loginActionInstruction = getInstruction<FiveRegisterInstruction>(loginActionIndex)
|
||||
|
||||
addInstructions(
|
||||
loginActionIndex,
|
||||
"""
|
||||
const-string v${loginActionInstruction.registerD}, "placeholder"
|
||||
const-string v${loginActionInstruction.registerE}, "placeholder"
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region Disable verdicts.
|
||||
|
||||
// Early return to block sending bad verdicts to the API.
|
||||
standardIntegrityTokenProviderBuilderFingerprint.method.returnEarly()
|
||||
runIntegrityVerificationFingerprint.method.returnEarly()
|
||||
|
||||
// endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.spotify.shared
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patcher.patch.BytecodePatchContext
|
||||
import app.revanced.patches.spotify.misc.extension.mainActivityOnCreateHook
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;"
|
||||
|
||||
@@ -12,6 +12,9 @@ private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivit
|
||||
internal const val SPOTIFY_MAIN_ACTIVITY_LEGACY = "Lcom/spotify/music/MainActivity;"
|
||||
|
||||
internal val mainActivityOnCreateFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("V")
|
||||
parameters("Landroid/os/Bundle;")
|
||||
custom { method, classDef ->
|
||||
method.name == "onCreate" && (classDef.type == SPOTIFY_MAIN_ACTIVITY
|
||||
|| classDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY)
|
||||
@@ -26,9 +29,10 @@ private var isLegacyAppTarget: Boolean? = null
|
||||
* supports Spotify integration on Kenwood/Pioneer car stereos.
|
||||
*/
|
||||
context(BytecodePatchContext)
|
||||
internal val IS_SPOTIFY_LEGACY_APP_TARGET get(): Boolean {
|
||||
if (isLegacyAppTarget == null) {
|
||||
isLegacyAppTarget = mainActivityOnCreateHook.fingerprint.originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY
|
||||
internal val IS_SPOTIFY_LEGACY_APP_TARGET
|
||||
get(): Boolean {
|
||||
if (isLegacyAppTarget == null) {
|
||||
isLegacyAppTarget = mainActivityOnCreateFingerprint.originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY
|
||||
}
|
||||
return isLegacyAppTarget!!
|
||||
}
|
||||
return isLegacyAppTarget!!
|
||||
}
|
||||
|
||||
@@ -962,12 +962,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">إخفاء زر التخطي بعد بضع ثوانٍ</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">يتم عرض زر التخطي للمقطع بأكمله</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">مدة زر التخطي</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">المدة التي تظهر فيها أزرار التخطي والتخطي إلى التمييز المخفية تلقائيًا</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">كم المدة لعرض أزرار التخطي والتخطي إلى التمييز قبل الإخفاء التلقائي</string>
|
||||
<string name="revanced_sb_general_skiptoast">إظهار إشعار التراجع عن التخطي</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">يظهر إشعار عند تخطي مقطع تلقائيًا. انقر على الإشعار للتراجع عن التخطي</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">لا يتم عرض التوست</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">مدة توست التخطي</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">المدة التي يظهر فيها إشعار التخطي</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">كم المدة لعرض رسالة التراجع عن التخطي المنبثقة</string>
|
||||
<string name="revanced_sb_duration_1s">ثانية واحدة</string>
|
||||
<string name="revanced_sb_duration_2s">ثانيتان</string>
|
||||
<string name="revanced_sb_duration_3s">3 ثوانٍ</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Кнопка \"Прапусціць\" скрываецца праз некалькі секунд</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Кнопка «Прапусціць» паказана для ўсяго сегмента</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Працягласць кнопкі пропуску</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Як доўга адлюстроўваюцца кнопкі аўтаматычнага хавання прапуску і пераходу да вылучэння</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Як доўга паказваць кнопкі прапусціць і прапусціць да асноўнага моманту перад аўтаматычным схаваннем</string>
|
||||
<string name="revanced_sb_general_skiptoast">Паказаць усплываючае паведамленне для адмены прапуску</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Усплываючае паведамленне паказваецца, калі сегмент аўтаматычна прапускаецца. Націсніце на ўсплываючае паведамленне, каб адмяніць прапуск</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Усплывальнае апавяшчэнне не паказваецца</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Працягласць усплывальнага апавяшчэння пра пропуск</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Як доўга адлюстроўваецца ўсплываючае паведамленне пра прапуск</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Як доўга паказваць паведамленне пра адмену пропуску</string>
|
||||
<string name="revanced_sb_duration_1s">1 секунда</string>
|
||||
<string name="revanced_sb_duration_2s">2 секунды</string>
|
||||
<string name="revanced_sb_duration_3s">3 секунды</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Бутона за пропускане се скрива след няколко секунди</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Бутонът \"Пропускане\" е показан за целия сегмент</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Продължителност на бутона за пропускане</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Колко дълго се показват бутоните за автоматично скриване на пропускане и за пропускане до акцент</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Колко дълго да се показват бутоните за пропускане и преминаване към акцент, преди да се скрият автоматично</string>
|
||||
<string name="revanced_sb_general_skiptoast">Показване на известие за отмяна на пропускането</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Показва се известие, когато сегмент е автоматично пропуснат. Докоснете известието, за да отмените пропускането</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Изскачащо съобщение не се показва</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Продължителност на изскачащото съобщение за пропускане</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Колко дълго се показва известието за пропускане</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Колко дълго да се показва известието за отмяна на пропускането</string>
|
||||
<string name="revanced_sb_duration_1s">1 секунда</string>
|
||||
<string name="revanced_sb_duration_2s">2 секунди</string>
|
||||
<string name="revanced_sb_duration_3s">3 секунди</string>
|
||||
|
||||
@@ -958,12 +958,12 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">কয়েক সেকেন্ড পরে স্কিপ বোতাম লুকিয়ে যায়</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">পুরো অংশের জন্য Skip বোতাম দেখানো হয়েছে</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">স্কিপ বোতামের সময়কাল</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">অটো হাইড স্কিপ এবং হাইলাইট বোতাম কতক্ষণ দেখানো হয়</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">স্বয়ংক্রিয়ভাবে লুকানোর আগে এড়িয়ে যাওয়া এবং হাইলাইট করা বোতামগুলি কতক্ষণ দেখানো হবে</string>
|
||||
<string name="revanced_sb_general_skiptoast">স্কিপ পূর্বাবস্থায় ফিরিয়ে আনার টোস্ট দেখান</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">যখন একটি সেগমেন্ট স্বয়ংক্রিয়ভাবে এড়িয়ে যাওয়া হয় তখন টোস্ট দেখানো হয়। স্কিপ পূর্বাবস্থায় ফিরিয়ে আনতে টোস্ট বিজ্ঞপ্তিতে ট্যাপ করুন</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">টোস্ট দেখানো হয়নি</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">টোস্ট এড়িয়ে যাওয়ার সময়কাল</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">স্কিপ টোস্ট বিজ্ঞপ্তি কতক্ষণ দেখানো হয়</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">এড়িয়ে যাওয়া বাতিল করার টোস্ট কতক্ষণ দেখানো হবে</string>
|
||||
<string name="revanced_sb_duration_1s">১ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_2s">২ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_3s">৩ সেকেন্ড</string>
|
||||
|
||||
@@ -963,12 +963,12 @@ Tato funkce funguje nejlépe s kvalitou videa 720p nebo nižší a při použit
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Tlačítko pro přeskočení se skrývá po několika sekundách</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Tlačítko Přeskočit se zobrazuje pro celý segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Doba trvání tlačítka přeskočení</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Jak dlouho se zobrazují tlačítka pro automatické skrytí přeskočení a přeskočení na zvýraznění</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Jak dlouho zobrazovat tlačítka přeskočit a přeskočit na zvýraznění před automatickým skrytím</string>
|
||||
<string name="revanced_sb_general_skiptoast">Zobrazit hlásku pro zrušení přeskočení</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Hláska se zobrazí, když je segment automaticky přeskočen. Klepněte na hlásku pro zrušení přeskočení</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast se nezobrazuje</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Doba trvání toastu přeskočení</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Jak dlouho se zobrazuje hláska pro přeskočení</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Jak dlouho zobrazovat hlášení o zrušení přeskočení</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunda</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundy</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekundy</string>
|
||||
|
||||
@@ -964,12 +964,12 @@ Denne funktion fungerer bedst med en videokvalitet på 720p eller lavere og ved
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Skip knap skjuler efter et par sekunder</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Spring over-knappen vises for hele segmentet</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Spring over-knap varighed</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hvor længe knapperne til automatisk skjuling af overspring og spring til højdepunkt vises</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hvor længe skal knapperne til at springe over og springe til højdepunkt vises, før de automatisk skjules</string>
|
||||
<string name="revanced_sb_general_skiptoast">Vis fortryd oversprings-toast</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Toast vises, når et segment automatisk springes over. Tryk på toast-meddelelsen for at fortryde overspringelsen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast vises ikke</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Spring over-toast varighed</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Hvor længe toast-meddelelsen ved overspringelse vises</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Hvor længe skal fortryd spring over-meddelelsen vises</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekund</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekunder</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekunder</string>
|
||||
|
||||
@@ -955,12 +955,12 @@ Diese Funktion funktioniert am besten mit einer Videoqualität von 720p oder nie
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Überspringe Taste verbirgt sich nach ein paar Sekunden</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Die Schaltfläche \"Überspringen\" wird für das gesamte Segment angezeigt</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Dauer des Überspringen-Buttons</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Wie lange die automatisch ausgeblendeten Schaltflächen zum Überspringen und zum Springen zur Markierung angezeigt werden</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Wie lange die Schaltflächen zum Überspringen und zum Hervorheben angezeigt werden sollen, bevor sie automatisch ausgeblendet werden</string>
|
||||
<string name="revanced_sb_general_skiptoast">Toast zum Rückgängigmachen des Überspringens anzeigen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ein Toast wird angezeigt, wenn ein Segment automatisch übersprungen wird. Tippen Sie auf die Toast-Benachrichtigung, um das Überspringen rückgängig zu machen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast-Nachricht wird nicht angezeigt</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Dauer der Überspring-Toastmeldung</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Wie lange die Überspringen-Toast-Benachrichtigung angezeigt wird</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Wie lange der Hinweis zum Rückgängigmachen des Überspringens angezeigt werden soll</string>
|
||||
<string name="revanced_sb_duration_1s">1 Sekunde</string>
|
||||
<string name="revanced_sb_duration_2s">2 Sekunden</string>
|
||||
<string name="revanced_sb_duration_3s">3 Sekunden</string>
|
||||
|
||||
@@ -969,7 +969,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε το μήνυμα για αναίρεση της παράλειψης</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Διάρκεια μηνύματος παράλειψης</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Διάρκεια εμφάνισης μηνύματος παράλειψης</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Διάρκεια εμφάνισης του μηνύματος αναίρεσης παράλειψης</string>
|
||||
<string name="revanced_sb_duration_1s">1 δευτερόλεπτο</string>
|
||||
<string name="revanced_sb_duration_2s">2 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_3s">3 δευτερόλεπτα</string>
|
||||
|
||||
@@ -959,12 +959,12 @@ Esta función funciona mejor con una calidad de vídeo de 720p o inferior y cuan
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Omitir botón se oculta después de unos segundos</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Se muestra el botón Saltar para todo el segmento</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Duración del botón Omitir</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">¿Cuánto tiempo se muestran automáticamente los botones de omitir y omitir para resaltar?</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cuánto tiempo se deben mostrar los botones de \"saltar\" y \"saltar al momento destacado\" antes de ocultarse automáticamente</string>
|
||||
<string name="revanced_sb_general_skiptoast">Mostrar mensaje emergente para deshacer omisión</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Se muestra un mensaje emergente cuando un segmento se omite automáticamente. Toca la notificación de mensaje emergente para deshacer la omisión</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">El mensaje emergente no se muestra</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Duración del mensaje emergente al omitir</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">¿Cuánto tiempo se muestra la notificación de mensaje emergente de omisión?</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cuánto tiempo se debe mostrar el mensaje emergente de \"deshacer salto\"</string>
|
||||
<string name="revanced_sb_duration_1s">1 segundo</string>
|
||||
<string name="revanced_sb_duration_2s">2 segundos</string>
|
||||
<string name="revanced_sb_duration_3s">3 segundos</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ See funktsioon toimib kõige paremini 720p või madalama video kvaliteedi ja vä
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Vahelejätmisnupp peitub mõne sekundi pärast</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Vahelejätmise nupp on kuvatud kogu segmendi jaoks</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Vahelejätnud nupu kestus</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Kui kaua kuvatakse automaatselt peidetud nuppe \"jäta vahele\" ja \"jäta esiletõstmise juurde\"</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Kui kaua näidata vahelejätmise ja esiletõstmise nuppe enne automaatset peitmist</string>
|
||||
<string name="revanced_sb_general_skiptoast">Kuva tühista vahelejätmise teavitus (toast)</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Teavitus kuvatakse, kui segment jäetakse automaatselt vahele. Vahelejätmise tühistamiseks puudutage teavitust</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Hüpikut ei kuvata</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Vahelejätnud hüpiku kestus</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Kui kaua kuvatakse vahelejätmise teavitust (toast)</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Kui kaua näidata vahelejätmise tagasivõtmise hüpikut</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekund</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundit</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekundit</string>
|
||||
|
||||
@@ -377,6 +377,9 @@ Rajoitukset
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Avainsana piilottaa kaikki videot: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_creator_store_shelves_title">Piilota sisällöntuottajien kauppojen hyllyt</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Kauppahyllyt soittimen alla ja videon kuvauksessa on piilotettu</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Kauppahyllyt soittimen alla ja videon kuvauksessa näytetään</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Piilota loppunäytön kauppabanneri</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Kauppabanneri on piilotettu</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Kauppabanneri näytetään</string>
|
||||
@@ -400,6 +403,9 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla"</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Piilota itse-sponsoroidut kortit</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Itse-sponsoroidut kortit ovat piilotettu</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Itse-sponsoroidut kortit näytetään</string>
|
||||
<string name="revanced_hide_tagged_products_title">Piilota tagatut tuotteet</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Tagatut tuotteet videon kuvauksessa on piilotettu</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Tagatut tuotteet videon kuvauksessa näytetään</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Piilota \"Vieraile kaupassa\" -painike kanavasivuilla</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Painike on piilotettu kanavasivuilla</string>
|
||||
@@ -665,7 +671,7 @@ Jos haluat nähdä sen, aseta \"Naamioi videovirrat\" iOS TV:ksi"</string>
|
||||
<string name="revanced_hide_player_flyout_video_quality_footer_summary_off">Videolaatuvalikon alatunniste näytetään</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<string name="revanced_hide_player_previous_next_buttons_title">Piilota Edellinen ja Seuraava -painikkeeet</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_title">Piilota Edellinen & Seuraava -painikkeet</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Painikkeet on piilotettu</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Painikkeet näytetään</string>
|
||||
<string name="revanced_hide_cast_button_title">Piilota Cast-painike</string>
|
||||
@@ -1007,7 +1013,7 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Älä näytä uudelleen</string>
|
||||
<string name="revanced_sb_diff_segments">Muuta osion käyttäytymistä</string>
|
||||
<string name="revanced_sb_segments_sponsor">Sponsori</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/sisällöntuottajista/nettisivuista/tuotteista, joista he pitävät</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Maksamaton/Itsensä mainostus</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Samankaltainen \"Sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä</string>
|
||||
<string name="revanced_sb_segments_interaction">Vuorovaikutusmuistutus (tilaaminen)</string>
|
||||
|
||||
@@ -960,12 +960,12 @@ Ang tampok na ito ay pinakamahusay na gumagana sa kalidad ng video na 720p o mas
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Tinatago ang pindutan ng skip pagkatapos ng ilang segundo</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Ipinapakita ang button na Laktawan para sa buong segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Tagal ng pindutan ng Paglaktaw</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Gaano katagal ipinapakita ang mga pindutan ng awtomatikong pagtago ng laktaw at laktaw upang i-highlight</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Gaano katagal ipakita ang mga pindutan ng paglaktaw at paglaktaw sa highlight bago awtomatikong itago</string>
|
||||
<string name="revanced_sb_general_skiptoast">Ipakita ang undo skip toast</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ipinapakita ang toast kapag awtomatikong nilaktawan ang isang segment. Tapikin ang notipikasyon ng toast upang i-undo ang paglaktaw</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Hindi ipinapakita ang toast</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Tagal ng toast sa paglaktaw</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Gaano katagal ipinapakita ang notipikasyon ng skip toast</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Gaano katagal ipakita ang paalala ng pag-undo ng paglaktaw</string>
|
||||
<string name="revanced_sb_duration_1s">1 segundo</string>
|
||||
<string name="revanced_sb_duration_2s">2 segundo</string>
|
||||
<string name="revanced_sb_duration_3s">3 segundo</string>
|
||||
|
||||
@@ -964,12 +964,12 @@ Cette fonctionnalité fonctionne de manière optimale avec une qualité vidéo d
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Le bouton Passer est masqué après quelques secondes</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Le bouton Passer est affiché pendant toute la durée du segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Durée du bouton Passer</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Durée d\'affichage avant masquage automatique des boutons Passer et Passer au temps fort</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Durée d\'affichage des boutons \"Passer\" et \"Passer au temps fort\" avant masquage automatique</string>
|
||||
<string name="revanced_sb_general_skiptoast">Afficher le message toast d\'annulation de saut</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Un message toast est affiché lorsqu\'un segment est automatiquement passé. Appuyez dessus pour annuler le saut.</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Le message toast n\'est pas affiché</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Durée du message toast de saut</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Durée d\'affichage du message toast de saut</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Durée d\'affichage du message toast d\'annulation de saut</string>
|
||||
<string name="revanced_sb_duration_1s">1 seconde</string>
|
||||
<string name="revanced_sb_duration_2s">2 secondes</string>
|
||||
<string name="revanced_sb_duration_3s">3 secondes</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Oibríonn an ghné seo is fearr le caighdeán físeáin 720p nó níos ísle agu
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Folaíonn cnaipe scipeáil tar éis cúpla soicindí</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Taispeántar cnaipe Scipeála don deighleog iomlán</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Fad an chnaipe scipeála</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cé chomh fada a thaispeántar na cnaipí uathfholaigh scipeála agus scipeála go buaicphointe</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cá fhad chun na cnaipí scipeála agus scipeála go dtí an aibhsigh a thaispeáint sula bhfolóidh siad go huathoibríoch</string>
|
||||
<string name="revanced_sb_general_skiptoast">Taispeáin teast cealaigh scipeála</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Taispeántar teast nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra teast chun an scipeáil a chealú</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Ní thaispeántar an tóstas</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Fad an tóstais scipeála</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cé chomh fada a thaispeántar an fógra teast scipeála</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cá fhad chun an fógra dísciption a thaispeáint</string>
|
||||
<string name="revanced_sb_duration_1s">1 soicind</string>
|
||||
<string name="revanced_sb_duration_2s">2 soicind</string>
|
||||
<string name="revanced_sb_duration_3s">3 soicind</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Ez a funkció a legjobban 720p vagy annál alacsonyabb videóminőség mellett
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">A kihagyás gomb néhány másodperc után eltűnik</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Az Átugrás gomb a teljes szegmenshez megjelenik</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Átugrás gomb időtartama</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Meddig láthatók az automatikus elrejtésű átugrás és kiemelés gombok</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Mennyi ideig jelenjenek meg az átugrás és az átugrás kiemeléshez gombok az automatikus elrejtés előtt</string>
|
||||
<string name="revanced_sb_general_skiptoast">Ugrás visszavonása felugró értesítés megjelenítése</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Felugró értesítés jelenik meg, amikor egy szegmens automatikusan átugrásra kerül. Érintse meg a felugró értesítést az átugrás visszavonásához</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">A felugró üzenet nem jelenik meg</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Átugrási felugró üzenet időtartama</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Meddig látható az átugrás felugró értesítés</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Mennyi ideig jelenjen meg az átugrás visszavonása felugró üzenet</string>
|
||||
<string name="revanced_sb_duration_1s">1 másodperc</string>
|
||||
<string name="revanced_sb_duration_2s">2 másodperc</string>
|
||||
<string name="revanced_sb_duration_3s">3 másodperc</string>
|
||||
|
||||
@@ -963,12 +963,12 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Բաց թողնել կոճակը թաքնվում է մի քանի վայրկյանից հետո</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Skip կոճակը ցուցադրվում է ամբողջ հատվածի համար</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Բաց թողնելու կոճակի տևողությունը</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Ինչքան ժամանակ են ցուցադրվում ավտոմատ թաքնվող բաց թողնելու և առանձնացված մասին անցնելու կոճակները։</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Որքան ժամանակ ցուցադրել բացթողում և բացթողում՝ ընդգծելու կոճակները մինչև ավտոմատ թաքնվելը</string>
|
||||
<string name="revanced_sb_general_skiptoast">Ցուցադրել բաց թողնելը չեղարկելու ծանուցումը։</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ծանուցում է ցուցադրվում, երբ հատվածն ավտոմատ կերպով բաց է թողնվում։ Հպեք ծանուցմանը՝ բացթողումը չեղարկելու համար</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Ծանուցումը չի ցուցադրվում</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Բաց թողնելու ծանուցման տևողությունը</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Ինչքան ժամանակ է ցուցադրվում բաց թողնելու ծանուցումը։</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Որքան ժամանակ ցուցադրել բացթողումը հետարկելու ծանուցումը</string>
|
||||
<string name="revanced_sb_duration_1s">1 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_2s">2 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_3s">3 վայրկյան</string>
|
||||
|
||||
@@ -400,9 +400,9 @@ Fitur ini hanya tersedia untuk perangkat yang lebih lama"</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Label promosi berbayar disembunyikan</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Label promosi berbayar ditampilkan</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Sembunyikan banner \'Lihat produk\'</string>
|
||||
<string name="revanced_hide_view_products_banner_title">Sembunyikan spanduk \'Lihat produk\'</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Spanduk di hamparan video disembunyikan</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Banner di overlay video ditampilkan</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Spanduk di hamparan video ditampilkan</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Sembunyikan kartu bersponsor pribadi</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Kartu bersponsor pribadi disembunyikan</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Kartu bersponsor pribadi ditampilkan</string>
|
||||
@@ -962,12 +962,12 @@ Fitur ini bekerja paling baik dengan kualitas video 720p atau lebih rendah dan s
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Tombol lewati disembunyikan setelah beberapa detik</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Tombol Lewati ditampilkan untuk seluruh segmen</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Durasi tombol Lewati</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Berapa lama tombol sembunyikan otomatis lewati dan lewati ke sorotan ditampilkan</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Berapa lama untuk menampilkan tombol lewati dan lewati ke sorotan sebelum bersembunyi secara otomatis</string>
|
||||
<string name="revanced_sb_general_skiptoast">Tampilkan pembatalan pesan timbul lewati</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Pesan timbul ditampilkan saat segmen dilewati secara otomatis. Ketuk notifikasi pesan timbul untuk membatalkan lewati</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Pesan timbul tidak ditampilkan</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Durasi pesan timbul lewati</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Berapa lama notifikasi pesan timbul lewati ditampilkan</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Berapa lama waktu yang dibutuhkan untuk menampilkan pembatalan pesan timbul </string>
|
||||
<string name="revanced_sb_duration_1s">1 detik</string>
|
||||
<string name="revanced_sb_duration_2s">2 detik</string>
|
||||
<string name="revanced_sb_duration_3s">3 detik</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Questa funzione funziona meglio con una qualità video di 720p o inferiore e qua
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Il pulsante Salta si nasconde dopo alcuni secondi</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Il pulsante Salta è mostrato per l\'intero segmento</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Durata pulsante Salta</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Per quanto tempo vengono mostrati i pulsanti di nascondimento automatico e di salto all\'evidenziazione</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Per quanto tempo mostrare i pulsanti Salta e Salta a evidenziazione prima che si nascondano automaticamente</string>
|
||||
<string name="revanced_sb_general_skiptoast">Mostra toast annulla salto</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Il toast viene mostrato quando un segmento viene automaticamente saltato. Tocca la notifica toast per annullare il salto</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Il toast non viene mostrato</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Durata toast Salta</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Per quanto tempo viene mostrata la notifica toast di salto</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Per quanto tempo mostrare il toast annulla salto</string>
|
||||
<string name="revanced_sb_duration_1s">1 secondo</string>
|
||||
<string name="revanced_sb_duration_2s">2 secondi</string>
|
||||
<string name="revanced_sb_duration_3s">3 secondi</string>
|
||||
|
||||
@@ -965,12 +965,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">לחצן דילוג נעלם לאחר כמה שניות</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">לחצן דילוג מוצג עבור כל המקטע</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">משך לחצן הדילוג</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">כמה זמן מוצגים כפתורי הדילוג והדילוג לסימון בהסתרה אוטומטית</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">כמה זמן להציג את כפתורי הדילוג ודילוג לסימון לפני הסתרה אוטומטית</string>
|
||||
<string name="revanced_sb_general_skiptoast">הצג הודעה קופצת לביטול דילוג</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">הודעה קופצת מוצגת כאשר קטע מדולג אוטומטית. הקש על ההודעה הקופצת כדי לבטל את הדילוג</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">הטוסט לא מוצג</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">משך טוסט הדילוג</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">כמה זמן מוצגת ההודעה הקופצת של הדילוג</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">כמה זמן להציג את הודעת \"טוסט\" ביטול הדילוג</string>
|
||||
<string name="revanced_sb_duration_1s">שנייה אחת</string>
|
||||
<string name="revanced_sb_duration_2s">שתי שניות</string>
|
||||
<string name="revanced_sb_duration_3s">3 שניות</string>
|
||||
|
||||
@@ -378,9 +378,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">全ての動画を除外するキーワード: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_creator_store_shelves_title">クリエイターのストア棚を非表示にする</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">プレーヤーの下と動画の概要欄にあるストア棚は非表示になります</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">プレーヤーの下と動画の概要欄にストアシェルフが表示されます</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">ストア広告を非表示</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">プレーヤー下および概要欄のストア広告を非表示にします</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">プレーヤー下および概要欄のストア広告を非表示にします</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">終了画面のストアバナーを非表示</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">終了画面のストアバナーを非表示にします</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">終了画面のストアバナーを非表示にします</string>
|
||||
@@ -401,15 +401,15 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">プレーヤー画面の「プロモーションを含みます」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">プレーヤー画面の「プロモーションを含みます」ボタンを非表示にします</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">\'商品を表示\'バナーを非表示にする</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">動画オーバーレイのバナーは非表示になります</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">動画オーバーレイにバナーが表示されます</string>
|
||||
<string name="revanced_hide_view_products_banner_title">「商品を表示」ボタンを非表示</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">プレーヤー画面の「商品を表示」ボタンおよび商品ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">プレーヤー画面の「商品を表示」ボタンおよび商品ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">自己スポンサー カードを非表示</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">自己スポンサー カードを非表示にします</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">自己スポンサー カードを非表示にします</string>
|
||||
<string name="revanced_hide_tagged_products_title">タグ付けされた商品を非表示にする</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">動画の概要欄にあるタグ付けされた商品は非表示になります</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">動画の概要欄にタグ付けされた商品が表示されます</string>
|
||||
<string name="revanced_hide_tagged_products_title">タグ付けされた商品へのリンクを非表示</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">概要欄のタグ付けされた商品へのリンクを非表示にします</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">概要欄のタグ付けされた商品へのリンクを非表示にします</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">「ストアに移動」ボタンを非表示</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">チャンネル ページの「ストアに移動」ボタンを非表示にします</string>
|
||||
@@ -521,9 +521,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_swipe_change_video_summary_off">全画面表示でスワイプしても、次 / 前の動画に切り替わりません</string>
|
||||
</patch>
|
||||
<patch id="layout.autocaptions.autoCaptionsPatch">
|
||||
<string name="revanced_disable_auto_captions_title">デフォルトでの字幕表示を無効にする</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">字幕がオフの状態で動画を開きます</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">字幕がオンの状態で動画を開く場合があります</string>
|
||||
<string name="revanced_disable_auto_captions_title">デフォルトでの字幕表示を無効化</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">動画を開いた際に字幕を表示しません</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">動画を開いた際に字幕を表示しません</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.action.hideButtonsPatch">
|
||||
<string name="revanced_hide_buttons_screen_title">アクション ボタン</string>
|
||||
@@ -828,7 +828,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">サウンド メタデータ ラベルを非表示</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">サウンド メタデータ ラベルは表示されません</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">サウンド メタデータ ラベルは表示されます</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">動画リンクのラベルを非表示にする</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">関連動画へのリンクを非表示</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">関連動画へのリンクは表示されません</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">関連動画へのリンクは表示されます</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">サウンド ボタンを非表示</string>
|
||||
@@ -966,11 +966,11 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">スキップボタンは、セグメントの開始から終了まで表示されます</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">スキップボタンの表示時間</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">自動非表示設定のスキップボタンとハイライトへのスキップボタンが表示される時間</string>
|
||||
<string name="revanced_sb_general_skiptoast">スキップ取り消しのトーストを表示</string>
|
||||
<string name="revanced_sb_general_skiptoast">スキップ取り消しトーストを表示</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">セグメントが自動的にスキップされた際にトーストを表示します。このトースト通知をタップすると、スキップが取り消されます</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">セグメントが自動的にスキップされた際にトーストを表示します。このトースト通知をタップすると、スキップが取り消されます</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">スキップ トーストの表示時間</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">スキップのトースト通知が表示される時間</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">スキップ取り消しトーストの表示時間</string>
|
||||
<string name="revanced_sb_duration_1s">1 秒</string>
|
||||
<string name="revanced_sb_duration_2s">2 秒</string>
|
||||
<string name="revanced_sb_duration_3s">3 秒</string>
|
||||
|
||||
@@ -24,7 +24,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_check_environment_failed_title">환경 검사에 실패하였습니다</string>
|
||||
<string name="revanced_check_environment_dialog_open_official_source_button">공식 홈페이지 열기</string>
|
||||
<string name="revanced_check_environment_dialog_ignore_button">닫기</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 사전에 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 삭제하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다.</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 다른 사람이 패치했거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 삭제하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다.</string>
|
||||
<string name="revanced_check_environment_not_same_patching_device">다른 기기에서 패치되었습니다</string>
|
||||
<string name="revanced_check_environment_manager_not_expected_installer">ReVanced Manager에 의해 설치되지 않았습니다</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time">10분 이상 전에 패치되었습니다</string>
|
||||
@@ -962,15 +962,15 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">최소화된 건너뛰기 버튼을 표시합니다</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">일반적인 건너뛰기 버튼을 표시합니다</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">자동으로 건너뛰기 버튼 숨기기</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">건너뛰기 버튼이 몇 초 후에 사라집니다</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">건너뛰기 버튼이 몇 초 후에 숨겨집니다</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">건너뛰기 버튼 표시 시간</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">자동으로 숨겨지는 \'건너뛰기\' 및 \'하이라이트로 건너뛰기\' 버튼이 표시되는 시간을 설정할 수 있습니다</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 설정할 수 있습니다</string>
|
||||
<string name="revanced_sb_general_skiptoast">건너뛰기 취소 메시지 표시하기</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 눌러서 건너뛰기를 취소할 수 있습니다</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">팝업 메시지를 표시하지 않습니다</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">건너뛰기 팝업 메시지 표시 시간</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">건너뛰기 팝업 메시지가 표시되는 시간을 설정할 수 있습니다</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">건너뛰기 취소 메시지 표시 시간</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">건너뛰기 취소 팝업 메시지가 표시되는 시간을 설정할 수 있습니다</string>
|
||||
<string name="revanced_sb_duration_1s">1 초</string>
|
||||
<string name="revanced_sb_duration_2s">2 초</string>
|
||||
<string name="revanced_sb_duration_3s">3 초</string>
|
||||
|
||||
@@ -960,12 +960,12 @@ Paieškos juostos miniatiūros bus naudojamos tos pačios kokybės kaip dabartin
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Praleidimo mygtukas pasislėps po kelių sekundžių</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Praleidimo mygtukas rodomas visam segmentui</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Praleidimo mygtuko trukmė</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Kiek laiko rodomi automatinio paslėpimo praleidimo ir praleidimo iki paryškinimo mygtukai</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Kiek laiko rodyti praleidimo ir praleidimo iki paryškinimo mygtukus prieš juos automatiškai paslepiant</string>
|
||||
<string name="revanced_sb_general_skiptoast">Rodyti praleidimo anuliavimo pranešimą</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Pranešimas rodomas, kai segmentas automatiškai praleidžiamas. Bakstelėkite pranešimą, norėdami anuliuoti praleidimą</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Pranešimas nerodomas</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Praleidimo pranešimo trukmė</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Kiek laiko rodomas praleidimo pranešimas</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Kiek laiko rodyti pranešimą apie praleidimo atšaukimą</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekundė</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundės</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekundės</string>
|
||||
|
||||
@@ -964,12 +964,12 @@ Laika skalas miniatūras izmantos tādu pašu kvalitāti kā pašreizējais vide
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Izlaides poga paslēpjas pēc dažām sekundēm</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Poga Izlaist ir redzama visam segmentam</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Izlaišanas pogas ilgums</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cik ilgi tiek rādītas automātiskās paslēpšanas izlaišanas un pārejas uz izcēlumu pogas</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cik ilgi rādīt pogas \"Izlaist\" un \"Izlaist uz izcelt\", pirms tās automātiski paslēpjas</string>
|
||||
<string name="revanced_sb_general_skiptoast">Rādīt atsaukt izlaišanas paziņojumu</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Paziņojums tiek rādīts, kad segments tiek automātiski izlaists. Pieskarieties paziņojumam, lai atsauktu izlaišanu</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Paziņojums netiek rādīts</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Izlaišanas paziņojuma ilgums</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cik ilgi tiek rādīts izlaišanas paziņojums</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cik ilgi rādīt paziņojumu par izlaišanas atcelšanu</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunde</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundes</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekundes</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Deze functie werkt het beste met een videokwaliteit van 720p of lager en wanneer
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Oversla-knop wordt na een paar seconden verborgen</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Skip-knop wordt weergegeven voor het hele segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Duur van overslaan-knop</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hoe lang de \"automatisch verbergen overslaan\"- en \"markeer\"-knoppen worden getoond</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hoe lang de knoppen \"overslaan\" en \"overslaan naar hoogtepunt\" moeten worden weergegeven voordat ze automatisch worden verborgen</string>
|
||||
<string name="revanced_sb_general_skiptoast">Toon \"overslaan ongedaan maken\"-melding</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Een melding wordt getoond wanneer een segment automatisch wordt overgeslagen. Tik op de melding om het overslaan ongedaan te maken</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast wordt niet getoond</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Duur van overslaan-toast</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Hoe lang de overslaan-melding wordt getoond</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Hoe lang de \"overslaan ongedaan maken\"-melding moet worden weergegeven</string>
|
||||
<string name="revanced_sb_duration_1s">1 seconde</string>
|
||||
<string name="revanced_sb_duration_2s">2 seconden</string>
|
||||
<string name="revanced_sb_duration_3s">3 seconden</string>
|
||||
|
||||
@@ -958,12 +958,12 @@ Ta funkcja działa najlepiej przy jakości wideo 720p lub niższej i przy korzys
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Przycisk od pomijania ukrywa się po kilku sekundach</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Przycisk pomijania jest wyświetlany dla całego segmentu</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Czas trwania przycisku pominięcia</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Jak długo wyświetlane są przyciski automatycznego ukrywania pomijania i przechodzenia do wyróżnienia</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Jak długo wyświetlać przyciski pomijania i przechodzenia do wyróżnienia przed automatycznym ukryciem</string>
|
||||
<string name="revanced_sb_general_skiptoast">Pokaż komunikat o cofnięciu pominięcia</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Komunikat jest wyświetlany, gdy segment zostanie automatycznie pominięty. Dotknij powiadomienia, aby cofnąć pominięcie</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Komunikat nie jest wyświetlany</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Czas trwania komunikatu pominięcia</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Jak długo wyświetlane jest powiadomienie o pominięciu</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Jak długo wyświetlać komunikat wyskakujący o cofnięciu pominięcia</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunda</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundy</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekundy</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Tính năng này hoạt động tốt nhất với chất lg video là 720p tr
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Pular botão esconde após alguns segundos</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">O botão \"Ignorar\" é mostrado para todo o segmento</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Duração do botão de pular</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Por quanto tempo os botões de ocultar automaticamente pular e pular para destacar são exibidos</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Quanto tempo para mostrar os botões de pular e pular para destaque antes de ocultar automaticamente</string>
|
||||
<string name="revanced_sb_general_skiptoast">Mostrar notificação de desfazer pular</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Uma notificação é exibida quando um segmento é pulado automaticamente. Toque na notificação para desfazer o pulo</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Notificação não é exibida</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Duração da notificação de pular</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Por quanto tempo a notificação de pular é exibida</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Quanto tempo para mostrar o aviso de desfazer pular</string>
|
||||
<string name="revanced_sb_duration_1s">1 segundo</string>
|
||||
<string name="revanced_sb_duration_2s">2 segundos</string>
|
||||
<string name="revanced_sb_duration_3s">3 segundos</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Această caracteristică funcționează cel mai bine cu o calitate video de 720p
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Omite ascunderea butonului după câteva secunde</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Butonul Skip este afișat pentru întregul segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Durata butonului de omitere</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cât timp sunt afișate butoanele de ascundere automată a săriturii și de săritură la evidențiere</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Cât timp să se afișeze butoanele „Omite” și „Omite la momentul cheie” înainte de a se ascunde automat</string>
|
||||
<string name="revanced_sb_general_skiptoast">Afișează notificare toast de anulare a săriturii</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Notificarea toast este afișată când un segment este sărit automat. Atingeți notificarea toast pentru a anula săritura</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Notificarea pop-up nu este afișată</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Durata notificării pop-up de omitere</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cât timp este afișată notificarea toast de săritură</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Cât timp să se afișeze notificarea de anulare a omisiunii</string>
|
||||
<string name="revanced_sb_duration_1s">1 secundă</string>
|
||||
<string name="revanced_sb_duration_2s">2 secunde</string>
|
||||
<string name="revanced_sb_duration_3s">3 secunde</string>
|
||||
|
||||
@@ -964,12 +964,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Кнопка пропуска автоматически скрывается через несколько секунд</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Кнопка пропуска показывается для всего сегмента</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Длительность кнопки пропуска</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Длительность показа кнопок автоматического скрытия пропуска и перехода к основному моменту</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Длительность показа кнопок пропуска и перехода к основному моменту до автоматического скрытия</string>
|
||||
<string name="revanced_sb_general_skiptoast">Показывать уведомление отмены пропуска</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Всплывающее уведомление показано при автоматическом пропуске сегмента. Нажмите на всплывающее уведомление для отмены пропуска</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Всплывающее уведомление скрыто</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Длительность всплывающего уведомления при пропуске</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Длительность показа всплывающего уведомления при пропуске</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Как долго показывать всплывающее сообщение об отмене пропуска</string>
|
||||
<string name="revanced_sb_duration_1s">1 секунда</string>
|
||||
<string name="revanced_sb_duration_2s">2 секунды</string>
|
||||
<string name="revanced_sb_duration_3s">3 секунды</string>
|
||||
|
||||
@@ -955,12 +955,12 @@ Táto funkcia najlepšie funguje s kvalitou videa 720p alebo nižšou a pri pou
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Tlačidlo preskočenia sa po niekoľkých sekundách skryje</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Tlačidlo Preskočiť sa zobrazuje pre celý segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Dĺžka trvania tlačidla preskočiť</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Ako dlho sú zobrazené tlačidlá pre automatické skrytie preskočenia a preskočenie na zvýraznenie</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Ako dlho zobrazovať tlačidlá preskočiť a preskočiť na zvýraznenie pred automatickým skrytím</string>
|
||||
<string name="revanced_sb_general_skiptoast">Zobraziť hlásenie o vrátení preskočenia</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Hlásenie sa zobrazí, keď je segment automaticky preskočený. Klepnutím na hlásenie preskočenie vrátite</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Hlásenie sa nezobrazuje</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Dĺžka trvania hlásenia preskočenia</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Ako dlho je zobrazené hlásenie o preskočení</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Ako dlho zobrazovať správu o zrušení preskočenia</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunda</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundy</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekundy</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Ta funkcija deluje najbolje pri kakovosti videa 720p ali nižji in pri uporabi z
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Gumb za preskakovanje se po nekaj sekundah skrije</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Gumb za preskok je prikazan za celoten segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Trajanje gumba za preskok</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Kako dolgo so prikazani gumbi za samodejno skrivanje preskakovanja in preskok na poudarek</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Kako dolgo prikazovati gumbe za preskok in preskok do označevalca, preden se samodejno skrijejo</string>
|
||||
<string name="revanced_sb_general_skiptoast">Prikaži obvestilo za razveljavitev preskakovanja</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Obvestilo se prikaže, ko je segment samodejno preskočen. Dotaknite se obvestila, da razveljavite preskok</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Obvestilo ni prikazano</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Trajanje obvestila o preskoku</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Kako dolgo je prikazano obvestilo o preskakovanju.</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Kako dolgo prikazovati obvestilo o razveljavitvi preskoka</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunda</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekundi</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekunde</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Kjo veçori funksionon më mirë me një cilësi video prej 720p ose më të ul
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Butoni i kalimit fshihet pas disa sekondash</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Butoni Kalo është i shfaqur për të gjithë segmentin</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Kohëzgjatja e butonit të kapërcimit</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Sa gjatë shfaqen butonat e fshehjes automatike të anashkalimit dhe anashkalimit te theksimi</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Sa gjatë të shfaqen butonat \"kapërce\" dhe \"kapërce te pika kryesore\" përpara fshehjes automatike</string>
|
||||
<string name="revanced_sb_general_skiptoast">Shfaq njoftimin e zhbërjes së anashkalimit</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Njoftimi shfaqet kur një segment anashkalohet automatikisht. Prek njoftimin për të zhbërë anashkalimin</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Njoftimi i shkurtër nuk shfaqet</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Kohëzgjatja e njoftimit të kapërcimit</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Sa gjatë shfaqet njoftimi i anashkalimit</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Sa gjatë të shfaqet njoftimi i përkohshëm për zhbërjen e kapërcimit</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekondë</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekonda</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekonda</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Ova funkcija najbolje radi sa kvalitetom videa od 720p ili nižim i kada koristi
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Dugme za preskakanje će biti skriveno nakon nekoliko sekundi</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Dugme za preskakanje je prikazano za ceo segment</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Trajanje dugmeta za preskakanje</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Koliko dugo se prikazuju dugmad za automatsko skrivanje preskakanja i preskakanje do isticanja</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Koliko dugo prikazivati dugmad za preskakanje i preskakanje do isticanja pre automatskog skrivanja</string>
|
||||
<string name="revanced_sb_general_skiptoast">Prikaži iskačuće obaveštenje o poništavanju preskakanja</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Iskačuće obaveštenje se prikazuje, kada se segment automatski preskoči. Dodirnite iskačuće obaveštenje da biste poništili preskakanje</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Iskačuće obaveštenje se ne prikazuje</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Trajanje iskačućeg obaveštenja pri preskakanju</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Koliko dugo se prikazuje iskačuće obaveštenje o preskakanju</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Koliko dugo prikazivati poruku za opoziv preskakanja</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunda</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekunde</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekunde</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Дугме за прескакање ће бити скривено након неколико секунди</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Дугме за прескакање је приказано за цео сегмент</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Трајање дугмета за прескакање</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Колико дуго се приказују дугмад за аутоматско скривање прескакања и прескакање до истакнутог</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Колико дуго да се приказују дугмад за прескакање и прескакање до истакнутог дела пре аутоматског скривања</string>
|
||||
<string name="revanced_sb_general_skiptoast">Прикажи искачуће обавештење о поништавању прескакања</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Искачуће обавештење се приказује, када се сегмент аутоматски прескочи. Додирните искачуће обавештење да бисте поништили прескакање</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Искачуће обавештење се не приказује</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Трајање искачућег обавештења при прескакању</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Колико дуго се приказује искачуће обавештење о прескакању</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Колико дуго да се приказује тост за поништавање прескакања</string>
|
||||
<string name="revanced_sb_duration_1s">1 секунда</string>
|
||||
<string name="revanced_sb_duration_2s">2 секунде</string>
|
||||
<string name="revanced_sb_duration_3s">3 секунде</string>
|
||||
|
||||
@@ -962,12 +962,12 @@ Den här funktionen fungerar bäst med en videokvalitet på 720p eller lägre oc
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Hoppa över-knappen döljs efter några sekunder</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Hoppa över-knappen visas för hela segmentet</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Varaktighet för Hoppa över-knappen</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hur länge knapparna för automatisk döljning av överhoppning och hoppa till markering visas</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hur länge knappen för att hoppa över och hoppa till höjdpunkt ska visas innan den döljs automatiskt</string>
|
||||
<string name="revanced_sb_general_skiptoast">Visa toastmeddelande för ångra överhoppning</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Meddelande visas när ett segment hoppas över automatiskt. Tryck på toastmeddelandet för att ångra överhoppningen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toastmeddelande visas inte</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Varaktighet för överhoppningstoastmeddelande</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Hur länge toastmeddelandet för överhoppning visas</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Hur länge toast-meddelandet för ångra överhoppning ska visas</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekund</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekunder</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekunder</string>
|
||||
|
||||
@@ -961,12 +961,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">ปุ่มข้ามซ่อนหลังจากผ่านไปไม่กี่วินาที</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">ปุ่มข้ามจะแสดงสำหรับทั้งส่วน</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">ระยะเวลาปุ่มข้าม</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">ระยะเวลาที่ปุ่มซ่อนอัตโนมัติสำหรับข้ามและข้ามไปยังไฮไลต์จะแสดง</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">นานแค่ไหนที่จะแสดงปุ่มข้ามและปุ่มข้ามไปยังไฮไลต์ก่อนที่จะซ่อนโดยอัตโนมัติ</string>
|
||||
<string name="revanced_sb_general_skiptoast">แสดงการแจ้งเตือนยกเลิกการข้าม</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">จะมีการแจ้งเตือนแสดงขึ้นเมื่อมีการข้ามส่วนโดยอัตโนมัติ แตะการแจ้งเตือนแบบชั่วคราวเพื่อยกเลิกการข้าม</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">ไม่แสดงข้อความแจ้งเตือน</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">ระยะเวลาข้อความแจ้งเตือนการข้าม</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">ระยะเวลาที่แสดงการแจ้งเตือนข้ามแบบชั่วคราว</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">นานแค่ไหนที่จะแสดงแจ้งเตือนยกเลิกการข้าม</string>
|
||||
<string name="revanced_sb_duration_1s">1 วินาที</string>
|
||||
<string name="revanced_sb_duration_2s">2 วินาที</string>
|
||||
<string name="revanced_sb_duration_3s">3 วินาที</string>
|
||||
|
||||
@@ -964,12 +964,12 @@ Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Atlama düğmesi birkaç saniye sonra gizlenir</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Atlama düğmesi bütün kısım boyunca gösterilir</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Atla düğmesi süresi</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Otomatik gizlenen atla ve vurgulaya atla düğmelerinin ne kadar süreyle gösterildiği</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Atla ve öne çıkanlara atla düğmelerini otomatik olarak gizlemeden önce ne kadar süreyle göster</string>
|
||||
<string name="revanced_sb_general_skiptoast">Atlamayı geri al bildirimini göster</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Bildirim, bir segment otomatik olarak atlandığında gösterilir. Atlamayı geri almak için bildirimine dokunun</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast gösterilmiyor</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Atlama toast süresi</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Atlama bildiriminin ne kadar süreyle gösterildiği</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Geri al atla bildirimini ne kadar süreyle göster</string>
|
||||
<string name="revanced_sb_duration_1s">1 saniye</string>
|
||||
<string name="revanced_sb_duration_2s">2 saniye</string>
|
||||
<string name="revanced_sb_duration_3s">3 saniye</string>
|
||||
|
||||
@@ -964,12 +964,12 @@ Tính năng này hoạt động tốt nhất với chất lượng video 720p tr
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Nút bỏ qua sẽ ẩn sau vài giây</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Nút bỏ qua được hiển thị cho toàn bộ phân đoạn</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Thời gian hiển thị nút bỏ qua</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Thời gian tự động ẩn nút bỏ qua và nút bỏ qua đến phần nổi bật</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Thời gian hiển thị nút bỏ qua và nút bỏ qua đến phần nổi bật trước khi tự động ẩn</string>
|
||||
<string name="revanced_sb_general_skiptoast">Hiện thông báo nổi hoàn tác bỏ qua</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Thông báo nổi được hiển thị mỗi khi tự động bỏ qua một phân đoạn. Chạm vào thông báo nổi để hoàn tác bỏ qua phân đoạn vừa rồi</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Thông báo nổi không được hiển thị</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Thời gian hiển thị thông báo nổi bỏ qua</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Thời gian hiển thị thông báo nổi bỏ qua</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Thời gian hiển thị thông báo nổi hoàn tác bỏ qua</string>
|
||||
<string name="revanced_sb_duration_1s">1 giây</string>
|
||||
<string name="revanced_sb_duration_2s">2 giây</string>
|
||||
<string name="revanced_sb_duration_3s">3 giây</string>
|
||||
|
||||
Reference in New Issue
Block a user