mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-11 13:46:17 +00:00
chore: Merge branch dev to main (#5265)
This commit is contained in:
85
CHANGELOG.md
85
CHANGELOG.md
@@ -1,3 +1,88 @@
|
||||
# [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)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **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))
|
||||
|
||||
# [5.30.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.4...v5.30.0-dev.5) (2025-06-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **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))
|
||||
|
||||
# [5.30.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.3...v5.30.0-dev.4) (2025-06-30)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **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.3](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.2...v5.30.0-dev.3) (2025-06-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **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))
|
||||
|
||||
# [5.30.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.30.0-dev.1...v5.30.0-dev.2) (2025-06-27)
|
||||
|
||||
|
||||
### 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))
|
||||
|
||||
# [5.30.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.29.1-dev.1...v5.30.0-dev.1) (2025-06-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **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-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 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))
|
||||
|
||||
|
||||
### 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))
|
||||
|
||||
## [5.29.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.29.0...v5.29.1-dev.1) (2025-06-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **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))
|
||||
|
||||
# [5.29.0](https://github.com/ReVanced/revanced-patches/compare/v5.28.0...v5.29.0) (2025-06-26)
|
||||
|
||||
|
||||
|
||||
3
build.gradle.kts
Normal file
3
build.gradle.kts
Normal file
@@ -0,0 +1,3 @@
|
||||
plugins {
|
||||
alias(libs.plugins.android.library) apply false
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id("com.android.library")
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -311,6 +311,10 @@ public class Utils {
|
||||
return getContext().getResources().getDimension(getResourceIdentifier(resourceIdentifierName, "dimen"));
|
||||
}
|
||||
|
||||
public static String[] getResourceStringArray(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
return getContext().getResources().getStringArray(getResourceIdentifier(resourceIdentifierName, "array"));
|
||||
}
|
||||
|
||||
public interface MatchFilter<T> {
|
||||
boolean matches(T object);
|
||||
}
|
||||
@@ -579,7 +583,7 @@ public class Utils {
|
||||
Context currentContext = context;
|
||||
|
||||
if (currentContext == null) {
|
||||
Logger.printException(() -> "Cannot show toast (context is null): " + messageToToast, null);
|
||||
Logger.printException(() -> "Cannot show toast (context is null): " + messageToToast);
|
||||
} else {
|
||||
Logger.printDebug(() -> "Showing toast: " + messageToToast);
|
||||
Toast.makeText(currentContext, messageToToast, toastDuration).show();
|
||||
@@ -809,7 +813,7 @@ public class Utils {
|
||||
|
||||
// Create content container (message/EditText) inside a ScrollView only if message or editText is provided.
|
||||
ScrollView contentScrollView = null;
|
||||
LinearLayout contentContainer = null;
|
||||
LinearLayout contentContainer;
|
||||
if (message != null || editText != null) {
|
||||
contentScrollView = new ScrollView(context);
|
||||
contentScrollView.setVerticalScrollBarEnabled(false); // Disable the vertical scrollbar.
|
||||
@@ -833,7 +837,7 @@ public class Utils {
|
||||
contentScrollView.addView(contentContainer);
|
||||
|
||||
// Message (if not replaced by EditText).
|
||||
if (editText == null && message != null) {
|
||||
if (editText == null) {
|
||||
TextView messageView = new TextView(context);
|
||||
messageView.setText(message); // Supports Spanned (HTML).
|
||||
messageView.setTextSize(16);
|
||||
|
||||
@@ -71,15 +71,20 @@ public class EnumSetting<T extends Enum<?>> extends Setting<T> {
|
||||
json.put(importExportKey, value.name().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private T getEnumFromString(String enumName) {
|
||||
/**
|
||||
* @param enumName Enum name. Casing does not matter.
|
||||
* @return Enum of this type with the same declared name.
|
||||
* @throws IllegalArgumentException if the name is not a valid enum of this type.
|
||||
*/
|
||||
protected T getEnumFromString(String enumName) {
|
||||
//noinspection ConstantConditions
|
||||
for (Enum<?> value : defaultValue.getClass().getEnumConstants()) {
|
||||
if (value.name().equalsIgnoreCase(enumName)) {
|
||||
// noinspection unchecked
|
||||
//noinspection unchecked
|
||||
return (T) value;
|
||||
}
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException("Unknown enum value: " + enumName);
|
||||
}
|
||||
|
||||
@@ -103,7 +108,9 @@ public class EnumSetting<T extends Enum<?>> extends Setting<T> {
|
||||
* Availability based on if this setting is currently set to any of the provided types.
|
||||
*/
|
||||
@SafeVarargs
|
||||
public final Setting.Availability availability(@NonNull T... types) {
|
||||
public final Setting.Availability availability(T... types) {
|
||||
Objects.requireNonNull(types);
|
||||
|
||||
return () -> {
|
||||
T currentEnumType = get();
|
||||
for (T enumType : types) {
|
||||
|
||||
@@ -28,16 +28,14 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* Availability based on a single parent setting being enabled.
|
||||
*/
|
||||
@NonNull
|
||||
public static Availability parent(@NonNull BooleanSetting parent) {
|
||||
public static Availability parent(BooleanSetting parent) {
|
||||
return parent::get;
|
||||
}
|
||||
|
||||
/**
|
||||
* Availability based on all parents being enabled.
|
||||
*/
|
||||
@NonNull
|
||||
public static Availability parentsAll(@NonNull BooleanSetting... parents) {
|
||||
public static Availability parentsAll(BooleanSetting... parents) {
|
||||
return () -> {
|
||||
for (BooleanSetting parent : parents) {
|
||||
if (!parent.get()) return false;
|
||||
@@ -49,8 +47,7 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* Availability based on any parent being enabled.
|
||||
*/
|
||||
@NonNull
|
||||
public static Availability parentsAny(@NonNull BooleanSetting... parents) {
|
||||
public static Availability parentsAny(BooleanSetting... parents) {
|
||||
return () -> {
|
||||
for (BooleanSetting parent : parents) {
|
||||
if (parent.get()) return true;
|
||||
@@ -79,7 +76,7 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* Adds a callback for {@link #importFromJSON(Context, String)} and {@link #exportToJson(Context)}.
|
||||
*/
|
||||
public static void addImportExportCallback(@NonNull ImportExportCallback callback) {
|
||||
public static void addImportExportCallback(ImportExportCallback callback) {
|
||||
importExportCallbacks.add(Objects.requireNonNull(callback));
|
||||
}
|
||||
|
||||
@@ -100,14 +97,13 @@ public abstract class Setting<T> {
|
||||
public static final SharedPrefCategory preferences = new SharedPrefCategory("revanced_prefs");
|
||||
|
||||
@Nullable
|
||||
public static Setting<?> getSettingFromPath(@NonNull String str) {
|
||||
public static Setting<?> getSettingFromPath(String str) {
|
||||
return PATH_TO_SETTINGS.get(str);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return All settings that have been created.
|
||||
*/
|
||||
@NonNull
|
||||
public static List<Setting<?>> allLoadedSettings() {
|
||||
return Collections.unmodifiableList(SETTINGS);
|
||||
}
|
||||
@@ -115,7 +111,6 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* @return All settings that have been created, sorted by keys.
|
||||
*/
|
||||
@NonNull
|
||||
private static List<Setting<?>> allLoadedSettingsSorted() {
|
||||
Collections.sort(SETTINGS, (Setting<?> o1, Setting<?> o2) -> o1.key.compareTo(o2.key));
|
||||
return allLoadedSettings();
|
||||
@@ -124,13 +119,11 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* The key used to store the value in the shared preferences.
|
||||
*/
|
||||
@NonNull
|
||||
public final String key;
|
||||
|
||||
/**
|
||||
* The default value of the setting.
|
||||
*/
|
||||
@NonNull
|
||||
public final T defaultValue;
|
||||
|
||||
/**
|
||||
@@ -161,7 +154,6 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* The value of the setting.
|
||||
*/
|
||||
@NonNull
|
||||
protected volatile T value;
|
||||
|
||||
public Setting(String key, T defaultValue) {
|
||||
@@ -199,8 +191,8 @@ public abstract class Setting<T> {
|
||||
* @param userDialogMessage Confirmation message to display, if the user tries to change the setting from the default value.
|
||||
* @param availability Condition that must be true, for this setting to be available to configure.
|
||||
*/
|
||||
public Setting(@NonNull String key,
|
||||
@NonNull T defaultValue,
|
||||
public Setting(String key,
|
||||
T defaultValue,
|
||||
boolean rebootApp,
|
||||
boolean includeWithImportExport,
|
||||
@Nullable String userDialogMessage,
|
||||
@@ -227,7 +219,7 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* Migrate a setting value if the path is renamed but otherwise the old and new settings are identical.
|
||||
*/
|
||||
public static <T> void migrateOldSettingToNew(@NonNull Setting<T> oldSetting, @NonNull Setting<T> newSetting) {
|
||||
public static <T> void migrateOldSettingToNew(Setting<T> oldSetting, Setting<T> newSetting) {
|
||||
if (oldSetting == newSetting) throw new IllegalArgumentException();
|
||||
|
||||
if (!oldSetting.isSetToDefault()) {
|
||||
@@ -243,7 +235,7 @@ public abstract class Setting<T> {
|
||||
* This method will be deleted in the future.
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void migrateFromOldPreferences(@NonNull SharedPrefCategory oldPrefs, @NonNull Setting setting, String settingKey) {
|
||||
public static void migrateFromOldPreferences(SharedPrefCategory oldPrefs, Setting setting, String settingKey) {
|
||||
if (!oldPrefs.preferences.contains(settingKey)) {
|
||||
return; // Nothing to do.
|
||||
}
|
||||
@@ -285,7 +277,7 @@ public abstract class Setting<T> {
|
||||
* This intentionally is a static method to deter
|
||||
* accidental usage when {@link #save(Object)} was intended.
|
||||
*/
|
||||
public static void privateSetValueFromString(@NonNull Setting<?> setting, @NonNull String newValue) {
|
||||
public static void privateSetValueFromString(Setting<?> setting, String newValue) {
|
||||
setting.setValueFromString(newValue);
|
||||
|
||||
// Clear the preference value since default is used, to allow changing
|
||||
@@ -299,7 +291,7 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* Sets the value of {@link #value}, but do not save to {@link #preferences}.
|
||||
*/
|
||||
protected abstract void setValueFromString(@NonNull String newValue);
|
||||
protected abstract void setValueFromString(String newValue);
|
||||
|
||||
/**
|
||||
* Load and set the value of {@link #value}.
|
||||
@@ -309,7 +301,7 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* Persistently saves the value.
|
||||
*/
|
||||
public final void save(@NonNull T newValue) {
|
||||
public final void save(T newValue) {
|
||||
if (value.equals(newValue)) {
|
||||
return;
|
||||
}
|
||||
@@ -406,7 +398,6 @@ public abstract class Setting<T> {
|
||||
json.put(importExportKey, value);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String exportToJson(@Nullable Context alertDialogContext) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
@@ -445,7 +436,7 @@ public abstract class Setting<T> {
|
||||
/**
|
||||
* @return if any settings that require a reboot were changed.
|
||||
*/
|
||||
public static boolean importFromJSON(@NonNull Context alertDialogContext, @NonNull String settingsJsonString) {
|
||||
public static boolean importFromJSON(Context alertDialogContext, String settingsJsonString) {
|
||||
try {
|
||||
if (!settingsJsonString.matches("[\\s\\S]*\\{")) {
|
||||
settingsJsonString = '{' + settingsJsonString + '}'; // Restore outer JSON braces
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
plugins {
|
||||
alias(libs.plugins.protobuf)
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(project(":extensions:shared:library"))
|
||||
compileOnly(project(":extensions:spotify:stub"))
|
||||
compileOnly(libs.annotation)
|
||||
|
||||
implementation(project(":extensions:spotify:utils"))
|
||||
implementation(libs.nanohttpd)
|
||||
implementation(libs.protobuf.javalite)
|
||||
}
|
||||
|
||||
android {
|
||||
@@ -14,3 +22,19 @@ android {
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
}
|
||||
|
||||
protobuf {
|
||||
protoc {
|
||||
artifact = libs.protobuf.protoc.get().toString()
|
||||
}
|
||||
|
||||
generateProtoTasks {
|
||||
all().forEach { task ->
|
||||
task.builtins {
|
||||
create("java") {
|
||||
option("lite")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
package app.revanced.extension.spotify.misc.fix;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.spotify.login5.v4.proto.Login5.*;
|
||||
import com.google.protobuf.ByteString;
|
||||
import com.google.protobuf.MessageLite;
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.FilterInputStream;
|
||||
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
|
||||
@Override
|
||||
public Response serve(IHTTPSession request) {
|
||||
Logger.printInfo(() -> "Serving request for URI: " + request.getUri());
|
||||
|
||||
InputStream requestBodyInputStream = getRequestBodyInputStream(request);
|
||||
|
||||
LoginRequest loginRequest;
|
||||
try {
|
||||
loginRequest = LoginRequest.parseFrom(requestBodyInputStream);
|
||||
} catch (IOException ex) {
|
||||
Logger.printException(() -> "Failed to parse LoginRequest", ex);
|
||||
return newResponse(INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
MessageLite loginResponse;
|
||||
|
||||
// A request may be made concurrently by Spotify,
|
||||
// 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) {
|
||||
try {
|
||||
loginResponse = getLoginResponse(loginRequest);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "Failed to get login response", ex);
|
||||
return newResponse(INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
return newResponse(Response.Status.OK, loginResponse);
|
||||
}
|
||||
|
||||
|
||||
private static LoginResponse getLoginResponse(@NonNull LoginRequest loginRequest) {
|
||||
Session session;
|
||||
|
||||
if (!loginRequest.hasStoredCredential()) {
|
||||
Logger.printInfo(() -> "Received request for initial 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);
|
||||
}
|
||||
|
||||
private static LoginResponse toLoginResponse(@Nullable Session session) {
|
||||
LoginResponse.Builder builder = LoginResponse.newBuilder();
|
||||
|
||||
if (session == null) {
|
||||
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 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);
|
||||
builder.setOk(LoginOk.newBuilder()
|
||||
.setUsername(session.username)
|
||||
.setAccessToken(session.accessToken)
|
||||
.setStoredCredential(ByteString.fromHex("00")) // Placeholder, as it cannot be null or empty.
|
||||
.setAccessTokenExpiresIn(session.accessTokenExpiresInSeconds())
|
||||
.build());
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static InputStream limitedInputStream(InputStream inputStream, long contentLength) {
|
||||
return new FilterInputStream(inputStream) {
|
||||
private long remaining = contentLength;
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
if (remaining <= 0) return -1;
|
||||
int result = super.read();
|
||||
if (result != -1) remaining--;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
if (remaining <= 0) return -1;
|
||||
len = (int) Math.min(len, remaining);
|
||||
int result = super.read(b, off, len);
|
||||
if (result != -1) remaining -= result;
|
||||
return result;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static InputStream getRequestBodyInputStream(@NonNull IHTTPSession request) {
|
||||
long requestContentLength =
|
||||
Long.parseLong(Objects.requireNonNull(request.getHeaders().get("content-length")));
|
||||
return limitedInputStream(request.getInputStream(), requestContentLength);
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
@NonNull
|
||||
private static Response newResponse(Response.Status status) {
|
||||
return newResponse(status, null);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static Response newResponse(Response.IStatus status, MessageLite messageLite) {
|
||||
if (messageLite == null) {
|
||||
return newFixedLengthResponse(status, "application/x-protobuf", null);
|
||||
}
|
||||
|
||||
byte[] messageBytes = messageLite.toByteArray();
|
||||
InputStream stream = new ByteArrayInputStream(messageBytes);
|
||||
return newFixedLengthResponse(status, "application/x-protobuf", stream, messageBytes.length);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
package app.revanced.extension.spotify.misc.fix;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import static android.content.Context.MODE_PRIVATE;
|
||||
|
||||
class Session {
|
||||
/**
|
||||
* Username of the account. Null if this session does not have an authenticated user.
|
||||
*/
|
||||
@Nullable
|
||||
final String username;
|
||||
/**
|
||||
* Access token for this session.
|
||||
*/
|
||||
final String accessToken;
|
||||
/**
|
||||
* Session expiration timestamp in milliseconds.
|
||||
*/
|
||||
final Long expirationTime;
|
||||
/**
|
||||
* Authentication cookies for this 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.
|
||||
* @param cookies Authentication cookies for this session.
|
||||
*/
|
||||
Session(@Nullable String username, String accessToken, String cookies) {
|
||||
this(username, accessToken, System.currentTimeMillis() + 60 * 60 * 1000, cookies);
|
||||
}
|
||||
|
||||
private Session(@Nullable String username, String accessToken, long expirationTime, String cookies) {
|
||||
this.username = username;
|
||||
this.accessToken = accessToken;
|
||||
this.expirationTime = expirationTime;
|
||||
this.cookies = cookies;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The number of milliseconds until the access token expires.
|
||||
*/
|
||||
long accessTokenExpiresInMillis() {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
return expirationTime - currentTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The number of seconds until the access token expires.
|
||||
*/
|
||||
int accessTokenExpiresInSeconds() {
|
||||
return (int) accessTokenExpiresInMillis() / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return True if the access token has expired, false otherwise.
|
||||
*/
|
||||
boolean accessTokenExpired() {
|
||||
return accessTokenExpiresInMillis() <= 0;
|
||||
}
|
||||
|
||||
void save() {
|
||||
Logger.printInfo(() -> "Saving session: " + this);
|
||||
|
||||
SharedPreferences.Editor editor = Utils.getContext().getSharedPreferences("revanced", MODE_PRIVATE).edit();
|
||||
|
||||
String json;
|
||||
try {
|
||||
json = new JSONObject()
|
||||
.put("accessToken", accessToken)
|
||||
.put("expirationTime", expirationTime)
|
||||
.put("cookies", cookies).toString();
|
||||
} catch (JSONException ex) {
|
||||
Logger.printException(() -> "Failed to convert session to stored credential", ex);
|
||||
return;
|
||||
}
|
||||
|
||||
editor.putString("session_" + username, json);
|
||||
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);
|
||||
|
||||
SharedPreferences sharedPreferences = Utils.getContext().getSharedPreferences("revanced", MODE_PRIVATE);
|
||||
String savedJson = sharedPreferences.getString("session_" + username, null);
|
||||
if (savedJson == null) {
|
||||
Logger.printInfo(() -> "No session found in shared preferences");
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
JSONObject json = new JSONObject(savedJson);
|
||||
String accessToken = json.getString("accessToken");
|
||||
long expirationTime = json.getLong("expirationTime");
|
||||
String cookies = json.getString("cookies");
|
||||
|
||||
return new Session(username, accessToken, expirationTime, cookies);
|
||||
} catch (JSONException ex) {
|
||||
Logger.printException(() -> "Failed to read session from shared preferences", ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Session(" +
|
||||
"username=" + username +
|
||||
", accessToken=" + accessToken +
|
||||
", expirationTime=" + expirationTime +
|
||||
", cookies=" + cookies +
|
||||
')';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package app.revanced.extension.spotify.misc.fix;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class SpoofClientPatch {
|
||||
private static LoginRequestListener listener;
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <br>
|
||||
* Launch login server.
|
||||
*/
|
||||
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);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "launchListener failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <br>
|
||||
* Launch login web view.
|
||||
*/
|
||||
public static void launchLogin(LayoutInflater inflater) {
|
||||
try {
|
||||
WebApp.launchLogin(inflater.getContext());
|
||||
} catch (Exception 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();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,297 @@
|
||||
package app.revanced.extension.spotify.misc.fix;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Build;
|
||||
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 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?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();
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
interface NativeLoginHandler {
|
||||
void login();
|
||||
}
|
||||
|
||||
static NativeLoginHandler nativeLoginHandler;
|
||||
|
||||
static void launchLogin(Context context) {
|
||||
final Dialog dialog = newDialog(context);
|
||||
|
||||
Utils.runOnBackgroundThread(() -> {
|
||||
Logger.printInfo(() -> "Launching login");
|
||||
|
||||
// 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);
|
||||
|
||||
// Can't use Utils.getContext() here, because autofill won't work.
|
||||
// See https://stackoverflow.com/a/79182053/11213244.
|
||||
launchWebView(context, ACCOUNTS_SPOTIFY_COM_LOGIN_URL, new WebViewCallback() {
|
||||
@Override
|
||||
void onInitialized(WebView webView) {
|
||||
super.onInitialized(webView);
|
||||
|
||||
dialog.setContentView(webView);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
void onLoggedIn(String cookies) {
|
||||
onLoggedInLatch.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
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 renewSessionBlocking(String cookies) {
|
||||
Logger.printInfo(() -> "Renewing session with cookies: " + cookies);
|
||||
|
||||
CountDownLatch getSessionLatch = new CountDownLatch(1);
|
||||
|
||||
launchWebView(Utils.getContext(), OPEN_SPOTIFY_COM_PREFERENCES_URL, new WebViewCallback() {
|
||||
@Override
|
||||
public void onInitialized(WebView webView) {
|
||||
setCookies(cookies);
|
||||
super.onInitialized(webView);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
if (!isAcquired) {
|
||||
Logger.printException(() -> "Failed to retrieve session within " + GET_SESSION_TIMEOUT_SECONDS + " seconds");
|
||||
currentSession = FAILED_TO_RENEW_SESSION;
|
||||
destructWebView();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* All methods are called on the main thread.
|
||||
*/
|
||||
abstract static class WebViewCallback {
|
||||
void onInitialized(WebView webView) {
|
||||
currentWebView = webView;
|
||||
currentSession = null; // Reset current session.
|
||||
}
|
||||
|
||||
void onLoggedIn(String cookies) {
|
||||
}
|
||||
|
||||
void onReceivedSession(Session session) {
|
||||
Logger.printInfo(() -> "Received session: " + session);
|
||||
currentSession = session;
|
||||
|
||||
destructWebView();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
private static void launchWebView(
|
||||
Context context,
|
||||
String initialUrl,
|
||||
WebViewCallback webViewCallback
|
||||
) {
|
||||
Utils.runOnMainThreadNowOrLater(() -> {
|
||||
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() {
|
||||
@Override
|
||||
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
|
||||
if (OPEN_SPOTIFY_COM.equals(request.getUrl().getHost())) {
|
||||
Utils.runOnMainThread(() -> webViewCallback.onLoggedIn(getCurrentCookies()));
|
||||
}
|
||||
|
||||
return super.shouldInterceptRequest(view, request);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageStarted(WebView view, String url, Bitmap favicon) {
|
||||
Logger.printInfo(() -> "Page started loading: " + url);
|
||||
|
||||
if (!url.startsWith(OPEN_SPOTIFY_COM_URL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.printInfo(() -> "Evaluating script to get session on url: " + url);
|
||||
String getSessionScript = "Object.defineProperty(Object.prototype, \"_username\", {" +
|
||||
" configurable: true," +
|
||||
" set(username) {" +
|
||||
" accessToken = this._builder?.accessToken;" +
|
||||
" if (accessToken) {" +
|
||||
" " + JAVASCRIPT_INTERFACE_NAME + ".getSession(username, accessToken);" +
|
||||
" delete Object.prototype._username;" +
|
||||
" }" +
|
||||
" " +
|
||||
" Object.defineProperty(this, \"_username\", {" +
|
||||
" configurable: true," +
|
||||
" enumerable: true," +
|
||||
" writable: true," +
|
||||
" value: username" +
|
||||
" })" +
|
||||
" " +
|
||||
" }" +
|
||||
"});" +
|
||||
"if (new URLSearchParams(window.location.search).get('_authfailed') != null) {" +
|
||||
" " + JAVASCRIPT_INTERFACE_NAME + ".getSession(null, null);" +
|
||||
"}";
|
||||
|
||||
view.evaluateJavascript(getSessionScript, null);
|
||||
}
|
||||
});
|
||||
|
||||
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(session));
|
||||
}
|
||||
}, JAVASCRIPT_INTERFACE_NAME);
|
||||
|
||||
CookieManager.getInstance().removeAllCookies((anyRemoved) -> {
|
||||
Logger.printInfo(() -> "Loading URL: " + initialUrl);
|
||||
webView.loadUrl(initialUrl);
|
||||
|
||||
Logger.printInfo(() -> "WebView initialized with user agent: " + USER_AGENT);
|
||||
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 {
|
||||
return new UserAgent(userAgentString)
|
||||
.withCommentReplaced("Android", "Windows NT 10.0; Win64; x64")
|
||||
.withoutProduct("Mobile")
|
||||
.toString();
|
||||
} 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, 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);
|
||||
}
|
||||
|
||||
private static void setCookies(@NonNull String cookies) {
|
||||
CookieManager cookieManager = CookieManager.getInstance();
|
||||
|
||||
String[] cookiesList = cookies.split(";");
|
||||
for (String cookie : cookiesList) {
|
||||
cookieManager.setCookie(OPEN_SPOTIFY_COM_URL, cookie);
|
||||
}
|
||||
}
|
||||
}
|
||||
43
extensions/spotify/src/main/proto/login5.proto
Normal file
43
extensions/spotify/src/main/proto/login5.proto
Normal file
@@ -0,0 +1,43 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package spotify.login5.v4;
|
||||
|
||||
option optimize_for = LITE_RUNTIME;
|
||||
option java_package = "app.revanced.extension.spotify.login5.v4.proto";
|
||||
|
||||
message StoredCredential {
|
||||
string username = 1;
|
||||
bytes data = 2;
|
||||
}
|
||||
|
||||
message LoginRequest {
|
||||
oneof login_method {
|
||||
StoredCredential stored_credential = 100;
|
||||
}
|
||||
}
|
||||
|
||||
message LoginOk {
|
||||
string username = 1;
|
||||
string access_token = 2;
|
||||
bytes stored_credential = 3;
|
||||
int32 access_token_expires_in = 4;
|
||||
}
|
||||
|
||||
message LoginResponse {
|
||||
oneof response {
|
||||
LoginOk ok = 1;
|
||||
LoginError error = 2;
|
||||
}
|
||||
}
|
||||
|
||||
enum LoginError {
|
||||
UNKNOWN_ERROR = 0;
|
||||
INVALID_CREDENTIALS = 1;
|
||||
BAD_REQUEST = 2;
|
||||
UNSUPPORTED_LOGIN_PROTOCOL = 3;
|
||||
TIMEOUT = 4;
|
||||
UNKNOWN_IDENTIFIER = 5;
|
||||
TOO_MANY_ATTEMPTS = 6;
|
||||
INVALID_PHONENUMBER = 7;
|
||||
TRY_AGAIN_LATER = 8;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
package app.revanced;
|
||||
|
||||
public interface ContextMenuItemPlaceholder {
|
||||
Object getViewModel();
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.spotify.browsita.v1.resolved;
|
||||
|
||||
public final class Section {
|
||||
public static final int BRAND_ADS_FIELD_NUMBER = 6;
|
||||
public int sectionTypeCase_;
|
||||
}
|
||||
19
extensions/spotify/utils/build.gradle.kts
Normal file
19
extensions/spotify/utils/build.gradle.kts
Normal file
@@ -0,0 +1,19 @@
|
||||
plugins {
|
||||
java
|
||||
antlr
|
||||
}
|
||||
|
||||
dependencies {
|
||||
antlr(libs.antlr4)
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
tasks {
|
||||
generateGrammarSource {
|
||||
arguments = listOf("-visitor")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
grammar UserAgent;
|
||||
|
||||
@header { package app.revanced.extension.spotify; }
|
||||
|
||||
userAgent
|
||||
: product (WS product)* EOF
|
||||
;
|
||||
|
||||
product
|
||||
: name ('/' version)? (WS comment)?
|
||||
;
|
||||
|
||||
name
|
||||
: STRING
|
||||
;
|
||||
|
||||
version
|
||||
: STRING ('.' STRING)*
|
||||
;
|
||||
|
||||
comment
|
||||
: COMMENT
|
||||
;
|
||||
|
||||
COMMENT
|
||||
: '(' ~ ')'* ')'
|
||||
;
|
||||
|
||||
STRING
|
||||
: [a-zA-Z0-9]+
|
||||
;
|
||||
|
||||
WS
|
||||
: [ \r\n]+
|
||||
;
|
||||
@@ -0,0 +1,60 @@
|
||||
package app.revanced.extension.spotify;
|
||||
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.CharStreams;
|
||||
import org.antlr.v4.runtime.CommonTokenStream;
|
||||
import org.antlr.v4.runtime.TokenStreamRewriter;
|
||||
import org.antlr.v4.runtime.tree.ParseTreeWalker;
|
||||
|
||||
public class UserAgent {
|
||||
private final UserAgentParser.UserAgentContext tree;
|
||||
private final TokenStreamRewriter rewriter;
|
||||
private final ParseTreeWalker walker;
|
||||
|
||||
public UserAgent(String userAgentString) {
|
||||
CharStream input = CharStreams.fromString(userAgentString);
|
||||
UserAgentLexer lexer = new UserAgentLexer(input);
|
||||
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
||||
|
||||
tree = new UserAgentParser(tokens).userAgent();
|
||||
walker = new ParseTreeWalker();
|
||||
rewriter = new TokenStreamRewriter(tokens);
|
||||
}
|
||||
|
||||
public UserAgent withoutProduct(String name) {
|
||||
walker.walk(new UserAgentBaseListener() {
|
||||
@Override
|
||||
public void exitProduct(UserAgentParser.ProductContext ctx) {
|
||||
if (!ctx.name().getText().contains(name)) return;
|
||||
|
||||
int startIndex = ctx.getStart().getTokenIndex();
|
||||
if (startIndex != 0) startIndex -= 1; // Also remove the preceding whitespace.
|
||||
|
||||
int stopIndex = ctx.getStop().getTokenIndex();
|
||||
|
||||
|
||||
rewriter.delete(startIndex, stopIndex);
|
||||
}
|
||||
}, tree);
|
||||
|
||||
return new UserAgent(rewriter.getText().trim());
|
||||
}
|
||||
|
||||
public UserAgent withCommentReplaced(String containing, String replacement) {
|
||||
walker.walk(new UserAgentBaseListener() {
|
||||
@Override
|
||||
public void exitComment(UserAgentParser.CommentContext ctx) {
|
||||
if (ctx.getText().contains(containing)) {
|
||||
rewriter.replace(ctx.getStart(), ctx.getStop(), "(" + replacement + ")");
|
||||
}
|
||||
}
|
||||
}, tree);
|
||||
|
||||
return new UserAgent(rewriter.getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return rewriter.getText();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
android.namespace = "app.revanced.extension"
|
||||
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -107,27 +107,29 @@ public final class AdsFilter extends Filter {
|
||||
);
|
||||
|
||||
final var viewProducts = new StringFilterGroup(
|
||||
Settings.HIDE_PRODUCTS_BANNER,
|
||||
Settings.HIDE_VIEW_PRODUCTS_BANNER,
|
||||
"product_item",
|
||||
"products_in_video",
|
||||
"shopping_overlay.eml", // Video player overlay shopping links.
|
||||
"shopping_carousel.eml" // Channel profile shopping shelf.
|
||||
"shopping_overlay.eml" // Video player overlay shopping links.
|
||||
);
|
||||
|
||||
shoppingLinks = new StringFilterGroup(
|
||||
Settings.HIDE_SHOPPING_LINKS,
|
||||
Settings.HIDE_TAGGED_PRODUCTS,
|
||||
"expandable_list"
|
||||
);
|
||||
|
||||
final var storeProductsShelf = new StringFilterGroup(
|
||||
Settings.HIDE_CREATOR_STORE_SHELVES,
|
||||
"shopping_description_shelf.eml"
|
||||
);
|
||||
|
||||
playerShoppingShelf = new StringFilterGroup(
|
||||
Settings.HIDE_PLAYER_STORE_SHELF,
|
||||
"expandable_list.eml",
|
||||
Settings.HIDE_CREATOR_STORE_SHELVES,
|
||||
"horizontal_shelf.eml"
|
||||
);
|
||||
|
||||
playerShoppingShelfBuffer = new ByteArrayFilterGroup(
|
||||
null,
|
||||
"shopping_link_item",
|
||||
"shopping_item_card_list"
|
||||
);
|
||||
|
||||
@@ -149,7 +151,8 @@ public final class AdsFilter extends Filter {
|
||||
|
||||
final var merchandise = new StringFilterGroup(
|
||||
Settings.HIDE_MERCHANDISE_BANNERS,
|
||||
"product_carousel"
|
||||
"product_carousel",
|
||||
"shopping_carousel.eml" // Channel profile shopping shelf.
|
||||
);
|
||||
|
||||
final var selfSponsor = new StringFilterGroup(
|
||||
@@ -158,16 +161,17 @@ public final class AdsFilter extends Filter {
|
||||
);
|
||||
|
||||
addPathCallbacks(
|
||||
channelProfile,
|
||||
fullscreenAd,
|
||||
generalAds,
|
||||
merchandise,
|
||||
viewProducts,
|
||||
selfSponsor,
|
||||
fullscreenAd,
|
||||
channelProfile,
|
||||
webLinkPanel,
|
||||
shoppingLinks,
|
||||
movieAds,
|
||||
playerShoppingShelf,
|
||||
movieAds
|
||||
selfSponsor,
|
||||
shoppingLinks,
|
||||
storeProductsShelf,
|
||||
viewProducts,
|
||||
webLinkPanel
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ final class CommentsFilter extends Filter {
|
||||
|
||||
filterChipBar = new StringFilterGroup(
|
||||
Settings.HIDE_COMMENTS_AI_SUMMARY,
|
||||
"filter_chip_bar.eml"
|
||||
"chip_bar.eml"
|
||||
);
|
||||
|
||||
aiCommentsSummary = new ByteArrayFilterGroup(
|
||||
|
||||
@@ -4,6 +4,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
final class DescriptionComponentsFilter extends Filter {
|
||||
@@ -17,6 +18,8 @@ final class DescriptionComponentsFilter extends Filter {
|
||||
private final StringFilterGroup horizontalShelf;
|
||||
private final ByteArrayFilterGroup cellVideoAttribute;
|
||||
|
||||
private final StringFilterGroup aiGeneratedVideoSummarySection;
|
||||
|
||||
public DescriptionComponentsFilter() {
|
||||
exceptions.addPatterns(
|
||||
"compact_channel",
|
||||
@@ -26,7 +29,7 @@ final class DescriptionComponentsFilter extends Filter {
|
||||
"metadata"
|
||||
);
|
||||
|
||||
final StringFilterGroup aiGeneratedVideoSummarySection = new StringFilterGroup(
|
||||
aiGeneratedVideoSummarySection = new StringFilterGroup(
|
||||
Settings.HIDE_AI_GENERATED_VIDEO_SUMMARY_SECTION,
|
||||
"cell_expandable_metadata.eml"
|
||||
);
|
||||
@@ -104,6 +107,12 @@ final class DescriptionComponentsFilter extends Filter {
|
||||
@Override
|
||||
boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray,
|
||||
StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) {
|
||||
|
||||
if (matchedGroup == aiGeneratedVideoSummarySection) {
|
||||
// Only hide if player is open, in case this component is used somewhere else.
|
||||
return PlayerType.getCurrent().isMaximizedOrFullscreen();
|
||||
}
|
||||
|
||||
if (exceptions.matches(path)) return false;
|
||||
|
||||
if (matchedGroup == macroMarkersCarousel) {
|
||||
|
||||
@@ -39,6 +39,7 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
private final ByteArrayFilterGroup joinMembershipButton;
|
||||
private final StringFilterGroup horizontalShelves;
|
||||
private final ByteArrayFilterGroup ticketShelf;
|
||||
private final StringFilterGroup chipBar;
|
||||
|
||||
public LayoutComponentsFilter() {
|
||||
exceptions.addPatterns(
|
||||
@@ -105,6 +106,11 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
"subscriptions_chip_bar"
|
||||
);
|
||||
|
||||
chipBar = new StringFilterGroup(
|
||||
Settings.HIDE_FILTER_BAR_FEED_IN_HISTORY,
|
||||
"chip_bar"
|
||||
);
|
||||
|
||||
inFeedSurvey = new StringFilterGroup(
|
||||
Settings.HIDE_FEED_SURVEY,
|
||||
"in_feed_survey",
|
||||
@@ -247,7 +253,7 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
|
||||
ticketShelf = new ByteArrayFilterGroup(
|
||||
Settings.HIDE_TICKET_SHELF,
|
||||
"ticket"
|
||||
"ticket.eml"
|
||||
);
|
||||
|
||||
addPathCallbacks(
|
||||
@@ -272,6 +278,7 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
emergencyBox,
|
||||
subscribersCommunityGuidelines,
|
||||
subscriptionsChipBar,
|
||||
chipBar,
|
||||
channelGuidelines,
|
||||
audioTrackButton,
|
||||
artistCard,
|
||||
@@ -314,6 +321,10 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
return contentIndex == 0 && (hideShelves() || ticketShelf.check(protobufBufferArray).isFiltered());
|
||||
}
|
||||
|
||||
if (matchedGroup == chipBar) {
|
||||
return contentIndex == 0 && NavigationButton.getSelectedNavigationButton() == NavigationButton.LIBRARY;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -448,7 +459,7 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
}
|
||||
|
||||
// Do not hide if the navigation back button is visible,
|
||||
// otherwise the content shelves in the explore/music/courses pages are hidde.
|
||||
// otherwise the content shelves in the explore/music/courses pages are hidden.
|
||||
if (NavigationBar.isBackButtonVisible()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ public final class LithoFilterPatch {
|
||||
/**
|
||||
* Search through a byte array for all ASCII strings.
|
||||
*/
|
||||
private static void findAsciiStrings(StringBuilder builder, byte[] buffer) {
|
||||
static void findAsciiStrings(StringBuilder builder, byte[] buffer) {
|
||||
// Valid ASCII values (ignore control characters).
|
||||
final int minimumAscii = 32; // 32 = space character
|
||||
final int maximumAscii = 126; // 127 = delete character
|
||||
@@ -96,7 +96,7 @@ public final class LithoFilterPatch {
|
||||
private static final class DummyFilter extends Filter { }
|
||||
|
||||
private static final Filter[] filters = new Filter[] {
|
||||
new DummyFilter() // Replaced by patch.
|
||||
new DummyFilter() // Replaced patching, do not touch.
|
||||
};
|
||||
|
||||
private static final StringTrieSearch pathSearchTree = new StringTrieSearch();
|
||||
@@ -108,11 +108,7 @@ public final class LithoFilterPatch {
|
||||
* Because litho filtering is multi-threaded and the buffer is passed in from a different injection point,
|
||||
* the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads.
|
||||
*/
|
||||
private static final ThreadLocal<ByteBuffer> bufferThreadLocal = new ThreadLocal<>();
|
||||
/**
|
||||
* Results of calling {@link #filter(String, StringBuilder)}.
|
||||
*/
|
||||
private static final ThreadLocal<Boolean> filterResult = new ThreadLocal<>();
|
||||
private static final ThreadLocal<byte[]> bufferThreadLocal = new ThreadLocal<>();
|
||||
|
||||
static {
|
||||
for (Filter filter : filters) {
|
||||
@@ -168,57 +164,50 @@ public final class LithoFilterPatch {
|
||||
/**
|
||||
* Injection point. Called off the main thread.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public static void setProtoBuffer(@Nullable ByteBuffer protobufBuffer) {
|
||||
public static void setProtoBuffer(byte[] buffer) {
|
||||
// Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes.
|
||||
// This is intentional, as it appears the buffer can be set once and then filtered multiple times.
|
||||
// The buffer will be cleared from memory after a new buffer is set by the same thread,
|
||||
// or when the calling thread eventually dies.
|
||||
if (protobufBuffer == null) {
|
||||
bufferThreadLocal.set(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point. Called off the main thread.
|
||||
* Targets 20.21 and lower.
|
||||
*/
|
||||
public static void setProtoBuffer(@Nullable ByteBuffer buffer) {
|
||||
// Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes.
|
||||
// This is intentional, as it appears the buffer can be set once and then filtered multiple times.
|
||||
// The buffer will be cleared from memory after a new buffer is set by the same thread,
|
||||
// or when the calling thread eventually dies.
|
||||
if (buffer == null || !buffer.hasArray()) {
|
||||
// It appears the buffer can be cleared out just before the call to #filter()
|
||||
// Ignore this null value and retain the last buffer that was set.
|
||||
Logger.printDebug(() -> "Ignoring null protobuffer");
|
||||
Logger.printDebug(() -> "Ignoring null or empty buffer: " + buffer);
|
||||
} else {
|
||||
bufferThreadLocal.set(protobufBuffer);
|
||||
setProtoBuffer(buffer.array());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean shouldFilter() {
|
||||
Boolean shouldFilter = filterResult.get();
|
||||
return shouldFilter != null && shouldFilter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point. Called off the main thread, and commonly called by multiple threads at the same time.
|
||||
*/
|
||||
public static void filter(@Nullable String lithoIdentifier, StringBuilder pathBuilder) {
|
||||
filterResult.set(handleFiltering(lithoIdentifier, pathBuilder));
|
||||
}
|
||||
|
||||
private static boolean handleFiltering(@Nullable String lithoIdentifier, StringBuilder pathBuilder) {
|
||||
public static boolean shouldFilter(@Nullable String lithoIdentifier, StringBuilder pathBuilder) {
|
||||
try {
|
||||
if (pathBuilder.length() == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ByteBuffer protobufBuffer = bufferThreadLocal.get();
|
||||
final byte[] bufferArray;
|
||||
byte[] buffer = bufferThreadLocal.get();
|
||||
// Potentially the buffer may have been null or never set up until now.
|
||||
// Use an empty buffer so the litho id/path filters still work correctly.
|
||||
if (protobufBuffer == null) {
|
||||
bufferArray = EMPTY_BYTE_ARRAY;
|
||||
} else if (!protobufBuffer.hasArray()) {
|
||||
Logger.printDebug(() -> "Proto buffer does not have an array, using an empty buffer array");
|
||||
bufferArray = EMPTY_BYTE_ARRAY;
|
||||
} else {
|
||||
bufferArray = protobufBuffer.array();
|
||||
if (buffer == null) {
|
||||
buffer = EMPTY_BYTE_ARRAY;
|
||||
}
|
||||
|
||||
LithoFilterParameters parameter = new LithoFilterParameters(lithoIdentifier,
|
||||
pathBuilder.toString(), bufferArray);
|
||||
LithoFilterParameters parameter = new LithoFilterParameters(
|
||||
lithoIdentifier, pathBuilder.toString(), buffer);
|
||||
Logger.printDebug(() -> "Searching " + parameter);
|
||||
|
||||
if (parameter.identifier != null && identifierSearchTree.matches(parameter.identifier, parameter)) {
|
||||
|
||||
@@ -44,6 +44,8 @@ public final class ShortsFilter extends Filter {
|
||||
private final ByteArrayFilterGroup shortsCompactFeedVideoBuffer;
|
||||
private final StringFilterGroup useSoundButton;
|
||||
private final ByteArrayFilterGroup useSoundButtonBuffer;
|
||||
private final StringFilterGroup useTemplateButton;
|
||||
private final ByteArrayFilterGroup useTemplateButtonBuffer;
|
||||
|
||||
private final StringFilterGroup subscribeButton;
|
||||
private final StringFilterGroup joinButton;
|
||||
@@ -178,7 +180,10 @@ public final class ShortsFilter extends Filter {
|
||||
|
||||
useSoundButton = new StringFilterGroup(
|
||||
Settings.HIDE_SHORTS_USE_SOUND_BUTTON,
|
||||
// First filter needed for "Use this sound" that can appear when viewing Shorts
|
||||
// through the "Short remixing this video" section.
|
||||
"floating_action_button.eml",
|
||||
// Second filter needed for "Use this sound" that can appear below the video title.
|
||||
REEL_METAPANEL_PATH
|
||||
);
|
||||
|
||||
@@ -187,6 +192,17 @@ public final class ShortsFilter extends Filter {
|
||||
"yt_outline_camera_"
|
||||
);
|
||||
|
||||
useTemplateButton = new StringFilterGroup(
|
||||
Settings.HIDE_SHORTS_USE_TEMPLATE_BUTTON,
|
||||
// Second filter needed for "Use this template" that can appear below the video title.
|
||||
REEL_METAPANEL_PATH
|
||||
);
|
||||
|
||||
useTemplateButtonBuffer = new ByteArrayFilterGroup(
|
||||
null,
|
||||
"yt_outline_template_add_"
|
||||
);
|
||||
|
||||
videoActionButton = new StringFilterGroup(
|
||||
null,
|
||||
// Can be simply 'button.eml', 'shorts_video_action_button.eml' or 'reel_action_button.eml'
|
||||
@@ -195,8 +211,7 @@ public final class ShortsFilter extends Filter {
|
||||
|
||||
suggestedAction = new StringFilterGroup(
|
||||
null,
|
||||
"suggested_action.eml",
|
||||
REEL_METAPANEL_PATH
|
||||
"suggested_action.eml"
|
||||
);
|
||||
|
||||
addPathCallbacks(
|
||||
@@ -268,6 +283,7 @@ public final class ShortsFilter extends Filter {
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_USE_TEMPLATE_BUTTON,
|
||||
// "Use this template" can appear in two different places.
|
||||
"yt_outline_template_add_"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
@@ -317,6 +333,10 @@ public final class ShortsFilter extends Filter {
|
||||
return useSoundButtonBuffer.check(protobufBufferArray).isFiltered();
|
||||
}
|
||||
|
||||
if (matchedGroup == useTemplateButton) {
|
||||
return useTemplateButtonBuffer.check(protobufBufferArray).isFiltered();
|
||||
}
|
||||
|
||||
if (matchedGroup == shortsCompactFeedVideo) {
|
||||
return shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(protobufBufferArray).isFiltered();
|
||||
}
|
||||
@@ -402,17 +422,6 @@ public final class ShortsFilter extends Filter {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point. Only used if patching older than 19.03.
|
||||
* This hook may be obsolete even for old versions
|
||||
* as they now use a litho layout like newer versions.
|
||||
*/
|
||||
public static void hideShortsShelf(final View shortsShelfView) {
|
||||
if (shouldHideShortsFeedItems()) {
|
||||
Utils.hideViewByLayoutParams(shortsShelfView);
|
||||
}
|
||||
}
|
||||
|
||||
public static int getSoundButtonSize(int original) {
|
||||
if (Settings.HIDE_SHORTS_SOUND_BUTTON.get()) {
|
||||
return 0;
|
||||
|
||||
@@ -5,6 +5,7 @@ import static java.lang.Boolean.TRUE;
|
||||
import static app.revanced.extension.shared.settings.Setting.Availability;
|
||||
import static app.revanced.extension.shared.settings.Setting.migrateOldSettingToNew;
|
||||
import static app.revanced.extension.shared.settings.Setting.parent;
|
||||
import static app.revanced.extension.shared.settings.Setting.parentsAll;
|
||||
import static app.revanced.extension.shared.settings.Setting.parentsAny;
|
||||
import static app.revanced.extension.youtube.patches.ChangeFormFactorPatch.FormFactor;
|
||||
import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.ChangeStartPageTypeAvailability;
|
||||
@@ -22,6 +23,7 @@ import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPa
|
||||
import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability;
|
||||
import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability;
|
||||
import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle;
|
||||
import static app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController.SponsorBlockDuration;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.IGNORE;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.MANUAL_SKIP;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY;
|
||||
@@ -72,6 +74,7 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", FALSE, new ForceOriginalAudioAvailability());
|
||||
|
||||
// Ads
|
||||
public static final BooleanSetting HIDE_CREATOR_STORE_SHELVES = new BooleanSetting("revanced_hide_creator_store_shelves", TRUE);
|
||||
public static final BooleanSetting HIDE_END_SCREEN_STORE_BANNER = new BooleanSetting("revanced_hide_end_screen_store_banner", TRUE, true);
|
||||
public static final BooleanSetting HIDE_FULLSCREEN_ADS = new BooleanSetting("revanced_hide_fullscreen_ads", TRUE);
|
||||
public static final BooleanSetting HIDE_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE);
|
||||
@@ -79,11 +82,10 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting HIDE_HIDE_LATEST_POSTS = new BooleanSetting("revanced_hide_latest_posts_ads", TRUE);
|
||||
public static final BooleanSetting HIDE_MERCHANDISE_BANNERS = new BooleanSetting("revanced_hide_merchandise_banners", TRUE);
|
||||
public static final BooleanSetting HIDE_PAID_PROMOTION_LABEL = new BooleanSetting("revanced_hide_paid_promotion_label", TRUE);
|
||||
public static final BooleanSetting HIDE_PLAYER_STORE_SHELF = new BooleanSetting("revanced_hide_player_store_shelf", TRUE);
|
||||
public static final BooleanSetting HIDE_PRODUCTS_BANNER = new BooleanSetting("revanced_hide_products_banner", TRUE);
|
||||
public static final BooleanSetting HIDE_SELF_SPONSOR = new BooleanSetting("revanced_hide_self_sponsor_ads", TRUE);
|
||||
public static final BooleanSetting HIDE_SHOPPING_LINKS = new BooleanSetting("revanced_hide_shopping_links", TRUE);
|
||||
public static final BooleanSetting HIDE_TAGGED_PRODUCTS = new BooleanSetting("revanced_hide_tagged_products", TRUE);
|
||||
public static final BooleanSetting HIDE_VIDEO_ADS = new BooleanSetting("revanced_hide_video_ads", TRUE, true);
|
||||
public static final BooleanSetting HIDE_VIEW_PRODUCTS_BANNER = new BooleanSetting("revanced_hide_view_products_banner", TRUE);
|
||||
public static final BooleanSetting HIDE_VISIT_STORE_BUTTON = new BooleanSetting("revanced_hide_visit_store_button", TRUE);
|
||||
public static final BooleanSetting HIDE_WEB_SEARCH_RESULTS = new BooleanSetting("revanced_hide_web_search_results", TRUE);
|
||||
|
||||
@@ -98,6 +100,7 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting HIDE_EXPANDABLE_CHIP = new BooleanSetting("revanced_hide_expandable_chip", TRUE);
|
||||
public static final BooleanSetting HIDE_FEED_SURVEY = new BooleanSetting("revanced_hide_feed_survey", TRUE);
|
||||
public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_FEED = new BooleanSetting("revanced_hide_filter_bar_feed_in_feed", FALSE, true);
|
||||
public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_HISTORY = new BooleanSetting("revanced_hide_filter_bar_feed_in_history", FALSE);
|
||||
public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS = new BooleanSetting("revanced_hide_filter_bar_feed_in_related_videos", FALSE, true);
|
||||
public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_SEARCH = new BooleanSetting("revanced_hide_filter_bar_feed_in_search", FALSE, true);
|
||||
public static final BooleanSetting HIDE_FLOATING_MICROPHONE_BUTTON = new BooleanSetting("revanced_hide_floating_microphone_button", TRUE, true);
|
||||
@@ -184,10 +187,10 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting HIDE_COMMENTS_AI_SUMMARY = new BooleanSetting("revanced_hide_comments_ai_summary", FALSE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_BY_MEMBERS_HEADER = new BooleanSetting("revanced_hide_comments_by_members_header", FALSE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_CREATE_A_SHORT_BUTTON = new BooleanSetting("revanced_hide_comments_create_a_short_button", TRUE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_TIMESTAMP_BUTTON = new BooleanSetting("revanced_hide_comments_timestamp_button", FALSE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_PREVIEW_COMMENT = new BooleanSetting("revanced_hide_comments_preview_comment", FALSE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_SECTION = new BooleanSetting("revanced_hide_comments_section", FALSE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_THANKS_BUTTON = new BooleanSetting("revanced_hide_comments_thanks_button", TRUE);
|
||||
public static final BooleanSetting HIDE_COMMENTS_TIMESTAMP_BUTTON = new BooleanSetting("revanced_hide_comments_timestamp_button", FALSE);
|
||||
// Description
|
||||
public static final BooleanSetting HIDE_AI_GENERATED_VIDEO_SUMMARY_SECTION = new BooleanSetting("revanced_hide_ai_generated_video_summary_section", FALSE);
|
||||
public static final BooleanSetting HIDE_ASK_SECTION = new BooleanSetting("revanced_hide_ask_section", FALSE);
|
||||
@@ -380,7 +383,11 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting SB_SQUARE_LAYOUT = new BooleanSetting("sb_square_layout", FALSE, parent(SB_ENABLED));
|
||||
public static final BooleanSetting SB_COMPACT_SKIP_BUTTON = new BooleanSetting("sb_compact_skip_button", FALSE, parent(SB_ENABLED));
|
||||
public static final BooleanSetting SB_AUTO_HIDE_SKIP_BUTTON = new BooleanSetting("sb_auto_hide_skip_button", TRUE, parent(SB_ENABLED));
|
||||
public static final EnumSetting<SponsorBlockDuration> SB_AUTO_HIDE_SKIP_BUTTON_DURATION = new EnumSetting<>("sb_auto_hide_skip_button_duration",
|
||||
SponsorBlockDuration.FOUR_SECONDS, parent(SB_ENABLED));
|
||||
public static final BooleanSetting SB_TOAST_ON_SKIP = new BooleanSetting("sb_toast_on_skip", TRUE, parent(SB_ENABLED));
|
||||
public static final EnumSetting<SponsorBlockDuration> SB_TOAST_ON_SKIP_DURATION = new EnumSetting<>("sb_toast_on_skip_duration",
|
||||
SponsorBlockDuration.FOUR_SECONDS, parentsAll(SB_ENABLED, SB_TOAST_ON_SKIP));
|
||||
public static final BooleanSetting SB_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("sb_toast_on_connection_error", TRUE, parent(SB_ENABLED));
|
||||
public static final BooleanSetting SB_TRACK_SKIP_COUNT = new BooleanSetting("sb_track_skip_count", TRUE, parent(SB_ENABLED));
|
||||
public static final FloatSetting SB_SEGMENT_MIN_DURATION = new FloatSetting("sb_min_segment_duration", 0F, parent(SB_ENABLED));
|
||||
|
||||
@@ -1,16 +1,37 @@
|
||||
package app.revanced.extension.youtube.sponsorblock;
|
||||
|
||||
import static app.revanced.extension.shared.StringRef.str;
|
||||
import static app.revanced.extension.shared.Utils.dipToPixels;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.ShapeDrawable;
|
||||
import android.graphics.drawable.shapes.RoundRectShape;
|
||||
import android.text.TextUtils;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Range;
|
||||
import android.view.Gravity;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.Animation;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
@@ -23,6 +44,7 @@ import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategory;
|
||||
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
|
||||
import app.revanced.extension.youtube.sponsorblock.requests.SBRequester;
|
||||
import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockViewController;
|
||||
import kotlin.Unit;
|
||||
|
||||
/**
|
||||
* Handles showing, scheduling, and skipping of all {@link SponsorSegment} for the current video.
|
||||
@@ -30,20 +52,37 @@ import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockViewController
|
||||
* Class is not thread safe. All methods must be called on the main thread unless otherwise specified.
|
||||
*/
|
||||
public class SegmentPlaybackController {
|
||||
|
||||
/**
|
||||
* Length of time to show a skip button for a highlight segment,
|
||||
* or a regular segment if {@link Settings#SB_AUTO_HIDE_SKIP_BUTTON} is enabled.
|
||||
*
|
||||
* Effectively this value is rounded up to the next second.
|
||||
* Enum for configurable durations (1 to 10 seconds) for skip button and toast display.
|
||||
*/
|
||||
private static final long DURATION_TO_SHOW_SKIP_BUTTON = 3800;
|
||||
public enum SponsorBlockDuration {
|
||||
ONE_SECOND(1),
|
||||
TWO_SECONDS(2),
|
||||
THREE_SECONDS(3),
|
||||
FOUR_SECONDS(4),
|
||||
FIVE_SECONDS(5),
|
||||
SIX_SECONDS(6),
|
||||
SEVEN_SECONDS(7),
|
||||
EIGHT_SECONDS(8),
|
||||
NINE_SECONDS(9),
|
||||
TEN_SECONDS(10);
|
||||
|
||||
/**
|
||||
* Duration, minus 200ms to adjust for exclusive end time checking in scheduled show/hides.
|
||||
*/
|
||||
private final long adjustedDuration;
|
||||
|
||||
SponsorBlockDuration(int seconds) {
|
||||
adjustedDuration = seconds * 1000L - 200;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Highlight segments have zero length as they are a point in time.
|
||||
* Draw them on screen using a fixed width bar.
|
||||
* Value is independent of device dpi.
|
||||
*/
|
||||
private static final int HIGHLIGHT_SEGMENT_DRAW_BAR_WIDTH = 7;
|
||||
private static final int HIGHLIGHT_SEGMENT_DRAW_BAR_WIDTH = dipToPixels(7);
|
||||
|
||||
@Nullable
|
||||
private static String currentVideoId;
|
||||
@@ -59,7 +98,7 @@ public class SegmentPlaybackController {
|
||||
/**
|
||||
* Because loading can take time, show the skip to highlight for a few seconds after the segments load.
|
||||
* This is the system time (in milliseconds) to no longer show the initial display skip to highlight.
|
||||
* Value will be zero if no highlight segment exists, or if the system time to show the highlight has passed.
|
||||
* Value is zero if no highlight segment exists, or if the system time to show the highlight has passed.
|
||||
*/
|
||||
private static long highlightSegmentInitialShowEndTime;
|
||||
|
||||
@@ -70,7 +109,7 @@ public class SegmentPlaybackController {
|
||||
private static SponsorSegment segmentCurrentlyPlaying;
|
||||
/**
|
||||
* Currently playing manual skip segment that is scheduled to hide.
|
||||
* This will always be NULL or equal to {@link #segmentCurrentlyPlaying}.
|
||||
* This is always NULL or equal to {@link #segmentCurrentlyPlaying}.
|
||||
*/
|
||||
@Nullable
|
||||
private static SponsorSegment scheduledHideSegment;
|
||||
@@ -89,31 +128,95 @@ public class SegmentPlaybackController {
|
||||
*/
|
||||
private static final List<SponsorSegment> hiddenSkipSegmentsForCurrentVideoTime = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Current segments that have been auto skipped.
|
||||
* If field is non null then the range will always contain the current video time.
|
||||
* Range is used to prevent auto-skipping after undo.
|
||||
* Android Range object has inclusive end time, unlike {@link SponsorSegment}.
|
||||
*/
|
||||
@Nullable
|
||||
private static Range<Long> undoAutoSkipRange;
|
||||
/**
|
||||
* Range to undo if the toast is tapped.
|
||||
* Is always null or identical to the last non null value of {@link #undoAutoSkipRange}.
|
||||
*/
|
||||
@Nullable
|
||||
private static Range<Long> undoAutoSkipRangeToast;
|
||||
|
||||
/**
|
||||
* System time (in milliseconds) of when to hide the skip button of {@link #segmentCurrentlyPlaying}.
|
||||
* Value is zero if playback is not inside a segment ({@link #segmentCurrentlyPlaying} is null),
|
||||
* or if {@link Settings#SB_AUTO_HIDE_SKIP_BUTTON} is not enabled.
|
||||
*/
|
||||
private static long skipSegmentButtonEndTime;
|
||||
|
||||
@Nullable
|
||||
private static String timeWithoutSegments;
|
||||
|
||||
private static int sponsorBarAbsoluteLeft;
|
||||
private static int sponsorAbsoluteBarRight;
|
||||
private static int sponsorBarThickness;
|
||||
|
||||
@Nullable
|
||||
private static SponsorSegment lastSegmentSkipped;
|
||||
private static long lastSegmentSkippedTime;
|
||||
|
||||
@Nullable
|
||||
private static SponsorSegment toastSegmentSkipped;
|
||||
private static int toastNumberOfSegmentsSkipped;
|
||||
|
||||
/**
|
||||
* The last toast dialog showing on screen.
|
||||
*/
|
||||
private static WeakReference<Dialog> toastDialogRef = new WeakReference<>(null);
|
||||
|
||||
static {
|
||||
// Dismiss toast if app changes to PiP while undo skip is shown.
|
||||
PlayerType.getOnChange().addObserver((PlayerType type) -> {
|
||||
if (type == PlayerType.WATCH_WHILE_PICTURE_IN_PICTURE && dismissUndoToast()) {
|
||||
Logger.printDebug(() -> "Dismissed undo toast as playback is PiP");
|
||||
}
|
||||
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @return If the toast was on screen and is now dismissed.
|
||||
*/
|
||||
private static boolean dismissUndoToast() {
|
||||
Dialog toastDialog = toastDialogRef.get();
|
||||
if (toastDialog != null && toastDialog.isShowing()) {
|
||||
toastDialog.dismiss();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The adjusted duration to show the skip button, in milliseconds.
|
||||
*/
|
||||
private static long getSkipButtonDuration() {
|
||||
return Settings.SB_AUTO_HIDE_SKIP_BUTTON_DURATION.get().adjustedDuration;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The adjusted duration to show the skipped toast, in milliseconds.
|
||||
*/
|
||||
private static long getToastDuration() {
|
||||
return Settings.SB_TOAST_ON_SKIP_DURATION.get().adjustedDuration;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
static SponsorSegment[] getSegments() {
|
||||
return segments;
|
||||
}
|
||||
|
||||
private static void setSegments(@NonNull SponsorSegment[] videoSegments) {
|
||||
private static void setSegments(SponsorSegment[] videoSegments) {
|
||||
Arrays.sort(videoSegments);
|
||||
segments = videoSegments;
|
||||
calculateTimeWithoutSegments();
|
||||
|
||||
if (SegmentCategory.HIGHLIGHT.behaviour == CategoryBehaviour.SKIP_AUTOMATICALLY
|
||||
if (SegmentCategory.HIGHLIGHT.behaviour == SKIP_AUTOMATICALLY
|
||||
|| SegmentCategory.HIGHLIGHT.behaviour == CategoryBehaviour.MANUAL_SKIP) {
|
||||
for (SponsorSegment segment : videoSegments) {
|
||||
if (segment.category == SegmentCategory.HIGHLIGHT) {
|
||||
@@ -125,7 +228,7 @@ public class SegmentPlaybackController {
|
||||
highlightSegment = null;
|
||||
}
|
||||
|
||||
static void addUnsubmittedSegment(@NonNull SponsorSegment segment) {
|
||||
static void addUnsubmittedSegment(SponsorSegment segment) {
|
||||
Objects.requireNonNull(segment);
|
||||
if (segments == null) {
|
||||
segments = new SponsorSegment[1];
|
||||
@@ -140,6 +243,7 @@ public class SegmentPlaybackController {
|
||||
if (segments == null || segments.length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<SponsorSegment> replacement = new ArrayList<>();
|
||||
for (SponsorSegment segment : segments) {
|
||||
if (segment.category != SegmentCategory.UNSUBMITTED) {
|
||||
@@ -156,7 +260,7 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears all downloaded data.
|
||||
* Clear all data.
|
||||
*/
|
||||
private static void clearData() {
|
||||
currentVideoId = null;
|
||||
@@ -170,6 +274,8 @@ public class SegmentPlaybackController {
|
||||
skipSegmentButtonEndTime = 0;
|
||||
toastSegmentSkipped = null;
|
||||
toastNumberOfSegmentsSkipped = 0;
|
||||
undoAutoSkipRange = null;
|
||||
undoAutoSkipRangeToast = null;
|
||||
hiddenSkipSegmentsForCurrentVideoTime.clear();
|
||||
}
|
||||
|
||||
@@ -186,7 +292,7 @@ public class SegmentPlaybackController {
|
||||
SponsorBlockUtils.clearUnsubmittedSegmentTimes();
|
||||
Logger.printDebug(() -> "Initialized SponsorBlock");
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "Failed to initialize SponsorBlock", ex);
|
||||
Logger.printException(() -> "initialize failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,7 +309,7 @@ public class SegmentPlaybackController {
|
||||
return;
|
||||
}
|
||||
if (PlayerType.getCurrent().isNoneOrHidden()) {
|
||||
Logger.printDebug(() -> "ignoring Short");
|
||||
Logger.printDebug(() -> "Ignoring Short");
|
||||
return;
|
||||
}
|
||||
if (!Utils.isNetworkConnected()) {
|
||||
@@ -212,7 +318,7 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
|
||||
currentVideoId = videoId;
|
||||
Logger.printDebug(() -> "setCurrentVideoId: " + videoId);
|
||||
Logger.printDebug(() -> "New video ID: " + videoId);
|
||||
|
||||
Utils.runOnBackgroundThread(() -> {
|
||||
try {
|
||||
@@ -227,42 +333,39 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
|
||||
/**
|
||||
* Must be called off main thread
|
||||
* Must be called off main thread.
|
||||
*/
|
||||
static void executeDownloadSegments(@NonNull String videoId) {
|
||||
static void executeDownloadSegments(String videoId) {
|
||||
Objects.requireNonNull(videoId);
|
||||
try {
|
||||
SponsorSegment[] segments = SBRequester.getSegments(videoId);
|
||||
|
||||
Utils.runOnMainThread(()-> {
|
||||
if (!videoId.equals(currentVideoId)) {
|
||||
// user changed videos before get segments network call could complete
|
||||
Logger.printDebug(() -> "Ignoring segments for prior video: " + videoId);
|
||||
return;
|
||||
}
|
||||
setSegments(segments);
|
||||
SponsorSegment[] segments = SBRequester.getSegments(videoId);
|
||||
|
||||
final long videoTime = VideoInformation.getVideoTime();
|
||||
if (highlightSegment != null) {
|
||||
// If the current video time is before the highlight.
|
||||
final long timeUntilHighlight = highlightSegment.start - videoTime;
|
||||
if (timeUntilHighlight > 0) {
|
||||
if (highlightSegment.shouldAutoSkip()) {
|
||||
skipSegment(highlightSegment, false);
|
||||
return;
|
||||
}
|
||||
highlightSegmentInitialShowEndTime = System.currentTimeMillis() + Math.min(
|
||||
(long) (timeUntilHighlight / VideoInformation.getPlaybackSpeed()),
|
||||
DURATION_TO_SHOW_SKIP_BUTTON);
|
||||
Utils.runOnMainThread(() -> {
|
||||
if (!videoId.equals(currentVideoId)) {
|
||||
// user changed videos before get segments network call could complete
|
||||
Logger.printDebug(() -> "Ignoring segments for prior video: " + videoId);
|
||||
return;
|
||||
}
|
||||
setSegments(segments);
|
||||
|
||||
final long videoTime = VideoInformation.getVideoTime();
|
||||
if (highlightSegment != null) {
|
||||
// If the current video time is before the highlight.
|
||||
final long timeUntilHighlight = highlightSegment.start - videoTime;
|
||||
if (timeUntilHighlight > 0) {
|
||||
if (highlightSegment.shouldAutoSkip()) {
|
||||
skipSegment(highlightSegment, false);
|
||||
return;
|
||||
}
|
||||
highlightSegmentInitialShowEndTime = System.currentTimeMillis() + Math.min(
|
||||
(long) (timeUntilHighlight / VideoInformation.getPlaybackSpeed()),
|
||||
getSkipButtonDuration());
|
||||
}
|
||||
}
|
||||
|
||||
// check for any skips now, instead of waiting for the next update to setVideoTime()
|
||||
setVideoTime(videoTime);
|
||||
});
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "executeDownloadSegments failure", ex);
|
||||
}
|
||||
// check for any skips now, instead of waiting for the next update to setVideoTime()
|
||||
setVideoTime(videoTime);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -273,8 +376,8 @@ public class SegmentPlaybackController {
|
||||
public static void setVideoTime(long millis) {
|
||||
try {
|
||||
if (!Settings.SB_ENABLED.get()
|
||||
|| PlayerType.getCurrent().isNoneOrHidden() // Shorts playback.
|
||||
|| segments == null || segments.length == 0) {
|
||||
|| PlayerType.getCurrent().isNoneOrHidden() // Shorts playback.
|
||||
|| segments == null || segments.length == 0) {
|
||||
return;
|
||||
}
|
||||
Logger.printDebug(() -> "setVideoTime: " + millis);
|
||||
@@ -290,7 +393,7 @@ public class SegmentPlaybackController {
|
||||
//
|
||||
// To debug the stale skip logic, set this to a very large value (5000 or more)
|
||||
// then try manually seeking just before playback reaches a segment skip.
|
||||
final long speedAdjustedTimeThreshold = (long)(playbackSpeed * 1200);
|
||||
final long speedAdjustedTimeThreshold = (long) (playbackSpeed * 1200);
|
||||
final long startTimerLookAheadThreshold = millis + speedAdjustedTimeThreshold;
|
||||
|
||||
SponsorSegment foundSegmentCurrentlyPlaying = null;
|
||||
@@ -298,22 +401,24 @@ public class SegmentPlaybackController {
|
||||
|
||||
for (final SponsorSegment segment : segments) {
|
||||
if (segment.category.behaviour == CategoryBehaviour.SHOW_IN_SEEKBAR
|
||||
|| segment.category.behaviour == CategoryBehaviour.IGNORE
|
||||
|| segment.category == SegmentCategory.HIGHLIGHT) {
|
||||
|| segment.category.behaviour == CategoryBehaviour.IGNORE
|
||||
|| segment.category == SegmentCategory.HIGHLIGHT) {
|
||||
continue;
|
||||
}
|
||||
if (segment.end <= millis) {
|
||||
continue; // past this segment
|
||||
continue; // Past this segment.
|
||||
}
|
||||
|
||||
final boolean segmentShouldAutoSkip = shouldAutoSkipAndUndoSkipNotActive(segment, millis);
|
||||
|
||||
if (segment.start <= millis) {
|
||||
// we are in the segment!
|
||||
if (segment.shouldAutoSkip()) {
|
||||
// We are in the segment!
|
||||
if (segmentShouldAutoSkip) {
|
||||
skipSegment(segment, false);
|
||||
return; // must return, as skipping causes a recursive call back into this method
|
||||
return; // Must return, as skipping causes a recursive call back into this method.
|
||||
}
|
||||
|
||||
// first found segment, or it's an embedded segment and fully inside the outer segment
|
||||
// First found segment, or it's an embedded segment and fully inside the outer segment.
|
||||
if (foundSegmentCurrentlyPlaying == null || foundSegmentCurrentlyPlaying.containsSegment(segment)) {
|
||||
// If the found segment is not currently displayed, then do not show if the segment is nearly over.
|
||||
// This check prevents the skip button text from rapidly changing when multiple segments end at nearly the same time.
|
||||
@@ -327,25 +432,27 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
}
|
||||
// Keep iterating and looking. There may be an upcoming autoskip,
|
||||
// or there may be another smaller segment nested inside this segment
|
||||
// or there may be another smaller segment nested inside this segment.
|
||||
continue;
|
||||
}
|
||||
|
||||
// segment is upcoming
|
||||
// Segment is upcoming.
|
||||
if (startTimerLookAheadThreshold < segment.start) {
|
||||
break; // segment is not close enough to schedule, and no segments after this are of interest
|
||||
// Segment is not close enough to schedule, and no segments after this are of interest.
|
||||
break;
|
||||
}
|
||||
if (segment.shouldAutoSkip()) { // upcoming autoskip
|
||||
|
||||
if (segmentShouldAutoSkip) {
|
||||
foundUpcomingSegment = segment;
|
||||
break; // must stop here
|
||||
break; // Must stop here.
|
||||
}
|
||||
|
||||
// upcoming manual skip
|
||||
// Upcoming manual skip.
|
||||
|
||||
// do not schedule upcoming segment, if it is not fully contained inside the current segment
|
||||
// Do not schedule upcoming segment, if it is not fully contained inside the current segment.
|
||||
if ((foundSegmentCurrentlyPlaying == null || foundSegmentCurrentlyPlaying.containsSegment(segment))
|
||||
// use the most inner upcoming segment
|
||||
&& (foundUpcomingSegment == null || foundUpcomingSegment.containsSegment(segment))) {
|
||||
// Use the most inner upcoming segment.
|
||||
&& (foundUpcomingSegment == null || foundUpcomingSegment.containsSegment(segment))) {
|
||||
|
||||
// Only schedule, if the segment start time is not near the end time of the current segment.
|
||||
// This check is needed to prevent scheduled hide and show from clashing with each other.
|
||||
@@ -361,8 +468,8 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
|
||||
if (highlightSegment != null) {
|
||||
if (millis < DURATION_TO_SHOW_SKIP_BUTTON || (highlightSegmentInitialShowEndTime != 0
|
||||
&& System.currentTimeMillis() < highlightSegmentInitialShowEndTime)) {
|
||||
if (millis < getSkipButtonDuration() || (highlightSegmentInitialShowEndTime != 0
|
||||
&& System.currentTimeMillis() < highlightSegmentInitialShowEndTime)) {
|
||||
SponsorBlockViewController.showSkipHighlightButton(highlightSegment);
|
||||
} else {
|
||||
highlightSegmentInitialShowEndTime = 0;
|
||||
@@ -373,16 +480,17 @@ public class SegmentPlaybackController {
|
||||
if (segmentCurrentlyPlaying != foundSegmentCurrentlyPlaying) {
|
||||
setSegmentCurrentlyPlaying(foundSegmentCurrentlyPlaying);
|
||||
} else if (foundSegmentCurrentlyPlaying != null
|
||||
&& skipSegmentButtonEndTime != 0 && skipSegmentButtonEndTime <= System.currentTimeMillis()) {
|
||||
&& skipSegmentButtonEndTime != 0
|
||||
&& skipSegmentButtonEndTime <= System.currentTimeMillis()) {
|
||||
Logger.printDebug(() -> "Auto hiding skip button for segment: " + segmentCurrentlyPlaying);
|
||||
skipSegmentButtonEndTime = 0;
|
||||
hiddenSkipSegmentsForCurrentVideoTime.add(foundSegmentCurrentlyPlaying);
|
||||
SponsorBlockViewController.hideSkipSegmentButton();
|
||||
}
|
||||
|
||||
// schedule a hide, only if the segment end is near
|
||||
final SponsorSegment segmentToHide =
|
||||
(foundSegmentCurrentlyPlaying != null && foundSegmentCurrentlyPlaying.endIsNear(millis, speedAdjustedTimeThreshold))
|
||||
// Schedule a hide, but only if the segment end is near.
|
||||
final SponsorSegment segmentToHide = (foundSegmentCurrentlyPlaying != null &&
|
||||
foundSegmentCurrentlyPlaying.endIsNear(millis, speedAdjustedTimeThreshold))
|
||||
? foundSegmentCurrentlyPlaying
|
||||
: null;
|
||||
|
||||
@@ -407,7 +515,7 @@ public class SegmentPlaybackController {
|
||||
|
||||
final long videoTime = VideoInformation.getVideoTime();
|
||||
if (!segmentToHide.endIsNear(videoTime, speedAdjustedTimeThreshold)) {
|
||||
// current video time is not what's expected. User paused playback
|
||||
// Current video time is not what's expected. User paused playback.
|
||||
Logger.printDebug(() -> "Ignoring outdated scheduled hide: " + segmentToHide
|
||||
+ " videoInformation time: " + videoTime);
|
||||
return;
|
||||
@@ -416,7 +524,7 @@ public class SegmentPlaybackController {
|
||||
// Need more than just hide the skip button, as this may have been an embedded segment
|
||||
// Instead call back into setVideoTime to check everything again.
|
||||
// Should not use VideoInformation time as it is less accurate,
|
||||
// but this scheduled handler was scheduled precisely so we can just use the segment end time
|
||||
// but this scheduled handler was scheduled precisely so we can just use the segment end time.
|
||||
setSegmentCurrentlyPlaying(null);
|
||||
setVideoTime(segmentToHide.end);
|
||||
}, delayUntilHide);
|
||||
@@ -446,12 +554,12 @@ public class SegmentPlaybackController {
|
||||
|
||||
final long videoTime = VideoInformation.getVideoTime();
|
||||
if (!segmentToSkip.startIsNear(videoTime, speedAdjustedTimeThreshold)) {
|
||||
// current video time is not what's expected. User paused playback
|
||||
// Current video time is not what's expected. User paused playback.
|
||||
Logger.printDebug(() -> "Ignoring outdated scheduled segment: " + segmentToSkip
|
||||
+ " videoInformation time: " + videoTime);
|
||||
return;
|
||||
}
|
||||
if (segmentToSkip.shouldAutoSkip()) {
|
||||
if (shouldAutoSkipAndUndoSkipNotActive(segmentToSkip, videoTime)) {
|
||||
Logger.printDebug(() -> "Running scheduled skip segment: " + segmentToSkip);
|
||||
skipSegment(segmentToSkip, false);
|
||||
} else {
|
||||
@@ -461,6 +569,12 @@ public class SegmentPlaybackController {
|
||||
}, delayUntilSkip);
|
||||
}
|
||||
}
|
||||
|
||||
// Clear undo range if video time is outside the segment. Must check last.
|
||||
if (undoAutoSkipRange != null && !undoAutoSkipRange.contains(millis)) {
|
||||
Logger.printDebug(() -> "Clearing undo range as current time is now outside range: " + undoAutoSkipRange);
|
||||
undoAutoSkipRange = null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.printException(() -> "setVideoTime failure", e);
|
||||
}
|
||||
@@ -470,14 +584,13 @@ public class SegmentPlaybackController {
|
||||
* Removes all previously hidden segments that are not longer contained in the given video time.
|
||||
*/
|
||||
private static void updateHiddenSegments(long currentVideoTime) {
|
||||
Iterator<SponsorSegment> i = hiddenSkipSegmentsForCurrentVideoTime.iterator();
|
||||
while (i.hasNext()) {
|
||||
SponsorSegment hiddenSegment = i.next();
|
||||
hiddenSkipSegmentsForCurrentVideoTime.removeIf((hiddenSegment) -> {
|
||||
if (!hiddenSegment.containsTime(currentVideoTime)) {
|
||||
Logger.printDebug(() -> "Resetting hide skip button: " + hiddenSegment);
|
||||
i.remove();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
private static void setSegmentCurrentlyPlaying(@Nullable SponsorSegment segment) {
|
||||
@@ -488,8 +601,10 @@ public class SegmentPlaybackController {
|
||||
SponsorBlockViewController.hideSkipSegmentButton();
|
||||
return;
|
||||
}
|
||||
|
||||
segmentCurrentlyPlaying = segment;
|
||||
skipSegmentButtonEndTime = 0;
|
||||
|
||||
if (Settings.SB_AUTO_HIDE_SKIP_BUTTON.get()) {
|
||||
if (hiddenSkipSegmentsForCurrentVideoTime.contains(segment)) {
|
||||
// Playback exited a nested segment and the outer segment skip button was previously hidden.
|
||||
@@ -497,16 +612,13 @@ public class SegmentPlaybackController {
|
||||
SponsorBlockViewController.hideSkipSegmentButton();
|
||||
return;
|
||||
}
|
||||
skipSegmentButtonEndTime = System.currentTimeMillis() + DURATION_TO_SHOW_SKIP_BUTTON;
|
||||
skipSegmentButtonEndTime = System.currentTimeMillis() + getSkipButtonDuration();
|
||||
}
|
||||
Logger.printDebug(() -> "Showing segment: " + segment);
|
||||
SponsorBlockViewController.showSkipSegmentButton(segment);
|
||||
}
|
||||
|
||||
private static SponsorSegment lastSegmentSkipped;
|
||||
private static long lastSegmentSkippedTime;
|
||||
|
||||
private static void skipSegment(@NonNull SponsorSegment segmentToSkip, boolean userManuallySkipped) {
|
||||
private static void skipSegment(SponsorSegment segmentToSkip, boolean userManuallySkipped) {
|
||||
try {
|
||||
SponsorBlockViewController.hideSkipHighlightButton();
|
||||
SponsorBlockViewController.hideSkipSegmentButton();
|
||||
@@ -525,7 +637,7 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
}
|
||||
|
||||
Logger.printDebug(() -> "Skipping segment: " + segmentToSkip);
|
||||
Logger.printDebug(() -> "Skipping segment: " + segmentToSkip + " videoState: " + VideoState.getCurrent());
|
||||
lastSegmentSkipped = segmentToSkip;
|
||||
lastSegmentSkippedTime = now;
|
||||
setSegmentCurrentlyPlaying(null);
|
||||
@@ -535,29 +647,39 @@ public class SegmentPlaybackController {
|
||||
highlightSegmentInitialShowEndTime = 0;
|
||||
}
|
||||
|
||||
// Set or update undo skip range.
|
||||
Range<Long> range = segmentToSkip.getUndoRange();
|
||||
if (undoAutoSkipRange == null) {
|
||||
Logger.printDebug(() -> "Setting new undo range to: " + range);
|
||||
undoAutoSkipRange = range;
|
||||
} else {
|
||||
Range<Long> extendedRange = undoAutoSkipRange.extend(range);
|
||||
Logger.printDebug(() -> "Extending undo range from: " + undoAutoSkipRange +
|
||||
" to: " + extendedRange);
|
||||
undoAutoSkipRange = extendedRange;
|
||||
}
|
||||
undoAutoSkipRangeToast = undoAutoSkipRange;
|
||||
|
||||
// If the seek is successful, then the seek causes a recursive call back into this class.
|
||||
final boolean seekSuccessful = VideoInformation.seekTo(segmentToSkip.end);
|
||||
if (!seekSuccessful) {
|
||||
// can happen when switching videos and is normal
|
||||
// Can happen when switching videos and is normal.
|
||||
Logger.printDebug(() -> "Could not skip segment (seek unsuccessful): " + segmentToSkip);
|
||||
return;
|
||||
}
|
||||
|
||||
final boolean videoIsPaused = VideoState.getCurrent() == VideoState.PAUSED;
|
||||
if (!userManuallySkipped) {
|
||||
// check for any smaller embedded segments, and count those as autoskipped
|
||||
// Check for any smaller embedded segments, and count those as auto-skipped.
|
||||
final boolean showSkipToast = Settings.SB_TOAST_ON_SKIP.get();
|
||||
for (final SponsorSegment otherSegment : Objects.requireNonNull(segments)) {
|
||||
for (SponsorSegment otherSegment : Objects.requireNonNull(segments)) {
|
||||
if (segmentToSkip.end < otherSegment.start) {
|
||||
break; // no other segments can be contained
|
||||
break; // No other segments can be contained.
|
||||
}
|
||||
|
||||
if (otherSegment == segmentToSkip ||
|
||||
(otherSegment.category != SegmentCategory.HIGHLIGHT && segmentToSkip.containsSegment(otherSegment))) {
|
||||
otherSegment.didAutoSkipped = true;
|
||||
// Do not show a toast if the user is scrubbing thru a paused video.
|
||||
// Cannot do this video state check in setTime or earlier in this method, as the video state may not be up to date.
|
||||
// So instead, only hide toasts because all other skip logic done while paused causes no harm.
|
||||
if (showSkipToast && !videoIsPaused) {
|
||||
if (showSkipToast) {
|
||||
showSkippedSegmentToast(otherSegment);
|
||||
}
|
||||
}
|
||||
@@ -567,7 +689,7 @@ public class SegmentPlaybackController {
|
||||
if (segmentToSkip.category == SegmentCategory.UNSUBMITTED) {
|
||||
removeUnsubmittedSegments();
|
||||
SponsorBlockUtils.setNewSponsorSegmentPreviewed();
|
||||
} else if (!videoIsPaused) {
|
||||
} else if (VideoState.getCurrent() != VideoState.PAUSED) {
|
||||
SponsorBlockUtils.sendViewRequestAsync(segmentToSkip);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
@@ -575,31 +697,49 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the segment should be auto-skipped _and_ if undo autoskip is not active.
|
||||
*/
|
||||
private static boolean shouldAutoSkipAndUndoSkipNotActive(SponsorSegment segment, long currentVideoTime) {
|
||||
return segment.shouldAutoSkip() && (undoAutoSkipRange == null
|
||||
|| !undoAutoSkipRange.contains(currentVideoTime));
|
||||
}
|
||||
|
||||
private static int toastNumberOfSegmentsSkipped;
|
||||
@Nullable
|
||||
private static SponsorSegment toastSegmentSkipped;
|
||||
|
||||
private static void showSkippedSegmentToast(@NonNull SponsorSegment segment) {
|
||||
private static void showSkippedSegmentToast(SponsorSegment segment) {
|
||||
Utils.verifyOnMainThread();
|
||||
toastNumberOfSegmentsSkipped++;
|
||||
if (toastNumberOfSegmentsSkipped > 1) {
|
||||
return; // toast already scheduled
|
||||
}
|
||||
toastSegmentSkipped = segment;
|
||||
if (toastNumberOfSegmentsSkipped++ > 0) {
|
||||
return; // Toast is already scheduled.
|
||||
}
|
||||
|
||||
final long delayToToastMilliseconds = 250; // also the maximum time between skips to be considered skipping multiple segments
|
||||
// Maximum time between skips to be considered skipping multiple segments.
|
||||
final long delayToToastMilliseconds = 250;
|
||||
Utils.runOnMainThreadDelayed(() -> {
|
||||
try {
|
||||
if (toastSegmentSkipped == null) { // video was changed just after skipping segment
|
||||
// Do not show a toast if the user is scrubbing thru a paused video.
|
||||
// Cannot do this video state check in setTime or before calling this this method,
|
||||
// as the video state may not be up to date. So instead, only ignore the toast
|
||||
// just before it's about to show since the video state is up to date.
|
||||
if (VideoState.getCurrent() == VideoState.PAUSED) {
|
||||
Logger.printDebug(() -> "Ignoring scheduled toast as video state is paused");
|
||||
return;
|
||||
}
|
||||
|
||||
if (PlayerType.getCurrent() == PlayerType.WATCH_WHILE_PICTURE_IN_PICTURE) {
|
||||
Logger.printDebug(() -> "Not showing autoskip toast as playback is PiP");
|
||||
return;
|
||||
}
|
||||
|
||||
if (toastSegmentSkipped == null || undoAutoSkipRangeToast == null) {
|
||||
// Video was changed immediately after skipping segment.
|
||||
Logger.printDebug(() -> "Ignoring old scheduled show toast");
|
||||
return;
|
||||
}
|
||||
Utils.showToastShort(toastNumberOfSegmentsSkipped == 1
|
||||
String message = toastNumberOfSegmentsSkipped == 1
|
||||
? toastSegmentSkipped.getSkippedToastText()
|
||||
: str("revanced_sb_skipped_multiple_segments"));
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "showSkippedSegmentToast failure", ex);
|
||||
: str("revanced_sb_skipped_multiple_segments");
|
||||
|
||||
showAutoSkipToast(message, undoAutoSkipRangeToast);
|
||||
} finally {
|
||||
toastNumberOfSegmentsSkipped = 0;
|
||||
toastSegmentSkipped = null;
|
||||
@@ -607,13 +747,126 @@ public class SegmentPlaybackController {
|
||||
}, delayToToastMilliseconds);
|
||||
}
|
||||
|
||||
private static void showAutoSkipToast(String messageToToast, Range<Long> rangeToUndo) {
|
||||
Objects.requireNonNull(messageToToast);
|
||||
Utils.verifyOnMainThread();
|
||||
|
||||
Context currentContext = SponsorBlockViewController.getOverLaysViewGroupContext();
|
||||
if (currentContext == null) {
|
||||
Logger.printException(() -> "Cannot show toast (context is null): " + messageToToast);
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.printDebug(() -> "Showing toast: " + messageToToast);
|
||||
|
||||
Dialog dialog = new Dialog(currentContext);
|
||||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
// Do not dismiss dialog if tapped outside the dialog bounds.
|
||||
dialog.setCanceledOnTouchOutside(false);
|
||||
|
||||
LinearLayout mainLayout = new LinearLayout(currentContext);
|
||||
mainLayout.setOrientation(LinearLayout.VERTICAL);
|
||||
final int dip8 = dipToPixels(8);
|
||||
final int dip16 = dipToPixels(16);
|
||||
mainLayout.setPadding(dip16, dip8, dip16, dip8);
|
||||
mainLayout.setGravity(Gravity.CENTER);
|
||||
mainLayout.setMinimumHeight(dipToPixels(48));
|
||||
|
||||
ShapeDrawable background = new ShapeDrawable(new RoundRectShape(
|
||||
Utils.createCornerRadii(20), null, null));
|
||||
background.getPaint().setColor(Utils.getDialogBackgroundColor());
|
||||
mainLayout.setBackground(background);
|
||||
|
||||
TextView textView = new TextView(currentContext);
|
||||
textView.setText(messageToToast);
|
||||
textView.setTextSize(14);
|
||||
textView.setTextColor(Utils.getAppForegroundColor());
|
||||
textView.setGravity(Gravity.CENTER);
|
||||
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
textParams.gravity = Gravity.CENTER;
|
||||
textView.setLayoutParams(textParams);
|
||||
mainLayout.addView(textView);
|
||||
mainLayout.setAlpha(0.8f); // Opacity for the entire dialog.
|
||||
|
||||
final int fadeDurationFast = Utils.getResourceInteger("fade_duration_fast");
|
||||
Animation fadeIn = Utils.getResourceAnimation("fade_in");
|
||||
Animation fadeOut = Utils.getResourceAnimation("fade_out");
|
||||
fadeIn.setDuration(fadeDurationFast);
|
||||
fadeOut.setDuration(fadeDurationFast);
|
||||
fadeOut.setAnimationListener(new Animation.AnimationListener() {
|
||||
public void onAnimationStart(Animation animation) { }
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
if (dialog.isShowing()) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
}
|
||||
public void onAnimationRepeat(Animation animation) { }
|
||||
});
|
||||
|
||||
mainLayout.setOnClickListener(v -> {
|
||||
try {
|
||||
Logger.printDebug(() -> "Undoing autoskip using range: " + rangeToUndo);
|
||||
// Restore undo autoskip range since it's already cleared by now.
|
||||
undoAutoSkipRange = rangeToUndo;
|
||||
VideoInformation.seekTo(rangeToUndo.getLower());
|
||||
|
||||
mainLayout.startAnimation(fadeOut);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "showToastShortWithTapAction setOnClickListener failure", ex);
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
mainLayout.setClickable(true);
|
||||
dialog.setContentView(mainLayout);
|
||||
|
||||
Window window = dialog.getWindow();
|
||||
if (window != null) {
|
||||
// Remove window animations and use custom fade animation.
|
||||
window.setWindowAnimations(0);
|
||||
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.gravity = Gravity.BOTTOM;
|
||||
params.y = dipToPixels(72);
|
||||
DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
|
||||
int portraitWidth = (int) (displayMetrics.widthPixels * 0.6);
|
||||
|
||||
if (Resources.getSystem().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
||||
portraitWidth = (int) Math.min(portraitWidth, displayMetrics.heightPixels * 0.6);
|
||||
}
|
||||
params.width = portraitWidth;
|
||||
params.dimAmount = 0.0f;
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawable(null);
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
|
||||
}
|
||||
|
||||
if (dismissUndoToast()) {
|
||||
Logger.printDebug(() -> "Dismissed previous skip toast that was still on screen");
|
||||
}
|
||||
toastDialogRef = new WeakReference<>(dialog);
|
||||
|
||||
mainLayout.startAnimation(fadeIn);
|
||||
dialog.show();
|
||||
|
||||
// Fade out and dismiss the dialog if the user does not undo the skip.
|
||||
Utils.runOnMainThreadDelayed(() -> {
|
||||
if (dialog.isShowing()) {
|
||||
mainLayout.startAnimation(fadeOut);
|
||||
}
|
||||
}, getToastDuration());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param segment can be either a highlight or a regular manual skip segment.
|
||||
*/
|
||||
public static void onSkipSegmentClicked(@NonNull SponsorSegment segment) {
|
||||
public static void onSkipSegmentClicked(SponsorSegment segment) {
|
||||
try {
|
||||
if (segment != highlightSegment && segment != segmentCurrentlyPlaying) {
|
||||
Logger.printException(() -> "error: segment not available to skip"); // should never happen
|
||||
Logger.printException(() -> "error: segment not available to skip"); // Should never happen.
|
||||
SponsorBlockViewController.hideSkipSegmentButton();
|
||||
SponsorBlockViewController.hideSkipHighlightButton();
|
||||
return;
|
||||
@@ -628,7 +881,7 @@ public class SegmentPlaybackController {
|
||||
* Injection point
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public static void setSponsorBarRect(final Object self) {
|
||||
public static void setSponsorBarRect(Object self) {
|
||||
try {
|
||||
Field field = self.getClass().getDeclaredField("replaceMeWithsetSponsorBarRect");
|
||||
field.setAccessible(true);
|
||||
@@ -651,7 +904,7 @@ public class SegmentPlaybackController {
|
||||
private static void setSponsorBarAbsoluteRight(Rect rect) {
|
||||
final int right = rect.right;
|
||||
if (sponsorAbsoluteBarRight != right) {
|
||||
Logger.printDebug(() -> "setSponsorBarAbsoluteRight: " + right);
|
||||
Logger.printDebug(() -> "setSponsorBarAbsoluteRight: " + right);
|
||||
sponsorAbsoluteBarRight = right;
|
||||
}
|
||||
}
|
||||
@@ -726,12 +979,6 @@ public class SegmentPlaybackController {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Actual screen pixel width to use for the highlight segment time bar.
|
||||
*/
|
||||
private static final int highlightSegmentTimeBarScreenWidth
|
||||
= Utils.dipToPixels(HIGHLIGHT_SEGMENT_DRAW_BAR_WIDTH);
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
@@ -752,9 +999,9 @@ public class SegmentPlaybackController {
|
||||
final float left = leftPadding + segment.start * videoMillisecondsToPixels;
|
||||
final float right;
|
||||
if (segment.category == SegmentCategory.HIGHLIGHT) {
|
||||
right = left + highlightSegmentTimeBarScreenWidth;
|
||||
right = left + HIGHLIGHT_SEGMENT_DRAW_BAR_WIDTH;
|
||||
} else {
|
||||
right = leftPadding + segment.end * videoMillisecondsToPixels;
|
||||
right = leftPadding + segment.end * videoMillisecondsToPixels;
|
||||
}
|
||||
canvas.drawRect(left, top, right, bottom, segment.category.paint);
|
||||
}
|
||||
@@ -762,5 +1009,4 @@ public class SegmentPlaybackController {
|
||||
Logger.printException(() -> "drawSponsorTimeBars failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -223,13 +223,18 @@ public class SponsorBlockUtils {
|
||||
Logger.printException(() -> "invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
clearUnsubmittedSegmentTimes();
|
||||
Utils.runOnBackgroundThread(() -> {
|
||||
SBRequester.submitSegments(videoId, segmentCategory.keyValue, start, end, videoLength);
|
||||
SegmentPlaybackController.executeDownloadSegments(videoId);
|
||||
try {
|
||||
SBRequester.submitSegments(videoId, segmentCategory.keyValue, start, end, videoLength);
|
||||
SegmentPlaybackController.executeDownloadSegments(videoId);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "submitNewSegment failure", ex);
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Logger.printException(() -> "Unable to submit segment", e);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "submitNewSegment failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -366,7 +371,7 @@ public class SponsorBlockUtils {
|
||||
}
|
||||
|
||||
|
||||
static void sendViewRequestAsync(@NonNull SponsorSegment segment) {
|
||||
static void sendViewRequestAsync(SponsorSegment segment) {
|
||||
if (segment.recordedAsSkipped || segment.category == SegmentCategory.UNSUBMITTED) {
|
||||
return;
|
||||
}
|
||||
@@ -409,7 +414,7 @@ public class SponsorBlockUtils {
|
||||
return statsNumberFormatter.format(viewCount);
|
||||
}
|
||||
|
||||
private static long parseSegmentTime(@NonNull String time) {
|
||||
private static long parseSegmentTime(String time) {
|
||||
Matcher matcher = manualEditTimePattern.matcher(time);
|
||||
if (!matcher.matches()) {
|
||||
return -1;
|
||||
@@ -419,9 +424,12 @@ public class SponsorBlockUtils {
|
||||
String secondsStr = matcher.group(4);
|
||||
String millisecondsStr = matcher.group(6); // Milliseconds is optional.
|
||||
|
||||
|
||||
try {
|
||||
final int hours = (hoursStr != null) ? Integer.parseInt(hoursStr) : 0;
|
||||
//noinspection ConstantConditions
|
||||
final int minutes = Integer.parseInt(minutesStr);
|
||||
//noinspection ConstantConditions
|
||||
final int seconds = Integer.parseInt(secondsStr);
|
||||
final int milliseconds;
|
||||
if (millisecondsStr != null) {
|
||||
@@ -468,32 +476,29 @@ public class SponsorBlockUtils {
|
||||
}
|
||||
|
||||
public static String getTimeSavedString(long totalSecondsSaved) {
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
||||
Duration duration = Duration.ofSeconds(totalSecondsSaved);
|
||||
final long hours = duration.toHours();
|
||||
final long minutes = duration.toMinutes() % 60;
|
||||
Duration duration = Duration.ofSeconds(totalSecondsSaved);
|
||||
final long hours = duration.toHours();
|
||||
final long minutes = duration.toMinutes() % 60;
|
||||
|
||||
// Format all numbers so non-western numbers use a consistent appearance.
|
||||
String minutesFormatted = statsNumberFormatter.format(minutes);
|
||||
if (hours > 0) {
|
||||
String hoursFormatted = statsNumberFormatter.format(hours);
|
||||
return str("revanced_sb_stats_saved_hour_format", hoursFormatted, minutesFormatted);
|
||||
}
|
||||
|
||||
final long seconds = duration.getSeconds() % 60;
|
||||
String secondsFormatted = statsNumberFormatter.format(seconds);
|
||||
if (minutes > 0) {
|
||||
return str("revanced_sb_stats_saved_minute_format", minutesFormatted, secondsFormatted);
|
||||
}
|
||||
|
||||
return str("revanced_sb_stats_saved_second_format", secondsFormatted);
|
||||
// Format all numbers so non-western numbers use a consistent appearance.
|
||||
String minutesFormatted = statsNumberFormatter.format(minutes);
|
||||
if (hours > 0) {
|
||||
String hoursFormatted = statsNumberFormatter.format(hours);
|
||||
return str("revanced_sb_stats_saved_hour_format", hoursFormatted, minutesFormatted);
|
||||
}
|
||||
return "error"; // will never be reached. YouTube requires Android O or greater
|
||||
|
||||
final long seconds = duration.getSeconds() % 60;
|
||||
String secondsFormatted = statsNumberFormatter.format(seconds);
|
||||
if (minutes > 0) {
|
||||
return str("revanced_sb_stats_saved_minute_format", minutesFormatted, secondsFormatted);
|
||||
}
|
||||
|
||||
return str("revanced_sb_stats_saved_second_format", secondsFormatted);
|
||||
}
|
||||
|
||||
private static class EditByHandSaveDialogListener implements DialogInterface.OnClickListener {
|
||||
boolean settingStart;
|
||||
WeakReference<EditText> editTextRef = new WeakReference<>(null);
|
||||
private boolean settingStart;
|
||||
private WeakReference<EditText> editTextRef = new WeakReference<>(null);
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
@@ -512,10 +517,11 @@ public class SponsorBlockUtils {
|
||||
}
|
||||
}
|
||||
|
||||
if (settingStart)
|
||||
if (settingStart) {
|
||||
newSponsorSegmentStartMillis = Math.max(time, 0);
|
||||
else
|
||||
} else {
|
||||
newSponsorSegmentEndMillis = time;
|
||||
}
|
||||
|
||||
if (which == DialogInterface.BUTTON_NEUTRAL)
|
||||
editByHandDialogListener.onClick(dialog, settingStart ?
|
||||
|
||||
@@ -9,7 +9,10 @@ import java.util.Objects;
|
||||
|
||||
import static app.revanced.extension.shared.StringRef.sf;
|
||||
|
||||
import android.util.Range;
|
||||
|
||||
public class SponsorSegment implements Comparable<SponsorSegment> {
|
||||
|
||||
public enum SegmentVote {
|
||||
UPVOTE(sf("revanced_sb_vote_upvote"), 1,false),
|
||||
DOWNVOTE(sf("revanced_sb_vote_downvote"), 0, true),
|
||||
@@ -38,7 +41,7 @@ public class SponsorSegment implements Comparable<SponsorSegment> {
|
||||
@NonNull
|
||||
public final SegmentCategory category;
|
||||
/**
|
||||
* NULL if segment is unsubmitted
|
||||
* NULL if segment is unsubmitted.
|
||||
*/
|
||||
@Nullable
|
||||
public final String UUID;
|
||||
@@ -64,33 +67,54 @@ public class SponsorSegment implements Comparable<SponsorSegment> {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param nearThreshold threshold to declare the time parameter is near this segment. Must be a positive number
|
||||
* @param nearThreshold threshold to declare the time parameter is near this segment. Must be a positive number.
|
||||
*/
|
||||
public boolean startIsNear(long videoTime, long nearThreshold) {
|
||||
return Math.abs(start - videoTime) <= nearThreshold;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param nearThreshold threshold to declare the time parameter is near this segment. Must be a positive number
|
||||
* @param nearThreshold threshold to declare the time parameter is near this segment. Must be a positive number.
|
||||
*/
|
||||
public boolean endIsNear(long videoTime, long nearThreshold) {
|
||||
return Math.abs(end - videoTime) <= nearThreshold;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if the time parameter is within this segment
|
||||
* @return if the time parameter is within this segment.
|
||||
*/
|
||||
public boolean containsTime(long videoTime) {
|
||||
return start <= videoTime && videoTime < end;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if the segment is completely contained inside this segment
|
||||
* @return if the segment is completely contained inside this segment.
|
||||
*/
|
||||
public boolean containsSegment(SponsorSegment other) {
|
||||
return start <= other.start && other.end <= end;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return If the range has any overlap with this segment.
|
||||
*/
|
||||
public boolean intersectsRange(Range<Long> range) {
|
||||
return range.getLower() < end && range.getUpper() >= start;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The start/end time in range form.
|
||||
* Range times are adjusted since it uses inclusive and Segments use exclusive.
|
||||
*
|
||||
* {@link SegmentCategory#HIGHLIGHT} is unique and
|
||||
* returns a range from the start of the video until the highlight.
|
||||
*/
|
||||
public Range<Long> getUndoRange() {
|
||||
final long undoStart = category == SegmentCategory.HIGHLIGHT
|
||||
? 0
|
||||
: start;
|
||||
return Range.create(undoStart, end - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the length of this segment, in milliseconds. Always a positive number.
|
||||
*/
|
||||
@@ -99,7 +123,7 @@ public class SponsorSegment implements Comparable<SponsorSegment> {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return 'skip segment' UI overlay button text
|
||||
* @return 'skip segment' UI overlay button text.
|
||||
*/
|
||||
@NonNull
|
||||
public String getSkipButtonText() {
|
||||
@@ -107,7 +131,7 @@ public class SponsorSegment implements Comparable<SponsorSegment> {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return 'skipped segment' toast message
|
||||
* @return 'skipped segment' toast message.
|
||||
*/
|
||||
@NonNull
|
||||
public String getSkippedToastText() {
|
||||
|
||||
@@ -53,7 +53,7 @@ public class SBRequester {
|
||||
private SBRequester() {
|
||||
}
|
||||
|
||||
private static void handleConnectionError(@NonNull String toastMessage, @Nullable Exception ex) {
|
||||
private static void handleConnectionError(String toastMessage, @Nullable Exception ex) {
|
||||
if (Settings.SB_TOAST_ON_CONNECTION_ERROR.get()) {
|
||||
Utils.showToastShort(toastMessage);
|
||||
}
|
||||
@@ -63,7 +63,7 @@ public class SBRequester {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static SponsorSegment[] getSegments(@NonNull String videoId) {
|
||||
public static SponsorSegment[] getSegments(String videoId) {
|
||||
Utils.verifyOffMainThread();
|
||||
List<SponsorSegment> segments = new ArrayList<>();
|
||||
try {
|
||||
@@ -113,10 +113,10 @@ public class SBRequester {
|
||||
Logger.printException(() -> "getSegments failure", ex);
|
||||
}
|
||||
|
||||
// Crude debug tests to verify random features
|
||||
// Crude debug tests to verify random features.
|
||||
// Could benefit from:
|
||||
// 1) collection of YouTube videos with test segment times (verify client skip timing matches the video, verify seekbar draws correctly)
|
||||
// 2) unit tests (verify everything else)
|
||||
// 1) Collection of YouTube videos with test segment times (verify client skip timing matches the video, verify seekbar draws correctly).
|
||||
// 2) Unit tests (verify everything else).
|
||||
//noinspection ConstantValue
|
||||
if (false) {
|
||||
segments.clear();
|
||||
@@ -140,10 +140,30 @@ public class SBRequester {
|
||||
segments.add(new SponsorSegment(SegmentCategory.SELF_PROMO, "debug", 200000, 330000, false));
|
||||
}
|
||||
|
||||
// Test undo skip functionality.
|
||||
// To test enable 'Autoskip always' for intro and self promo.
|
||||
//noinspection ConstantValue
|
||||
if (false) {
|
||||
// Should autoskip to 12 seconds.
|
||||
// Undoing skip should seek to 2 seconds.
|
||||
// Skip button should show at 2 seconds, and again at 8 seconds.
|
||||
// Self promo at 8 second time should not autoskip.
|
||||
segments.clear();
|
||||
segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 2000, 12000, false));
|
||||
segments.add(new SponsorSegment(SegmentCategory.SELF_PROMO, "debug", 8000, 15000, false));
|
||||
|
||||
// Test multiple autoskip dialogs rapidly showing.
|
||||
// Only one toast should be shown at anytime.
|
||||
segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 16000, 17000, false));
|
||||
segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 18000, 19000, false));
|
||||
segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 20000, 21000, false));
|
||||
segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 22000, 23000, false));
|
||||
}
|
||||
|
||||
return segments.toArray(new SponsorSegment[0]);
|
||||
}
|
||||
|
||||
public static void submitSegments(@NonNull String videoId, @NonNull String category,
|
||||
public static void submitSegments(String videoId, String category,
|
||||
long startTime, long endTime, long videoLength) {
|
||||
Utils.verifyOffMainThread();
|
||||
|
||||
@@ -189,7 +209,7 @@ public class SBRequester {
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendSegmentSkippedViewedRequest(@NonNull SponsorSegment segment) {
|
||||
public static void sendSegmentSkippedViewedRequest(SponsorSegment segment) {
|
||||
Utils.verifyOffMainThread();
|
||||
try {
|
||||
HttpURLConnection connection = getConnectionFromRoute(SBRoutes.VIEWED_SEGMENT, segment.UUID);
|
||||
@@ -208,13 +228,13 @@ public class SBRequester {
|
||||
}
|
||||
}
|
||||
|
||||
public static void voteForSegmentOnBackgroundThread(@NonNull SponsorSegment segment, @NonNull SegmentVote voteOption) {
|
||||
public static void voteForSegmentOnBackgroundThread(SponsorSegment segment, SegmentVote voteOption) {
|
||||
voteOrRequestCategoryChange(segment, voteOption, null);
|
||||
}
|
||||
public static void voteToChangeCategoryOnBackgroundThread(@NonNull SponsorSegment segment, @NonNull SegmentCategory categoryToVoteFor) {
|
||||
public static void voteToChangeCategoryOnBackgroundThread(SponsorSegment segment, SegmentCategory categoryToVoteFor) {
|
||||
voteOrRequestCategoryChange(segment, SegmentVote.CATEGORY_CHANGE, categoryToVoteFor);
|
||||
}
|
||||
private static void voteOrRequestCategoryChange(@NonNull SponsorSegment segment, @NonNull SegmentVote voteOption, SegmentCategory categoryToVoteFor) {
|
||||
private static void voteOrRequestCategoryChange(SponsorSegment segment, SegmentVote voteOption, SegmentCategory categoryToVoteFor) {
|
||||
Utils.runOnBackgroundThread(() -> {
|
||||
try {
|
||||
String segmentUuid = segment.UUID;
|
||||
@@ -280,7 +300,7 @@ public class SBRequester {
|
||||
* @return NULL if the call was successful. If unsuccessful, an error message is returned.
|
||||
*/
|
||||
@Nullable
|
||||
public static String setUsername(@NonNull String username) {
|
||||
public static String setUsername(String username) {
|
||||
Utils.verifyOffMainThread();
|
||||
try {
|
||||
HttpURLConnection connection = getConnectionFromRoute(SBRoutes.CHANGE_USERNAME, SponsorBlockSettings.getSBPrivateUserID(), username);
|
||||
@@ -320,14 +340,14 @@ public class SBRequester {
|
||||
|
||||
// helpers
|
||||
|
||||
private static HttpURLConnection getConnectionFromRoute(@NonNull Route route, String... params) throws IOException {
|
||||
private static HttpURLConnection getConnectionFromRoute(Route route, String... params) throws IOException {
|
||||
HttpURLConnection connection = Requester.getConnectionFromRoute(Settings.SB_API_URL.get(), route, params);
|
||||
connection.setConnectTimeout(TIMEOUT_TCP_DEFAULT_MILLISECONDS);
|
||||
connection.setReadTimeout(TIMEOUT_HTTP_DEFAULT_MILLISECONDS);
|
||||
return connection;
|
||||
}
|
||||
|
||||
private static JSONObject getJSONObject(@NonNull Route route, String... params) throws IOException, JSONException {
|
||||
private static JSONObject getJSONObject(Route route, String... params) throws IOException, JSONException {
|
||||
return Requester.parseJSONObject(getConnectionFromRoute(route, params));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package app.revanced.extension.youtube.sponsorblock.ui;
|
||||
|
||||
import static app.revanced.extension.shared.StringRef.str;
|
||||
import static app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController.SponsorBlockDuration;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Dialog;
|
||||
@@ -28,6 +29,7 @@ import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.preference.CustomDialogListPreference;
|
||||
import app.revanced.extension.shared.settings.preference.ResettableEditTextPreference;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController;
|
||||
@@ -62,6 +64,8 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
private SwitchPreference trackSkips;
|
||||
private SwitchPreference showTimeWithoutSegments;
|
||||
private SwitchPreference toastOnConnectionError;
|
||||
private CustomDialogListPreference autoHideSkipSegmentButtonDuration;
|
||||
private CustomDialogListPreference showSkipToastDuration;
|
||||
|
||||
private ResettableEditTextPreference newSegmentStep;
|
||||
private ResettableEditTextPreference minSegmentDuration;
|
||||
@@ -69,8 +73,8 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
private EditTextPreference importExport;
|
||||
private Preference apiUrl;
|
||||
|
||||
private final List<SegmentCategoryListPreference> segmentCategories = new ArrayList<>();
|
||||
private PreferenceCategory segmentCategory;
|
||||
private final List<SegmentCategoryListPreference> segmentCategories = new ArrayList<>();
|
||||
|
||||
public SponsorBlockPreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
@@ -114,17 +118,23 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
votingEnabled.setChecked(Settings.SB_VOTING_BUTTON.get());
|
||||
votingEnabled.setEnabled(enabled);
|
||||
|
||||
autoHideSkipSegmentButton.setEnabled(enabled);
|
||||
autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get());
|
||||
autoHideSkipSegmentButton.setEnabled(enabled);
|
||||
|
||||
autoHideSkipSegmentButtonDuration.setValue(Settings.SB_AUTO_HIDE_SKIP_BUTTON_DURATION.get().toString());
|
||||
autoHideSkipSegmentButtonDuration.setEnabled(Settings.SB_AUTO_HIDE_SKIP_BUTTON_DURATION.isAvailable());
|
||||
|
||||
compactSkipButton.setChecked(Settings.SB_COMPACT_SKIP_BUTTON.get());
|
||||
compactSkipButton.setEnabled(enabled);
|
||||
|
||||
showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get());
|
||||
showSkipToast.setEnabled(enabled);
|
||||
|
||||
squareLayout.setChecked(Settings.SB_SQUARE_LAYOUT.get());
|
||||
squareLayout.setEnabled(enabled);
|
||||
|
||||
showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get());
|
||||
showSkipToast.setEnabled(enabled);
|
||||
showSkipToastDuration.setValue(Settings.SB_TOAST_ON_SKIP_DURATION.get().toString());
|
||||
showSkipToastDuration.setEnabled(Settings.SB_TOAST_ON_SKIP_DURATION.isAvailable());
|
||||
|
||||
toastOnConnectionError.setChecked(Settings.SB_TOAST_ON_CONNECTION_ERROR.get());
|
||||
toastOnConnectionError.setEnabled(enabled);
|
||||
@@ -166,7 +176,7 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
try {
|
||||
super.onAttachedToActivity();
|
||||
|
||||
if (preferencesInitialized) {
|
||||
if (preferencesInitialized) {
|
||||
if (settingsImported) {
|
||||
settingsImported = false;
|
||||
updateUI();
|
||||
@@ -205,17 +215,6 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
});
|
||||
appearanceCategory.addPreference(votingEnabled);
|
||||
|
||||
autoHideSkipSegmentButton = new SwitchPreference(context);
|
||||
autoHideSkipSegmentButton.setTitle(str("revanced_sb_enable_auto_hide_skip_segment_button"));
|
||||
autoHideSkipSegmentButton.setSummaryOn(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_on"));
|
||||
autoHideSkipSegmentButton.setSummaryOff(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_off"));
|
||||
autoHideSkipSegmentButton.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_AUTO_HIDE_SKIP_BUTTON.save((Boolean) newValue);
|
||||
updateUI();
|
||||
return true;
|
||||
});
|
||||
appearanceCategory.addPreference(autoHideSkipSegmentButton);
|
||||
|
||||
compactSkipButton = new SwitchPreference(context);
|
||||
compactSkipButton.setTitle(str("revanced_sb_enable_compact_skip_button"));
|
||||
compactSkipButton.setSummaryOn(str("revanced_sb_enable_compact_skip_button_sum_on"));
|
||||
@@ -227,25 +226,38 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
});
|
||||
appearanceCategory.addPreference(compactSkipButton);
|
||||
|
||||
squareLayout = new SwitchPreference(context);
|
||||
squareLayout.setTitle(str("revanced_sb_square_layout"));
|
||||
squareLayout.setSummaryOn(str("revanced_sb_square_layout_sum_on"));
|
||||
squareLayout.setSummaryOff(str("revanced_sb_square_layout_sum_off"));
|
||||
squareLayout.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_SQUARE_LAYOUT.save((Boolean) newValue);
|
||||
autoHideSkipSegmentButton = new SwitchPreference(context);
|
||||
autoHideSkipSegmentButton.setTitle(str("revanced_sb_enable_auto_hide_skip_segment_button"));
|
||||
autoHideSkipSegmentButton.setSummaryOn(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_on"));
|
||||
autoHideSkipSegmentButton.setSummaryOff(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_off"));
|
||||
autoHideSkipSegmentButton.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_AUTO_HIDE_SKIP_BUTTON.save((Boolean) newValue);
|
||||
updateUI();
|
||||
return true;
|
||||
});
|
||||
appearanceCategory.addPreference(squareLayout);
|
||||
appearanceCategory.addPreference(autoHideSkipSegmentButton);
|
||||
|
||||
String[] durationEntries = Utils.getResourceStringArray("revanced_sb_duration_entries");
|
||||
String[] durationEntryValues = Utils.getResourceStringArray("revanced_sb_duration_entry_values");
|
||||
|
||||
autoHideSkipSegmentButtonDuration = new CustomDialogListPreference(context);
|
||||
autoHideSkipSegmentButtonDuration.setTitle(str("revanced_sb_auto_hide_skip_button_duration"));
|
||||
autoHideSkipSegmentButtonDuration.setSummary(str("revanced_sb_auto_hide_skip_button_duration_sum"));
|
||||
autoHideSkipSegmentButtonDuration.setEntries(durationEntries);
|
||||
autoHideSkipSegmentButtonDuration.setEntryValues(durationEntryValues);
|
||||
autoHideSkipSegmentButtonDuration.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_AUTO_HIDE_SKIP_BUTTON_DURATION.save(
|
||||
SponsorBlockDuration.valueOf((String) newValue)
|
||||
);
|
||||
updateUI();
|
||||
return true;
|
||||
});
|
||||
appearanceCategory.addPreference(autoHideSkipSegmentButtonDuration);
|
||||
|
||||
showSkipToast = new SwitchPreference(context);
|
||||
showSkipToast.setTitle(str("revanced_sb_general_skiptoast"));
|
||||
showSkipToast.setSummaryOn(str("revanced_sb_general_skiptoast_sum_on"));
|
||||
showSkipToast.setSummaryOff(str("revanced_sb_general_skiptoast_sum_off"));
|
||||
showSkipToast.setOnPreferenceClickListener(preference1 -> {
|
||||
Utils.showToastShort(str("revanced_sb_skipped_sponsor"));
|
||||
return false;
|
||||
});
|
||||
showSkipToast.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_TOAST_ON_SKIP.save((Boolean) newValue);
|
||||
updateUI();
|
||||
@@ -253,6 +265,20 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
});
|
||||
appearanceCategory.addPreference(showSkipToast);
|
||||
|
||||
showSkipToastDuration = new CustomDialogListPreference(context);
|
||||
showSkipToastDuration.setTitle(str("revanced_sb_toast_on_skip_duration"));
|
||||
showSkipToastDuration.setSummary(str("revanced_sb_toast_on_skip_duration_sum"));
|
||||
showSkipToastDuration.setEntries(durationEntries);
|
||||
showSkipToastDuration.setEntryValues(durationEntryValues);
|
||||
showSkipToastDuration.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_TOAST_ON_SKIP_DURATION.save(
|
||||
SponsorBlockDuration.valueOf((String) newValue)
|
||||
);
|
||||
updateUI();
|
||||
return true;
|
||||
});
|
||||
appearanceCategory.addPreference(showSkipToastDuration);
|
||||
|
||||
showTimeWithoutSegments = new SwitchPreference(context);
|
||||
showTimeWithoutSegments.setTitle(str("revanced_sb_general_time_without"));
|
||||
showTimeWithoutSegments.setSummaryOn(str("revanced_sb_general_time_without_sum_on"));
|
||||
@@ -264,6 +290,17 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup {
|
||||
});
|
||||
appearanceCategory.addPreference(showTimeWithoutSegments);
|
||||
|
||||
squareLayout = new SwitchPreference(context);
|
||||
squareLayout.setTitle(str("revanced_sb_square_layout"));
|
||||
squareLayout.setSummaryOn(str("revanced_sb_square_layout_sum_on"));
|
||||
squareLayout.setSummaryOff(str("revanced_sb_square_layout_sum_off"));
|
||||
squareLayout.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_SQUARE_LAYOUT.save((Boolean) newValue);
|
||||
updateUI();
|
||||
return true;
|
||||
});
|
||||
appearanceCategory.addPreference(squareLayout);
|
||||
|
||||
segmentCategory = new PreferenceCategory(context);
|
||||
segmentCategory.setTitle(str("revanced_sb_diff_segments"));
|
||||
addPreference(segmentCategory);
|
||||
|
||||
@@ -203,7 +203,7 @@ public class SponsorBlockViewController {
|
||||
setSkipButtonMargins(skipSponsorButton, isWatchFullScreen);
|
||||
setViewVisibility(skipSponsorButton, skipSegment != null);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "Player type changed failure", ex);
|
||||
Logger.printException(() -> "playerTypeChanged failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
alias(libs.plugins.android.library)
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.29.0
|
||||
version = 5.30.0-dev.10
|
||||
|
||||
@@ -11,15 +11,25 @@ appcompat = "1.7.0"
|
||||
okhttp = "5.0.0-alpha.14"
|
||||
retrofit = "2.11.0"
|
||||
guava = "33.4.0-jre"
|
||||
protobuf-javalite = "4.31.1"
|
||||
protoc = "4.31.1"
|
||||
protobuf = "0.9.5"
|
||||
antlr4 = "4.13.2"
|
||||
nanohttpd = "2.3.1"
|
||||
apksig = "8.10.1"
|
||||
|
||||
[libraries]
|
||||
annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" }
|
||||
antlr4 = { module = "org.antlr:antlr4", version.ref = "antlr4" }
|
||||
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
|
||||
nanohttpd = { module = "org.nanohttpd:nanohttpd", version.ref = "nanohttpd" }
|
||||
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
|
||||
protobuf-javalite = { module = "com.google.protobuf:protobuf-javalite", version.ref = "protobuf-javalite" }
|
||||
protobuf-protoc = { module = "com.google.protobuf:protoc", version.ref = "protoc" }
|
||||
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
|
||||
guava = { module = "com.google.guava:guava", version.ref = "guava" }
|
||||
apksig = { group = "com.android.tools.build", name = "apksig", version.ref = "apksig" }
|
||||
|
||||
[plugins]
|
||||
android-library = { id = "com.android.library", version.ref = "agp" }
|
||||
android-library = { id = "com.android.library" }
|
||||
protobuf = { id = "com.google.protobuf", version.ref = "protobuf" }
|
||||
|
||||
6
gradle/wrapper/gradle-wrapper.properties
vendored
6
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,8 +1,6 @@
|
||||
#Mon Jun 16 14:39:32 CEST 2025
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -668,17 +668,39 @@ public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt {
|
||||
public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/hex/HexPatchKt {
|
||||
public static final fun hexPatch (Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/RawResourcePatch;
|
||||
public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker {
|
||||
public fun <init> ()V
|
||||
public fun add (Lapp/revanced/patches/shared/misc/hex/Replacement;)Z
|
||||
public synthetic fun add (Ljava/lang/Object;)Z
|
||||
public fun addAll (Ljava/util/Collection;)Z
|
||||
public final fun asPatternTo (Ljava/lang/String;Ljava/lang/String;)Lkotlin/Pair;
|
||||
public fun clear ()V
|
||||
public fun contains (Lapp/revanced/patches/shared/misc/hex/Replacement;)Z
|
||||
public final fun contains (Ljava/lang/Object;)Z
|
||||
public fun containsAll (Ljava/util/Collection;)Z
|
||||
public fun getSize ()I
|
||||
public final fun inFile (Lkotlin/Pair;Ljava/lang/String;)V
|
||||
public fun isEmpty ()Z
|
||||
public fun iterator ()Ljava/util/Iterator;
|
||||
public fun remove (Ljava/lang/Object;)Z
|
||||
public fun removeAll (Ljava/util/Collection;)Z
|
||||
public fun retainAll (Ljava/util/Collection;)Z
|
||||
public final fun size ()I
|
||||
public fun toArray ()[Ljava/lang/Object;
|
||||
public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/hex/HexPatchBuilderKt {
|
||||
public static final fun hexPatch (ZLkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/RawResourcePatch;
|
||||
public static final fun hexPatch (ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/RawResourcePatch;
|
||||
public static synthetic fun hexPatch$default (ZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lapp/revanced/patcher/patch/RawResourcePatch;
|
||||
public static synthetic fun hexPatch$default (ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/RawResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/hex/Replacement {
|
||||
public static final field Companion Lapp/revanced/patches/shared/misc/hex/Replacement$Companion;
|
||||
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
public final fun replacePattern ([B)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/hex/Replacement$Companion {
|
||||
public fun <init> ([B[BLjava/lang/String;)V
|
||||
public final fun getReplacementBytesPadded ()[B
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/mapping/ResourceElement {
|
||||
@@ -922,6 +944,10 @@ public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt
|
||||
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt {
|
||||
public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt {
|
||||
public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.all.misc.hex
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.rawResourcePatch
|
||||
import app.revanced.patcher.patch.stringsOption
|
||||
import app.revanced.patches.shared.misc.hex.Replacement
|
||||
import app.revanced.patches.shared.misc.hex.HexPatchBuilder
|
||||
import app.revanced.patches.shared.misc.hex.hexPatch
|
||||
import app.revanced.util.Utils.trimIndentMultiline
|
||||
|
||||
@@ -13,44 +13,42 @@ val hexPatch = rawResourcePatch(
|
||||
description = "Replaces a hexadecimal patterns of bytes of files in an APK.",
|
||||
use = false,
|
||||
) {
|
||||
// TODO: Instead of stringArrayOption, use a custom option type to work around
|
||||
// https://github.com/ReVanced/revanced-library/issues/48.
|
||||
// Replace the custom option type with a stringArrayOption once the issue is resolved.
|
||||
val replacements by stringsOption(
|
||||
key = "replacements",
|
||||
title = "Replacements",
|
||||
description = """
|
||||
Hexadecimal patterns to search for and replace with another in a target file.
|
||||
|
||||
|
||||
A pattern is a sequence of case insensitive strings, each representing hexadecimal bytes, separated by spaces.
|
||||
An example pattern is 'aa 01 02 FF'.
|
||||
|
||||
Every pattern must be followed by a pipe ('|'), the replacement pattern,
|
||||
another pipe ('|'), and the path to the file to make the changes in relative to the APK root.
|
||||
The replacement pattern must have the same length as the original pattern.
|
||||
The replacement pattern must be shorter or equal in length to the pattern.
|
||||
|
||||
Full example of a valid input:
|
||||
'aa 01 02 FF|00 00 00 00|path/to/file'
|
||||
Full example of a valid replacement:
|
||||
'01 02 aa FF|03 04|path/to/file'
|
||||
""".trimIndentMultiline(),
|
||||
required = true,
|
||||
)
|
||||
|
||||
dependsOn(
|
||||
hexPatch {
|
||||
replacements!!.map { from ->
|
||||
val (pattern, replacementPattern, targetFilePath) = try {
|
||||
from.split("|", limit = 3)
|
||||
} catch (e: Exception) {
|
||||
throw PatchException(
|
||||
"Invalid input: $from.\n" +
|
||||
"Every pattern must be followed by a pipe ('|'), " +
|
||||
"the replacement pattern, another pipe ('|'), " +
|
||||
"and the path to the file to make the changes in relative to the APK root. ",
|
||||
)
|
||||
hexPatch(
|
||||
block = fun HexPatchBuilder.() {
|
||||
replacements!!.forEach { replacement ->
|
||||
try {
|
||||
val (pattern, replacementPattern, targetFilePath) = replacement.split("|", limit = 3)
|
||||
pattern asPatternTo replacementPattern inFile targetFilePath
|
||||
} catch (e: Exception) {
|
||||
throw PatchException(
|
||||
"Invalid replacement: $replacement.\n" +
|
||||
"Every pattern must be followed by a pipe ('|'), " +
|
||||
"the replacement pattern, another pipe ('|'), " +
|
||||
"and the path to the file to make the changes in relative to the APK root. ",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Replacement(pattern, replacementPattern, targetFilePath)
|
||||
}.toSet()
|
||||
},
|
||||
},
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
package app.revanced.patches.shared.misc.hex
|
||||
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.rawResourcePatch
|
||||
import kotlin.math.max
|
||||
|
||||
// The replacements being passed using a function is intended.
|
||||
// Previously the replacements were a property of the patch. Getter were being delegated to that property.
|
||||
// This late evaluation was being leveraged in app.revanced.patches.all.misc.hex.HexPatch.
|
||||
// Without the function, the replacements would be evaluated at the time of patch creation.
|
||||
// This isn't possible because the delegated property is not accessible at that time.
|
||||
fun hexPatch(replacementsSupplier: () -> Set<Replacement>) = rawResourcePatch {
|
||||
execute {
|
||||
replacementsSupplier().groupBy { it.targetFilePath }.forEach { (targetFilePath, replacements) ->
|
||||
val targetFile = try {
|
||||
get(targetFilePath, true)
|
||||
} catch (e: Exception) {
|
||||
throw PatchException("Could not find target file: $targetFilePath")
|
||||
}
|
||||
|
||||
// TODO: Use a file channel to read and write the file instead of reading the whole file into memory,
|
||||
// in order to reduce memory usage.
|
||||
val targetFileBytes = targetFile.readBytes()
|
||||
|
||||
replacements.forEach { replacement ->
|
||||
replacement.replacePattern(targetFileBytes)
|
||||
}
|
||||
|
||||
targetFile.writeBytes(targetFileBytes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a pattern to search for and its replacement pattern.
|
||||
*
|
||||
* @property pattern The pattern to search for.
|
||||
* @property replacementPattern The pattern to replace the [pattern] with.
|
||||
* @property targetFilePath The path to the file to make the changes in relative to the APK root.
|
||||
*/
|
||||
class Replacement(
|
||||
private val pattern: String,
|
||||
replacementPattern: String,
|
||||
internal val targetFilePath: String,
|
||||
) {
|
||||
private val patternBytes = pattern.toByteArrayPattern()
|
||||
private val replacementPattern = replacementPattern.toByteArrayPattern()
|
||||
|
||||
init {
|
||||
if (this.patternBytes.size != this.replacementPattern.size) {
|
||||
throw PatchException("Pattern and replacement pattern must have the same length: $pattern")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the [patternBytes] with the [replacementPattern] in the [targetFileBytes].
|
||||
*
|
||||
* @param targetFileBytes The bytes of the file to make the changes in.
|
||||
*/
|
||||
fun replacePattern(targetFileBytes: ByteArray) {
|
||||
val startIndex = indexOfPatternIn(targetFileBytes)
|
||||
|
||||
if (startIndex == -1) {
|
||||
throw PatchException("Pattern not found in target file: $pattern")
|
||||
}
|
||||
|
||||
replacementPattern.copyInto(targetFileBytes, startIndex)
|
||||
}
|
||||
|
||||
// TODO: Allow searching in a file channel instead of a byte array to reduce memory usage.
|
||||
/**
|
||||
* Returns the index of the first occurrence of [patternBytes] in the haystack
|
||||
* using the Boyer-Moore algorithm.
|
||||
*
|
||||
* @param haystack The array to search in.
|
||||
*
|
||||
* @return The index of the first occurrence of the [patternBytes] in the haystack or -1
|
||||
* if the [patternBytes] is not found.
|
||||
*/
|
||||
private fun indexOfPatternIn(haystack: ByteArray): Int {
|
||||
val needle = patternBytes
|
||||
|
||||
val haystackLength = haystack.size - 1
|
||||
val needleLength = needle.size - 1
|
||||
val right = IntArray(256) { -1 }
|
||||
|
||||
for (i in 0 until needleLength) right[needle[i].toInt().and(0xFF)] = i
|
||||
|
||||
var skip: Int
|
||||
for (i in 0..haystackLength - needleLength) {
|
||||
skip = 0
|
||||
|
||||
for (j in needleLength - 1 downTo 0) {
|
||||
if (needle[j] != haystack[i + j]) {
|
||||
skip = max(1, j - right[haystack[i + j].toInt().and(0xFF)])
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (skip == 0) return i
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* Convert a string representing a pattern of hexadecimal bytes to a byte array.
|
||||
*
|
||||
* @return The byte array representing the pattern.
|
||||
* @throws PatchException If the pattern is invalid.
|
||||
*/
|
||||
private fun String.toByteArrayPattern() = try {
|
||||
split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
} catch (e: NumberFormatException) {
|
||||
throw PatchException(
|
||||
"Could not parse pattern: $this. A pattern is a sequence of case insensitive strings " +
|
||||
"representing hexadecimal bytes separated by spaces",
|
||||
e,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
package app.revanced.patches.shared.misc.hex
|
||||
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.rawResourcePatch
|
||||
import kotlin.collections.component1
|
||||
import kotlin.collections.component2
|
||||
import kotlin.math.max
|
||||
|
||||
fun hexPatch(ignoreMissingTargetFiles: Boolean = false, block: HexPatchBuilder.() -> Unit) =
|
||||
hexPatch(ignoreMissingTargetFiles, fun(): Set<Replacement> = HexPatchBuilder().apply(block))
|
||||
|
||||
@Suppress("JavaDefaultMethodsNotOverriddenByDelegation")
|
||||
class HexPatchBuilder internal constructor(
|
||||
private val replacements: MutableSet<Replacement> = mutableSetOf(),
|
||||
) : Set<Replacement> by replacements {
|
||||
infix fun String.asPatternTo(replacementPattern: String) = byteArrayOf(this) to byteArrayOf(replacementPattern)
|
||||
|
||||
infix fun <T> Pair<T, T>.inFile(filePath: String) {
|
||||
if (first is String && second is String) {
|
||||
val first = first as String
|
||||
val second = second as String
|
||||
|
||||
replacements += Replacement(
|
||||
first.toByteArray(), second.toByteArray(),
|
||||
filePath
|
||||
)
|
||||
} else if (first is ByteArray && second is ByteArray) {
|
||||
val first = first as ByteArray
|
||||
val second = second as ByteArray
|
||||
|
||||
replacements += Replacement(first, second, filePath)
|
||||
} else {
|
||||
throw PatchException("Unsupported types for pattern and replacement: $first, $second")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The replacements being passed using a function is intended.
|
||||
// Previously the replacements were a property of the patch. Getter were being delegated to that property.
|
||||
// This late evaluation was being leveraged in app.revanced.patches.all.misc.hex.HexPatch.
|
||||
// Without the function, the replacements would be evaluated at the time of patch creation.
|
||||
// This isn't possible because the delegated property is not accessible at that time.
|
||||
@Deprecated("Use the hexPatch function with the builder parameter instead.")
|
||||
fun hexPatch(ignoreMissingTargetFiles: Boolean = false, replacementsSupplier: () -> Set<Replacement>) =
|
||||
rawResourcePatch {
|
||||
execute {
|
||||
replacementsSupplier().groupBy { it.targetFilePath }.forEach { (targetFilePath, replacements) ->
|
||||
val targetFile = get(targetFilePath, true)
|
||||
if (ignoreMissingTargetFiles && !targetFile.exists()) return@forEach
|
||||
|
||||
// TODO: Use a file channel to read and write the file instead of reading the whole file into memory,
|
||||
// in order to reduce memory usage.
|
||||
val targetFileBytes = targetFile.readBytes()
|
||||
replacements.forEach { it.replacePattern(targetFileBytes) }
|
||||
targetFile.writeBytes(targetFileBytes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a pattern to search for and its replacement pattern in a file.
|
||||
*
|
||||
* @property bytes The bytes to search for.
|
||||
* @property replacementBytes The bytes to replace the [bytes] with.
|
||||
* @property targetFilePath The path to the file to make the changes in relative to the APK root.
|
||||
*/
|
||||
class Replacement(
|
||||
private val bytes: ByteArray,
|
||||
replacementBytes: ByteArray,
|
||||
internal val targetFilePath: String,
|
||||
) {
|
||||
val replacementBytesPadded = replacementBytes + ByteArray(bytes.size - replacementBytes.size)
|
||||
|
||||
@Deprecated("Use the constructor with ByteArray parameters instead.")
|
||||
constructor(
|
||||
pattern: String,
|
||||
replacementPattern: String,
|
||||
targetFilePath: String,
|
||||
) : this(
|
||||
byteArrayOf(pattern),
|
||||
byteArrayOf(replacementPattern),
|
||||
targetFilePath
|
||||
)
|
||||
|
||||
/**
|
||||
* Replaces the [bytes] with the [replacementBytes] in the [targetFileBytes].
|
||||
*
|
||||
* @param targetFileBytes The bytes of the file to make the changes in.
|
||||
*/
|
||||
internal fun replacePattern(targetFileBytes: ByteArray) {
|
||||
val startIndex = indexOfPatternIn(targetFileBytes)
|
||||
|
||||
if (startIndex == -1) {
|
||||
throw PatchException(
|
||||
"Pattern not found in target file: " +
|
||||
bytes.joinToString(" ") { "%02x".format(it) }
|
||||
)
|
||||
}
|
||||
|
||||
replacementBytesPadded.copyInto(targetFileBytes, startIndex)
|
||||
}
|
||||
|
||||
// TODO: Allow searching in a file channel instead of a byte array to reduce memory usage.
|
||||
/**
|
||||
* Returns the index of the first occurrence of [bytes] in the haystack
|
||||
* using the Boyer-Moore algorithm.
|
||||
*
|
||||
* @param haystack The array to search in.
|
||||
*
|
||||
* @return The index of the first occurrence of the [bytes] in the haystack or -1
|
||||
* if the [bytes] is not found.
|
||||
*/
|
||||
private fun indexOfPatternIn(haystack: ByteArray): Int {
|
||||
val needle = bytes
|
||||
|
||||
val haystackLength = haystack.size - 1
|
||||
val needleLength = needle.size - 1
|
||||
val right = IntArray(256) { -1 }
|
||||
|
||||
for (i in 0 until needleLength) right[needle[i].toInt().and(0xFF)] = i
|
||||
|
||||
var skip: Int
|
||||
for (i in 0..haystackLength - needleLength) {
|
||||
skip = 0
|
||||
|
||||
for (j in needleLength - 1 downTo 0) {
|
||||
if (needle[j] != haystack[i + j]) {
|
||||
skip = max(1, j - right[haystack[i + j].toInt().and(0xFF)])
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (skip == 0) return i
|
||||
}
|
||||
return -1
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a string representing a pattern of hexadecimal bytes to a byte array.
|
||||
*
|
||||
* @return The byte array representing the pattern.
|
||||
* @throws PatchException If the pattern is invalid.
|
||||
*/
|
||||
private fun byteArrayOf(pattern: String) = try {
|
||||
pattern.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
} catch (e: NumberFormatException) {
|
||||
throw PatchException(
|
||||
"Could not parse pattern: $pattern. A pattern is a sequence of case insensitive strings " +
|
||||
"representing hexadecimal bytes separated by spaces",
|
||||
e,
|
||||
)
|
||||
}
|
||||
@@ -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,18 +117,28 @@ internal val abstractProtobufListEnsureIsMutableFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val homeSectionFingerprint = fingerprint {
|
||||
custom { _, classDef -> classDef.endsWith("homeapi/proto/Section;") }
|
||||
}
|
||||
|
||||
internal val homeStructureGetSectionsFingerprint = fingerprint {
|
||||
internal fun structureGetSectionsFingerprint(className: String) = fingerprint {
|
||||
custom { method, classDef ->
|
||||
classDef.endsWith("homeapi/proto/HomeStructure;") && method.indexOfFirstInstruction {
|
||||
classDef.endsWith(className) && method.indexOfFirstInstruction {
|
||||
opcode == Opcode.IGET_OBJECT && getReference<FieldReference>()?.name == "sections_"
|
||||
} >= 0
|
||||
}
|
||||
}
|
||||
|
||||
internal val homeSectionFingerprint = fingerprint {
|
||||
custom { _, classDef -> classDef.endsWith("homeapi/proto/Section;") }
|
||||
}
|
||||
|
||||
internal val homeStructureGetSectionsFingerprint =
|
||||
structureGetSectionsFingerprint("homeapi/proto/HomeStructure;")
|
||||
|
||||
internal val browseSectionFingerprint = fingerprint {
|
||||
custom { _, classDef-> classDef.endsWith("browsita/v1/resolved/Section;") }
|
||||
}
|
||||
|
||||
internal val browseStructureGetSectionsFingerprint =
|
||||
structureGetSectionsFingerprint("browsita/v1/resolved/BrowseStructure;")
|
||||
|
||||
internal fun reactivexFunctionApplyWithClassInitFingerprint(className: String) = fingerprint {
|
||||
returns("Ljava/lang/Object;")
|
||||
parameters("Ljava/lang/Object;")
|
||||
|
||||
@@ -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,9 +1,61 @@
|
||||
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(
|
||||
"Failed to get the application signatures"
|
||||
)
|
||||
}
|
||||
|
||||
internal val loadOrbitLibraryFingerprint = fingerprint {
|
||||
strings("/liborbit-jni-spotify.so")
|
||||
}
|
||||
|
||||
internal val startupPageLayoutInflateFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("Landroid/view/View;")
|
||||
parameters("Landroid/view/LayoutInflater;", "Landroid/view/ViewGroup;", "Landroid/os/Bundle;")
|
||||
strings("blueprintContainer", "gradient", "valuePropositionTextView")
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
package app.revanced.patches.spotify.misc.fix
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
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.*
|
||||
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
|
||||
|
||||
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val spoofClientPatch = bytecodePatch(
|
||||
name = "Spoof client",
|
||||
description = "Spoofs the client to fix various functions of the app.",
|
||||
) {
|
||||
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. " +
|
||||
"Port must be between 0 and 65535.",
|
||||
required = true,
|
||||
validator = {
|
||||
it!!
|
||||
!(it < 0 || it > 65535)
|
||||
}
|
||||
)
|
||||
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
hexPatch(ignoreMissingTargetFiles = true, block = fun HexPatchBuilder.() {
|
||||
listOf(
|
||||
"arm64-v8a",
|
||||
"armeabi-v7a",
|
||||
"x86",
|
||||
"x86_64"
|
||||
).forEach { architecture ->
|
||||
"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:$requestListenerPort/v4/login" inFile
|
||||
"lib/$architecture/liborbit-jni-spotify.so"
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
compatibleWith("com.spotify.music")
|
||||
|
||||
execute {
|
||||
// region Spoof package info.
|
||||
|
||||
getPackageInfoFingerprint.method.apply {
|
||||
// region Spoof signature.
|
||||
|
||||
val failedToGetSignaturesStringIndex =
|
||||
getPackageInfoFingerprint.stringMatches!!.first().index
|
||||
|
||||
val concatSignaturesIndex = indexOfFirstInstructionReversedOrThrow(
|
||||
failedToGetSignaturesStringIndex,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
)
|
||||
|
||||
val signatureRegister = getInstruction<OneRegisterInstruction>(concatSignaturesIndex).registerA
|
||||
val expectedSignature = "d6a6dced4a85f24204bf9505ccc1fce114cadb32"
|
||||
|
||||
replaceInstruction(concatSignaturesIndex, "const-string v$signatureRegister, \"$expectedSignature\"")
|
||||
|
||||
// endregion
|
||||
|
||||
// region Spoof installer name.
|
||||
|
||||
val expectedInstallerName = "com.android.vending"
|
||||
|
||||
findInstructionIndicesReversedOrThrow {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.name == "getInstallerPackageName" || reference?.name == "getInstallingPackageName"
|
||||
}.forEach { index ->
|
||||
val returnObjectIndex = index + 1
|
||||
|
||||
val installerPackageNameRegister = getInstruction<OneRegisterInstruction>(
|
||||
returnObjectIndex
|
||||
).registerA
|
||||
|
||||
addInstruction(
|
||||
returnObjectIndex + 1,
|
||||
"const-string v$installerPackageNameRegister, \"$expectedInstallerName\""
|
||||
)
|
||||
}
|
||||
|
||||
// endregion
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region Spoof client.
|
||||
|
||||
loadOrbitLibraryFingerprint.method.addInstructions(
|
||||
0,
|
||||
"""
|
||||
const/16 v0, $requestListenerPort
|
||||
invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->launchListener(I)V
|
||||
"""
|
||||
)
|
||||
|
||||
startupPageLayoutInflateFingerprint.method.apply {
|
||||
val openLoginWebViewDescriptor =
|
||||
"$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,
|
||||
"""
|
||||
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.
|
||||
runIntegrityVerificationFingerprint.method.returnEarly()
|
||||
|
||||
// endregion
|
||||
}
|
||||
}
|
||||
@@ -1,63 +1,11 @@
|
||||
package app.revanced.patches.spotify.misc.fix
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@Deprecated("Superseded by spoofClientPatch", ReplaceWith("spoofClientPatch"))
|
||||
@Suppress("unused")
|
||||
val spoofPackageInfoPatch = bytecodePatch(
|
||||
name = "Spoof package info",
|
||||
description = "Spoofs the package info of the app to fix various functions of the app.",
|
||||
) {
|
||||
compatibleWith("com.spotify.music")
|
||||
|
||||
execute {
|
||||
getPackageInfoFingerprint.method.apply {
|
||||
// region Spoof signature.
|
||||
|
||||
val failedToGetSignaturesStringIndex =
|
||||
getPackageInfoFingerprint.stringMatches!!.first().index
|
||||
|
||||
val concatSignaturesIndex = indexOfFirstInstructionReversedOrThrow(
|
||||
failedToGetSignaturesStringIndex,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
)
|
||||
|
||||
val signatureRegister = getInstruction<OneRegisterInstruction>(concatSignaturesIndex).registerA
|
||||
val expectedSignature = "d6a6dced4a85f24204bf9505ccc1fce114cadb32"
|
||||
|
||||
replaceInstruction(concatSignaturesIndex, "const-string v$signatureRegister, \"$expectedSignature\"")
|
||||
|
||||
// endregion
|
||||
|
||||
// region Spoof installer name.
|
||||
|
||||
val expectedInstallerName = "com.android.vending"
|
||||
|
||||
findInstructionIndicesReversedOrThrow {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.name == "getInstallerPackageName" || reference?.name == "getInstallingPackageName"
|
||||
}.forEach { index ->
|
||||
val returnObjectIndex = index + 1
|
||||
|
||||
val installerPackageNameRegister = getInstruction<OneRegisterInstruction>(
|
||||
returnObjectIndex
|
||||
).registerA
|
||||
|
||||
addInstruction(
|
||||
returnObjectIndex + 1,
|
||||
"const-string v$installerPackageNameRegister, \"$expectedInstallerName\""
|
||||
)
|
||||
}
|
||||
|
||||
// endregion
|
||||
}
|
||||
}
|
||||
dependsOn(spoofClientPatch)
|
||||
}
|
||||
|
||||
@@ -2,10 +2,10 @@ package app.revanced.patches.spotify.misc.fix
|
||||
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
|
||||
@Deprecated("Superseded by spoofPackageInfoPatch", ReplaceWith("spoofPackageInfoPatch"))
|
||||
@Deprecated("Superseded by spoofClientPatch", ReplaceWith("spoofClientPatch"))
|
||||
@Suppress("unused")
|
||||
val spoofSignaturePatch = bytecodePatch(
|
||||
description = "Spoofs the signature of the app fix various functions of the app.",
|
||||
) {
|
||||
dependsOn(spoofPackageInfoPatch)
|
||||
dependsOn(spoofClientPatch)
|
||||
}
|
||||
|
||||
@@ -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!!
|
||||
}
|
||||
|
||||
@@ -43,17 +43,17 @@ private val hideAdsResourcePatch = resourcePatch {
|
||||
addResources("youtube", "ad.general.hideAdsResourcePatch")
|
||||
|
||||
PreferenceScreen.ADS.addPreferences(
|
||||
SwitchPreference("revanced_hide_general_ads"),
|
||||
SwitchPreference("revanced_hide_creator_store_shelves"),
|
||||
SwitchPreference("revanced_hide_end_screen_store_banner"),
|
||||
SwitchPreference("revanced_hide_fullscreen_ads"),
|
||||
SwitchPreference("revanced_hide_general_ads"),
|
||||
SwitchPreference("revanced_hide_merchandise_banners"),
|
||||
SwitchPreference("revanced_hide_paid_promotion_label"),
|
||||
SwitchPreference("revanced_hide_player_store_shelf"),
|
||||
SwitchPreference("revanced_hide_self_sponsor_ads"),
|
||||
SwitchPreference("revanced_hide_products_banner"),
|
||||
SwitchPreference("revanced_hide_shopping_links"),
|
||||
SwitchPreference("revanced_hide_tagged_products"),
|
||||
SwitchPreference("revanced_hide_view_products_banner"),
|
||||
SwitchPreference("revanced_hide_visit_store_button"),
|
||||
SwitchPreference("revanced_hide_web_search_results"),
|
||||
SwitchPreference("revanced_hide_merchandise_banners"),
|
||||
)
|
||||
|
||||
addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;")
|
||||
|
||||
@@ -160,9 +160,9 @@ val hideLayoutComponentsPatch = bytecodePatch(
|
||||
SwitchPreference("revanced_hide_comments_by_members_header"),
|
||||
SwitchPreference("revanced_hide_comments_section"),
|
||||
SwitchPreference("revanced_hide_comments_create_a_short_button"),
|
||||
SwitchPreference("revanced_hide_comments_timestamp_button"),
|
||||
SwitchPreference("revanced_hide_comments_preview_comment"),
|
||||
SwitchPreference("revanced_hide_comments_thanks_button"),
|
||||
SwitchPreference("revanced_hide_comments_timestamp_button"),
|
||||
),
|
||||
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
|
||||
),
|
||||
@@ -201,6 +201,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
|
||||
key = "revanced_hide_filter_bar_screen",
|
||||
preferences = setOf(
|
||||
SwitchPreference("revanced_hide_filter_bar_feed_in_feed"),
|
||||
SwitchPreference("revanced_hide_filter_bar_feed_in_history"),
|
||||
SwitchPreference("revanced_hide_filter_bar_feed_in_search"),
|
||||
SwitchPreference("revanced_hide_filter_bar_feed_in_related_videos"),
|
||||
),
|
||||
|
||||
@@ -7,26 +7,18 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val componentContextParserFingerprint = fingerprint {
|
||||
strings(
|
||||
"TreeNode result must be set.",
|
||||
// String is a partial match and changed slightly in 20.03+
|
||||
"it was removed due to duplicate converter bindings."
|
||||
)
|
||||
strings("Number of bits must be positive")
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves to the class found in [componentContextParserFingerprint].
|
||||
* When patching 19.16 this fingerprint matches the same method as [componentContextParserFingerprint].
|
||||
*/
|
||||
internal val componentContextSubParserFingerprint = fingerprint {
|
||||
internal val componentCreateFingerprint = fingerprint {
|
||||
strings(
|
||||
"Number of bits must be positive"
|
||||
"Element missing correct type extension",
|
||||
"Element missing type"
|
||||
)
|
||||
}
|
||||
|
||||
internal val lithoFilterFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR)
|
||||
returns("V")
|
||||
custom { _, classDef ->
|
||||
classDef.endsWith("/LithoFilterPatch;")
|
||||
}
|
||||
@@ -58,7 +50,7 @@ internal val lithoThreadExecutorFingerprint = fingerprint {
|
||||
parameters("I", "I", "I")
|
||||
custom { method, classDef ->
|
||||
classDef.superclass == "Ljava/util/concurrent/ThreadPoolExecutor;" &&
|
||||
method.containsLiteralInstruction(1L) // 1L = default thread timeout.
|
||||
method.containsLiteralInstruction(1L) // 1L = default thread timeout.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,13 +9,13 @@ import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.is_20_05_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||
import app.revanced.patches.youtube.shared.conversionContextFingerprintToString
|
||||
import app.revanced.util.addInstructionsAtControlFlowLabel
|
||||
import app.revanced.util.findFreeRegister
|
||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
|
||||
@@ -24,7 +24,6 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
lateinit var addLithoFilter: (String) -> Unit
|
||||
private set
|
||||
@@ -66,17 +65,11 @@ val lithoFilterPatch = bytecodePatch(
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* class ComponentContextParser {
|
||||
* public Component parseComponent() {
|
||||
* class CreateComponentClass {
|
||||
* public Component createComponent() {
|
||||
* ...
|
||||
*
|
||||
* // Checks if the component should be filtered.
|
||||
* // Sets a thread local with the filtering result.
|
||||
* extensionClass.filter(identifier, pathBuilder); // Inserted by this patch.
|
||||
*
|
||||
* ...
|
||||
*
|
||||
* if (extensionClass.shouldFilter()) { // Inserted by this patch.
|
||||
* if (extensionClass.shouldFilter(identifier, path)) { // Inserted by this patch.
|
||||
* return emptyComponent;
|
||||
* }
|
||||
* return originalUnpatchedComponent; // Original code.
|
||||
@@ -116,95 +109,68 @@ val lithoFilterPatch = bytecodePatch(
|
||||
// Allow the method to run to completion, and override the
|
||||
// return value with an empty component if it should be filtered.
|
||||
// It is important to allow the original code to always run to completion,
|
||||
// otherwise memory leaks and poor app performance can occur.
|
||||
//
|
||||
// The extension filtering result needs to be saved off somewhere, but cannot
|
||||
// save to a class field since the target class is called by multiple threads.
|
||||
// It would be great if there was a way to change the register count of the
|
||||
// method implementation and save the result to a high register to later use
|
||||
// in the method, but there is no simple way to do that.
|
||||
// Instead save the extension filter result to a thread local and check the
|
||||
// filtering result at each method return index.
|
||||
// String field for the litho identifier.
|
||||
componentContextParserFingerprint.method.apply {
|
||||
val conversionContextClass = conversionContextFingerprintToString.originalClassDef
|
||||
// otherwise high memory usage and poor app performance can occur.
|
||||
|
||||
val conversionContextIdentifierField = componentContextSubParserFingerprint.match(
|
||||
componentContextParserFingerprint.originalClassDef
|
||||
).let {
|
||||
// Identifier field is loaded just before the string declaration.
|
||||
val index = it.method.indexOfFirstInstructionReversedOrThrow(
|
||||
it.stringMatches!!.first().index
|
||||
) {
|
||||
val reference = getReference<FieldReference>()
|
||||
reference?.definingClass == conversionContextClass.type
|
||||
&& reference.type == "Ljava/lang/String;"
|
||||
}
|
||||
it.method.getInstruction<ReferenceInstruction>(index).getReference<FieldReference>()
|
||||
// Find the identifier/path fields of the conversion context.
|
||||
val conversionContextIdentifierField = componentContextParserFingerprint.let {
|
||||
// Identifier field is loaded just before the string declaration.
|
||||
val index = it.method.indexOfFirstInstructionReversedOrThrow(
|
||||
it.stringMatches!!.first().index
|
||||
) {
|
||||
val reference = getReference<FieldReference>()
|
||||
reference?.definingClass == conversionContextFingerprintToString.originalClassDef.type
|
||||
&& reference.type == "Ljava/lang/String;"
|
||||
}
|
||||
|
||||
// StringBuilder field for the litho path.
|
||||
val conversionContextPathBuilderField = conversionContextClass.fields
|
||||
.single { field -> field.type == "Ljava/lang/StringBuilder;" }
|
||||
it.method.getInstruction<ReferenceInstruction>(index).getReference<FieldReference>()!!
|
||||
}
|
||||
|
||||
val conversionContextResultIndex = indexOfFirstInstructionOrThrow {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.returnType == conversionContextClass.type
|
||||
} + 1
|
||||
val conversionContextPathBuilderField = conversionContextFingerprintToString.originalClassDef
|
||||
.fields.single { field -> field.type == "Ljava/lang/StringBuilder;" }
|
||||
|
||||
val conversionContextResultRegister = getInstruction<OneRegisterInstruction>(
|
||||
conversionContextResultIndex
|
||||
).registerA
|
||||
|
||||
val identifierRegister = findFreeRegister(
|
||||
conversionContextResultIndex, conversionContextResultRegister
|
||||
)
|
||||
val stringBuilderRegister = findFreeRegister(
|
||||
conversionContextResultIndex, conversionContextResultRegister, identifierRegister
|
||||
)
|
||||
|
||||
// Check if the component should be filtered, and save the result to a thread local.
|
||||
addInstructionsAtControlFlowLabel(
|
||||
conversionContextResultIndex + 1,
|
||||
"""
|
||||
iget-object v$identifierRegister, v$conversionContextResultRegister, $conversionContextIdentifierField
|
||||
iget-object v$stringBuilderRegister, v$conversionContextResultRegister, $conversionContextPathBuilderField
|
||||
invoke-static { v$identifierRegister, v$stringBuilderRegister }, $EXTENSION_CLASS_DESCRIPTOR->filter(Ljava/lang/String;Ljava/lang/StringBuilder;)V
|
||||
"""
|
||||
)
|
||||
|
||||
// Get the only static method in the class.
|
||||
val builderMethodDescriptor = emptyComponentFingerprint.classDef.methods.single {
|
||||
// Find class and methods to create an empty component.
|
||||
val builderMethodDescriptor = emptyComponentFingerprint.classDef.methods.single {
|
||||
// The only static method in the class.
|
||||
method -> AccessFlags.STATIC.isSet(method.accessFlags)
|
||||
}
|
||||
// Only one field.
|
||||
val emptyComponentField = classBy { classDef ->
|
||||
classDef.type == builderMethodDescriptor.returnType
|
||||
}!!.immutableClass.fields.single()
|
||||
}
|
||||
val emptyComponentField = classBy {
|
||||
// Only one field that matches.
|
||||
it.type == builderMethodDescriptor.returnType
|
||||
}!!.immutableClass.fields.single()
|
||||
|
||||
// Check at each return value if the component is filtered,
|
||||
// and return an empty component if filtering is needed.
|
||||
findInstructionIndicesReversedOrThrow(Opcode.RETURN_OBJECT).forEach { returnIndex ->
|
||||
val freeRegister = findFreeRegister(returnIndex)
|
||||
|
||||
addInstructionsAtControlFlowLabel(
|
||||
returnIndex,
|
||||
"""
|
||||
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->shouldFilter()Z
|
||||
move-result v$freeRegister
|
||||
if-eqz v$freeRegister, :unfiltered
|
||||
|
||||
move-object/from16 v$freeRegister, p1
|
||||
invoke-static { v$freeRegister }, $builderMethodDescriptor
|
||||
move-result-object v$freeRegister
|
||||
iget-object v$freeRegister, v$freeRegister, $emptyComponentField
|
||||
return-object v$freeRegister
|
||||
|
||||
:unfiltered
|
||||
nop
|
||||
"""
|
||||
)
|
||||
componentCreateFingerprint.method.apply {
|
||||
val insertIndex = if (is_19_17_or_greater) {
|
||||
indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT)
|
||||
} else {
|
||||
// 19.16 clobbers p2 so must check at start of the method and not at the return index.
|
||||
0
|
||||
}
|
||||
|
||||
val freeRegister = findFreeRegister(insertIndex)
|
||||
val identifierRegister = findFreeRegister(insertIndex, freeRegister)
|
||||
val pathRegister = findFreeRegister(insertIndex, freeRegister, identifierRegister)
|
||||
|
||||
addInstructionsAtControlFlowLabel(
|
||||
insertIndex,
|
||||
"""
|
||||
move-object/from16 v$freeRegister, p2
|
||||
iget-object v$identifierRegister, v$freeRegister, $conversionContextIdentifierField
|
||||
iget-object v$pathRegister, v$freeRegister, $conversionContextPathBuilderField
|
||||
invoke-static { v$identifierRegister, v$pathRegister }, $EXTENSION_CLASS_DESCRIPTOR->shouldFilter(Ljava/lang/String;Ljava/lang/StringBuilder;)Z
|
||||
move-result v$freeRegister
|
||||
if-eqz v$freeRegister, :unfiltered
|
||||
|
||||
# Return an empty component
|
||||
move-object/from16 v$freeRegister, p1
|
||||
invoke-static { v$freeRegister }, $builderMethodDescriptor
|
||||
move-result-object v$freeRegister
|
||||
iget-object v$freeRegister, v$freeRegister, $emptyComponentField
|
||||
return-object v$freeRegister
|
||||
|
||||
:unfiltered
|
||||
nop
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -285,10 +285,13 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_description_components_screen_title">وصف الفيديو</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">إخفاء أو عرض مكونات وصف الفيديو</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">شريط التصفية</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">إخفاء أو عرض شريط الفلتر في الموجز ونتائج البحث والفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">إخفاء أو إظهار شريط الفلترة في الخلاصات، السجل، نتائج البحث، والفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">إخفاء في الموجز</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">مخفي في الموجز</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">يُعرض في الموجز</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">معروض في الموجز</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">إخفاء في السجل</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">مخفي في السجل</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">معروض في السجل</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">إخفاء في نتائج البحث</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">مخفي في نتائج البحث</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">يُعرض في نتائج البحث</string>
|
||||
@@ -312,15 +315,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">إخفاء زر \'إنشاء Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">تم إخفاء زر إنشاء Short</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">يتم عرض زر إنشاء Short</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">زر إخفاء الطابع الزمني</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">زر الطابع الزمني مخفي</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">زر الطابع الزمني معروض</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">إخفاء تعليق المعاينة</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">تم إخفاء تعليق المعاينة</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">يتم عرض تعليق المعاينة</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">إخفاء زر شكرًا</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">تم إخفاء زر شكرًا</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">يتم عرض زر شكرًا</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">زر إخفاء الطابع الزمني</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">زر الطابع الزمني مخفي</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">زر الطابع الزمني معروض</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">إخفاء رسومات YouTube</string>
|
||||
<string name="revanced_hide_doodles_summary_on">تم إخفاء رسومات شريط البحث</string>
|
||||
@@ -374,32 +377,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">الكلمة المفتاحية سوف تخفي جميع الفيديوهات: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">إخفاء الإعلانات العامة</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">تم إخفاء الإعلانات بشكل عام</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">إخفاء إعلانات ملء الشاشة</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"يتم إخفاء إعلانات ملء الشاشة
|
||||
|
||||
هذه الميزة متاحة فقط للأجهزة القديمة"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">يتم عرض إعلانات ملء الشاشة</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">إخفاء إعلانات ملء الشاشة يعمل فقط مع الأجهزة القديمة</string>
|
||||
<string name="revanced_hide_general_ads_title">إخفاء الإعلانات العامة</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">تم إخفاء الإعلانات بشكل عام</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">يتم عرض الإعلانات العامة</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">إخفاء لافتات البضائع</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">تم إخفاء لافتات البضائع</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">يتم عرض لافتات البضائع</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">إخفاء تسمية الترقية المدفوعة</string>
|
||||
<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_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_products_banner_title">إخفاء لافتة \'عرض المنتجات\'</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">تم إخفاء البانر</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">إخفاء رف مشغل التسوق</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">تم إخفاء رف التسوق</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">يتم عرض رف التسوق</string>
|
||||
<string name="revanced_hide_shopping_links_title">إخفاء روابط التسوق في وصف الفيديو</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">تم إخفاء روابط التسوق في وصف الفيديو</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -407,11 +416,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_web_search_results_title">إخفاء نتائج بحث الويب</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">تم إخفاء نتائج البحث على الويب</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">يتم عرض نتائج البحث على الويب</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">إخفاء لافتات البضائع</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">تم إخفاء لافتات البضائع</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">يتم عرض لافتات البضائع</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">إخفاء إعلانات ملء الشاشة يعمل فقط مع الأجهزة القديمة</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">إخفاء ترقية YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Second \"item\" text"</string>
|
||||
<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>
|
||||
@@ -957,11 +961,25 @@ Second \"item\" text"</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_off">يتم عرض زر التخطي للمقطع بأكمله</string>
|
||||
<string name="revanced_sb_general_skiptoast">عرض ملاحظة عند التخطي</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">يتم عرض ملاحظة عندما يتم تخطي مقطع تلقائيًا. انقر هنا لمشاهدة مثال</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_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_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_duration_1s">ثانية واحدة</string>
|
||||
<string name="revanced_sb_duration_2s">ثانيتان</string>
|
||||
<string name="revanced_sb_duration_3s">3 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_4s">4 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_5s">5 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_6s">6 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_7s">7 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_8s">8 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_9s">9 ثوانٍ</string>
|
||||
<string name="revanced_sb_duration_10s">10 ثوانٍ</string>
|
||||
<string name="revanced_sb_general_time_without">عرض مدة الفيديو بدون المقاطع</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">يعرض مدة الفيديو ناقصًا منه جميع المقاطع بين قوسين بجوار مدة الفيديو الكاملة</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">يتم عرض طول الفيديو مطروحًا منه جميع المقاطع على شريط التقدم</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">يتم عرض مدة الفيديو كاملةً</string>
|
||||
<string name="revanced_sb_create_segment_category">إنشاء مقاطع جديدة</string>
|
||||
<string name="revanced_sb_enable_create_segment">عرض زر إنشاء مقطع جديد</string>
|
||||
@@ -1139,6 +1157,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_change_form_factor_entry_1">الافتراضي</string>
|
||||
<string name="revanced_change_form_factor_entry_2">الجوّال</string>
|
||||
<string name="revanced_change_form_factor_entry_3">الجهاز اللوحي</string>
|
||||
<string name="revanced_change_form_factor_entry_4">السيارات</string>
|
||||
<string name="revanced_change_form_factor_user_dialog_message">"التغييرات تشمل:
|
||||
|
||||
تصميم الجهاز اللوحي
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -285,10 +285,13 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Video təsviri</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Video təsviri elementlərini gizlət və ya göstər</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Filtr çubuğu</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Axında, axtarış nəticələrində və əlaqəli videolarda filtr cərgəsin gizlət və ya göstər</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Axında gizlət</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Axında gizlidir</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Axında göstərilir</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Axınlar, tarixçə, axtarış nəticələri və əlaqəli videolarda filtr panelini gizlət və ya göstər</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Axınlarda gizlət</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Axınlarda gizlidir</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Axınlarda göstər</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Tarixçədə gizlət</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Tarixçədə gizlədilib</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Tarixçədə göstərilib</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Axtarış nəticələrində gizlət</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Axtarış nəticələrində gizlədilib</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Axtarış nəticələrində göstərilir</string>
|
||||
@@ -312,15 +315,15 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">\"Shorts Yarat\" düyməsini gizlət</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Short yarat düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Short yarat düyməsi görünür</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Vaxt möhürü düyməsini gizlət</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Vaxt damğası düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Vaxt möhürü düyməsi göstərilir</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Önbaxış şərhin gizlət</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Önbaxış şərhi gizlədilib</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Önbaxış şərhi göstərilir</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Təşəkkür Düyməsini Gizlət</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Təşəkkür düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Təşəkkür düyməsi göstərilir</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Vaxt möhürü düyməsini gizlət</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Vaxt damğası düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Vaxt möhürü düyməsi göstərilir</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodle-ları gizlət</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Axtarış çubuğu Doodle-ları gizlidir</string>
|
||||
@@ -374,32 +377,38 @@ Məhdudiyyətlər
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Açar söz, bütün videoları gizlədəcək: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Ümumi reklamları gizlət</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Ümumi reklamlar gizlidir</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Ümumi reklamlar göstərilir</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Yaradıcı mağaza bölmələrin gizlət</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Oynadıcı altında və video təsvirində mağaza bölümün gizlidir</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Oynadıcı altında və video təsvirində mağaza bölümün görünür</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Son ekran mağaza etiketini gizlət</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Mağaza etiketi gizlidir</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Mağaza etiketi görünür</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Tam ekran reklamlarını gizlət</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Tam ekran reklamları gizlidir
|
||||
|
||||
Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Tam ekran reklamları göstərilir</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Tam ekran reklamları gizlətmə yalnız köhnə cihazlarda işləyir</string>
|
||||
<string name="revanced_hide_general_ads_title">Ümumi reklamları gizlət</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Ümumi reklamlar gizlidir</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Ümumi reklamlar göstərilir</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Məhsul etiketlərini gizlət</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Məhsul etiketləri gizlədilir</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Məhsul etiketləri göstərilir</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Ödənişli tanıtım etiketini gizlət</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Ödənişli reklam etiketi gizlədilib</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Ödənişli reklam etiketi göstərilir</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">“Məhsullara baxın” panelin gizlət</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Video örtüyündəki panel gizlədilib</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Video örtüyündəki panel görünür</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Öz-sponsorlu kartları gizlət</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Özünə sponsorluq edilən kartlar gizlidir</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Özünə sponsorluq edilən kartlar göstərilir</string>
|
||||
<string name="revanced_hide_products_banner_title">\"Məhsullara baxın\" etiketin gizlət</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Etiket gizlədilib</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Etiket göstərilir</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Son ekran mağaza etiketini gizlət</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Mağaza etiketi gizlidir</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Mağaza etiketi görünür</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Oynadıcı mağaza bölməsin gizlət</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Alış-veriş rəfi gizlidir</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Alış-veriş rəfi göstərilir</string>
|
||||
<string name="revanced_hide_shopping_links_title">Video təsvirdə mağaza linklərin gizlə</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Video təsvirində alış-veriş linkləri gizlədilib</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Video təsvirində alış-veriş linkləri görünür</string>
|
||||
<string name="revanced_hide_tagged_products_title">Etiketlənən məhsulları gizlət</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Video təsvirdəki etiketlənən məhsullar gizlidir</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Video təsvirdəki etiketlənən məhsullar görünür</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Kanalda \"Mağazaya baxın\" düyməsin gizlə</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Kanal səhifəsindəki düymə gizlidir</string>
|
||||
@@ -407,11 +416,6 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Veb axtarış nəticələrini gizlət</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Veb axtarış nəticələri gizlədilir</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Veb axtarış nəticələri göstərilir</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Məhsul etiketlərini gizlət</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Məhsul etiketləri gizlədilir</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Məhsul etiketləri göstərilir</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Tam ekran reklamları gizlətmə yalnız köhnə cihazlarda işləyir</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">YouTube Premium reklamlarını gizlət</string>
|
||||
@@ -823,7 +827,7 @@ Audio trek seçimin göstərmək üçün \"Video axınları saxtalaşdır\"ı iO
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Səs üst məlumat etiketini gizlət</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Üst məlumat etiketi gizlidir</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Üst məlumat etiketi göstərilir</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Tam video bağlantısı etiketini gizlət</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Video keçidi etiketini gizlət</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video linki etiketi gizlidir</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video link etiketi göstərilir</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Səs düyməsini gizlət</string>
|
||||
@@ -956,11 +960,25 @@ Bu funksiya 720p və ya daha aşağı video keyfiyyəti ilə və çox sürətli
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Ötürmə düyməsini avtomatik gizlət</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Ötürmə düyməsi bir neçə saniyə sonra gizlənir</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Ötürmə düyməsi bütün bölüm ərzində göstərilir</string>
|
||||
<string name="revanced_sb_general_skiptoast">Ötürüləndə ani bildiriş göstər</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Bölüm avto-ötürüləndə bildiriş göstərilir. Nümunə görmək üçün bura toxun</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Bildiriş göstərilmir. Nümunə görmək üçün bura toxun</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Ötür düyməsi müddəti</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Avtomatik gizlənən ötür və vurğulama düymələri nə qədər göstərilir</string>
|
||||
<string name="revanced_sb_general_skiptoast">Ötürməni geri al bildirişin göstər</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ani bildiriş bölüm birbaşa ötürüldükdə görünür. Ötürməni geri qaytarmaq üçün bildirişə toxun</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Ani bildiriş görünmür</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">Ötür ani bildiriş müddəti</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">Ötürmə ani bildirişi nə qədər göstərilir</string>
|
||||
<string name="revanced_sb_duration_1s">1 saniyə</string>
|
||||
<string name="revanced_sb_duration_2s">2 saniyə</string>
|
||||
<string name="revanced_sb_duration_3s">3 saniyə</string>
|
||||
<string name="revanced_sb_duration_4s">4 saniyə</string>
|
||||
<string name="revanced_sb_duration_5s">5 saniyə</string>
|
||||
<string name="revanced_sb_duration_6s">6 saniyə</string>
|
||||
<string name="revanced_sb_duration_7s">7 saniyə</string>
|
||||
<string name="revanced_sb_duration_8s">8 saniyə</string>
|
||||
<string name="revanced_sb_duration_9s">9 saniyə</string>
|
||||
<string name="revanced_sb_duration_10s">10 saniyə</string>
|
||||
<string name="revanced_sb_general_time_without">Bölümsüz video uzunluğun göstər</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Video uzunluğu bütün bölümləri silir, tam video uzunluğu yanaşı mötərizədə göstərilir</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Video uzunluğu bütün bölümləri çıxarır, irəliləyiş cizgisində göstərir</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Tam video uzunluğu göstərilir</string>
|
||||
<string name="revanced_sb_create_segment_category">Yeni bölümlər yaradılır</string>
|
||||
<string name="revanced_sb_enable_create_segment">Yeni Bölüm Yarat Düyməsini Göstər</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Апісанне відэа</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Схаваць або паказаць кампаненты апісання відэа</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Панэль фільтраў</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Схаваць ці паказаць панэль фільтраў у стужцы, выніках пошуку і звязаных відэа</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Схаваць у карме</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Схаваны ў стужцы</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Паказваецца ў стужцы</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Схаваць ці паказаць панэль фільтраў у стужках, гісторыі, выніках пошуку і звязаных відэа</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Схаваць у стужках</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Схавана ў стужках</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Паказана ў стужках</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Схаваць у гісторыі</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Схавана ў гісторыі</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Паказана ў гісторыі</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Схаваць у выніках пошуку</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Схавана ў выніках пошуку</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Паказана ў выніках пошуку</string>
|
||||
@@ -312,15 +315,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Схаваць кнопку \"Створиць Short\"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Кнопка «Стварыць Shorts» схаваная</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Кнопка «Стварыць Shorts» паказаная</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Схаваць кнопку часу</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Кнопка часу схаваная</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Кнопка часу паказаная</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Схаваць каментарый для папярэдняга прагляду</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Каментарый перад праглядам схаваны</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Паказваецца папярэдні прагляд каментарыя</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Схаваць кнопку \"Дзякуй\"\"</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Кнопка падзякі схавана</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Паказана кнопка падзякі</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Схаваць кнопку часу</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Кнопка часу схаваная</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Кнопка часу паказаная</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Схаваць YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Doodles у панэлі пошуку схаваны</string>
|
||||
@@ -374,32 +377,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Ключавое слова схавае ўсе відэа: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Схаваць агульную рэкламу</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Агульныя аб\"явы схаваныя</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Схаваць поўнаэкранную рэкламу</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Схаваны поўнаэкранныя рэкламныя ролікі
|
||||
|
||||
Гэтая функцыя даступная толькі для старых прылад"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Адлюстроўваецца поўнаэкранная рэклама</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Схаваць поўнаэкранную рэкламу працуе толькі са старымі прыладамі</string>
|
||||
<string name="revanced_hide_general_ads_title">Схаваць агульную рэкламу</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Агульныя аб\"явы схаваныя</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Паказваюцца агульныя аб\"явы</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Схаваць банеры з таварамі</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Таварныя банеры схаваныя</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Паказваюцца таварныя банеры</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Схаваць метку аплачанай акцыі</string>
|
||||
<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_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_products_banner_title">Схаваць банер «Паглядзець прадукты»</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Банэр схаваны</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">Схаваць полку крамы прайгравальніка</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Паліца крамы схавана</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Паліца крамы паказана</string>
|
||||
<string name="revanced_hide_shopping_links_title">Схаваць спасылкі на пакупкі ў апісанні відэа</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Спасылкі на пакупкі ў апісанні відэа схаваныя</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -407,11 +416,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Схаваць вынікі вэб-пошуку</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Вынікі вэб-пошуку схаваныя</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Паказваюцца вынікі вэб-пошуку</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Схаваць банеры з таварамі</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Таварныя банеры схаваныя</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Паказваюцца таварныя банеры</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Схаваць поўнаэкранную рэкламу працуе толькі са старымі прыладамі</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Схаваць акцыі YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Second \"item\" text"</string>
|
||||
<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>
|
||||
@@ -957,11 +961,25 @@ Second \"item\" text"</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_off">Кнопка «Прапусціць» паказана для ўсяго сегмента</string>
|
||||
<string name="revanced_sb_general_skiptoast">Паказваць toast пры пропуску</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Тост паказваецца, калі сегмент аўтаматычна прапускаецца. Націсніце тут, каб убачыць прыклад</string>
|
||||
<string name="revanced_sb_general_skiptoast_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_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_duration_1s">1 секунда</string>
|
||||
<string name="revanced_sb_duration_2s">2 секунды</string>
|
||||
<string name="revanced_sb_duration_3s">3 секунды</string>
|
||||
<string name="revanced_sb_duration_4s">4 секунды</string>
|
||||
<string name="revanced_sb_duration_5s">5 секунд</string>
|
||||
<string name="revanced_sb_duration_6s">6 секунд</string>
|
||||
<string name="revanced_sb_duration_7s">7 секунд</string>
|
||||
<string name="revanced_sb_duration_8s">8 секунд</string>
|
||||
<string name="revanced_sb_duration_9s">9 секунд</string>
|
||||
<string name="revanced_sb_duration_10s">10 секунд</string>
|
||||
<string name="revanced_sb_general_time_without">Паказаць працягласць відэа без сегментаў</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Працягласць відэа мінус усе сегменты, паказана ў дужках побач з поўнай працягласцю відэа</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Даўжыня відэа без усіх сегментаў паказваецца на шкале пракруткі</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Паказана поўная даўжыня відэа</string>
|
||||
<string name="revanced_sb_create_segment_category">Стварэнне новых сегментаў</string>
|
||||
<string name="revanced_sb_enable_create_segment">Паказваць кнопку «Стварыць новы сегмент»</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Описание на видеото</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Скриване или показване на компонентите за описание на видеоклиповете</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Лента с филтри</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Скриване или показване на лентата за филтриране в емисията, резултатите от търсенето и свързаните видеоклипове</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Скриване на горната лента с категории в емисията</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Скрита</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Показва се</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Скриване или показване на лентата с филтри в емисиите, историята, резултатите от търсенето и свързаните видеоклипове</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Скриване в емисии</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Скрити в емисии</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Показани в емисии</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Скриване в историята</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Скрити в историята</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Показани в историята</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Скриване в резултатите от търсенето</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Скрито в резултатите от търсенето</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Показано в резултатите от търсенето</string>
|
||||
@@ -312,15 +315,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Бутон за създаване на Shorts</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Бутонът \"Създаване на Short\" е скрит</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Бутонът \"Създаване на Short\" е показан</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Скриване на бутона за времеви печат</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Бутонът за времеви печат е скрит</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Бутонът за времеви печат е показан</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Преглед на коментари</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Прегледа на коментари е скрит</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Прегледа на коментари се показва</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Скрий бутона за харесване</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Бутона за благодарност е скрит</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Бутона за благодарност се показва</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Скриване на бутона за времеви печат</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Бутонът за времеви печат е скрит</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Бутонът за времеви печат е показан</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Doodles в лентата за търсене са скрити</string>
|
||||
@@ -374,32 +377,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Всички видеа с ключовата дума ще бъдат скрити: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Скриване на общите реклами</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Общите реклами са скрити</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Скриване на рекламите в режим на цял екран</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Всички реклами на цял екран са скрити
|
||||
|
||||
Тази функция е налична само за по-стари устройства"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Рекламите в режим на цял екран са показани</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Скр. на реклами на цял екран, за по-стари устройства</string>
|
||||
<string name="revanced_hide_general_ads_title">Скриване на общите реклами</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Общите реклами са скрити</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Общите реклами се показват</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Скриване на банерите за стоки</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Рекламните банери за стоки са скрити</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Банерите за стоки се показват</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Скриване на платените промоции</string>
|
||||
<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_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_products_banner_title">Скриване на банера \"Преглед на продукти\"</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Банерът е скрит</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">Скриване на рафта за пазаруване</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Рафта за пазаруване е скрит</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Рафта за пазаруване се показва</string>
|
||||
<string name="revanced_hide_shopping_links_title">Скриване на връзки за пазаруване</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Връзките за пазаруване в описанието на видеоклипа са скрити</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -407,11 +416,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Скриване на резултатите от уеб търсенето</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Резултатите от уеб търсенето са скрити</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Резултатите от уеб търсенето са показани.</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Скриване на банерите за стоки</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Рекламните банери за стоки са скрити</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Банерите за стоки се показват</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Скр. на реклами на цял екран, за по-стари устройства</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Скриване на YouTube Premium промоциите</string>
|
||||
@@ -823,7 +827,7 @@ Second \"item\" text"</string>
|
||||
<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>
|
||||
@@ -957,11 +961,25 @@ Second \"item\" text"</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_off">Бутонът \"Пропускане\" е показан за целия сегмент</string>
|
||||
<string name="revanced_sb_general_skiptoast">Показване на toast при пропускане</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Показване на известие при автоматично пропусната част. Докоснете тук за пример</string>
|
||||
<string name="revanced_sb_general_skiptoast_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_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_duration_1s">1 секунда</string>
|
||||
<string name="revanced_sb_duration_2s">2 секунди</string>
|
||||
<string name="revanced_sb_duration_3s">3 секунди</string>
|
||||
<string name="revanced_sb_duration_4s">4 секунди</string>
|
||||
<string name="revanced_sb_duration_5s">5 секунди</string>
|
||||
<string name="revanced_sb_duration_6s">6 секунди</string>
|
||||
<string name="revanced_sb_duration_7s">7 секунди</string>
|
||||
<string name="revanced_sb_duration_8s">8 секунди</string>
|
||||
<string name="revanced_sb_duration_9s">9 секунди</string>
|
||||
<string name="revanced_sb_duration_10s">10 секунди</string>
|
||||
<string name="revanced_sb_general_time_without">Показване на дължината на видеото без сигментите</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Дължината на видеото без всички части показана в скоби до цялата дължина</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Дължината на видеото без всички сегменти се показва на лентата за напредък</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Цялата дължина на видето се показва</string>
|
||||
<string name="revanced_sb_create_segment_category">Създаване на нови части</string>
|
||||
<string name="revanced_sb_enable_create_segment">Показване на бутон \"Създаване на нов сегмент\"</string>
|
||||
|
||||
@@ -281,10 +281,13 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_description_components_screen_title">ভিডিওর বিবরণ</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">ভিডিও বিবরণ এর উপাদান লুকান বা প্রদর্শন করুন</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">ফিল্টার বার</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">ফিড, অনুসন্ধানের ফলাফল এবং সম্পর্কিত ভিডিওগুলোতে ফিল্টার বার লুকান অথবা দেখান</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">ফিড, ইতিহাস, অনুসন্ধান ফলাফল এবং সম্পর্কিত ভিডিওগুলিতে ফিল্টার বার লুকান বা দেখান</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">ফিডে লুকান</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">ফিডে লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">ফিডে প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">ফিডে লুকানো</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">ফিডে দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">ইতিহাসে লুকান</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">ইতিহাসে লুকানো</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">ইতিহাসে দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">অনুসন্ধান ফলাফলে লুকান</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">অনুসন্ধান ফলাফলে লুকানো আছে</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">অনুসন্ধান ফলাফলে দেখানো হয়েছে</string>
|
||||
@@ -308,15 +311,15 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">\'Short তৈরি করুন\' বোতাম লুকান</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">একটি Shorts বোতাম তৈরি করুন লুকানো আছে</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">একটি Shorts বোতাম তৈরি করুন দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">সময় চিহ্নিত করার বোতাম লুকান</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">সময় চিহ্নিত করার বোতাম লুকানো আছে</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">সময় চিহ্নিত করার বোতাম দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">মন্তব্যের পূর্বরূপ লুকান</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">মন্তব্যের পূর্বরূপ লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">মন্তব্যের পূর্বরূপ প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">ধন্যবাদ বাটন লুকান</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">ধন্যবাদ বোতাম লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">ধন্যবাদ বোতাম প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">সময় চিহ্নিত করার বোতাম লুকান</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">সময় চিহ্নিত করার বোতাম লুকানো আছে</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">সময় চিহ্নিত করার বোতাম দেখানো হয়েছে</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodles छिपाएँ</string>
|
||||
<string name="revanced_hide_doodles_summary_on">सर्च बार Doodles छिपे हुए हैं</string>
|
||||
@@ -370,32 +373,38 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">কিওয়ার্ড সমস্ত ভিডিও লুকিয়ে রাখবে: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">সাধারণ বিজ্ঞাপন লুকান</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">সাধারণ বিজ্ঞাপন লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">পূর্ণ স্ক্রীন প্যানেল লুকান</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"পূর্ণ পর্দার বিজ্ঞাপন লুকানো হয়
|
||||
|
||||
এই বৈশিষ্ট্যটি কেবল পুরনো ডিভাইসের জন্য উপলব্ধ"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">পূর্ণ স্ক্রীন বিজ্ঞাপন প্রদর্শিত হয়েছে</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">পূর্ণস্ক্রীন বিজ্ঞাপন লুকানো পুরোনো ডিভাইসে কাজ করে</string>
|
||||
<string name="revanced_hide_general_ads_title">সাধারণ বিজ্ঞাপন লুকান</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">সাধারণ বিজ্ঞাপন লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">সাধারণ বিজ্ঞাপন প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">পণ্যদ্রব্য ব্যানার লুকান</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">পণ্যদ্রব্যের ব্যানার লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">পণ্যদ্রব্যের ব্যানার প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকান</string>
|
||||
<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_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_products_banner_title">\'পণ্য দেখুন\' ব্যানার লুকান</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">ব্যানার লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">প্লেয়ার শপিং শেলফ লুকান</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">শপিং শেলফ লুকানো আছে</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">শপিং শেলফ দেখানো হচ্ছে</string>
|
||||
<string name="revanced_hide_shopping_links_title">ভিডিওর বিবরণে কেনাকাটার লিঙ্ক লুকান</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">ভিডিও বিবরণে শপিং লিঙ্ক লুকানো আছে</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -403,11 +412,6 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_web_search_results_title">লোকেরা এইগুলিও সার্চ করছে লুকান</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">লোকেরা এইগুলিও সার্চ করছে লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">লোকেরা এইগুলিও সার্চ করছে প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">পণ্যদ্রব্য ব্যানার লুকান</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">পণ্যদ্রব্যের ব্যানার লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">পণ্যদ্রব্যের ব্যানার প্রদর্শিত হয়েছে</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">পূর্ণস্ক্রীন বিজ্ঞাপন লুকানো পুরোনো ডিভাইসে কাজ করে</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">YouTube প্রিমিয়াম প্রচারণা লুকান</string>
|
||||
@@ -819,7 +823,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<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>
|
||||
@@ -953,11 +957,25 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Skip বোতামটি স্বয়ংক্রিয়ভাবে লুকান</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">পুরো অংশের জন্য Skip বোতাম দেখানো হয়েছে</string>
|
||||
<string name="revanced_sb_general_skiptoast">বাদ দেওয়ার সময় একটি toast দেখান</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">সেগমেন্ট স্বয়ংক্রিয়ভাবে এড়িয়ে যেতে একটি টোস্ট দেখানো হয়। উদাহরণ দেখতে এখানে ট্যাপ করুন</string>
|
||||
<string name="revanced_sb_general_skiptoast_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_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_duration_1s">১ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_2s">২ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_3s">৩ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_4s">৪ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_5s">৫ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_6s">৬ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_7s">৭ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_8s">৮ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_9s">৯ সেকেন্ড</string>
|
||||
<string name="revanced_sb_duration_10s">১০ সেকেন্ড</string>
|
||||
<string name="revanced_sb_general_time_without">সেগমেন্ট ছাড়া ভিডিওর দৈর্ঘ্য দেখান</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">সমস্ত সেগমেন্ট ছাড়াই ভিডিওর দৈর্ঘ্য, পূর্ণ ভিডিওর দৈর্ঘ্যের পাশে বন্ধনীতে উল্লেখ করা হয়</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">ভিডিওর দৈর্ঘ্য থেকে সব অংশ বাদ দিয়ে সিকারবারে দেখানো হবে</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">সম্পূর্ণ ভিডিও দৈর্ঘ্য প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_sb_create_segment_category">নতুন সেগমন্ট তৈরি হচ্ছে</string>
|
||||
<string name="revanced_sb_enable_create_segment">নতুন বিভাগ তৈরি করুন বোতামটি দেখান</string>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -285,10 +285,13 @@ Nebudete informováni o žádné neočekávané události."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Popis videa</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Skrýt nebo zobrazit komponenty popisu videa</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Lišta filtrů</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Skrýt nebo zobrazit lištu filtrů v kanálu, výsledcích hledání a souvisejících videích</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Skrýt ve feedu</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Ve feedu skryto</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Ve feedu zobrazeno</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Skrýt nebo zobrazit panel filtru v kanálech, historii, výsledcích vyhledávání a souvisejících videích</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Skrýt v kanálech</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Skryto v kanálech</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Zobrazeno v kanálech</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Skrýt v historii</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Skryto v historii</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Zobrazeno v historii</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Skrýt ve výsledcích vyhledávání</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Skryto ve výsledcích vyhledávání</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Zobrazeno ve výsledcích vyhledávání</string>
|
||||
@@ -312,15 +315,15 @@ Nebudete informováni o žádné neočekávané události."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Skrýt tlačítko \"Vytvořit Short\"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Tlačítko Vytvořit Short je skryté</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Tlačítko Vytvořit Short je zobrazeno</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Skrýt tlačítko časové osy</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tlačítko časové osy je skryté</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Tlačítko časové osy je zobrazeno</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Skrýt náhled komentáře</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Náhled komentáře je skryt</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Náhled komentáře je zobrazen</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Skrýt tlačítko děk」、「</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Tlačítko poděkování je skryto</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Tlačítko poděkování je zobrazeno</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Skrýt tlačítko časové osy</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tlačítko časové osy je skryté</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Tlačítko časové osy je zobrazeno</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Skrýt YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Doodles na liště vyhledávání jsou skryty</string>
|
||||
@@ -374,32 +377,38 @@ Omezení:
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Klíčové slovo skryje všechna videa: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Skrýt běžné reklamy</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Běžné reklamy jsou skryty</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Běžné reklamy jsou zobrazeny</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Skrýt regály obchodu tvůrce</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Regály obchodu pod přehrávačem a v popisu videa jsou skryty</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Police obchodu pod přehrávačem a v popisu videa jsou zobrazeny</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Skrýt koncový banner obchodu</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Banner obchodu je skrytý</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Banner obchodu je zobrazen</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Skrýt celostránkové reklamy</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Celoobrazovkové reklamy jsou skryty
|
||||
|
||||
Tato funkce je dostupná pouze pro starší zařízení"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Celostránkové reklamy jsou zobrazeny</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Blokování reklam na celou obrazovku je funkční pouze na starších zařízeních</string>
|
||||
<string name="revanced_hide_general_ads_title">Skrýt běžné reklamy</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Běžné reklamy jsou skryty</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Běžné reklamy jsou zobrazeny</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Skrýt reklamní bannery</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise bannery jsou skryty</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Merchandise bannery jsou zobrazeny</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Skrýt štítek placené propagace</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Štítek placené propagace je skryt</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Štítek placené propagace je zobrazen</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Skrýt banner „Zobrazit produkty“</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Banner v překryvu videa je skryt</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Banner v překrytí videa je zobrazen</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Skrýt karty se sponzorovanými produkty</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Karty se sponzorovanými produkty jsou skryty</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Karty se sponzorovanými produkty jsou zobrazeny</string>
|
||||
<string name="revanced_hide_products_banner_title">Skrýt banner „Zobrazit produkty“</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Banner je skryt</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Banner je zobrazen</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Skrýt koncový banner obchodu</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Banner obchodu je skrytý</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Banner obchodu je zobrazen</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Skrýt nákupní polici přehrávače</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Nákupní police je skryta</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Nákupní police je zobrazena</string>
|
||||
<string name="revanced_hide_shopping_links_title">Skrýt odkazy na nakupování v popisu videa</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Nákupní odkazy v popisu videa jsou skryty</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Nákupní odkazy v popisu videa jsou zobrazeny</string>
|
||||
<string name="revanced_hide_tagged_products_title">Skrýt označené produkty</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Označené produkty v popisu videa jsou skryty</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Označení produktů v popisu videa jsou zobrazeny</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Skrýt tlačítko \'Navštívit obchod\' na stránkách kanálů</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Tlačítko na stránce kanálu je skryto</string>
|
||||
@@ -407,11 +416,6 @@ Tato funkce je dostupná pouze pro starší zařízení"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Skryté webové výsledky vyhledávání</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Webové výsledky vyhledávání jsou skryté</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Webové výsledky vyhledávání jsou zobrazeny</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Skrýt reklamní bannery</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise bannery jsou skryty</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Merchandise bannery jsou zobrazeny</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Blokování reklam na celou obrazovku je funkční pouze na starších zařízeních</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Skrýt nabídky YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Chcete-li zobrazit nabídku zvukové stopy, změňte možnost „Zfalšovat stre
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Skrýt štítek zvukového metadata</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Štítek metadata je skrytý</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Štítek metadata je zobrazen</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Skrýt štítek odkazu na celé video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Skrýt popisek odkazu na video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Štítek odkazu na video je skrytý</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Štítek odkazu na video je zobrazen</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Skrýt tlačítko zvuku</string>
|
||||
@@ -958,11 +962,25 @@ 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">Automaticky skrýt tlačítko Přeskočit</string>
|
||||
<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_general_skiptoast">Zobrazit toast při přeskakování</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">\"Toast\" se zobrazí, když se segment automaticky přeskočí. Klepněte zde, abyste se podívali na příklad</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">\"Toast\" se nezobrazí. Klepněte zde, abyste se podívali na příklad</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 sekundy</string>
|
||||
<string name="revanced_sb_duration_5s">5 sekund</string>
|
||||
<string name="revanced_sb_duration_6s">6 sekund</string>
|
||||
<string name="revanced_sb_duration_7s">7 sekund</string>
|
||||
<string name="revanced_sb_duration_8s">8 sekund</string>
|
||||
<string name="revanced_sb_duration_9s">9 sekund</string>
|
||||
<string name="revanced_sb_duration_10s">10 sekund</string>
|
||||
<string name="revanced_sb_general_time_without">Zobrazit délku videa bez segmentů</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Délka videa minus všechny segmenty, zobrazená v závorkách vedle úplné délky videa</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Na posuvníku je zobrazena délka videa minus všechny segmenty</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Zobrazena úplná délka videa</string>
|
||||
<string name="revanced_sb_create_segment_category">Vytváření nových segmentů</string>
|
||||
<string name="revanced_sb_enable_create_segment">Zobrazit tlačítko Vytvořit nový segment</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Du modtager ikke notifikationer om uventede hændelser."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Video beskrivelse</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Skjul eller vis komponenter til videobeskrivelse</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Filtrer bjælke</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Skjul eller vis filterlinjen i feedet, søgeresultaterne og relaterede videoer</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Skjul i feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Skjult i feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Vist i feed</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Skjul eller vis filterlinjen i feeds, historik, søgeresultater og relaterede videoer</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Skjul i feeds</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Skjult i feeds</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Vist i feeds</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Skjul i historik</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Skjult i historik</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Vist i historik</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Skjul i søgeresultater</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Skjult i søgeresultater</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Vises i søgeresultater</string>
|
||||
@@ -312,15 +315,15 @@ Du modtager ikke notifikationer om uventede hændelser."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Skjul knappen \"Opret en Short\"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Opret en Short knap er skjult</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Opret en Short knap vises</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Skjul tidsstempelknap</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tidsstempelknappen er skjult</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Tidsstempelknappen vises</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Skjul forhåndsvisning kommentar</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Forhåndsvisning kommentar er skjult</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Forhåndsvis kommentar er vist</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Skjul \"Tak\"-knap</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Tak knappen er skjult</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Tak knappen er vist</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Skjul tidsstempelknap</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tidsstempelknappen er skjult</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Tidsstempelknappen vises</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Skjul YouTube-Doudler</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Søgebjælke Doudler er skjult</string>
|
||||
@@ -374,32 +377,38 @@ Begrænsninger
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Nøgleord vil skjule alle videoer: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Skjul generelle annoncer</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Generelle annoncer er skjult</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Generelle annoncer vises</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Skjul skaberens butikshylder</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Butikshylder under afspilleren og i videobeskrivelsen er skjult</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Butikshylder under afspilleren og i videobeskrivelsen vises</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Skjul banner fra butikken på slutskærmen</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Gem banner skjult</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Gem banner vises</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Skjul fuldskærmsannoncer</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Fuldsskærmsannoncer er skjult
|
||||
|
||||
Denne funktion er kun tilgængelig for ældre enheder"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Fuldskærms annoncer vises</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Skjul reklamer på fuld skærm virker kun med ældre enheder</string>
|
||||
<string name="revanced_hide_general_ads_title">Skjul generelle annoncer</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Generelle annoncer er skjult</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Generelle annoncer vises</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Skjul merchandise bannere</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Varer bannere er skjult</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Varer bannere er vist</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Skjul betalt kampagneetiket</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Betalt reklamemærke er skjult</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Betalt salgsfremmende mærke er vist</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Skjul banneret \"Se produkter\"</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Banner i video-overlay er skjult</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Banner i video-overlay vises</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Skjul selvsponsorerede kort</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Selvsponsorerede kort er skjult</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Selvsponsorerede kort vises</string>
|
||||
<string name="revanced_hide_products_banner_title">Skjul banneret \"Se produkter\"</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Banner er skjult</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Banner er vist</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Skjul banner fra butikken på slutskærmen</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Gem banner skjult</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Gem banner vises</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Skjul spillerens indkøbshylde</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Shopping hylde er skjult</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Shopping hylde er vist</string>
|
||||
<string name="revanced_hide_shopping_links_title">Skjul shopping links i video beskrivelse</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Shopping links i videobeskrivelsen er skjult</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Shopping links i videobeskrivelsen vises</string>
|
||||
<string name="revanced_hide_tagged_products_title">Skjul taggede produkter</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Taggede produkter i videobeskrivelsen er skjult</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Taggere produkter i videobeskrivelsen vises</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Skjul knappen \'Besøg butik\' på kanalsider</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Knap på kanalsiden er skjult</string>
|
||||
@@ -407,11 +416,6 @@ Denne funktion er kun tilgængelig for ældre enheder"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Skjul søgeresultater</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Websøgeresultater er skjult</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Websøgeresultater vises</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Skjul merchandise bannere</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Varer bannere er skjult</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Varer bannere er vist</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Skjul reklamer på fuld skærm virker kun med ældre enheder</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Skjul YouTube Premium kampagner</string>
|
||||
@@ -823,7 +827,7 @@ For at vise lydspormenuen skal du ændre \"Spoof videostream\" til iOS TV"</stri
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Skjul lyd metadata etiket</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Metadata etiket er skjult</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Metadata etiket er vist</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Skjul fuld video link etiket</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Skjul videolinketiket</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Videolink etiket er skjult</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Videolink etiket er vist</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Skjul lydknap</string>
|
||||
@@ -959,11 +963,25 @@ Denne funktion fungerer bedst med en videokvalitet på 720p eller lavere og ved
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Skjul automatisk Spring over-knap</string>
|
||||
<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_general_skiptoast">Vis en toast ved spring</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Toast vises, når et segment automatisk springes over. Tryk her for at se et eksempel</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast er ikke vist. Tryk her for at se et eksempel</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 sekunder</string>
|
||||
<string name="revanced_sb_duration_5s">5 sekunder</string>
|
||||
<string name="revanced_sb_duration_6s">6 sekunder</string>
|
||||
<string name="revanced_sb_duration_7s">7 sekunder</string>
|
||||
<string name="revanced_sb_duration_8s">8 sekunder</string>
|
||||
<string name="revanced_sb_duration_9s">9 sekunder</string>
|
||||
<string name="revanced_sb_duration_10s">10 sekunder</string>
|
||||
<string name="revanced_sb_general_time_without">Vis videolængde uden segmenter</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Videolængde minus alle segmenter, vist i parentes ved siden af den fulde videolængde</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Videolængde minus alle segmenter vises på tidslinjen</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Fuld videolængde vist</string>
|
||||
<string name="revanced_sb_create_segment_category">Opretter nye segmenter</string>
|
||||
<string name="revanced_sb_enable_create_segment">Vis Opret nyt segment-knap</string>
|
||||
|
||||
@@ -124,7 +124,7 @@ Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Ad
|
||||
<string name="revanced_debug_stacktrace_summary_off">Debug-Logs enthalten keine Stack-Traces</string>
|
||||
<string name="revanced_debug_toast_on_error_title">Toast bei ReVanced Fehler anzeigen</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_on">Ein Toast wird angezeigt, wenn ein Fehler auftritt</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Kein Toast wird angezeigt, wenn ein Fehler auftritt</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Es wird keine Toast-Nachricht angezeigt, wenn ein Fehler Auftritt</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">"Das Ausschalten von Fehler-Toasts blendet alle Benachrichtigungen über Fehler in ReVanced aus.
|
||||
|
||||
Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
@@ -165,9 +165,9 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_on">Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_off">Button wird angezeigt</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_for_you_shelf_title">Regal \"Für dich\" ausblenden</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_on">Regal auf der Kanalseite ist ausgeblendet</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_off">Regal auf der Kanalseite wird angezeigt</string>
|
||||
<string name="revanced_hide_for_you_shelf_title">\"Für dich\" Bereich ausblenden</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_on">Bereich auf der Kanalseite ist ausgeblendet</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_off">Bereich auf der Kanalseite wird angezeigt</string>
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<string name="revanced_hide_notify_me_button_title">\'Benachrichtigungen\' Button ausblenden</string>
|
||||
@@ -281,10 +281,13 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Videobeschreibung</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Komponenten der Videobeschreibung ausblenden oder anzeigen</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Filterleiste</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Die Filterleiste im Feed, in den Suchergebnissen und in verwandten Videos ein- oder ausblenden</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Im Feed ausblenden</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Versteckt im Feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Im Feed angezeigt</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Filterleiste in den Feeds, im Verlauf, in den Suchergebnissen und in ähnlichen Videos ein- oder ausblenden</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">In Feeds ausblenden</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">In Feeds ausgeblendet</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">In Feeds angezeigt</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Im Verlauf ausblenden</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Im Verlauf ausgeblendet</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Im Verlauf angezeigt</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">In Suchergebnissen ausblenden</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">In Suchergebnissen versteckt</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">In den Suchergebnissen angezeigt</string>
|
||||
@@ -308,15 +311,15 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">\'Verknüpfung erstellen\'-Button ausblenden</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Schaltfläche \" Short erstellen\" ist ausgeblendet</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Schaltfläche \" Short erstellen\" wird angezeigt</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Timestamp-Button ausblenden</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Timestamp-Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Timestamp-Button wird angezeigt</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Vorschaukommentar ausblenden</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Vorschaukommentar ist ausgeblendet</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Vorschau des Kommentars wird angezeigt</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Schließe die Dankeschön-Schaltfläche aus</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Dankeschön-Taste ist ausgeblendet</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Dankeschön Button wird angezeigt</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Timestamp-Button ausblenden</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Timestamp-Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Timestamp-Button wird angezeigt</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodles ausblenden</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Suchleiste Doodles sind versteckt</string>
|
||||
@@ -369,32 +372,38 @@ Einschränkungen
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Stichwort wird alle Videos ausblenden: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Allgemeine Werbung ausblenden</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Allgemeine Anzeigen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Allgemeine Anzeigen werden angezeigt</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Creator-Shop-Regale ausblenden</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Shop-Regale unter dem Player und in der Videobeschreibung sind ausgeblendet</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Store-Regale unter dem Player und in der Videobeschreibung werden angezeigt</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Endbild-Banner ausblenden</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Store-Banner wird ausgeblendet</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Store-Banner wird angezeigt</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Vollbild-Werbung ausblenden</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Vollbildwerbung wird ausgeblendet
|
||||
|
||||
Diese Funktion ist nur für ältere Geräte verfügbar"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Vollbild-Anzeigen werden angezeigt</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Vollbild-Werbung ausblenden funktioniert nur mit älteren Geräten</string>
|
||||
<string name="revanced_hide_general_ads_title">Allgemeine Werbung ausblenden</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Allgemeine Anzeigen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Allgemeine Anzeigen werden angezeigt</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Merchandise-Banner ausblenden</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise-Banner sind ausgeblendet</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Warenbanner werden angezeigt</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Bezahltes Werbe-Label ausblenden</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Bezahltes Werbelabel ist ausgeblendet</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Bezahltes Werbe-Label wird angezeigt</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">„Produkte ansehen“-Banner ausblenden</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Banner im Video-Overlay ist ausgeblendet</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Banner im Video-Overlay wird angezeigt</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Selbst gesponserte Karten ausblenden</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Selbst gesponserte Karten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Selbstgesponserte Karten werden angezeigt</string>
|
||||
<string name="revanced_hide_products_banner_title">Banner \"Produkte ansehen\" ausblenden</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Banner ist ausgeblendet</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Banner wird angezeigt</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Endbild-Banner ausblenden</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Store-Banner wird ausgeblendet</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Store-Banner wird angezeigt</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Spieler-Einkaufsregal ausblenden</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Einkaufsregal ist ausgeblendet</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Einkaufsregal wird angezeigt</string>
|
||||
<string name="revanced_hide_shopping_links_title">Einkaufslinks in der Videobeschreibung ausblenden</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Shopping-Links in der Videobeschreibung sind ausgeblendet</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Shopping-Links in der Videobeschreibung werden angezeigt</string>
|
||||
<string name="revanced_hide_tagged_products_title">Markierte Produkte ausblenden</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Markierte Produkte in der Videobeschreibung sind ausgeblendet</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Getaggte Produkte in der Videobeschreibung werden angezeigt</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Den \'Store besuchen\'-Button auf Kanalseiten ausblenden</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Button auf der Kanalseite ist ausgeblendet</string>
|
||||
@@ -402,11 +411,6 @@ Diese Funktion ist nur für ältere Geräte verfügbar"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Suchergebnisse ausblenden</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Web-Suchergebnisse sind ausgeblendet</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Web-Suchergebnisse werden angezeigt</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Merchandise-Banner ausblenden</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise-Banner sind ausgeblendet</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Warenbanner werden angezeigt</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Vollbild-Werbung ausblenden funktioniert nur mit älteren Geräten</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">YouTube Premium-Aktionen ausblenden</string>
|
||||
@@ -816,7 +820,7 @@ Um das Audiotrack-Menü anzuzeigen, ändere \"Video-Streams fälschen\" zu iOS T
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Sound-Metadaten-Label ausblenden</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Metadatenlabel ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Metadaten-Label wird angezeigt</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Verstecke vollständige Video-Linkbezeichnung</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Video-Link-Label ausblenden</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video-Link-Label ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video-Link-Label wird angezeigt</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Tonschaltfläche ausblenden</string>
|
||||
@@ -950,11 +954,25 @@ Diese Funktion funktioniert am besten mit einer Videoqualität von 720p oder nie
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Überspringen-Button automatisch ausblenden</string>
|
||||
<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_general_skiptoast">Einen toast beim Überspringen anzeigen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Toast wird angezeigt, wenn ein Segment automatisch übersprungen wird. Tippe hier, um ein Beispiel zu sehen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast wird nicht angezeigt. Tippe hier, um ein Beispiel zu sehen</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 Sekunden</string>
|
||||
<string name="revanced_sb_duration_5s">5 Sekunden</string>
|
||||
<string name="revanced_sb_duration_6s">6 Sekunden</string>
|
||||
<string name="revanced_sb_duration_7s">7 Sekunden</string>
|
||||
<string name="revanced_sb_duration_8s">8 Sekunden</string>
|
||||
<string name="revanced_sb_duration_9s">9 Sekunden</string>
|
||||
<string name="revanced_sb_duration_10s">10 Sekunden</string>
|
||||
<string name="revanced_sb_general_time_without">Videolänge ohne Segmente anzeigen</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Videolänge abzüglich aller Segmente in Klammern neben der vollständigen Videolänge</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Videolänge abzüglich aller Segmente wird in der Suchleiste angezeigt</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Vollständige Videolänge angezeigt</string>
|
||||
<string name="revanced_sb_create_segment_category">Neue Segmente erstellen</string>
|
||||
<string name="revanced_sb_enable_create_segment">Schaltfläche \"Neues Segment erstellen\" anzeigen</string>
|
||||
|
||||
@@ -287,10 +287,13 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Περιγραφή βίντεο</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Απόκρυψη ή εμφάνιση στοιχείων περιγραφής βίντεο</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Γραμμή φίλτρων</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Απόκρυψη ή εμφάνιση της γραμμής φίλτρων στην ροή, στα αποτελέσματα αναζήτησης και στα σχετικά βίντεο</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Απόκρυψη στη ροή</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Απόκρυψη ή εμφάνιση της γραμμής φίλτρων στις ροές, στο ιστορικό, στα αποτελέσματα αναζήτησης και στα σχετικά βίντεο</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Απόκρυψη στις ροές</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Απόκρυψη στο ιστορικό</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Απόκρυψη στα αποτελέσματα αναζήτησης</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Εμφανίζεται</string>
|
||||
@@ -314,15 +317,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Κουμπί «Δημιουργία Short»</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Κουμπί χρονοσήμανσης</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Προεπισκόπηση σχολίου</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Κουμπί «Σας ευχαριστούμε»</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Κουμπί χρονοσήμανσης</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Εμφανίζεται</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Κρυμμένα</string>
|
||||
@@ -376,32 +379,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Θα κρυφτούν όλα τα βίντεο με την λέξη-κλειδί: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Γενικές διαφημίσεις</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Ενότητες καταστήματος δημιουργών</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Κρυμμένες\n\nΑφορά τις ενότητες καταστήματος κάτω από το πρόγραμμα αναπαραγωγής και στην περιγραφή βίντεο</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Εμφανίζονται\n\nΑφορά τις ενότητες καταστήματος κάτω από το πρόγραμμα αναπαραγωγής και στην περιγραφή βίντεο</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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Διαφημίσεις πλήρους οθόνης</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Κρυμμένες
|
||||
|
||||
Αυτή η λειτουργία είναι διαθέσιμη μόνο για παλιότερες συσκευές"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Οι διαφημίσεις πλήρους οθόνης εμφανίζονται</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Η απόκρυψη διαφημίσεων πλήρους οθόνης λειτουργεί μόνο με παλαιότερες συσκευές</string>
|
||||
<string name="revanced_hide_general_ads_title">Γενικές διαφημίσεις</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Εμβλήματα εμπορευμάτων</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Ετικέτες προώθησης επί πληρωμή</string>
|
||||
<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_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_products_banner_title">Ετικέτα «Προβολή προϊόντων»</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">Ενότητα αγορών οθόνης αναπαραγωγής</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_shopping_links_title">Σύνδεσμοι αγορών</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Κρυμμένοι</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -409,11 +418,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Αποτελέσματα αναζήτησης στο διαδίκτυο</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Εμβλήματα εμπορευμάτων</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Εμφανίζονται</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Η απόκρυψη διαφημίσεων πλήρους οθόνης λειτουργεί μόνο με παλαιότερες συσκευές</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Προωθήσεις για απόκτηση YouTube Premium</string>
|
||||
@@ -825,7 +829,7 @@ Second \"item\" text"</string>
|
||||
<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>
|
||||
@@ -959,11 +963,25 @@ Second \"item\" text"</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_off">Το κουμπί παράλειψης εμφανίζεται σε όλο το τμήμα</string>
|
||||
<string name="revanced_sb_general_skiptoast">Εμφάνιση μηνύματος κατά την παράλειψη</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε για να δείτε ένα παράδειγμα</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_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_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_duration_1s">1 δευτερόλεπτο</string>
|
||||
<string name="revanced_sb_duration_2s">2 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_3s">3 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_4s">4 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_5s">5 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_6s">6 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_7s">7 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_8s">8 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_9s">9 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_duration_10s">10 δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_general_time_without">Εμφάνιση μήκους βίντεο χωρίς τα τμήματα</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Εμφανίζεται το μήκος βίντεο μείον όλα τα τμήματα, σε παρένθεση δίπλα στο πλήρες μήκος βίντεο</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Το μήκος του βίντεο χωρίς όλα τα τμήματα εμφανίζεται πάνω στη γραμμή προόδου</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Εμφανίζεται το πλήρες μήκος του βίντεο</string>
|
||||
<string name="revanced_sb_create_segment_category">Δημιουργία νέων τμημάτων</string>
|
||||
<string name="revanced_sb_enable_create_segment">Εμφάνιση κουμπιού δημιουργίας νέου τμήματος</string>
|
||||
|
||||
@@ -282,10 +282,13 @@ Sin embargo, si activas esto, también se registrarán algunos datos del usuario
|
||||
<string name="revanced_hide_description_components_screen_title">Descripción del vídeo</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Ocultar o mostrar componentes de descripción de vídeo</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Barra de filtros</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Ocultar o mostrar la barra de filtro en el feed, los resultados de búsqueda y los videos relacionados</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Ocultar en el feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Escondido en el feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Mostrar en el feed</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Ocultar o mostrar la barra de filtros en las fuentes, historial, resultados de búsqueda y vídeos relacionados</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Ocultar en feeds</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Oculto en feeds</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Visible en feeds</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Ocultar en el historial</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Oculto en el historial</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Visible en el historial</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Ocultar en los resultados de búsqueda</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Oculto en los resultados de búsqueda</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Mostrado en los resultados de búsqueda</string>
|
||||
@@ -309,15 +312,15 @@ Sin embargo, si activas esto, también se registrarán algunos datos del usuario
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Ocultar botón \'Crear un Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">El botón Crear un Short está oculto</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Se muestra el botón Crear un Short</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Ocultar botón de marca de tiempo</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Botón de marca de tiempo oculto</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Botón de marca de tiempo mostrado</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Ocultar comentario de vista previa</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">El comentario de la vista previa está oculto</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Vista previa del comentario se muestra</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Ocultar botón Gracias</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">El botón de gracias está oculto</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Se muestra el botón de gracias</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Ocultar botón de marca de tiempo</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Botón de marca de tiempo oculto</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Botón de marca de tiempo mostrado</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Ocultar YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Barra de búsqueda Doodles están ocultos</string>
|
||||
@@ -371,32 +374,38 @@ Limitaciones
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Palabra clave ocultará todos los vídeos: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Ocultar anuncios generales</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Los anuncios generales están ocultos</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Se muestran anuncios generales</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Ocultar estantes de la tienda del creador</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Los estantes de la tienda debajo del reproductor y en la descripción del video están ocultos</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Se muestran los estantes de la tienda debajo del reproductor y en la descripción del video</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Ocultar banner de la tienda en la pantalla final</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">El banner de la tienda está oculto</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">El banner de la tienda está mostrado</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Ocultar anuncios a pantalla completa</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Los anuncios a pantalla completa están ocultos
|
||||
|
||||
Esta función solo está disponible para dispositivos antiguos"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Se muestran anuncios a pantalla completa</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Ocultar anuncio solo con dispositivos viejos</string>
|
||||
<string name="revanced_hide_general_ads_title">Ocultar anuncios generales</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Los anuncios generales están ocultos</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Se muestran anuncios generales</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Ocultar banners publicitarios</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Los banners publicitarios están ocultos</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Se muestran los banners publicitarios</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Ocultar etiqueta de promoción de pago</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Etiqueta de promoción pagada está oculta</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Etiqueta de promoción pagada se muestra</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Ocultar el banner \"Ver productos\"</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">El banner en la superposición del video está oculto</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Se muestra el banner en la superposición del video</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Ocultar tarjetas autopatrocinadas</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Las tarjetas autopatrocinadas están ocultas</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Se muestran las tarjetas autopatrocinadas</string>
|
||||
<string name="revanced_hide_products_banner_title">Ocultar el banner \"Ver productos\"</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Banner oculto</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Banner mostrado</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Ocultar banner de la tienda en la pantalla final</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">El banner de la tienda está oculto</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">El banner de la tienda está mostrado</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Ocultar estampilla de compra del jugador</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">El armazón de compras está oculto</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Se muestra el shelf de la compra</string>
|
||||
<string name="revanced_hide_shopping_links_title">Ocultar enlaces de compras en la descripción de vídeo</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Los enlaces de compra en la descripción del video están ocultos</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Se muestran los enlaces de compra en la descripción del video</string>
|
||||
<string name="revanced_hide_tagged_products_title">Ocultar productos etiquetados</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Los productos etiquetados en la descripción del video están ocultos</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Se muestran los productos etiquetados en la descripción del video</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Ocultar el botón \'Visitar tienda\' en las páginas del canal</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">El botón en la página del canal está oculto</string>
|
||||
@@ -404,11 +413,6 @@ Esta función solo está disponible para dispositivos antiguos"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Ocultar resultados de búsqueda web</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Los resultados de búsqueda web están ocultos</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Se muestran los resultados de la búsqueda web</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Ocultar banners publicitarios</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Los banners publicitarios están ocultos</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Se muestran los banners publicitarios</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Ocultar anuncio solo con dispositivos viejos</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Ocultar promociones de YouTube Premium</string>
|
||||
@@ -820,7 +824,7 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Ocultar etiqueta de metadatos de sonido</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Etiqueta de metadatos oculta</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Etiqueta de metadatos mostrada</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Ocultar etiqueta de enlace de vídeo completo</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Ocultar la etiqueta del enlace del video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Etiqueta de enlace de vídeo oculto</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Etiqueta de enlace de vídeo mostrada</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Ocultar botón de sonido</string>
|
||||
@@ -954,11 +958,25 @@ 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">Ocultar automáticamente el botón Saltar</string>
|
||||
<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_general_skiptoast">Mostrar un toast al saltar</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Toast se muestra cuando un segmento se omite automáticamente. Pulse aquí para ver un ejemplo</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast no se muestra. Toque aquí para ver un ejemplo</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 segundos</string>
|
||||
<string name="revanced_sb_duration_5s">5 segundos</string>
|
||||
<string name="revanced_sb_duration_6s">6 segundos</string>
|
||||
<string name="revanced_sb_duration_7s">7 segundos</string>
|
||||
<string name="revanced_sb_duration_8s">8 segundos</string>
|
||||
<string name="revanced_sb_duration_9s">9 segundos</string>
|
||||
<string name="revanced_sb_duration_10s">10 segundos</string>
|
||||
<string name="revanced_sb_general_time_without">Mostrar longitud de vídeo sin segmentos</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Longitud del vídeo menos todos los segmentos, mostrados en paréntesis junto a la longitud completa del vídeo</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">La duración del vídeo, excluyendo todos los segmentos, se muestra en la barra de progreso</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Longitud completa del vídeo mostrada</string>
|
||||
<string name="revanced_sb_create_segment_category">Creando nuevos segmentos</string>
|
||||
<string name="revanced_sb_enable_create_segment">Mostrar el botón Crear nuevo segmento</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Teid ei teavitata ühestki ootamatust sündmusest."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Video kirjeldus</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Peida videokirjelduse komponendid või kuva need</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Filtriseriba</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Peida või näita filtripaneeli voos, otsingutulemustes ja seotud videotes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Peida söötes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Peidetud söötes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Näidatud söötes</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Peida või näita filtririba voogudes, ajaloos, otsingutulemustes ja seotud videotes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Peida voogudes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Peidetud voogudes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Näidatud voogudes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Peida ajaloos</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Peidetud ajaloos</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Näidatud ajaloos</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Peida otsingutulemustes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Peidetud otsingutulemustes</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Kuvatakse otsingutulemustes</string>
|
||||
@@ -312,15 +315,15 @@ Teid ei teavitata ühestki ootamatust sündmusest."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Peida nupp \"Loo lühis\"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Nupp Loo lühivideo on peidetud</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Nupp Loo lühivideo on kuvatud</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Peida ajatempli nupp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Ajatempli nupp on peidetud</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Ajatempli nupp on nähtav</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Peida eelvaate kommentaar</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Eelvaate kommentaar on peidetud</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Eelvaate kommentaar on kuvatud</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Peida tänunupp</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Tänu nupp on peidetud</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Tänu nupp on kuvatud</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Peida ajatempli nupp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Ajatempli nupp on peidetud</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Ajatempli nupp on nähtav</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Peida YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Otsinguriba Doodled on peidetud</string>
|
||||
@@ -374,32 +377,38 @@ Piirangud
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Võti sõna: %s peidab kõik videod</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Peida üldine reklaamid</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Üldine reklaamid on peidetud</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Üldreklaamid kuvatakse</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Peida looja poeriiulid</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Mängija all ja videokirjelduses olevad poeriiulid on peidetud</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Poeriiulid mängija all ja videokirjelduses on näha</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Peida lõpuekraani poe bänner</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Poebanner on peidetud</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Poebanner on nähtav</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Peida täisekraanireklaamid</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Täisekraani reklaamid on peidetud
|
||||
|
||||
See funktsioon on saadaval ainult vanemates seadmetes"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Täisekraanireklaamid kuvatakse</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Terveekraanireklaamide peitmine toimib ainult vanemate seadmetega</string>
|
||||
<string name="revanced_hide_general_ads_title">Peida üldine reklaamid</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Üldine reklaamid on peidetud</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Üldreklaamid kuvatakse</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Peida reklaamipõhjad</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Reklaamipõhjad on peidetud</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Reklaamipõhjad on nähtavad</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Peida makstud edendamise silt</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Makstud edendamise silt on peidus</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Makstud edendamise silt on näidatud</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Peida bänner \"Vaata tooteid\"</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Video ülekatte bänner on peidetud</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Bänner videokatte all on näha</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Peida ise-sponsoritud kaardid</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Ise-sponsoritud kaardid on peidus</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Ise-sponsoritud kaardid on näidatud</string>
|
||||
<string name="revanced_hide_products_banner_title">Peida bänner „Vaata tooteid“</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Bänner on peidetud</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Bänner on nähtav</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Peida lõpuekraani poe bänner</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Poebanner on peidetud</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Poebanner on nähtav</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Peida poes ostukorvi riiul</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Ostukorvi riiul on peidetud</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Ostukorvi riiul on nähtav</string>
|
||||
<string name="revanced_hide_shopping_links_title">Peida ostulinkid video kirjelduses</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Ostulinkid video kirjelduses on peidetud</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Ostulinkid video kirjelduses on kuvatud</string>
|
||||
<string name="revanced_hide_tagged_products_title">Peida märgistatud tooted</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Videokirjelduses olevad märgistatud tooted on peidetud</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Märgistatud tooted videokirjelduses on näha</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Peida kanali lehelt nuppu \"Külasta poodi\"</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Nupp kanali lehel on peidetud</string>
|
||||
@@ -407,11 +416,6 @@ See funktsioon on saadaval ainult vanemates seadmetes"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Peida veebiotsingu tulemused</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Veebiotsingu tulemused on peidetud</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Veebiotsingu tulemused on nähtavad</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Peida reklaamipõhjad</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Reklaamipõhjad on peidetud</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Reklaamipõhjad on nähtavad</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Terveekraanireklaamide peitmine toimib ainult vanemate seadmetega</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Peida YouTube Premiumi reklaamid</string>
|
||||
@@ -486,6 +490,7 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"</st
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_title">Luba automaatse heleduse žest</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_on">Pühkige alla heleduse žesti madalaima väärtuseni, et lubada automaatne heleduse</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_off">Pühkimine alla madalaima väärtuseni ei luba automaatset heleduse</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_overlay_text">Automaatne</string>
|
||||
<string name="revanced_swipe_overlay_timeout_title">Pühkimise katte aegumisaeg</string>
|
||||
<string name="revanced_swipe_overlay_timeout_summary">Katte näitamise millisekundite arv</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_title">Pühkiva katte tausta läbipaistvus</string>
|
||||
@@ -822,7 +827,7 @@ Heliriba menüü kuvamiseks muutke valikut „Võltsitud videovoogedastus“ vä
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Peida heli metaandmete silt</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Metaandmete silt on peidetud</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Metaandmete silt on nähtav</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Peida täispika video lingi silt</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Peida videolingi silt</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video lingi silt on peidetud</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video lingi silt on nähtav</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Peida heli nupp</string>
|
||||
@@ -956,11 +961,25 @@ See funktsioon toimib kõige paremini 720p või madalama video kvaliteedi ja vä
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Peida vahelejätmisnupp automaatselt</string>
|
||||
<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_general_skiptoast">Näita toast teadet vahelejätmisel</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Teatis näidatakse, kui segment vahele jäetakse automaatselt. Puuduta siia, et näha näidet</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Teatist ei näidata. Puuduta siia, et näha näidet</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 sekundit</string>
|
||||
<string name="revanced_sb_duration_5s">5 sekundit</string>
|
||||
<string name="revanced_sb_duration_6s">6 sekundit</string>
|
||||
<string name="revanced_sb_duration_7s">7 sekundit</string>
|
||||
<string name="revanced_sb_duration_8s">8 sekundit</string>
|
||||
<string name="revanced_sb_duration_9s">9 sekundit</string>
|
||||
<string name="revanced_sb_duration_10s">10 sekundit</string>
|
||||
<string name="revanced_sb_general_time_without">Näita video pikkust ilma segmentideta</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Video pikkus miinus kõik segmendid, kuvatakse sulgudes täispika video pikkuse kõrval</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Video pikkus miinus kõik segmendid kuvatakse edenemisribal</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Näidatakse täispikk video pikkust</string>
|
||||
<string name="revanced_sb_create_segment_category">Uute segmentide loomine</string>
|
||||
<string name="revanced_sb_enable_create_segment">Näita Uue segmendi loomise nuppu</string>
|
||||
@@ -1182,6 +1201,7 @@ Kui see hiljem välja lülitatakse, on soovitatav rakenduse andmed kustutada, et
|
||||
<string name="revanced_change_start_page_entry_notifications">Teatised</string>
|
||||
<string name="revanced_change_start_page_entry_playlists">Esitusloendid</string>
|
||||
<string name="revanced_change_start_page_entry_search">Otsi</string>
|
||||
<string name="revanced_change_start_page_entry_shopping">Ostlemine</string>
|
||||
<string name="revanced_change_start_page_entry_sports">Sport</string>
|
||||
<string name="revanced_change_start_page_entry_subscriptions">Tellimused</string>
|
||||
<string name="revanced_change_start_page_entry_trending">Trendikas</string>
|
||||
@@ -1409,6 +1429,7 @@ Selle lubamine võib avada kõrgema video kvaliteedi"</string>
|
||||
<string name="revanced_shorts_quality_default_wifi_title">Vaikimisi [Shorts] kvaliteet WiFi võrgus</string>
|
||||
<string name="revanced_shorts_quality_default_mobile_title">Vaikimisi [Shorts] kvaliteet mobiilivõrgus</string>
|
||||
<string name="revanced_remember_video_quality_mobile">mobiil</string>
|
||||
<string name="revanced_remember_video_quality_wifi">WiFi</string>
|
||||
<string name="revanced_remember_video_quality_toast">Vaikimisi %1$s kvaliteet muudeti: %2$s</string>
|
||||
<string name="revanced_remember_video_quality_toast_shorts">Muudetud Shorts %1$s kvaliteet: %2$s</string>
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -108,8 +108,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -285,10 +285,13 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Videon kuvaus</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Piilota tai näytä videon kuvauksen osia</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Suodatinpalkki</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Piilota tai näytä suodatinpalkki syötteessä, haussa ja liittyvissä videoissa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Piilota syötteessä</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Piilotettu syötteessä</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Näytetään syötteessä</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Piilota tai näytä suodatinpalkki syötteissä, historiassa, hakutuloksissa ja liittyvissä videoissa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Piilota syötteissä</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Piilotettu syötteissä</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Näytetään syötteissä</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Piilota historiassa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Piilotettu historiassa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Näytetään historiassa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Piilota hakutuloksissa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Piilotettu hakutuloksissa</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Näytetään hakutuloksissa</string>
|
||||
@@ -312,15 +315,15 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Piilota \"Luo Shorts-video\" -painike</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Luo Shorts-video -painike on piilotettu</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Luo Shorts-video -painike näytetään</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Piilota aikaleimapainike</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Aikaleimapainike on piilotettu</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Aikaleimapainike näytetään</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Piilota kommentin esikatselu</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Kommentin esikatselu on piilotettu</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Kommentin esikatselu näytetään</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Piilota Kiitos-painike</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Kiitos-painike on piilotettu</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Kiitos-painike näytetään</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Piilota aikaleimapainike</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Aikaleimapainike on piilotettu</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Aikaleimapainike näytetään</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Piilota YouTube Doodlet</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Hakupalkin Doodlet on piilotettu</string>
|
||||
@@ -374,32 +377,35 @@ 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_general_ads_title">Piilota yleiset mainokset</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Yleiset mainokset on piilotettu</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Yleiset mainokset näytetään</string>
|
||||
<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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Piilota koko näytön mainokset</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Koko näytön mainokset on piilotettu
|
||||
|
||||
Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Koko näytön mainokset näytetään</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Koko näytön mainosten piilottaminen toimii vain vanhemmilla laitteilla</string>
|
||||
<string name="revanced_hide_general_ads_title">Piilota yleiset mainokset</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Yleiset mainokset on piilotettu</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Yleiset mainokset näytetään</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Piilota tuotebannerit</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Tuotebannerit on piilotettu</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Tuotebannerit näytetään</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Piilota maksetun mainostuksen tunniste</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Maksetun mainostuksen tunniste on piilotettu</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Maksetun mainostuksen tunniste näytetään</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<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_products_banner_title">Piilota \"Näytä tuotteet\" -banneri</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Banneri on piilotettu</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Banneri 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>
|
||||
<string name="revanced_hide_player_store_shelf_title">Piilota soittimen tuotehylly</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Tuotehylly on piilotettu</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Tuotehylly näytetään</string>
|
||||
<string name="revanced_hide_shopping_links_title">Piilota kauppalinkit</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Shopping-linkit on piilotettu videoiden kuvauksissa</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Shopping-linkit näytetään videoiden kuvauksissa</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>
|
||||
@@ -407,11 +413,6 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Piilota verkkohakutulokset</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Verkkohakutulokset on piilotettu</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Verkkohakutulokset näytetään</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Piilota tuotebannerit</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Tuotebannerit on piilotettu</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Tuotebannerit näytetään</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Koko näytön mainosten piilottaminen toimii vain vanhemmilla laitteilla</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Piilota YouTube Premium -mainokset</string>
|
||||
@@ -561,6 +562,9 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu
|
||||
<string name="revanced_hide_clip_button_summary_on">Klippi-painike on piilotettu</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Klippi-painike näytetään</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Piilota Tallenna</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Tallenna-painike on piilotettu</string>
|
||||
<string name="revanced_hide_save_button_summary_off">Tallenna-painike näytetään</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
<string name="revanced_navigation_buttons_screen_title">Navigointipainikkeet</string>
|
||||
@@ -667,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>
|
||||
@@ -767,6 +771,9 @@ Jos haluat nähdä sen, aseta \"Naamioi videovirrat\" iOS TV:ksi"</string>
|
||||
<string name="revanced_hide_shorts_upcoming_button_title">Piilota Tulossa-painike</string>
|
||||
<string name="revanced_hide_shorts_upcoming_button_summary_on">Tulossa-painike on piilotettu</string>
|
||||
<string name="revanced_hide_shorts_upcoming_button_summary_off">Tulossa-painike näytetään</string>
|
||||
<string name="revanced_hide_shorts_effect_button_title">Piilota Tehoste-painike</string>
|
||||
<string name="revanced_hide_shorts_effect_button_summary_on">Tehoste-painike on piilotettu</string>
|
||||
<string name="revanced_hide_shorts_effect_button_summary_off">Tehoste-painike näytetään</string>
|
||||
<string name="revanced_hide_shorts_green_screen_button_title">Piilota Vihertausta-painike</string>
|
||||
<string name="revanced_hide_shorts_green_screen_button_summary_on">Vihertausta-painike on piilotettu</string>
|
||||
<string name="revanced_hide_shorts_green_screen_button_summary_off">Vihertausta-painike näytetään</string>
|
||||
@@ -814,7 +821,6 @@ Jos haluat nähdä sen, aseta \"Naamioi videovirrat\" iOS TV:ksi"</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Piilota äänen metadata-tunniste</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Metadata-tunniste on piilotettu</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Metadata-tunniste näytetään</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Piilota koko videon linkin tunniste</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Videolinkin tunniste on piilotettu</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Videolinkin tunniste näytetään</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Piilota äänipainike</string>
|
||||
@@ -948,11 +954,19 @@ Tämä ominaisuus toimii parhaiten, kun videon laatu on 720p tai alhaisempi ja k
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Piilota ohita-painike automaattisesti</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Ohita-painike piiloutuu muutaman sekunnin kuluttua</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Ohita-painike näytetään koko osion ajan</string>
|
||||
<string name="revanced_sb_general_skiptoast">Näytä ilmoitus ohitettaessa</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ponnahdusilmoitus näytetään, kun osio ohitetaan automaattisesti. Napauta tästä nähdäksesi esimerkin</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Ponnahdusilmoitusta ei näytetä. Napauta tästä nähdäksesi esimerkin</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Ponnahdusilmoitusta ei näytetä</string>
|
||||
<string name="revanced_sb_duration_1s">1 sekunti</string>
|
||||
<string name="revanced_sb_duration_2s">2 sekuntia</string>
|
||||
<string name="revanced_sb_duration_3s">3 sekuntia</string>
|
||||
<string name="revanced_sb_duration_4s">4 sekuntia</string>
|
||||
<string name="revanced_sb_duration_5s">5 sekuntia</string>
|
||||
<string name="revanced_sb_duration_6s">6 sekuntia</string>
|
||||
<string name="revanced_sb_duration_7s">7 sekuntia</string>
|
||||
<string name="revanced_sb_duration_8s">8 sekuntia</string>
|
||||
<string name="revanced_sb_duration_9s">9 sekuntia</string>
|
||||
<string name="revanced_sb_duration_10s">10 sekuntia</string>
|
||||
<string name="revanced_sb_general_time_without">Näytä videon pituus ilman osioita</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Videon pituus ilman osioita, näytetään suluissa koko videon pituuden vieressä</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Videon pituus ilman kaikkia osioita näkyy etenemispalkissa</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Videon koko pituus näytetään</string>
|
||||
<string name="revanced_sb_create_segment_category">Uusien osioiden luominen</string>
|
||||
<string name="revanced_sb_enable_create_segment">Näytä Luo uusi osio -painike</string>
|
||||
@@ -999,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>
|
||||
@@ -1259,7 +1273,7 @@ Minisoitin voidaan vetää pois näytöltä vasemmalle tai oikealle"</string>
|
||||
<string name="revanced_gradient_loading_screen_summary_off">Latausruudulla on yksivärinen tausta</string>
|
||||
<string name="splash_screen_animation_style_title">Aloitussivun tyyli</string>
|
||||
<string name="splash_screen_animation_style_entry_1">Väri</string>
|
||||
<string name="splash_screen_animation_style_entry_2">Musta ja valkoinen</string>
|
||||
<string name="splash_screen_animation_style_entry_2">Mustavalkoinen</string>
|
||||
<string name="revanced_seekbar_custom_color_title">Ota mukautettu etenemispalkin väri käyttöön</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_on">Mukautettu etenemispalkin väri näytetään</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_off">Alkuperäinen etenemispalkin väri näytetään</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Paglalarawan ng video</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Itago o ipakita ang mga bahagi ng paglalarawan ng video</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Bar ng filter</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Itago o ipakita ang filter bar sa feed, mga resulta ng paghahanap, at mga kaugnay na video</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Itago sa feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Nakatago sa feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Ipinapakita sa feed</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Itago o ipakita ang filter bar sa mga feed, history, mga resulta ng paghahanap, at mga kaugnay na video</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Itago sa mga feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Nakatago sa mga feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Ipinapakita sa mga feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Itago sa kasaysayan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Nakatago sa kasaysayan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Ipinapakita sa kasaysayan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Itago sa mga resulta ng paghahanap</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Nakatago sa mga resulta ng paghahanap</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Ipinapakita sa mga resulta ng paghahanap</string>
|
||||
@@ -312,15 +315,15 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Itago ang butong \'Gumawa ng Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Nakatago ang button na Gumawa ng isang Short</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Ipinapakita ang button na Gumawa ng isang Short</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Itago ang button na timestamp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Nakatago ang button na timestamp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Ipinapakita ang button na timestamp</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Itago ang preview na komento</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Nakatago ang preview ng komento</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Ang pag-preview ng komento ay ipinapakita</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Itago ang pindutang Salamat</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Nakatago ang buton ng salamat</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Ang pindutan ng salamat ay ipinapakita</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Itago ang button na timestamp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Nakatago ang button na timestamp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Ipinapakita ang button na timestamp</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Itago ang mga Doodles ng YouTube</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Ang mga Doodles sa search bar ay nakatago</string>
|
||||
@@ -374,32 +377,38 @@ Mga limitasyon
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Ang keyword ay magtatago ng lahat ng mga video: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Itago ang mga pangkalahatang ad</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Nakatago ang mga pangkalahatang ad</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Ipinapakita ang mga pangkalahatang ad</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Itago ang mga istante ng tindahan ng tagalikha</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Ang mga istante ng tindahan sa ibaba ng player at sa paglalarawan ng video ay nakatago</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Ipinapakita ang mga istante ng tindahan sa ilalim ng player at sa paglalarawan ng video</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Itago ang banner ng tindahan ng end screen</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Nakatago ang banner ng tindahan</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Ipinakita ang banner ng tindahan</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Itago ang mga fullscreen na ad</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Ang mga fullscreen ad ay nakatago
|
||||
|
||||
Ang tampok na ito ay magagamit lamang para sa mga mas lumang device"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Ipinapakita ang mga fullscreen na ad</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Gumagana lang ang Itago ang mga fullscreen na ad sa mga mas lumang device</string>
|
||||
<string name="revanced_hide_general_ads_title">Itago ang mga pangkalahatang ad</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Nakatago ang mga pangkalahatang ad</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Ipinapakita ang mga pangkalahatang ad</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Itago ang mga merchandise banner</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Nakatago ang mga banner ng merchandise</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Ipinapakita ang mga banner ng merchandise</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Itago ang may bayad na label ng promosyon</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Nakatago ang label ng bayad na promosyon</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Ipinapakita ang may bayad na label ng promosyon</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Itago ang banner na \"Tingnan ang mga produkto\"</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Nakatago ang banner sa overlay ng video</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Ipinapakita ang banner sa overlay ng video</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Itago ang mga self sponsored card</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Nakatago ang mga self sponsored card</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Ipinapakita ang mga self sponsored card</string>
|
||||
<string name="revanced_hide_products_banner_title">Itago ang banner na \'Tingnan ang mga produkto\'</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Nakatago ang banner</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Ipinakita ang banner</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Itago ang banner ng tindahan ng end screen</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Nakatago ang banner ng tindahan</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Ipinakita ang banner ng tindahan</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Itago ang istante ng pamimili ng player</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Ang istante ng pamimili ay nakatago</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Ang istante ng pamimili ay ipinapakita</string>
|
||||
<string name="revanced_hide_shopping_links_title">Itago ang mga link sa pamimili sa paglalarawan ng video</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Nakatago ang mga link sa pamimili sa paglalarawan ng video</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Ipinapakita ang mga link sa pamimili sa paglalarawan ng video</string>
|
||||
<string name="revanced_hide_tagged_products_title">Itago ang mga nakatag na produkto</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Ang mga nakatag na produkto sa paglalarawan ng video ay nakatago</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Ipinapakita ang mga naka-tag na produkto sa paglalarawan ng video</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Itago ang button na \"Bisitahin ang tindahan\" sa mga page ng channel</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Nakatago ang button sa page ng channel</string>
|
||||
@@ -407,11 +416,6 @@ Ang tampok na ito ay magagamit lamang para sa mga mas lumang device"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Itago ang mga resulta ng paghahanap sa web</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Nakatago ang mga resulta ng paghahanap sa web</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Ipinapakita ang mga resulta ng paghahanap sa web</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Itago ang mga merchandise banner</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Nakatago ang mga banner ng merchandise</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Ipinapakita ang mga banner ng merchandise</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Gumagana lang ang Itago ang mga fullscreen na ad sa mga mas lumang device</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Itago ang mga promosyon sa YouTube Premium</string>
|
||||
@@ -717,6 +721,7 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa iOS
|
||||
<string name="revanced_hide_seekbar_thumbnail_summary_off">Ipinapakita ang thumbnail seekbar</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.shorts.hideShortsComponentsResourcePatch">
|
||||
<string name="revanced_shorts_player_screen_title">Shorts Manlalaro</string>
|
||||
<string name="revanced_shorts_player_screen_summary">Itago o ipakita ang mga sangkap sa Shorts player</string>
|
||||
<!-- 'home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_hide_shorts_home_title">Itago ang Shorts sa home feed</string>
|
||||
@@ -820,7 +825,7 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa iOS
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Itago ang sound metadata label</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Nakatago ang label ng metadata</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Ang label ng metadata ay ipinapakita</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Itago ang buong label ng link ng video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Itago ang label ng link ng video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Nakatago ang label ng link ng video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Ipinapakita ang label ng link ng video</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Itago ang pindutan ng tunog</string>
|
||||
@@ -856,6 +861,8 @@ Mga Setting → Pag-playback → I-autoplay ang susunod na video"</string>
|
||||
<patch id="layout.player.fullscreen.exitFullscreenPatch">
|
||||
<string name="revanced_exit_fullscreen_title">Lumabas sa fullscreen mode sa katapusan ng video</string>
|
||||
<string name="revanced_exit_fullscreen_entry_1">Na-disable</string>
|
||||
<string name="revanced_exit_fullscreen_entry_2">Patayo</string>
|
||||
<string name="revanced_exit_fullscreen_entry_3">Pahalang</string>
|
||||
<string name="revanced_exit_fullscreen_entry_4">Portrait at landscape</string>
|
||||
</patch>
|
||||
<patch id="layout.player.fullscreen.openVideosFullscreen">
|
||||
@@ -889,6 +896,7 @@ Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode"</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_on">Ipinapakita ang mga Dislike bilang isang porsyento</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_off">Ipinapakita ang mga Dislike bilang isang numero</string>
|
||||
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
|
||||
<string name="revanced_ryd_compact_layout_title">Siksik na Pindutan ng Like</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">Like button na naka-istilong para sa minimum na lapad</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">I-style na button para sa pinakamahusay na hitsura</string>
|
||||
<string name="revanced_ryd_estimated_like_title">Ipakita ang tinantyang mga gusto</string>
|
||||
@@ -951,11 +959,25 @@ 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">Awtomatikong itago ang button na Laktawan</string>
|
||||
<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_general_skiptoast">Magpakita ng toast kapag lumaktaw</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ang toast ay ipinapakita kapag ang isang segment ay awtomatikong nilaktawan. Mag-tap dito para makakita ng halimbawa</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Hindi ipinapakita ang toast. Mag-tap dito para makakita ng halimbawa</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 segundo</string>
|
||||
<string name="revanced_sb_duration_5s">5 segundo</string>
|
||||
<string name="revanced_sb_duration_6s">6 segundo</string>
|
||||
<string name="revanced_sb_duration_7s">7 segundo</string>
|
||||
<string name="revanced_sb_duration_8s">8 segundo</string>
|
||||
<string name="revanced_sb_duration_9s">9 segundo</string>
|
||||
<string name="revanced_sb_duration_10s">10 segundo</string>
|
||||
<string name="revanced_sb_general_time_without">Ipakita ang haba ng video nang walang mga segment</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Haba ng video na binawasan ang lahat ng mga segment, na ipinapakita sa mga panaklong sa tabi ng buong haba ng video</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Ang haba ng video nang walang lahat ng segment ay ipinapakita sa seekbar</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Ipinapakita ang buong haba ng video</string>
|
||||
<string name="revanced_sb_create_segment_category">Paglikha ng mga bagong segment</string>
|
||||
<string name="revanced_sb_enable_create_segment">Ipakita ang button na Gumawa ng bagong segment</string>
|
||||
@@ -1001,6 +1023,7 @@ Ang iyong user id ay parang isang password at hindi dapat ibahagi.
|
||||
"</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Huwag ipakitang muli</string>
|
||||
<string name="revanced_sb_diff_segments">Baguhin ang gawi ng segment</string>
|
||||
<string name="revanced_sb_segments_sponsor">Sponsor</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Bayad na promosyon, bayad na referral at direktang advertisement. Hindi para sa self-promote o libreng shout-out sa mga sanhi/creator/website/produktong gusto nila</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Walang bayad/Pag-promote sa Sarili</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Katulad ng Sponsor maliban sa hindi bayad o self promotion. Kasama ang mga seksyon tungkol sa merchandise, donasyon, o impormasyon tungkol sa kung sino ang kanilang nakasama</string>
|
||||
@@ -1069,6 +1092,7 @@ Umiiral na"</string>
|
||||
<string name="revanced_sb_vote_failed_timeout">Hindi makaboto para sa segment (nag-time out ang API)</string>
|
||||
<string name="revanced_sb_vote_failed_unknown_error">Hindi makaboto para sa segment (status: %1$d %2$s)</string>
|
||||
<string name="revanced_sb_vote_failed_forbidden">Hindi makaboto para sa segment: %s</string>
|
||||
<string name="revanced_sb_vote_upvote">Itaas na Boto</string>
|
||||
<string name="revanced_sb_vote_downvote">I-downvote</string>
|
||||
<string name="revanced_sb_vote_category">Baguhin ang kategorya</string>
|
||||
<string name="revanced_sb_vote_no_segments">Walang mga segment na iboboto</string>
|
||||
@@ -1111,6 +1135,7 @@ Isumite na ba?"</string>
|
||||
<string name="revanced_sb_stats_reputation">Ang iyong reputasyon ay <b>%.2f</b></string>
|
||||
<string name="revanced_sb_stats_submissions">Nilikha mo ang <b>%s</b> mga segment</string>
|
||||
<string name="revanced_sb_stats_submissions_sum">Tapikin dito upang tingnan ang iyong mga segment</string>
|
||||
<string name="revanced_sb_stats_saved_zero">SponsorBlock Talaan ng mga Nangunguna</string>
|
||||
<string name="revanced_sb_stats_saved">Nailigtas mo ang mga tao mula sa <b>%s</b> mga segment</string>
|
||||
<string name="revanced_sb_stats_saved_sum_zero">Mag-tap dito para makita ang mga pandaigdigang istatistika at nangungunang contributor</string>
|
||||
<string name="revanced_sb_stats_saved_sum">Iyon ay <b>%s</b> ng kanilang buhay.<br>Mag-tap dito para makita ang leaderboard</string>
|
||||
@@ -1120,13 +1145,16 @@ Isumite na ba?"</string>
|
||||
<string name="revanced_sb_stats_saved_hour_format">%1$s oras %2$s minuto</string>
|
||||
<string name="revanced_sb_stats_saved_minute_format">%1$s minuto %2$s segundo</string>
|
||||
<string name="revanced_sb_stats_saved_second_format">%s segundo</string>
|
||||
<string name="revanced_sb_color_opacity_label">Opacity:</string>
|
||||
<string name="revanced_sb_color_dot_label">Kulay:</string>
|
||||
<string name="revanced_sb_about_title">Tungkol</string>
|
||||
<string name="revanced_sb_about_api_summary">Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Kaayusan ng Form Factor</string>
|
||||
<string name="revanced_change_form_factor_entry_1">Regular</string>
|
||||
<string name="revanced_change_form_factor_entry_2">Telepono</string>
|
||||
<string name="revanced_change_form_factor_entry_3">Tablet</string>
|
||||
<string name="revanced_change_form_factor_entry_4">Awtomatiko</string>
|
||||
<string name="revanced_change_form_factor_user_dialog_message">"Kasama sa mga pagbabago:
|
||||
|
||||
@@ -1164,6 +1192,7 @@ Kung mamaya ay patayin, inirerekumenda na i-clear ang data ng app upang maiwasan
|
||||
<string name="revanced_change_start_page_entry_history">Kasaysayan</string>
|
||||
<string name="revanced_change_start_page_entry_library">Aklatan</string>
|
||||
<string name="revanced_change_start_page_entry_liked_videos">Nagustuhan ang mga video</string>
|
||||
<string name="revanced_change_start_page_entry_live">Live</string>
|
||||
<string name="revanced_change_start_page_entry_movies">Mga Pelikula</string>
|
||||
<string name="revanced_change_start_page_entry_music">Musika</string>
|
||||
<string name="revanced_change_start_page_entry_news">Mga Balita</string>
|
||||
@@ -1173,6 +1202,8 @@ Kung mamaya ay patayin, inirerekumenda na i-clear ang data ng app upang maiwasan
|
||||
<string name="revanced_change_start_page_entry_shopping">Pamimili</string>
|
||||
<string name="revanced_change_start_page_entry_sports">Isports</string>
|
||||
<string name="revanced_change_start_page_entry_subscriptions">Mga subscription</string>
|
||||
<string name="revanced_change_start_page_entry_trending">Uso</string>
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Birtuwal na Katotohanan</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">Panoorin mamaya</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Mga clip mo</string>
|
||||
<string name="revanced_change_start_page_always_title">Palaging baguhin ang panimulang pahina</string>
|
||||
@@ -1188,6 +1219,9 @@ Limitasyon: Maaaring hindi gumana ang paggamit ng back button sa toolbar"</strin
|
||||
</patch>
|
||||
<patch id="layout.shortsplayer.shortsPlayerTypePatch">
|
||||
<string name="revanced_shorts_player_type_title">Buksan ang Shorts gamit ang</string>
|
||||
<string name="revanced_shorts_player_type_shorts">Shorts player</string>
|
||||
<string name="revanced_shorts_player_type_regular_player">Regular player</string>
|
||||
<string name="revanced_shorts_player_type_regular_player_fullscreen">Regular player fullscreen</string>
|
||||
</patch>
|
||||
<patch id="layout.shortsautoplay.shortsAutoplayPatch">
|
||||
<string name="revanced_shorts_autoplay_title">Awtomatikong pag-play ng Shorts</string>
|
||||
@@ -1198,10 +1232,12 @@ Limitasyon: Maaaring hindi gumana ang paggamit ng back button sa toolbar"</strin
|
||||
<string name="revanced_shorts_autoplay_background_summary_off">Uulitin ang mga Shorts sa background</string>
|
||||
</patch>
|
||||
<patch id="layout.miniplayer.miniplayerPatch">
|
||||
<string name="revanced_miniplayer_screen_title">Miniplayer</string>
|
||||
<string name="revanced_miniplayer_screen_summary">Baguhin ang estilo ng naka-minimize na in-app player</string>
|
||||
<string name="revanced_miniplayer_type_title">Uri ng miniplayer</string>
|
||||
<string name="revanced_miniplayer_type_entry_0">Hindi</string>
|
||||
<string name="revanced_miniplayer_type_entry_1">Regular</string>
|
||||
<string name="revanced_miniplayer_type_entry_2">Minimal</string>
|
||||
<string name="revanced_miniplayer_type_entry_3">Tableta</string>
|
||||
<string name="revanced_miniplayer_type_entry_4">Moderno 1</string>
|
||||
<string name="revanced_miniplayer_type_entry_5">Moderno 2</string>
|
||||
@@ -1286,6 +1322,7 @@ Mag-tap dito upang matuto nang higit pa tungkol sa DeArrow"</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">Magpakita ng toast kung hindi available ang API</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">Ang toast ay ipinapakita kung hindi available ang DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Hindi ipinapakita ang toast kung hindi available ang DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_title">DeArrow API endpoint</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">Ang URL ng DeArrow thumbnail cache endpoint</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_title">Nakakuha pa rin ng video</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_summary">Kinukuha ang mga still capture mula sa simula/gitna/katapusan ng bawat video. Ang mga larawang ito ay binuo sa YouTube at walang panlabas na API na ginagamit</string>
|
||||
@@ -1333,6 +1370,7 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video"</st
|
||||
<string name="microg_settings_summary">Mga setting para sa GmsCore</string>
|
||||
</patch>
|
||||
<patch id="misc.hapticfeedback.disableHapticFeedbackPatch">
|
||||
<string name="revanced_disable_haptic_feedback_title">Haptic feedback</string>
|
||||
<string name="revanced_disable_haptic_feedback_summary">Baguhin ang haptic feedback</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_title">Huwag paganahin ang chapters haptics</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_summary_on">Hindi pinagana ang Chapters haptics</string>
|
||||
@@ -1509,6 +1547,7 @@ Ang AVC ay may pinakamataas na resolusyon na 1080p, ang codec ng audio ng Opus a
|
||||
<string name="revanced_about_summary">Tungkol sa ReVanced</string>
|
||||
<string name="revanced_ads_screen_title">Mga ad</string>
|
||||
<string name="revanced_ads_screen_summary">Mga setting ng pag-block ng ad</string>
|
||||
<string name="revanced_chat_screen_title">Chat</string>
|
||||
<string name="revanced_chat_screen_summary">Mga setting ng chat</string>
|
||||
<string name="revanced_misc_screen_title">Iba Pa</string>
|
||||
<string name="revanced_misc_screen_summary">Sari-saring mga setting</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Vous ne serez pas informé des événements inattendus."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Description de la vidéo</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Masquez ou affichez des éléments dans la description des vidéos</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Barre des filtres</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Masquez ou affichez la barre des filtres dans le flux, les résultats de recherche et les vidéos similaires</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Masquer dans le flux</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Masquée dans le flux</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Affichée dans le flux</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Masquez ou affichez la barre des filtres dans les flux, l\'historique, les résultats de recherche et les vidéos associées</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Masquer dans les flux</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Masquée dans les flux</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Affichée dans les flux</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Masquer dans l\'historique</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Masquée dans l\'historique</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Affichée dans l\'historique</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Masquer dans les résultats de recherche</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Masquée dans les résultats de recherche</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Affichée dans les résultats de recherche</string>
|
||||
@@ -312,15 +315,15 @@ Vous ne serez pas informé des événements inattendus."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Masquer le bouton Créer un Short</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Le bouton \"Créer un Short\" est masqué</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Le bouton \"Créer un Short\" est affiché</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Masquer le bouton d\'horodatage</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Le bouton d\'horodatage est masqué</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Le bouton d\'horodatage est affiché</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Masquer le commentaire servant d\'aperçu</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Le commentaire servant d\'aperçu est masqué</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Le commentaire servant d\'aperçu est affiché</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Masquer le bouton Merci</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Le bouton Merci est masqué</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Le bouton Merci est affiché</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Masquer le bouton d\'horodatage</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Le bouton d\'horodatage est masqué</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Le bouton d\'horodatage est affiché</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Masquer les Doodles YouTube</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Les Doodles de la barre de recherche sont masqués</string>
|
||||
@@ -374,32 +377,38 @@ Limitations
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Ce mot-clé va masquer toutes les vidéos : %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Masquer les annonces générales</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Les annonces générales sont masquées</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Les annonces générales sont affichées</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Masquer les étagères de la boutique du créateur</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Les étagères de boutique sous le lecteur et dans la description de la vidéo sont masquées</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Les étagères de boutique sous le lecteur et dans la description de la vidéo sont affichées</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Masquer l\'écran de fin de bannière de boutique</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">La bannière de boutique est masquée</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">La bannière de boutique est affichée</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Masquer les annonces plein écran</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Les annonces plein écran sont masquées
|
||||
|
||||
Cette fonctionnalité est disponible uniquement pour les appareils anciens"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Les annonces plein écran sont affichées</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Masquer les annonces plein écran ne fonctionne que sur les appareils anciens</string>
|
||||
<string name="revanced_hide_general_ads_title">Masquer les annonces générales</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Les annonces générales sont masquées</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Les annonces générales sont affichées</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Masquer les bannières Produits dérivés</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Les bannières Produits dérivés sont masquées</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Les bannières Produits dérivés sont affichées</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Masquer la bannière de promotion rémunérée</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">La bannière \"Inclut une promotion rémunérée\" est masquée</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">La bannière \"Inclut une promotion rémunérée\" est affichée</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Masquer la bannière \"Afficher les produits\"</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">La bannière dans l\'overlay de la vidéo est masquée</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">La bannière dans l\'overlay de la vidéo est affichée</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Masquer les cartes d\'autopromotion</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Les cartes d\'autopromotion sont masquées</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Les cartes d\'autopromotion sont affichées</string>
|
||||
<string name="revanced_hide_products_banner_title">Masquer la bannière Afficher les produits</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">La bannière est masquée</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">La bannière est affichée</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Masquer l\'écran de fin de bannière de boutique</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">La bannière de boutique est masquée</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">La bannière de boutique est affichée</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Masquer l\'étagère Shopping dans le lecteur</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">L\'étagère Shopping est masquée</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">L\'étagère Shopping est affichée</string>
|
||||
<string name="revanced_hide_shopping_links_title">Masquer les liens de shopping</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Les liens de shopping dans la description des vidéos sont masqués</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Les liens de shopping dans la description des vidéos sont affichés</string>
|
||||
<string name="revanced_hide_tagged_products_title">Masquer les produits tagués</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Les produits tagués dans la description de la vidéo sont masqués</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Les produits tagués dans la description de la vidéo sont affichés</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Masquer le bouton Visiter la boutique</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Le bouton est masqué sur la page de chaîne</string>
|
||||
@@ -407,11 +416,6 @@ Cette fonctionnalité est disponible uniquement pour les appareils anciens"</str
|
||||
<string name="revanced_hide_web_search_results_title">Masquer les résultats Web</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Les résultats Web sont masqués</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Les résultats Web sont affichés</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Masquer les bannières Produits dérivés</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Les bannières Produits dérivés sont masquées</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Les bannières Produits dérivés sont affichées</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Masquer les annonces plein écran ne fonctionne que sur les appareils anciens</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Masquer les publicités pour YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Masquer le libellé des métadonnées audio</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Le libellé des métadonnées est masqué</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Le libellé des métadonnées est affiché</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Masquer le libellé de lien vers la vidéo complète</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Masquer le libellé du lien vidéo</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Le libellé de lien est masqué</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Le libellé de lien est affiché</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Masquer le bouton du son</string>
|
||||
@@ -959,12 +963,26 @@ Cette fonctionnalité fonctionne de manière optimale avec une qualité vidéo d
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Masquer automatiquement le bouton Passer</string>
|
||||
<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_general_skiptoast">Afficher un message toast lorsqu\'un segment est passé</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Un message toast est affiché lorsqu\'un segment est passé automatiquement. Appuyez ici pour voir un exemple.</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Message toast non affiché. Appuyez ici pour voir un exemple.</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 secondes</string>
|
||||
<string name="revanced_sb_duration_5s">5 secondes</string>
|
||||
<string name="revanced_sb_duration_6s">6 secondes</string>
|
||||
<string name="revanced_sb_duration_7s">7 secondes</string>
|
||||
<string name="revanced_sb_duration_8s">8 secondes</string>
|
||||
<string name="revanced_sb_duration_9s">9 secondes</string>
|
||||
<string name="revanced_sb_duration_10s">10 secondes</string>
|
||||
<string name="revanced_sb_general_time_without">Afficher la durée de la vidéo sans les segments</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Durée de la vidéo moins tous les segments, affichée entre parenthèses à côté de la durée totale de la vidéo</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Affichage de la durée totale de la vidéo</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">La durée de la vidéo moins tous les segments est affichée sur la barre de progression</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">La durée totale de la vidéo est affichée</string>
|
||||
<string name="revanced_sb_create_segment_category">Création de nouveaux segments</string>
|
||||
<string name="revanced_sb_enable_create_segment">Afficher le bouton Créer un segment</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_on">Le bouton de création de segment est affiché</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Cur síos físeán</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Folaigh nó taispeáint comhpháirteanna tuairisc</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Barra scagaire</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Folaigh nó taispeáin an barra scagaire sa sruth, torthaí cuardaigh agus físeáin ghaolmhara</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Folaigh i mbeatha</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">I bhfolach i mbeatha</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Taispeántar i mbeatha</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Folaigh nó taispeáin an barra scagaire sna fothaí, stair, torthaí cuardaigh, agus físeáin ghaolmhara</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Folaigh i bhfothaí</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">I bhfolach i bhfothaí</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Taispeánta i bhfothaí</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Folaigh sa stair</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">I bhfolach sa stair</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Taispeánta sa stair</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Folaigh i dtorthaí cuardaigh</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Folaigh i dtorthaí cuardaigh</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Taispeáin i dtorthaí cuardaigh</string>
|
||||
@@ -312,15 +315,15 @@ Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Folaigh an cnaipe \'Cruthaigh Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Tá cnaipe Cruthaigh gearrscéal i bhfolach</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Taispeántar cnaipe Cruthaigh gearrscéal</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Folaigh cnaipe an stampa ama</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tá cnaipe an stampa ama i bhfolach</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Taispeántar cnaipe an stampa ama</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Folaigh trácht réamhamharc</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Tá trácht réamhamhar i bhfolach</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Taispeántar trácht réamhamharc</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Folaigh cnaipe Buíochas</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Tá cnaipe buíochas i bhfolach</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Taispeántar cnaipe buíochas</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Folaigh cnaipe an stampa ama</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tá cnaipe an stampa ama i bhfolach</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Taispeántar cnaipe an stampa ama</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Folaigh YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Barra cuardaigh Tá Doodles i bhfolach</string>
|
||||
@@ -374,32 +377,38 @@ Teorainneacha
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Folaigh eochairfhocal gach físeán: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Folaigh fógraí ginearálta</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Tá fógraí ginearálta i bhfolach</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Taispeántar fógraí ginearálta</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Folaigh seilfeanna siopa an chruthaitheora</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Tá seilfeanna siopa faoi bhun an imreora agus i gcur síos an fhíseáin folaithe</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Taispeántar seilfeanna siopa faoin imreoir agus sa chur síos ar an bhfíseán</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Folaigh brat bhranda siopa scáileáin deiridh</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Tá an bhratach Siopa i bhfolach</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Taispeántar an bhratach Siopa</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Folaigh fógraí lánscáileáin</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Tá fógraí lána scáileáin i bhfolach
|
||||
|
||||
Níl an ghné seo ar fáil ach do ghléasanna níos sine"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Taispeántar fógraí lánscáileáin</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Ní oibríonn folaigh fógraí lánscáileáin ach le gléasanna níos sine</string>
|
||||
<string name="revanced_hide_general_ads_title">Folaigh fógraí ginearálta</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Tá fógraí ginearálta i bhfolach</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Taispeántar fógraí ginearálta</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Folaigh meirgí marsantais</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Tá meirgí marsantais i bhfolach</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Taispeántar meirgí marsantais</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Folaigh lipéad chun cinn íoctha</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Tá an lipéad promóisin íoctha i bhfolach</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Taispeántar lipéad promóisin íoctha</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Folaigh an meirge \'Féach ar tháirgí\'</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Tá meirge i bhforleagan físeáin folaithe</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Taispeántar meirge san fhorleagan físeáin</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Folaigh cártaí féin-urraithe</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Tá cártaí féin-urraithe i bhfolach</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Taispeántar cártaí féin-urraithe</string>
|
||||
<string name="revanced_hide_products_banner_title">Folaigh an bhratach \'Féach ar tháirgí\'</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Tá bratach i bhfolach</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Taispeántar an bhratach</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Folaigh brat bhranda siopa scáileáin deiridh</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Tá an bhratach Siopa i bhfolach</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Taispeántar an bhratach Siopa</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Folaigh seilf siopadóireachta an t-imreoir</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Tá seilf siopadóireachta i bhfolach</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Taispeántar seilf siopadóireachta</string>
|
||||
<string name="revanced_hide_shopping_links_title">Folaigh naisc siopadóireachta sa chur síos físeáin</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Tá naisc siopadóireachta i dtuairisc an fhíseáin i bhfolach</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Taispeántar naisc siopadóireachta i dtuairisc an fhíseáin</string>
|
||||
<string name="revanced_hide_tagged_products_title">Folaigh táirgí clibáilte</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Tá táirgí clibáilte i gcur síos an fhíseáin folaithe</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Taispeántar táirgí clibáilte sa chur síos ar an bhfíseán</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Folaigh an cnaipe \'Tabhair cuairt ar an siopa\' ar leathanaigh chainéil</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Tá cnaipe i leathanach an chainéil i bhfolach</string>
|
||||
@@ -407,11 +416,6 @@ Níl an ghné seo ar fáil ach do ghléasanna níos sine"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Folaigh torthaí cuardaigh gréasáin</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Tá torthaí cuardaigh gréasáin i bhfolach</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Taispeántar torthaí cuardaigh gréasáin</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Folaigh meirgí marsantais</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Tá meirgí marsantais i bhfolach</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Taispeántar meirgí marsantais</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Ní oibríonn folaigh fógraí lánscáileáin ach le gléasanna níos sine</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Folaigh cur chun cinn Préimhe YouTube</string>
|
||||
@@ -823,7 +827,7 @@ Chun roghchlár na rian fuaime a thaispeáint, athraigh 'Srutháin físeáin bhr
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Folaigh lipéad meiteashonraí fuaime</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Tá lipéad meiteashonraí folach</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Léirítear lipéad meiteashonraí</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Folaigh lipéad nasc físe iomlán</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Folaigh lipéad nasc físeáin</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Tá lipéad nasc físe i bhfolach</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Taispeántar lipéad nasc físe</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Folaigh an cnaipe fuaime</string>
|
||||
@@ -957,11 +961,25 @@ 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">Folaigh cnaipe Scipeála go huathoibríoch</string>
|
||||
<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_general_skiptoast">Taispeáin tósta agus tú ag scipeáil</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Taispeántar tósta nuair a scipeántar deighleog go huathoibríoch. Tapáil anseo chun sampla a fheiceáil</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Ní thaispeántar tósta. Tapáil anseo chun sampla a fheiceáil</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á 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á 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>
|
||||
<string name="revanced_sb_duration_4s">4 soicind</string>
|
||||
<string name="revanced_sb_duration_5s">5 soicind</string>
|
||||
<string name="revanced_sb_duration_6s">6 soicind</string>
|
||||
<string name="revanced_sb_duration_7s">7 soicindí</string>
|
||||
<string name="revanced_sb_duration_8s">8 soicindí</string>
|
||||
<string name="revanced_sb_duration_9s">9 soicindí</string>
|
||||
<string name="revanced_sb_duration_10s">10 soicindí</string>
|
||||
<string name="revanced_sb_general_time_without">Taispeáin fad físeáin gan codanna</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Fad físeáin lúide gach mír, léirithe i lúibíní in aice le fad iomlán an fhíse</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Taispeántar fad físe iomlán</string>
|
||||
<string name="revanced_sb_create_segment_category">Deighleoga nua a chruthú</string>
|
||||
<string name="revanced_sb_enable_create_segment">Taispeáin cnaipe Cruthaigh deighleog nua</string>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -285,10 +285,13 @@ Nem fog értesülni semmilyen váratlan eseményről."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Videóleírás</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">A videóleírás komponenseinek elrejtése vagy megjelenítése</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Szűrősáv</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Szűrősáv elrejtése vagy megjelenítése a hírfolyamban, a keresési eredményekben és a kapcsolódó videókban</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Elrejtés a feedekben</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Elrejtve a feedekben</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Megjelenítés a feedekben</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">A szűrősáv elrejtése vagy megjelenítése a feedekben, az előzményekben, a keresési eredményekben és a kapcsolódó videókban</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Elrejtés a hírcsatornákban</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Elrejtve a hírcsatornákban</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Megjelenítve a hírcsatornákban</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Elrejtés az előzményekben</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Elrejtve az előzményekben</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Megjelenítve az előzményekben</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Elrejtés a keresési eredmények között</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Elrejtve a keresési eredmények között</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Megjelenítve a keresési eredmények között</string>
|
||||
@@ -312,15 +315,15 @@ Nem fog értesülni semmilyen váratlan eseményről."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">A „Rövid létrehozása” gomb elrejtése</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">A Rövidfilm létrehozása gomb rejtett</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">A Rövidfilm létrehozása gomb látható</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Az időbélyegző gomb elrejtése</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Az időbélyegző gomb el van rejtve</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Az időbélyegző gomb megjelenik</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Megjegyzés előnézet elrejtése</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">A megjegyzés előnézet el van rejtve</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">A megjegyzés előnézet megjelenik</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Köszönet gomb elrejtése</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">A köszönet gomb el van rejtve</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">A köszönet gomb látható</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Az időbélyegző gomb elrejtése</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Az időbélyegző gomb el van rejtve</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Az időbélyegző gomb megjelenik</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodles elrejtése</string>
|
||||
<string name="revanced_hide_doodles_summary_on">A Doodles Keresősáv el van rejtve</string>
|
||||
@@ -374,32 +377,38 @@ Korlátozások
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">A kulcsszó elrejti az összes videót: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Általános hirdetések elrejtése</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Az általános hirdetések el vannak rejtve</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Az általános hirdetések megjelennek</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Alkotói bolti polcok elrejtése</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">A lejátszó alatti és a videó leírásában lévő bolti polcok elrejtve</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">A lejátszó alatt és a videó leírásában megjelennek az árupolcok</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">A befejező képernyőn lévő üzletbanner elrejtése</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Az áruház banner rejtett</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Az áruház banner megjelenik</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Teljes képernyős hirdetések elrejtése</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"A teljes képernyős hirdetések el vannak rejtve
|
||||
|
||||
Ez a funkció csak régebbi eszközökön érhető el"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">A teljes képernyős hirdetések láthatók</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">A teljes képernyős hirdetések elrejtése csak régebbi eszközökön működik</string>
|
||||
<string name="revanced_hide_general_ads_title">Általános hirdetések elrejtése</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Az általános hirdetések el vannak rejtve</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Az általános hirdetések megjelennek</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Áruszalaghirdetések elrejtése</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Az áruszalaghirdetések el vannak rejtve</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Az áruszalaghirdetések megjelennek</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Fizetett promóció címke elrejtése</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">A fizetett promóciós címke el van rejtve</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">A fizetett promóciós címke meg van jelenítve</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">A „Termékek megtekintése” szalaghirdetés elrejtése</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">A videóátfedésben lévő szalaghirdetés elrejtve</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">A szalaghirdetés megjelenik a videó átfedésében</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Önpromóciós kártyák elrejtése</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Az önpromóciós kártyák rejtve vannak</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Az önpromóciós kártyák megjelennek</string>
|
||||
<string name="revanced_hide_products_banner_title">\"View products\" szalagcím elrejtése</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">A szalagkép rejtett</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">A szalagkép megjelenik</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">A befejező képernyőn lévő üzletbanner elrejtése</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Az áruház banner rejtett</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Az áruház banner megjelenik</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">A lejátszó bevásárlópolcának elrejtése</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">A bevásárlópolc el van rejtve</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Megjelenik a bevásárlópolc</string>
|
||||
<string name="revanced_hide_shopping_links_title">Vásárlási linkek elrejtése a videó leírásában</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">A videóleírásban található vásárlási hivatkozások rejtettek</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">A videóleírásban található vásárlási hivatkozások láthatók</string>
|
||||
<string name="revanced_hide_tagged_products_title">Címkézett termékek elrejtése</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">A videó leírásában lévő címkézett termékek elrejtve</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">A videó leírásában címkézett termékek jelennek meg</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">\'Bolt meglátogatása\' gomb elrejtése a csatornák oldalán</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">A gomb a csatornaoldalon rejtett</string>
|
||||
@@ -407,11 +416,6 @@ Ez a funkció csak régebbi eszközökön érhető el"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Webes keresési találatok elrejtése</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">A webes keresési találatok rejtve vannak</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">A webes keresési találatok megjelennek</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Áruszalaghirdetések elrejtése</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Az áruszalaghirdetések el vannak rejtve</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Az áruszalaghirdetések megjelennek</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">A teljes képernyős hirdetések elrejtése csak régebbi eszközökön működik</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">YouTube Premium promóciók elrejtése</string>
|
||||
@@ -823,7 +827,7 @@ Az audiosáv menü megjelenítéséhez módosítsa a \"Videófolyamok hamisítá
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Hang metaadatcímke elrejtése</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">A hang metaadatcímke el van rejtve</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">A hang metaadatcímke megjelenik</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Teljes videólink címke elrejtése</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Videóhivatkozás címkéjének elrejtése</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">A teljes videólink címke el van rejtve</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">A teljes videólink címke megjelenik</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Hang gomb elrejtése</string>
|
||||
@@ -957,11 +961,25 @@ 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">Az Átugrás gomb automatikus elrejtése</string>
|
||||
<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_general_skiptoast">toast megjelenítése átugráskor</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Felugró üzenet megjelenítése, ha a szakasz automatikusan ki lett hagyva. Koppintson ide egy példa megtekintéséhez</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Felugró üzenet nem látható. Koppintson ide egy példa megtekintéséhez</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">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">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>
|
||||
<string name="revanced_sb_duration_4s">4 másodperc</string>
|
||||
<string name="revanced_sb_duration_5s">5 másodperc</string>
|
||||
<string name="revanced_sb_duration_6s">6 másodperc</string>
|
||||
<string name="revanced_sb_duration_7s">7 másodperc</string>
|
||||
<string name="revanced_sb_duration_8s">8 másodperc</string>
|
||||
<string name="revanced_sb_duration_9s">9 másodperc</string>
|
||||
<string name="revanced_sb_duration_10s">10 másodperc</string>
|
||||
<string name="revanced_sb_general_time_without">A videó hosszának megjelenítése szegmensek nélkül</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">A videó hossza mínusz minden szegmens, zárójelben a teljes videó hossza mellett</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">A videó hossza az összes szegmens nélkül jelenik meg a csúszkán</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">A videó teljes hossza látható</string>
|
||||
<string name="revanced_sb_create_segment_category">Új szegmensek létrehozása</string>
|
||||
<string name="revanced_sb_enable_create_segment">Új szegmens létrehozása gomb megjelenítése</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_description_components_screen_title">Տեսանյութի նկարագրություն</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Թաքցնել կամ ցույց տալ տեսանյութի նկարագրության բաղադրամասերը</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Ֆիլտրի գիծ</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Թաքցնել կամ ցուցադրել ֆիլտրի գոտին լրահոսում, որոնման արդյունքներում և հարակից տեսանյութերում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Թաքցնել լեզվականում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Թաքցված է լեզվականում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Ցույց է տրվում լեզվականում</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Թաքցնել կամ ցուցադրել զտիչի գոտին լրահոսերում, պատմության մեջ, որոնման արդյունքներում և հարակից տեսանյութերում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Թաքցնել լրահոսերում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Թաքցված է լրահոսերում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Ցուցադրված է լրահոսերում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Թաքցնել պատմության մեջ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Թաքցված է պատմության մեջ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Ցուցադրված է պատմության մեջ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Թաքցնել որոնման արդյունքներում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Թաքնված է որոնման արդյունքներում</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Ցուցադրված է որոնման արդյունքներում</string>
|
||||
@@ -312,15 +315,15 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Թաքցնել \"Ստեղծել Shorts\" կոճակը</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">\"Ստեղծել Short\" կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">\"Ստեղծել Short\" կոճակը ցուցադրվում է</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Թաքցնել ժամանակային նշումով կոճակը</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Ժամանակային նշումով կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Ժամանակային նշումով կոճակը ցուցադրվում է</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Թաքցնել նախադիտման մեկնաբանությունը</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Նախադիտման մեկնաբանությունը թաքցված է</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Նախադիտման մեկնաբանությունը երևում է</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Թաքցնել շնորհակալության կոճակը</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">\"Շնորհակալություն\" կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">\"Շնորհակալություն\" կոճակը երևում է</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Թաքցնել ժամանակային նշումով կոճակը</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Ժամանակային նշումով կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Ժամանակային նշումով կոճակը ցուցադրվում է</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Թաքցնել YouTube-ի Doodles-ները</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Որոնման տողի Doodles-ները թաքցված են</string>
|
||||
@@ -374,32 +377,38 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Բանալի բառը կթաքցնի բոլոր տեսանյութերը։ %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Թաքցնել ընդհանուր գովազդները</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Ընդհանուր գովազդները թաքցված են</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Թաքցնել լի էկրանի գովազդները</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"«Լրիվ էկրան» գովազդները թաքցվում են
|
||||
|
||||
Այս հատկությունը հասանելի է միայն հին սարքերի համար"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Լի էկրանի գովազդները երևում են</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Լի էկրանի գովազդների թաքցումը գործում է միայն հին սարքերի համար</string>
|
||||
<string name="revanced_hide_general_ads_title">Թաքցնել ընդհանուր գովազդները</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Ընդհանուր գովազդները թաքցված են</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Ընդհանուր գովազդները երևում են</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Թաքցնել ապրանքների բաները</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Ապրանքների բաները թաքցված են</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Ապրանքների բաները երևում են</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Թաքցնել վճարված խթանման նշանը</string>
|
||||
<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_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_products_banner_title">Թաքցնել «Դիտել ապրանքները» պաստառը</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Բաները թաքցված են</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">Թաքցնել խաղացողի խանութի դարակը</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Խանութի դարակը թաքցված է</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Խանութի դարակը երևում է</string>
|
||||
<string name="revanced_hide_shopping_links_title">Թաքցնել խանութի հղումները տեսանյութի նկարագրության մեջ</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Տեսանյութի նկարագրության մեջ առկա գնումների հղումները թաքցված են</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -407,11 +416,6 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_web_search_results_title">Թաքցնել վեբ-որոնման արդյունքները</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Վեբ-որոնման արդյունքները թաքցված են</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Վեբ-որոնման արդյունքները երևում են</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Թաքցնել ապրանքների բաները</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Ապրանքների բաները թաքցված են</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Ապրանքների բաները երևում են</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Լի էկրանի գովազդների թաքցումը գործում է միայն հին սարքերի համար</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Թաքցնել YouTube Premium-ի խթանումները</string>
|
||||
@@ -823,7 +827,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<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>
|
||||
@@ -958,11 +962,25 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Ավտոմատ կերպով թաքցնել Skip կոճակը</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">Skip կոճակը ցուցադրվում է ամբողջ հատվածի համար</string>
|
||||
<string name="revanced_sb_general_skiptoast">Ցուցադրել toast, երբ բաց թողնվի</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Toast ցույց է տրվում, երբ segment-ը ավտոմատ կերպով բաց թողնվում է: Տվեք այստեղ, որպեսզի տեսնեք օրինակը</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast չի ցույց տրվում: Տվեք այստեղ, որպեսզի տեսնեք օրինակը</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_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_duration_1s">1 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_2s">2 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_3s">3 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_4s">4 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_5s">5 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_6s">6 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_7s">7 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_8s">8 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_9s">9 վայրկյան</string>
|
||||
<string name="revanced_sb_duration_10s">10 վայրկյան</string>
|
||||
<string name="revanced_sb_general_time_without">Ցույց տալ տեսանյութի երկարությունը առանց segment-ների</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Տեսանյութի երկարությունը մինուս բոլոր segment-ները, ցույց է տրվում ամբողջ տեսանյութի երկարության կողքին ծալքերում</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Տեսանյութի երկարությունը հանած բոլոր հատվածները ցուցադրվում է որոնման գոտում</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Ցույց է տրվում ամբողջ տեսանյութի երկարությունը</string>
|
||||
<string name="revanced_sb_create_segment_category">Նոր segment-ների ստեղծում</string>
|
||||
<string name="revanced_sb_enable_create_segment">Ցուցադրել նոր հատված ստեղծելու կոճակը</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Keterangan video</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Sembunyikan atau tampilkan komponen keterangan video</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Bilah saring</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Sembunyikan atau tampilkan bilah saring di bagian umpan, hasil pencarian, dan video terkait</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Sembunyikan di bagian umpan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Disembunyikan di bagian umpan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Tampilkan di bagian umpan</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Sembunyikan atau tampilkan bilah penyaring di umpan, riwayat, hasil pencarian, dan video terkait</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Sembunyikan di umpan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Disembunyikan di umpan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Ditampilkan di umpan</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Sembunyikan di histori</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Disembunyikan di riwayat</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Ditampilkan di riwayat</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Sembunyikan di hasil penelusuran</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Disembunyikan di hasil penelusuran</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Ditampilkan di hasil penelusuran</string>
|
||||
@@ -312,15 +315,15 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Sembunyikan tombol \'Buat Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Tombol Buat Short disembunyikan</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Tombol Buat Short ditampilkan</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Sembunyikan tombol penanda waktu</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tombol penanda waktu disembunyikan</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Tombol penanda waktu ditampilkan</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Sembunyikan pratinjau komentar</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Pratinjau komentar disembunyikan</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Pratinjau komentar ditampilkan</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Sembunyikan tombol Terima Kasih</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Tombol terima kasih disembunyikan</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Tombol terima kasih ditampilkan</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Sembunyikan tombol penanda waktu</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Tombol penanda waktu disembunyikan</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Tombol penanda waktu ditampilkan</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Sembunyikan YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Bilah pencarian Doodle disembunyikan</string>
|
||||
@@ -374,32 +377,38 @@ Keterbatasan
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Kata kunci akan menyembunyikan semua video: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Sembunyikan iklan umum</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Iklan umum disembunyikan</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Iklan umum ditampilkan</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Sembunyikan rak toko kreator</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Rak toko di bawah pemutar dan di deskripsi video disembunyikan</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Rak toko di bawah pemutar dan di deskripsi video ditampilkan</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Sembunyikan spanduk toko di layar akhir</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Spanduk toko disembunyikan</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Spanduk toko ditampilkan</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Sembunyikan iklan layar penuh</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Iklan layar penuh disembunyikan
|
||||
|
||||
Fitur ini hanya tersedia untuk perangkat yang lebih lama"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Iklan layar penuh ditampilkan</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Menyembunyikan iklan layar penuh hanya berfungsi pada perangkat lama</string>
|
||||
<string name="revanced_hide_general_ads_title">Sembunyikan iklan umum</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Iklan umum disembunyikan</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Iklan umum ditampilkan</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Sembunyikan spanduk merchandise</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Banner merchandise disembunyikan</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Spanduk merchandise ditampilkan</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Sembunyikan label promosi berbayar</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 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">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>
|
||||
<string name="revanced_hide_products_banner_title">Sembunyikan spanduk \'Lihat produk\'</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Spanduk disembunyikan</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Spanduk ditampilkan</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Sembunyikan spanduk toko di layar akhir</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Spanduk toko disembunyikan</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Spanduk toko ditampilkan</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Sembunyikan rak belanja pemutar</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Rak belanja disembunyikan</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Rak belanja ditampilkan</string>
|
||||
<string name="revanced_hide_shopping_links_title">Sembunyikan tautan belanja</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Tautan belanja di deskripsi video disembunyikan</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Tautan belanja di deskripsi video ditampilkan</string>
|
||||
<string name="revanced_hide_tagged_products_title">Sembunyikan produk yang ditandai</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">Produk yang ditandai dalam deskripsi video disembunyikan</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">Produk yang ditandai di deskripsi video ditampilkan</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Sembunyikan tombol \'Kunjungi toko\'</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Tombol di halaman saluran disembunyikan</string>
|
||||
@@ -407,11 +416,6 @@ Fitur ini hanya tersedia untuk perangkat yang lebih lama"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Sembunyikan hasil pencarian web</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">Hasil pencarian web disembunyikan</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">Hasil pencarian web ditampilkan</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Sembunyikan spanduk merchandise</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Banner merchandise disembunyikan</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Spanduk merchandise ditampilkan</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Menyembunyikan iklan layar penuh hanya berfungsi pada perangkat lama</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Sembunyikan promosi YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Untuk menampilkan menu trek Audio, ubah 'Spoof aliran video' ke iOS TV"</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Sembunyikan label metadata suara</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Label metadata disembunyikan</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Label metadata ditampilkan</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Sembunyikan label tautan video penuh</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Sembunyikan label tautan video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Label tautan video disembunyikan</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Label tautan video ditampilkan</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Sembunyikan tombol suara</string>
|
||||
@@ -957,11 +961,25 @@ Fitur ini bekerja paling baik dengan kualitas video 720p atau lebih rendah dan s
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Sembunyikan tombol Lewati secara otomatis</string>
|
||||
<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_general_skiptoast">Tampilkan sebuah pesan timbul ketika melewati</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Pesan timbul ditampilkan saat segmen dilewati secara otomatis. Tekan di sini untuk melihat contohnya</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Pesan timbul tidak ditampilkan. Tekan di sini untuk melihat contohnya</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 detik</string>
|
||||
<string name="revanced_sb_duration_5s">5 detik</string>
|
||||
<string name="revanced_sb_duration_6s">6 detik</string>
|
||||
<string name="revanced_sb_duration_7s">7 detik</string>
|
||||
<string name="revanced_sb_duration_8s">8 detik</string>
|
||||
<string name="revanced_sb_duration_9s">9 detik</string>
|
||||
<string name="revanced_sb_duration_10s">10 detik</string>
|
||||
<string name="revanced_sb_general_time_without">Tampilkan durasi video tanpa segmen</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Durasi video dikurangi semua segmen, ditampilkan dalam tanda kurung di samping durasi video penuh</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Durasi video tanpa semua segmen ditampilkan pada bilah pencarian</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Durasi video penuh ditampilkan</string>
|
||||
<string name="revanced_sb_create_segment_category">Membuat segmen baru</string>
|
||||
<string name="revanced_sb_enable_create_segment">Tampilkan tombol Buat segmen baru</string>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -285,10 +285,13 @@ Non sarai notificato di eventi imprevisti."</string>
|
||||
<string name="revanced_hide_description_components_screen_title">Descrizione del video</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">Mostra o nascondi i componenti della descrizione del video</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">Barra dei filtri</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Nascondi o mostra la barra dei filtri nel feed, nei risultati di ricerca e nei video correlati</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Nascondi nel feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">È nascosto nel feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">È visibile nel feed</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">Nascondi o mostra la barra dei filtri nei feed, nella cronologia, nei risultati di ricerca e nei video correlati</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">Nascondi nei feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Nascosto nei feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Mostrato nei feed</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">Nascondi nella cronologia</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Nascosto nella cronologia</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Mostrato nella cronologia</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">Nascondi nei risultati di ricerca</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Nascosto nei risultati di ricerca</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Mostrato nei risultati di ricerca</string>
|
||||
@@ -312,15 +315,15 @@ Non sarai notificato di eventi imprevisti."</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">Nascondi il pulsante \'Crea uno Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">Il pulsante Crea uno Short è nascosto</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">Il pulsante Crea uno Short è visibile</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Nascondi pulsante timestamp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Il pulsante timestamp è nascosto</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Il pulsante timestamp è visibile</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Nascondi il commento di anteprima</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Il commento di anteprima è nascosto</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Il commento di anteprima è visibile</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Nascondi il pulsante Grazie</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Il pulsante Grazie è nascosto</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Il pulsante Grazie è visibile</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">Nascondi pulsante timestamp</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Il pulsante timestamp è nascosto</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Il pulsante timestamp è visibile</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">Nascondi Doodles di YouTube</string>
|
||||
<string name="revanced_hide_doodles_summary_on">I Doodle nella barra di ricerca sono nascosti</string>
|
||||
@@ -374,32 +377,38 @@ Note:
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">La parola chiave nasconderà tutti i video: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">Nascondi pubblicità generali</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Le pubblicità generali sono nascoste</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Le pubblicità generali sono visibili</string>
|
||||
<string name="revanced_hide_creator_store_shelves_title">Nascondi gli scaffali del negozio del creatore</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_on">Gli scaffali del negozio sotto il player e nella descrizione del video sono nascosti</string>
|
||||
<string name="revanced_hide_creator_store_shelves_summary_off">Le scaffalature del negozio sotto il lettore e nella descrizione del video sono mostrate</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Nascondi banner del negozio della schermata finale</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Il banner del negozio è nascosto</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Il banner del negozio è visibile</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">Nascondi le pubblicità a schermo intero</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"Le pubblicità a schermo intero sono nascoste
|
||||
|
||||
Questa funzione è disponibile solo per i dispositivi più vecchi"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Le pubblicità a schermo intero sono visibili</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Nascondi gli annunci a schermo intero funziona solo con dispositivi più vecchi</string>
|
||||
<string name="revanced_hide_general_ads_title">Nascondi pubblicità generali</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Le pubblicità generali sono nascoste</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Le pubblicità generali sono visibili</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Nascondi i banner sul merchandising</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">I banner sul merchandising sono nascosti</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">I banner sul merchandising sono visibili</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Nascondi l\'etichetta della promozione a pagamento</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">L\'etichetta della promozione a pagamento è nascosta</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">L\'etichetta della promozione a pagamento è visibile</string>
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_view_products_banner_title">Nascondi il banner \'Visualizza prodotti\'</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_on">Il banner nella sovrapposizione del video è nascosto</string>
|
||||
<string name="revanced_hide_view_products_banner_summary_off">Il banner nell\'overlay del video è mostrato</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Nascondi le schede autopromozionali</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Le schede autopromozionali sono nascoste</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Le schede autopromozionali sono visibili</string>
|
||||
<string name="revanced_hide_products_banner_title">Nascondi il banner \"Visualizza prodotti\"</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">Il banner è nascosto</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">Il banner è visibile</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Nascondi banner del negozio della schermata finale</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Il banner del negozio è nascosto</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Il banner del negozio è visibile</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Nascondi la sezione Negozio</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">La sezione negozio è nascosta</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">La sezione negozio è visibile</string>
|
||||
<string name="revanced_hide_shopping_links_title">Nascondi link agli acquisti nella descrizione del video</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">I link di shopping nella descrizione del video sono nascosti</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">I link di shopping nella descrizione del video sono visibili</string>
|
||||
<string name="revanced_hide_tagged_products_title">Nascondi prodotti taggati</string>
|
||||
<string name="revanced_hide_tagged_products_summary_on">I prodotti taggati nella descrizione del video sono nascosti</string>
|
||||
<string name="revanced_hide_tagged_products_summary_off">I prodotti taggati nella descrizione del video sono mostrati</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Nascondi il pulsante \'Visita negozio\' nelle pagine del canale</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Il pulsante nella pagina del canale è nascosto</string>
|
||||
@@ -407,11 +416,6 @@ Questa funzione è disponibile solo per i dispositivi più vecchi"</string>
|
||||
<string name="revanced_hide_web_search_results_title">Nascondi i risultati della ricerca web</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">I risultati della ricerca web sono nascosti</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">I risultati della ricerca web sono visibili</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Nascondi i banner sul merchandising</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">I banner sul merchandising sono nascosti</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">I banner sul merchandising sono visibili</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Nascondi gli annunci a schermo intero funziona solo con dispositivi più vecchi</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">Nascondi la promozione di YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Per mostrare il menu della traccia audio, cambia \"Spoof video streams\" in iOS
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Nascondi etichetta dei metadati sonori</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">L\'etichetta dei metadati è nascosta</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">L\'etichetta dei metadati è visibile</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Nascondi l\'etichetta del link del video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">Nascondi etichetta link video</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">L\'etichetta del link del video è nascosta</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">L\'etichetta del link del video è visibile</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">Nascondi il pulsante Suono</string>
|
||||
@@ -957,11 +961,25 @@ Questa funzione funziona meglio con una qualità video di 720p o inferiore e qua
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Nascondi automaticamente il pulsante Salta</string>
|
||||
<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_general_skiptoast">Mostra un toast quando si salta</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Mostra una notifica quando un segmento è saltato automaticamente. Tocca qui per vedere un esempio</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">La notifica è nascosta. Tocca qui per vedere un esempio</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 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 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>
|
||||
<string name="revanced_sb_duration_4s">4 secondi</string>
|
||||
<string name="revanced_sb_duration_5s">5 secondi</string>
|
||||
<string name="revanced_sb_duration_6s">6 secondi</string>
|
||||
<string name="revanced_sb_duration_7s">7 secondi</string>
|
||||
<string name="revanced_sb_duration_8s">8 secondi</string>
|
||||
<string name="revanced_sb_duration_9s">9 secondi</string>
|
||||
<string name="revanced_sb_duration_10s">10 secondi</string>
|
||||
<string name="revanced_sb_general_time_without">Mostra la durata del video senza segmenti</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">La durata del video meno tutti gli eventuali segmenti, visibile tra parentesi accanto alla durata del video completo</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">La durata del video meno tutti i segmenti è mostrata sulla barra di ricerca</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">La durata totale del video è visibile</string>
|
||||
<string name="revanced_sb_create_segment_category">Creazione di nuovi segmenti</string>
|
||||
<string name="revanced_sb_enable_create_segment">Mostra il pulsante Crea nuovo segmento</string>
|
||||
|
||||
@@ -285,10 +285,13 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_description_components_screen_title">תיאור סרטון</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">הסתר או הצג רכיבי תיאור סרטון</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">סרגל סינון</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">הסתר או הצג את סרגל הסינון בפיד, תוצאות חיפוש, וסרטונים קשורים</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">הסתר בפיד</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">מוסתר בפיד</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">מוצג בפיד</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">הסתר או הצג את סרגל הסינון בפידים, היסטוריה, תוצאות חיפוש, וסרטונים קשורים</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">הסתר בפידים</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">מוסתר בפידים</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">מוצג בפידים</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">הסתר בהיסטוריה</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">מוסתר בהיסטוריה</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">מוצג בהיסטוריה</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">הסתר בתוצאות חיפוש</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">מוסתר בתוצאות חיפוש</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">מוצג בתוצאות חיפוש</string>
|
||||
@@ -312,15 +315,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">הסתר לחצן \'יצירת Short\'</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">לחצן יצירת Short מוסתר</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">לחצן יצירת Short מוצג</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">הסתר לחצן חותם זמן</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">לחצן חותם זמן מוסתר</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">לחצן חותם זמן מוצג</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">הסתר תצוגה מקדימה של תגובה</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">תצוגה מקדימה של תגובה מוסתרת</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">תצוגה מקדימה של תגובה מוצגת</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">הסתר לחצן תודה</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">לחצן תודה מוסתר</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">לחצן תודה מוצג</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">הסתר לחצן חותם זמן</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">לחצן חותם זמן מוסתר</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">לחצן חותם זמן מוצג</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">הסתר YouTube Doodles</string>
|
||||
<string name="revanced_hide_doodles_summary_on">שרבוטים (Doodles) של סרגל חיפוש מוסתרים</string>
|
||||
@@ -374,32 +377,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">מילת מפתח תסתיר את כל הסרטונים: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">הסתר מודעות כלליות</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">מודעות כלליות מוסתרות</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">הסתר מודעות מסך מלא</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"מודעות במסך מלא מוסתרות
|
||||
|
||||
תכונה זו זמינה רק עבור מכשירים ישנים יותר"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">מודעות מסך מלא מוצגות</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">הסתר מודעות מסך מלא עובד רק עם מכשירים ישנים יותר</string>
|
||||
<string name="revanced_hide_general_ads_title">הסתר מודעות כלליות</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">מודעות כלליות מוסתרות</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">מודעות כלליות מוצגות</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">הסתר כרזות מרצ\'נדייז</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">כרזות מרצ\'נדייז מוסתרות</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">כרזות מרצ\'נדייז מוצגות</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">הסתר תווית קידום מכירות בתשלום</string>
|
||||
<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_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_products_banner_title">הסתר כרזת \'ראה מוצרים\'</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">כרזה מוסתרת</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">הסתר מדף שופינג של נגן</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">מדף שופינג מוסתר</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">מדף שופינג מוצג</string>
|
||||
<string name="revanced_hide_shopping_links_title">הסתר קישורי שופינג</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">קישורי שופינג בתיאור סרטון מוסתרים</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
@@ -407,11 +416,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_web_search_results_title">הסתר תוצאות חיפוש באינטרנט</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">תוצאות חיפוש באינטרנט מוסתרות</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">תוצאות חיפוש באינטרנט מוצגות</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">הסתר כרזות מרצ\'נדייז</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">כרזות מרצ\'נדייז מוסתרות</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">כרזות מרצ\'נדייז מוצגות</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">הסתר מודעות מסך מלא עובד רק עם מכשירים ישנים יותר</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">הסתר קידומי YouTube Premium</string>
|
||||
@@ -823,7 +827,7 @@ Second \"item\" text"</string>
|
||||
<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>
|
||||
@@ -960,11 +964,25 @@ Second \"item\" text"</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_off">לחצן דילוג מוצג עבור כל המקטע</string>
|
||||
<string name="revanced_sb_general_skiptoast">הצג הודעה קופצת בעת דילוג</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">הודעה קופצת מוצגת כאשר מקטע מדולג באופן אוטומטי. הקש כאן כדי לראות דוגמא</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_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_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_duration_1s">שנייה אחת</string>
|
||||
<string name="revanced_sb_duration_2s">שתי שניות</string>
|
||||
<string name="revanced_sb_duration_3s">3 שניות</string>
|
||||
<string name="revanced_sb_duration_4s">4 שניות</string>
|
||||
<string name="revanced_sb_duration_5s">5 שניות</string>
|
||||
<string name="revanced_sb_duration_6s">6 שניות</string>
|
||||
<string name="revanced_sb_duration_7s">7 שניות</string>
|
||||
<string name="revanced_sb_duration_8s">8 שניות</string>
|
||||
<string name="revanced_sb_duration_9s">9 שניות</string>
|
||||
<string name="revanced_sb_duration_10s">10 שניות</string>
|
||||
<string name="revanced_sb_general_time_without">הצג אורך סרטון ללא מקטעים</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">אורך סרטון פחות כל המקטעים, מוצג בסוגריים ליד אורך הסרטון המלא</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">אורך הסרטון פחות כל המקטעים מוצג על פס הניווט</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">אורך סרטון מלא מוצג</string>
|
||||
<string name="revanced_sb_create_segment_category">יוצר מקטעים חדשים</string>
|
||||
<string name="revanced_sb_enable_create_segment">הצג לחצן יצירת מקטע חדש</string>
|
||||
|
||||
@@ -24,12 +24,12 @@ 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>無視した場合、この警告は 2 回のみ表示されます。</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>
|
||||
<string name="revanced_check_environment_not_near_patch_time_days">%s 日前にパッチが適用されています</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">APK の作成日時データが破損しています</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>無視した場合、この警告は 2 回のみ表示されます。</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>
|
||||
<string name="revanced_check_environment_not_near_patch_time_days">%s 日前にパッチが適用されている</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">APK の作成日時データが破損している</string>
|
||||
</patch>
|
||||
<patch id="misc.settings.settingsResourcePatch">
|
||||
<string name="revanced_settings_submenu_title">設定</string>
|
||||
@@ -95,7 +95,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_settings_screen_05_player_title">プレーヤー</string>
|
||||
<string name="revanced_settings_screen_06_shorts_title">ショート</string>
|
||||
<string name="revanced_settings_screen_07_seekbar_title">シークバー</string>
|
||||
<string name="revanced_settings_screen_08_swipe_controls_title">スワイプコントロール</string>
|
||||
<string name="revanced_settings_screen_08_swipe_controls_title">スワイプ コントロール</string>
|
||||
<string name="revanced_settings_screen_11_misc_title">その他</string>
|
||||
<string name="revanced_settings_screen_12_video_title">動画</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">古い設定メニューを復元</string>
|
||||
@@ -188,8 +188,8 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_show_more_button_summary_on">「もっと見る」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">「もっと見る」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">チケット欄を非表示</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">チケット欄は表示されません</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">チケット欄は表示されます</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">チケット欄を非表示にします</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">チケット欄を非表示にします</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Timed Reaction を非表示</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Timed Reaction とチャット欄のハートマーク アイコンは表示されません</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Timed Reaction とチャット欄のハートマー ク アイコンは表示されます</string>
|
||||
@@ -286,10 +286,13 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_description_components_screen_title">概要欄</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">概要欄の設定</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">カテゴリー バー</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">フィード、検索結果、関連動画の上部にカテゴリーごとに表示されるバーの設定</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">フィードのカテゴリー バーを非表示</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">カテゴリー バーはフィードに表示されません</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">カテゴリー バーはフィードに表示されます</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">フィード、履歴、検索結果、関連動画でフィルターバーを表示または非表示にします</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">フィードで非表示</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">フィードで非表示にします</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">フィードで非表示にします</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_title">履歴で非表示</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">履歴で非表示にします</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">履歴で非表示にします</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">検索結果のカテゴリー バーを非表示</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">カテゴリー バーは検索結果に表示されません</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">カテゴリー バーは検索結果に表示されます</string>
|
||||
@@ -313,15 +316,15 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">「ショートを作成」ボタンを非表示</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">「ショートを作成」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">「ショートを作成」ボタンは表示されます</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">タイムスタンプ ボタンを非表示</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">タイムスタンプ ボタンは表示されません</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">タイムスタンプ ボタンは表示されます</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">コメントのプレビューを非表示</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">コメントのプレビューは表示されません</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">コメントのプレビューは表示されます</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Thanks ボタンを非表示</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Thanks ボタンは表示されません</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Thanks ボタンは表示されます</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_title">タイムスタンプ ボタンを非表示</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_on">タイムスタンプ ボタンは表示されません</string>
|
||||
<string name="revanced_hide_comments_timestamp_button_summary_off">タイムスタンプ ボタンは表示されます</string>
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
<string name="revanced_hide_doodles_title">YouTube Doodle を非表示</string>
|
||||
<string name="revanced_hide_doodles_summary_on">Doodle は検索バーに表示されません</string>
|
||||
@@ -375,54 +378,55 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">全ての動画を除外するキーワード: %s</string>
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">一般的な広告を非表示</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">一般的な広告は表示されません</string>
|
||||
<string name="revanced_hide_general_ads_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>
|
||||
<string name="revanced_hide_fullscreen_ads_title">全画面広告を非表示</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"全画面広告は、アプリ起動時に表示されません
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">"アプリ起動時の全画面広告を非表示にします
|
||||
|
||||
この機能は、古いデバイスでのみ利用できます"</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">全画面広告は、アプリ起動時に表示されます</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">「プロモーションを含みます」ボタンを非表示</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">「プロモーションを含みます」ボタンはプレーヤー画面に表示されません</string>
|
||||
<string name="revanced_hide_paid_promotion_label_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_products_banner_title">「商品を表示」ボタンを非表示</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">「商品を表示」ボタンや商品ボタンはプレーヤー画面に表示されません</string>
|
||||
<string name="revanced_hide_products_banner_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>
|
||||
<string name="revanced_hide_player_store_shelf_title">ストア広告を非表示</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">ストア広告は表示されません</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">ストア広告は表示されます</string>
|
||||
<string name="revanced_hide_shopping_links_title">商品へのリンクを非表示</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">タグ付けされた商品へのリンクは概要欄に表示されません</string>
|
||||
<string name="revanced_hide_shopping_links_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>
|
||||
<string name="revanced_hide_visit_store_button_summary_off">「ストアに移動」ボタンはチャンネル ページに表示されます</string>
|
||||
<string name="revanced_hide_web_search_results_title">ウェブ検索結果を非表示</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">ウェブ検索結果は表示されません</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">ウェブ検索結果は表示されます</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">商品バナーを非表示</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">商品バナーは表示されません</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">商品バナーは表示されます</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">アプリ起動時の全画面広告を非表示にします\n\nこの機能は、古いデバイスでのみ利用できます</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">全画面広告の非表示は古いデバイス専用です</string>
|
||||
<string name="revanced_hide_general_ads_title">一般的な広告を非表示</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">一般的な広告を非表示にします</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">一般的な広告を非表示にします</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">商品バナーを非表示</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">商品バナーを非表示にします</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">商品バナーを非表示にします</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">「プロモーションを含みます」ボタンを非表示</string>
|
||||
<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_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>
|
||||
<!-- '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>
|
||||
<string name="revanced_hide_visit_store_button_summary_off">チャンネル ページの「ストアに移動」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_web_search_results_title">ウェブ検索結果を非表示</string>
|
||||
<string name="revanced_hide_web_search_results_summary_on">ウェブ検索結果を非表示にします</string>
|
||||
<string name="revanced_hide_web_search_results_summary_off">ウェブ検索結果を非表示にします</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">YouTube Premium の広告を非表示</string>
|
||||
<string name="revanced_hide_get_premium_summary_on">YouTube Premium の広告は表示されません</string>
|
||||
<string name="revanced_hide_get_premium_summary_off">YouTube Premium の広告は表示されます</string>
|
||||
<string name="revanced_hide_get_premium_summary_on">YouTube Premium の広告を非表示にします</string>
|
||||
<string name="revanced_hide_get_premium_summary_off">YouTube Premium の広告を非表示にします</string>
|
||||
</patch>
|
||||
<patch id="ad.video.videoAdsPatch">
|
||||
<string name="revanced_hide_video_ads_title">動画広告を非表示</string>
|
||||
<string name="revanced_hide_video_ads_summary_on">動画広告は表示されません</string>
|
||||
<string name="revanced_hide_video_ads_summary_off">動画広告は表示されます</string>
|
||||
<string name="revanced_hide_video_ads_summary_on">動画広告を非表示にします</string>
|
||||
<string name="revanced_hide_video_ads_summary_off">動画広告を非表示にします</string>
|
||||
</patch>
|
||||
<patch id="interaction.copyvideourl.copyVideoUrlResourcePatch">
|
||||
<string name="revanced_share_copy_url_success">URL をクリップボードにコピーしました</string>
|
||||
@@ -517,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>
|
||||
@@ -536,8 +540,8 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_share_button_summary_off">共有ボタンは表示されます</string>
|
||||
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_stop_ads_button_title">「広告を停止」を非表示</string>
|
||||
<string name="revanced_hide_stop_ads_button_summary_on">「広告を停止」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_stop_ads_button_summary_off">「広告を停止」ボタンは表示されます</string>
|
||||
<string name="revanced_hide_stop_ads_button_summary_on">「広告を停止」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_stop_ads_button_summary_off">「広告を停止」ボタンを非表示にします</string>
|
||||
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears only on live streams. -->
|
||||
<string name="revanced_hide_report_button_title">報告ボタンを非表示</string>
|
||||
@@ -766,17 +770,17 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">「音楽を保存」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">「音楽を保存」ボタンは表示されます</string>
|
||||
<string name="revanced_hide_shorts_use_sound_button_title">「このサウンドを使用する」ボタンを非表示</string>
|
||||
<string name="revanced_hide_shorts_use_sound_button_summary_on">「このサウンドを使用する」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_use_sound_button_summary_off">「このサウンドを使用する」ボタンは表示されます</string>
|
||||
<string name="revanced_hide_shorts_use_sound_button_summary_on">「このサウンドを使用する」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_shorts_use_sound_button_summary_off">「このサウンドを使用する」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_title">「このテンプレートを使用する」ボタンを非表示</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_on">「このテンプレートを使用する」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_off">「このテンプレートを使用する」ボタンは表示されます</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_on">「このテンプレートを使用する」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_off">「このテンプレートを使用する」ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_shorts_upcoming_button_title">今後の動画ボタンを非表示</string>
|
||||
<string name="revanced_hide_shorts_upcoming_button_summary_on">今後の動画ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_upcoming_button_summary_off">今後の動画ボタンは表示されます</string>
|
||||
<string name="revanced_hide_shorts_effect_button_title">効果ボタンを非表示</string>
|
||||
<string name="revanced_hide_shorts_effect_button_summary_on">効果ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_effect_button_summary_off">効果ボタンは表示されます</string>
|
||||
<string name="revanced_hide_shorts_effect_button_summary_on">効果ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_shorts_effect_button_summary_off">効果ボタンを非表示にします</string>
|
||||
<string name="revanced_hide_shorts_green_screen_button_title">グリーンスクリーン ボタンを非表示</string>
|
||||
<string name="revanced_hide_shorts_green_screen_button_summary_on">グリーンスクリーン ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_green_screen_button_summary_off">グリーンスクリーン ボタンは表示されます</string>
|
||||
@@ -960,16 +964,30 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<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_off">スキップボタンは、セグメントの開始から終了まで表示されます</string>
|
||||
<string name="revanced_sb_general_skiptoast">スキップ時にトーストを表示する</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">セグメントが自動的にスキップされると、トースト ポップアップが表示されます。サンプルを表示するには、ここをタップしてください</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">セグメントが自動的にスキップされても、トースト ポップアップは表示されません。サンプルを表示するには、ここをタップしてください</string>
|
||||
<string name="revanced_sb_general_time_without">セグメントを除いた再生時間を表示する</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">セグメントを除いた再生時間が、動画全体の再生時間の横に括弧付きで表示されます</string>
|
||||
<string name="revanced_sb_general_time_without_sum_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_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_duration_1s">1 秒</string>
|
||||
<string name="revanced_sb_duration_2s">2 秒</string>
|
||||
<string name="revanced_sb_duration_3s">3 秒</string>
|
||||
<string name="revanced_sb_duration_4s">4 秒</string>
|
||||
<string name="revanced_sb_duration_5s">5 秒</string>
|
||||
<string name="revanced_sb_duration_6s">6 秒</string>
|
||||
<string name="revanced_sb_duration_7s">7 秒</string>
|
||||
<string name="revanced_sb_duration_8s">8 秒</string>
|
||||
<string name="revanced_sb_duration_9s">9 秒</string>
|
||||
<string name="revanced_sb_duration_10s">10 秒</string>
|
||||
<string name="revanced_sb_general_time_without">セグメントを除いた再生時間を表示</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">シークバーにすべてのセグメントを除いた再生時間を表示します</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">シークバーにすべてのセグメントを除いた再生時間を表示します</string>
|
||||
<string name="revanced_sb_create_segment_category">セグメントの作成</string>
|
||||
<string name="revanced_sb_enable_create_segment">セグメント作成ボタンを表示する</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_on">セグメント作成ボタンはプレーヤー オーバーレイに表示されます</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_off">セグメント作成ボタンはプレーヤー オーバーレイに表示されません</string>
|
||||
<string name="revanced_sb_enable_create_segment">セグメント作成ボタンを表示</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_on">プレーヤー オーバーレイにセグメント作成ボタンを表示します</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_off">プレーヤー オーバーレイにセグメント作成ボタンを表示します</string>
|
||||
<string name="revanced_sb_general_adjusting">セグメントの時間調整幅</string>
|
||||
<string name="revanced_sb_general_adjusting_sum">セグメント作成メニュー内の早送り / 巻き戻しボタンで移動する時間 (ミリ秒)</string>
|
||||
<string name="revanced_sb_general_adjusting_invalid">値は正の整数でなければなりません</string>
|
||||
@@ -1387,9 +1405,9 @@ Automotive レイアウト
|
||||
<string name="revanced_remove_tracking_query_parameter_summary_off">追跡パラメータはリンクから削除されません</string>
|
||||
</patch>
|
||||
<patch id="video.audio.forceOriginalAudioPatch">
|
||||
<string name="revanced_force_original_audio_title">デフォルトでの吹き替え再生を無効にする</string>
|
||||
<string name="revanced_force_original_audio_summary_on">動画を開いたとき、オリジナルの音声が再生されます</string>
|
||||
<string name="revanced_force_original_audio_summary_off">動画を開いたとき、吹き替え音声が再生される場合があります</string>
|
||||
<string name="revanced_force_original_audio_title">デフォルトでの吹き替え再生を無効化</string>
|
||||
<string name="revanced_force_original_audio_summary_on">動画を開いた際に強制的にオリジナルの音声トラックを再生します</string>
|
||||
<string name="revanced_force_original_audio_summary_off">動画を開いた際に強制的にオリジナルの音声トラックを再生します</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_force_original_audio_not_available">この機能を使用するには、「動画ストリームを偽装する」のクライアントを iOS TV に変更してください</string>
|
||||
</patch>
|
||||
@@ -1399,9 +1417,9 @@ Automotive レイアウト
|
||||
<string name="revanced_remember_video_quality_last_selected_title">画質の変更を保存する</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_on">画質の変更はすべての動画に適用されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_off">画質の変更は現在の動画にのみ適用されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_title">画質変更時にトーストを表示する</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">デフォルトの動画品質が変更されると、トースト ポップアップが表示されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">デフォルトの動画品質が変更されても、トースト ポップアップは表示されません</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_title">画質の変更時にトーストを表示</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">デフォルトの画質が変更された際に、トースト ポップアップを表示します</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">デフォルトの画質が変更された際に、トースト ポップアップを表示します</string>
|
||||
<string name="revanced_video_quality_default_wifi_title">デフォルトの画質(Wi-Fi)</string>
|
||||
<string name="revanced_video_quality_default_mobile_title">デフォルトの画質(携帯回線)</string>
|
||||
<string name="revanced_remember_shorts_quality_last_selected_title">ショートの画質の変更を保存する</string>
|
||||
@@ -1435,9 +1453,9 @@ Automotive レイアウト
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">再生速度の変更を保存する</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_summary_on">再生速度の変更はすべての動画に適用されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_summary_off">再生速度の変更は現在の動画にのみ適用されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_title">再生速度変更時にトーストを表示</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">デフォルトの再生速度が変更されると、トースト ポップアップが表示されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">デフォルトの再生速度が変更されても、トースト ポップアップは表示されません</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_title">再生速度の変更時にトーストを表示</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">デフォルトの再生速度が変更された際に、トースト ポップアップを表示します</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">デフォルトの再生速度が変更された際に、トースト ポップアップを表示します</string>
|
||||
<string name="revanced_playback_speed_default_title">デフォルトの再生速度</string>
|
||||
<string name="revanced_remember_playback_speed_toast">デフォルトの再生速度: %s</string>
|
||||
</patch>
|
||||
@@ -1479,7 +1497,7 @@ AVC は、最大解像度が 1080p であり、Opus オーディオ コーデッ
|
||||
<string name="revanced_spoof_video_streams_about_android_title">Android クライアントの副作用</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• 「音声トラック」がフライアウト メニューに表示されない
|
||||
• 「一定音量」が利用できない
|
||||
• 「デフォルトでの吹き替え再生を無効にする」が利用できない"</string>
|
||||
• 「デフォルトでの吹き替え再生を無効化」が利用できない"</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• AV1 コーデックが利用できない</string>
|
||||
<string name="revanced_spoof_video_streams_about_kids_videos">• ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">統計情報に表示する</string>
|
||||
@@ -1535,13 +1553,13 @@ AVC は、最大解像度が 1080p であり、Opus オーディオ コーデッ
|
||||
<string name="revanced_chat_screen_summary">チャットの設定</string>
|
||||
<string name="revanced_misc_screen_title">その他</string>
|
||||
<string name="revanced_misc_screen_summary">その他の設定</string>
|
||||
<string name="revanced_general_category_title">一般設定</string>
|
||||
<string name="revanced_general_category_title">全般設定</string>
|
||||
<string name="revanced_other_category_title">その他の設定</string>
|
||||
<string name="revanced_client_ads_category_title">クライアントサイド広告</string>
|
||||
<string name="revanced_surestream_ads_category_title">サーバー側サレストリーム広告</string>
|
||||
<string name="revanced_twitch_debug_title">デバッグログ</string>
|
||||
<string name="revanced_twitch_debug_summary_on">デバッグログは有効です</string>
|
||||
<string name="revanced_twitch_debug_summary_off">デバッグログは無効です</string>
|
||||
<string name="revanced_client_ads_category_title">クライアント側広告</string>
|
||||
<string name="revanced_surestream_ads_category_title">サーバー側 SureStream 広告</string>
|
||||
<string name="revanced_twitch_debug_title">デバッグログを有効化</string>
|
||||
<string name="revanced_twitch_debug_summary_on">デバッグログを有効にします</string>
|
||||
<string name="revanced_twitch_debug_summary_off">デバッグログを有効にします</string>
|
||||
</patch>
|
||||
</app>
|
||||
</resources>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -55,8 +55,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
@@ -70,8 +70,9 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
</patch>
|
||||
<patch id="ad.general.hideAdsResourcePatch">
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="ad.getpremium.hideGetPremiumPatch">
|
||||
</patch>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user