diff --git a/CHANGELOG.md b/CHANGELOG.md index 333cae391..48b9e83d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,72 @@ +# [5.24.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.8...v5.24.0-dev.9) (2025-05-18) + + +### Bug Fixes + +* **YouTube - SponsorBlock:** Fix segment category summary not showing category description ([06934a6](https://github.com/ReVanced/revanced-patches/commit/06934a60d91b40a5cdf7f4cd92deae4a136c149b)) + +# [5.24.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.7...v5.24.0-dev.8) (2025-05-17) + + +### Bug Fixes + +* **YouTube - Settings:** Correctly show summary text if search box is closed before searching ([d0ae835](https://github.com/ReVanced/revanced-patches/commit/d0ae835d3381fc659c9bb4a2d130d4db8a1499cf)) + +# [5.24.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.6...v5.24.0-dev.7) (2025-05-17) + + +### Features + +* **YouTube - Hide layout components:** Add `Hide ticket shelf` ([#4969](https://github.com/ReVanced/revanced-patches/issues/4969)) ([6436af7](https://github.com/ReVanced/revanced-patches/commit/6436af7e77c77d2034dfceba8bc51132ad7632be)) + +# [5.24.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.5...v5.24.0-dev.6) (2025-05-17) + + +### Features + +* **YouTube - Hide description components:** Add `Hide Ask` ([#4972](https://github.com/ReVanced/revanced-patches/issues/4972)) ([ebc94a5](https://github.com/ReVanced/revanced-patches/commit/ebc94a5da6214b67399c9c01515689bd4b20547c)) + +# [5.24.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.4...v5.24.0-dev.5) (2025-05-17) + + +### Bug Fixes + +* **Spotify - Fix third party launchers widgets:** Add missing compatibility annotation ([0493f80](https://github.com/ReVanced/revanced-patches/commit/0493f8035b26b90c5f8e42be2e2a5ce73d8685a5)) + + +### Features + +* **YouTube - Settings:** Add ability to search in settings ([#4881](https://github.com/ReVanced/revanced-patches/issues/4881)) ([aca8b20](https://github.com/ReVanced/revanced-patches/commit/aca8b207c15f254bcc9ad94bc7dfb895f21d4058)) + +# [5.24.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.3...v5.24.0-dev.4) (2025-05-16) + + +### Features + +* **Spotify:** Add `Fix third party launchers widgets` patch ([#4893](https://github.com/ReVanced/revanced-patches/issues/4893)) ([23bfdc9](https://github.com/ReVanced/revanced-patches/commit/23bfdc98fbbcc8ecf0ffbf8704f58dd2272e4af2)) + +# [5.24.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.2...v5.24.0-dev.3) (2025-05-14) + + +### Bug Fixes + +* **YouTube - Hide layout components:** Fix `Hide video recommendation labels` ([#4956](https://github.com/ReVanced/revanced-patches/issues/4956)) ([ae05ac3](https://github.com/ReVanced/revanced-patches/commit/ae05ac38151ebd3197953af97ca0dd847a04cc2d)) + +# [5.24.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.24.0-dev.1...v5.24.0-dev.2) (2025-05-14) + + +### Features + +* **GmsCore support:** Open vendor specific DontKillMyApp if available ([#4952](https://github.com/ReVanced/revanced-patches/issues/4952)) ([b89927a](https://github.com/ReVanced/revanced-patches/commit/b89927a10e3b909a3c37fbb75c16a7abbce44560)) +* **YouTube - Hide player components:** Hide related video overlay in fullscreen ([#4938](https://github.com/ReVanced/revanced-patches/issues/4938)) ([ac9be97](https://github.com/ReVanced/revanced-patches/commit/ac9be9760c9965e54df196b227a310d64ead4bf5)) + +# [5.24.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.23.0...v5.24.0-dev.1) (2025-05-12) + + +### Features + +* **NU.nl:** Support version `11.3.0` ([#4925](https://github.com/ReVanced/revanced-patches/issues/4925)) ([bedde60](https://github.com/ReVanced/revanced-patches/commit/bedde60fc1a52b0fd491174b3b5b887435eb621a)) + # [5.23.0](https://github.com/ReVanced/revanced-patches/compare/v5.22.0...v5.23.0) (2025-05-10) diff --git a/extensions/nunl/src/main/java/app/revanced/extension/nunl/ads/HideAdsPatch.java b/extensions/nunl/src/main/java/app/revanced/extension/nunl/ads/HideAdsPatch.java index fb3cd0c54..2e4ab5b06 100644 --- a/extensions/nunl/src/main/java/app/revanced/extension/nunl/ads/HideAdsPatch.java +++ b/extensions/nunl/src/main/java/app/revanced/extension/nunl/ads/HideAdsPatch.java @@ -82,7 +82,7 @@ public class HideAdsPatch { // Filter HeaderBlock with known ads until next HeaderBlock. if (currentBlock instanceof HeaderBlock headerBlock) { - StyledText headerText = headerBlock.component20(); + StyledText headerText = headerBlock.getTitle(); if (headerText != null) { skipFullHeader = false; for (String blockedHeaderBlock : blockedHeaderBlocks) { diff --git a/extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/HeaderBlock.java b/extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/HeaderBlock.java index f946b54da..7b1f7ad19 100644 --- a/extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/HeaderBlock.java +++ b/extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/HeaderBlock.java @@ -3,8 +3,7 @@ package nl.nu.performance.api.client.objects; import nl.nu.performance.api.client.interfaces.Block; public class HeaderBlock extends Block { - // returns title - public final StyledText component20() { + public final StyledText getTitle() { throw new UnsupportedOperationException("Stub"); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java index 5debdd649..585721491 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java @@ -1,6 +1,7 @@ package app.revanced.extension.shared; import static app.revanced.extension.shared.StringRef.str; +import static app.revanced.extension.shared.requests.Route.Method.GET; import android.annotation.SuppressLint; import android.app.Activity; @@ -15,10 +16,16 @@ import android.os.Build; import android.os.PowerManager; import android.provider.Settings; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.Locale; + +import app.revanced.extension.shared.requests.Requester; +import app.revanced.extension.shared.requests.Route; @SuppressWarnings("unused") public class GmsCoreSupport { @@ -29,10 +36,24 @@ public class GmsCoreSupport { = getGmsCoreVendorGroupId() + ".android.gms"; private static final Uri GMS_CORE_PROVIDER = Uri.parse("content://" + getGmsCoreVendorGroupId() + ".android.gsf.gservices/prefix"); - private static final String DONT_KILL_MY_APP_LINK - = "https://dontkillmyapp.com"; + private static final String DONT_KILL_MY_APP_URL + = "https://dontkillmyapp.com/"; + private static final Route DONT_KILL_MY_APP_MANUFACTURER_API + = new Route(GET, "/api/v2/{manufacturer}.json"); + private static final String DONT_KILL_MY_APP_NAME_PARAMETER + = "?app=MicroG"; + private static final String BUILD_MANUFACTURER + = Build.MANUFACTURER.toLowerCase(Locale.ROOT).replace(" ", "-"); + + /** + * If a manufacturer specific page exists on DontKillMyApp. + */ + @Nullable + private static volatile Boolean DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED; private static void open(String queryOrLink) { + Logger.printInfo(() -> "Opening link: " + queryOrLink); + Intent intent; try { // Check if queryOrLink is a valid URL. @@ -86,7 +107,7 @@ public class GmsCoreSupport { // Do not exit. If the app exits before launch completes (and without // opening another activity), then on some devices such as Pixel phone Android 10 - // no toast will be shown and the app will continually be relaunched + // no toast will be shown and the app will continually relaunch // with the appearance of a hung app. } @@ -122,11 +143,12 @@ public class GmsCoreSupport { try (var client = context.getContentResolver().acquireContentProviderClient(GMS_CORE_PROVIDER)) { if (client == null) { Logger.printInfo(() -> "GmsCore is not running in the background"); + checkIfDontKillMyAppSupportsManufacturer(); showBatteryOptimizationDialog(context, "gms_core_dialog_not_whitelisted_not_allowed_in_background_message", "gms_core_dialog_open_website_text", - (dialog, id) -> open(DONT_KILL_MY_APP_LINK)); + (dialog, id) -> openDontKillMyApp()); } } } catch (Exception ex) { @@ -141,6 +163,48 @@ public class GmsCoreSupport { activity.startActivityForResult(intent, 0); } + private static void checkIfDontKillMyAppSupportsManufacturer() { + Utils.runOnBackgroundThread(() -> { + try { + final long start = System.currentTimeMillis(); + HttpURLConnection connection = Requester.getConnectionFromRoute( + DONT_KILL_MY_APP_URL, DONT_KILL_MY_APP_MANUFACTURER_API, BUILD_MANUFACTURER); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + + final boolean supported = connection.getResponseCode() == 200; + Logger.printInfo(() -> "Manufacturer is " + (supported ? "" : "NOT ") + + "listed on DontKillMyApp: " + BUILD_MANUFACTURER + + " fetch took: " + (System.currentTimeMillis() - start) + "ms"); + DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED = supported; + } catch (Exception ex) { + Logger.printInfo(() -> "Could not check if manufacturer is listed on DontKillMyApp: " + + BUILD_MANUFACTURER, ex); + DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED = null; + } + }); + } + + private static void openDontKillMyApp() { + final Boolean manufacturerSupported = DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED; + + String manufacturerPageToOpen; + if (manufacturerSupported == null) { + // Fetch has not completed yet. Only happens on extremely slow internet connections + // and the user spends less than 1 second reading what's on screen. + // Instead of waiting for the fetch (which may timeout), + // open the website without a vendor. + manufacturerPageToOpen = ""; + } else if (manufacturerSupported) { + manufacturerPageToOpen = BUILD_MANUFACTURER; + } else { + // No manufacturer specific page exists. Open the general page. + manufacturerPageToOpen = "general"; + } + + open(DONT_KILL_MY_APP_URL + manufacturerPageToOpen + DONT_KILL_MY_APP_NAME_PARAMETER); + } + /** * @return If GmsCore is not whitelisted from battery optimizations. */ diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index 8343d595c..3cb809a2d 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -371,7 +371,7 @@ public class Utils { if (language != AppLanguage.DEFAULT) { // Create a new context with the desired language. Logger.printDebug(() -> "Using app language: " + language); - Configuration config = appContext.getResources().getConfiguration(); + Configuration config = new Configuration(appContext.getResources().getConfiguration()); config.setLocale(language.getLocale()); context = appContext.createConfigurationContext(config); } @@ -391,16 +391,47 @@ public class Utils { private static Boolean isRightToLeftTextLayout; /** - * If the device language uses right to left text layout (hebrew, arabic, etc) + * @return If the device language uses right to left text layout (Hebrew, Arabic, etc). + * If this should match any ReVanced language override then instead use + * {@link #isRightToLeftLocale(Locale)} with {@link BaseSettings#REVANCED_LANGUAGE}. + * This is the default locale of the device, which may differ if + * {@link BaseSettings#REVANCED_LANGUAGE} is set to a different language. */ - public static boolean isRightToLeftTextLayout() { + public static boolean isRightToLeftLocale() { if (isRightToLeftTextLayout == null) { - String displayLanguage = Locale.getDefault().getDisplayLanguage(); - isRightToLeftTextLayout = new Bidi(displayLanguage, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT).isRightToLeft(); + isRightToLeftTextLayout = isRightToLeftLocale(Locale.getDefault()); } return isRightToLeftTextLayout; } + /** + * @return If the locale uses right to left text layout (Hebrew, Arabic, etc). + */ + public static boolean isRightToLeftLocale(Locale locale) { + String displayLanguage = locale.getDisplayLanguage(); + return new Bidi(displayLanguage, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT).isRightToLeft(); + } + + /** + * @return A UTF8 string containing a left-to-right or right-to-left + * character of the device locale. If this should match any ReVanced language + * override then instead use {@link #getTextDirectionString(Locale)} with + * {@link BaseSettings#REVANCED_LANGUAGE}. + */ + public static String getTextDirectionString() { + return getTextDirectionString(isRightToLeftLocale()); + } + + public static String getTextDirectionString(Locale locale) { + return getTextDirectionString(isRightToLeftLocale(locale)); + } + + private static String getTextDirectionString(boolean isRightToLeft) { + return isRightToLeft + ? "\u200F" // u200F = right to left character. + : "\u200E"; // u200E = left to right character. + } + /** * @return if the text contains at least 1 number character, * including any unicode numbers such as Arabic. @@ -692,9 +723,10 @@ public class Utils { /** * Strips all punctuation and converts to lower case. A null parameter returns an empty string. */ - public static String removePunctuationConvertToLowercase(@Nullable CharSequence original) { + public static String removePunctuationToLowercase(@Nullable CharSequence original) { if (original == null) return ""; - return punctuationPattern.matcher(original).replaceAll("").toLowerCase(); + return punctuationPattern.matcher(original).replaceAll("") + .toLowerCase(BaseSettings.REVANCED_LANGUAGE.get().getLocale()); } /** @@ -726,7 +758,7 @@ public class Utils { final String sortValue; switch (preferenceSort) { case BY_TITLE: - sortValue = removePunctuationConvertToLowercase(preference.getTitle()); + sortValue = removePunctuationToLowercase(preference.getTitle()); break; case BY_KEY: sortValue = preference.getKey(); @@ -810,4 +842,12 @@ public class Utils { } return getResourceColor(colorString); } + + public static int clamp(int value, int lower, int upper) { + return Math.max(lower, Math.min(value, upper)); + } + + public static float clamp(float value, float lower, float upper) { + return Math.max(lower, Math.min(value, upper)); + } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java index 877f4ba22..944529f4e 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java @@ -89,9 +89,11 @@ public enum AppLanguage { ZU; private final String language; + private final Locale locale; AppLanguage() { language = name().toLowerCase(Locale.US); + locale = Locale.forLanguageTag(language); } /** @@ -112,6 +114,6 @@ public enum AppLanguage { return Locale.getDefault(); } - return Locale.forLanguageTag(language); + return locale; } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/NoTitlePreferenceCategory.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/NoTitlePreferenceCategory.java index 73255b028..d6b895f22 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/NoTitlePreferenceCategory.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/NoTitlePreferenceCategory.java @@ -21,6 +21,10 @@ public class NoTitlePreferenceCategory extends PreferenceCategory { super(context, attrs, defStyleAttr); } + public NoTitlePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + public NoTitlePreferenceCategory(Context context) { super(context); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SortedListPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SortedListPreference.java new file mode 100644 index 000000000..c5d166a7f --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SortedListPreference.java @@ -0,0 +1,107 @@ +package app.revanced.extension.shared.settings.preference; + +import android.content.Context; +import android.preference.ListPreference; +import android.util.AttributeSet; +import android.util.Pair; + +import java.util.ArrayList; +import java.util.List; +import java.util.SortedMap; +import java.util.TreeMap; + +import app.revanced.extension.shared.Utils; + +/** + * PreferenceList that sorts itself. + * By default the first entry is preserved in its original position, + * and all other entries are sorted alphabetically. + * + * Ideally the 'keep first entries to preserve' is an xml parameter, + * but currently that's not so simple since Extensions code cannot use + * generated code from the Patches repo (which is required for custom xml parameters). + * + * If any class wants to use a different getFirstEntriesToPreserve value, + * it needs to subclass this preference and override {@link #getFirstEntriesToPreserve}. + */ +@SuppressWarnings({"unused", "deprecation"}) +public class SortedListPreference extends ListPreference { + + /** + * Sorts the current list entries. + * + * @param firstEntriesToPreserve The number of entries to preserve in their original position. + */ + public void sortEntryAndValues(int firstEntriesToPreserve) { + CharSequence[] entries = getEntries(); + CharSequence[] entryValues = getEntryValues(); + if (entries == null || entryValues == null) { + return; + } + + final int entrySize = entries.length; + if (entrySize != entryValues.length) { + // Xml array declaration has a missing/extra entry. + throw new IllegalStateException(); + } + + List> firstEntries = new ArrayList<>(firstEntriesToPreserve); + SortedMap> lastEntries = new TreeMap<>(); + + for (int i = 0; i < entrySize; i++) { + Pair pair = new Pair<>(entries[i], entryValues[i]); + if (i < firstEntriesToPreserve) { + firstEntries.add(pair); + } else { + lastEntries.put(Utils.removePunctuationToLowercase(pair.first), pair); + } + } + + CharSequence[] sortedEntries = new CharSequence[entrySize]; + CharSequence[] sortedEntryValues = new CharSequence[entrySize]; + + int i = 0; + for (Pair pair : firstEntries) { + sortedEntries[i] = pair.first; + sortedEntryValues[i] = pair.second; + i++; + } + + for (Pair pair : lastEntries.values()) { + sortedEntries[i] = pair.first; + sortedEntryValues[i] = pair.second; + i++; + } + + super.setEntries(sortedEntries); + super.setEntryValues(sortedEntryValues); + } + + protected int getFirstEntriesToPreserve() { + return 1; + } + + public SortedListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + sortEntryAndValues(getFirstEntriesToPreserve()); + } + + public SortedListPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + sortEntryAndValues(getFirstEntriesToPreserve()); + } + + public SortedListPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + sortEntryAndValues(getFirstEntriesToPreserve()); + } + + public SortedListPreference(Context context) { + super(context); + + sortEntryAndValues(getFirstEntriesToPreserve()); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java index f541b2347..0177c9cbc 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java @@ -1,10 +1,18 @@ package app.revanced.extension.youtube; +import static app.revanced.extension.shared.Utils.clamp; + import android.app.Activity; +import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; import android.os.Build; +import android.text.style.ReplacementSpan; +import android.text.TextPaint; import android.view.Window; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; @@ -121,4 +129,43 @@ public class ThemeHelper { window.setNavigationBarContrastEnforced(true); } } + + /** + * Adjusts the brightness of a color by lightening or darkening it based on the given factor. + *

+ * If the factor is greater than 1, the color is lightened by interpolating toward white (#FFFFFF). + * If the factor is less than or equal to 1, the color is darkened by scaling its RGB components toward black (#000000). + * The alpha channel remains unchanged. + * + * @param color The input color to adjust, in ARGB format. + * @param factor The adjustment factor. Use values > 1.0f to lighten (e.g., 1.11f for slight lightening) + * or values <= 1.0f to darken (e.g., 0.95f for slight darkening). + * @return The adjusted color in ARGB format. + */ + public static int adjustColorBrightness(int color, float factor) { + final int alpha = Color.alpha(color); + int red = Color.red(color); + int green = Color.green(color); + int blue = Color.blue(color); + + if (factor > 1.0f) { + // Lighten: Interpolate toward white (255) + final float t = 1.0f - (1.0f / factor); // Interpolation parameter + red = Math.round(red + (255 - red) * t); + green = Math.round(green + (255 - green) * t); + blue = Math.round(blue + (255 - blue) * t); + } else { + // Darken or no change: Scale toward black + red = (int) (red * factor); + green = (int) (green * factor); + blue = (int) (blue * factor); + } + + // Ensure values are within [0, 255] + red = clamp(red, 0, 255); + green = clamp(green, 0, 255); + blue = clamp(blue, 0, 255); + + return Color.argb(alpha, red, green, blue); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java new file mode 100644 index 000000000..423a7951c --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java @@ -0,0 +1,13 @@ +package app.revanced.extension.youtube.patches; + +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public final class HideRelatedVideoOverlayPatch { + /** + * Injection point. + */ + public static boolean hideRelatedVideoOverlay() { + return Settings.HIDE_RELATED_VIDEO_OVERLAY.get(); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index c5ba1c033..2db744ae6 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -18,7 +18,6 @@ import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.patches.components.ReturnYouTubeDislikeFilterPatch; import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike; -import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.PlayerType; @@ -69,13 +68,6 @@ public class ReturnYouTubeDislikePatch { @Nullable private static volatile String lastPrefetchedVideoId; - public static void onRYDStatusChange(boolean rydEnabled) { - ReturnYouTubeDislikeApi.resetRateLimits(); - // Must remove all values to protect against using stale data - // if the user enables RYD while a video is on screen. - clearData(); - } - private static void clearData() { currentVideoData = null; lastLithoShortsVideoData = null; @@ -274,7 +266,7 @@ public class ReturnYouTubeDislikePatch { Logger.printDebug(() -> "Adding rolling number TextView changes"); view.setCompoundDrawablePadding(ReturnYouTubeDislike.leftSeparatorShapePaddingPixels); ShapeDrawable separator = ReturnYouTubeDislike.getLeftSeparatorDrawable(); - if (Utils.isRightToLeftTextLayout()) { + if (Utils.isRightToLeftLocale()) { view.setCompoundDrawables(null, null, separator, null); } else { view.setCompoundDrawables(separator, null, null, null); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java index aeff4ac26..90f18a6c2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java @@ -36,7 +36,7 @@ public final class WideSearchbarPatch { final int paddingStart = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, Resources.getSystem().getDisplayMetrics()); - if (Utils.isRightToLeftTextLayout()) { + if (Utils.isRightToLeftLocale()) { searchBarView.setPadding(paddingLeft, paddingTop, paddingStart, paddingBottom); } else { searchBarView.setPadding(paddingStart, paddingTop, paddingRight, paddingBottom); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java index 5f47290e9..78015ea79 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java @@ -177,10 +177,7 @@ public final class AdsFilter extends Filter { boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == playerShoppingShelf) { - if (contentIndex == 0 && playerShoppingShelfBuffer.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return contentIndex == 0 && playerShoppingShelfBuffer.check(protobufBufferArray).isFiltered(); } // Check for the index because of likelihood of false positives. @@ -198,13 +195,10 @@ public final class AdsFilter extends Filter { } if (matchedGroup == channelProfile) { - if (visitStoreButton.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return visitStoreButton.check(protobufBufferArray).isFiltered(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java index 308be8ce8..3ad2070ed 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java @@ -99,29 +99,23 @@ final class ButtonsFilter extends Filter { boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == likeSubscribeGlow) { - if ((path.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) || path.startsWith(COMPACT_CHANNEL_BAR_PATH_PREFIX)) - && path.contains(ANIMATED_VECTOR_TYPE_PATH)) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return (path.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) || path.startsWith(COMPACT_CHANNEL_BAR_PATH_PREFIX)) + && path.contains(ANIMATED_VECTOR_TYPE_PATH); } // If the current matched group is the action bar group, // in case every filter group is enabled, hide the action bar. if (matchedGroup == actionBarGroup) { - if (!isEveryFilterGroupEnabled()) { - return false; - } - } else if (matchedGroup == bufferFilterPathGroup) { - // Make sure the current path is the right one - // to avoid false positives. - if (!path.startsWith(VIDEO_ACTION_BAR_PATH)) return false; - - // In case the group list has no match, return false. - if (!bufferButtonsGroupList.check(protobufBufferArray).isFiltered()) return false; + return isEveryFilterGroupEnabled(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + if (matchedGroup == bufferFilterPathGroup) { + // Make sure the current path is the right one + // to avoid false positives. + return path.startsWith(VIDEO_ACTION_BAR_PATH) + && bufferButtonsGroupList.check(protobufBufferArray).isFiltered(); + } + + return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java index ec58b2ee2..d30504c2c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java @@ -88,22 +88,15 @@ final class CommentsFilter extends Filter { if (matchedGroup == commentComposer) { // To completely hide the emoji buttons (and leave no empty space), the timestamp button is // also hidden because the buffer is exactly the same and there's no way selectively hide. - if (contentIndex == 0 + return contentIndex == 0 && path.endsWith(TIMESTAMP_OR_EMOJI_BUTTONS_ENDS_WITH_PATH) - && emojiPickerBufferGroup.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + && emojiPickerBufferGroup.check(protobufBufferArray).isFiltered(); } if (matchedGroup == filterChipBar) { - if (aiCommentsSummary.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return aiCommentsSummary.check(protobufBufferArray).isFiltered(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java index 37062d6e2..263921fff 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java @@ -153,9 +153,11 @@ final class CustomFilter extends Filter { if (custom.startsWith && contentIndex != 0) { return false; } - if (custom.bufferSearch != null && !custom.bufferSearch.matches(protobufBufferArray)) { - return false; + + if (custom.bufferSearch == null) { + return true; // No buffer filter, only path filtering. } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + + return custom.bufferSearch.matches(protobufBufferArray); } } \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java index 3ccdd97f8..8e69ac407 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java @@ -28,6 +28,11 @@ final class DescriptionComponentsFilter extends Filter { "cell_expandable_metadata.eml" ); + final StringFilterGroup askSection = new StringFilterGroup( + Settings.HIDE_ASK_SECTION, + "youchat_entrypoint.eml" + ); + final StringFilterGroup attributesSection = new StringFilterGroup( Settings.HIDE_ATTRIBUTES_SECTION, "gaming_section", @@ -73,6 +78,7 @@ final class DescriptionComponentsFilter extends Filter { addPathCallbacks( aiGeneratedVideoSummarySection, + askSection, attributesSection, infoCardsSection, howThisWasMadeSection, @@ -88,13 +94,9 @@ final class DescriptionComponentsFilter extends Filter { if (exceptions.matches(path)) return false; if (matchedGroup == macroMarkersCarousel) { - if (contentIndex == 0 && macroMarkersCarouselGroupList.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return contentIndex == 0 && macroMarkersCarouselGroupList.check(protobufBufferArray).isFiltered(); } - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java index 42b86d589..ddec956f0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java @@ -6,9 +6,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.settings.BaseSettings; - /** * Filters litho based components. * @@ -62,10 +59,7 @@ abstract class Filter { * Called after an enabled filter has been matched. * Default implementation is to always filter the matched component and log the action. * Subclasses can perform additional or different checks if needed. - *

- * If the content is to be filtered, subclasses should always - * call this method (and never return a plain 'true'). - * That way the logs will always show when a component was filtered and which filter hide it. + * *

* Method is called off the main thread. * @@ -76,14 +70,6 @@ abstract class Filter { */ boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { - if (BaseSettings.DEBUG.get()) { - String filterSimpleName = getClass().getSimpleName(); - if (contentType == FilterContentType.IDENTIFIER) { - Logger.printDebug(() -> filterSimpleName + " Filtered identifier: " + identifier); - } else { - Logger.printDebug(() -> filterSimpleName + " Filtered path: " + path); - } - } return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java index d365d6802..45fdcd7d2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java @@ -576,7 +576,7 @@ final class KeywordContentFilter extends Filter { MutableReference matchRef = new MutableReference<>(); if (bufferSearch.matches(protobufBufferArray, matchRef)) { updateStats(true, matchRef.value); - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } updateStats(false, null); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java index 5f6bffd1a..347491a46 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java @@ -34,12 +34,11 @@ public final class LayoutComponentsFilter extends Filter { private final StringFilterGroup notifyMe; private final StringFilterGroup singleItemInformationPanel; private final StringFilterGroup expandableMetadata; - private final ByteArrayFilterGroup searchResultRecommendations; - private final StringFilterGroup searchResultVideo; private final StringFilterGroup compactChannelBarInner; private final StringFilterGroup compactChannelBarInnerButton; private final ByteArrayFilterGroup joinMembershipButton; private final StringFilterGroup horizontalShelves; + private final ByteArrayFilterGroup ticketShelf; public LayoutComponentsFilter() { exceptions.addPatterns( @@ -233,14 +232,9 @@ public final class LayoutComponentsFilter extends Filter { "mixed_content_shelf" ); - searchResultVideo = new StringFilterGroup( - Settings.HIDE_SEARCH_RESULT_RECOMMENDATIONS, - "search_video_with_context.eml" - ); - - searchResultRecommendations = new ByteArrayFilterGroup( - Settings.HIDE_SEARCH_RESULT_RECOMMENDATIONS, - "endorsement_header_footer" + final var searchResultRecommendationLabels = new StringFilterGroup( + Settings.HIDE_SEARCH_RESULT_RECOMMENDATION_LABELS, + "endorsement_header_footer.eml" ); horizontalShelves = new StringFilterGroup( @@ -251,6 +245,11 @@ public final class LayoutComponentsFilter extends Filter { "horizontal_tile_shelf.eml" ); + ticketShelf = new ByteArrayFilterGroup( + Settings.HIDE_TICKET_SHELF, + "ticket" + ); + addPathCallbacks( expandableMetadata, inFeedSurvey, @@ -258,7 +257,7 @@ public final class LayoutComponentsFilter extends Filter { compactChannelBar, communityPosts, paidPromotion, - searchResultVideo, + searchResultRecommendationLabels, latestPosts, channelWatermark, communityGuidelines, @@ -293,50 +292,29 @@ public final class LayoutComponentsFilter extends Filter { // From 2025, the medical information panel is no longer shown in the search results. // Therefore, this identifier does not filter when the search bar is activated. if (matchedGroup == singleItemInformationPanel) { - if (PlayerType.getCurrent().isMaximizedOrFullscreen() || !NavigationBar.isSearchBarActive()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; - } - - if (matchedGroup == searchResultVideo) { - if (searchResultRecommendations.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return PlayerType.getCurrent().isMaximizedOrFullscreen() || !NavigationBar.isSearchBarActive(); } // The groups are excluded from the filter due to the exceptions list below. // Filter them separately here. - if (matchedGroup == notifyMe || matchedGroup == inFeedSurvey || matchedGroup == expandableMetadata) - { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + if (matchedGroup == notifyMe || matchedGroup == inFeedSurvey || matchedGroup == expandableMetadata) { + return true; } if (exceptions.matches(path)) return false; // Exceptions are not filtered. if (matchedGroup == compactChannelBarInner) { - if (compactChannelBarInnerButton.check(path).isFiltered()) { - // The filter may be broad, but in the context of a compactChannelBarInnerButton, - // it's safe to assume that the button is the only thing that should be hidden. - if (joinMembershipButton.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - } - - return false; + return compactChannelBarInnerButton.check(path).isFiltered() + // The filter may be broad, but in the context of a compactChannelBarInnerButton, + // it's safe to assume that the button is the only thing that should be hidden. + && joinMembershipButton.check(protobufBufferArray).isFiltered(); } if (matchedGroup == horizontalShelves) { - if (contentIndex == 0 && hideShelves()) { - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return contentIndex == 0 && (hideShelves() || ticketShelf.check(protobufBufferArray).isFiltered()); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java index 3b054c6e6..ac88185cf 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java @@ -7,6 +7,7 @@ import java.nio.ByteBuffer; import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.StringTrieSearch; import app.revanced.extension.youtube.settings.Settings; @@ -114,12 +115,29 @@ public final class LithoFilterPatch { if (!group.includeInSearch()) { continue; } + for (String pattern : group.filters) { - pathSearchTree.addPattern(pattern, (textSearched, matchedStartIndex, matchedLength, callbackParameter) -> { + String filterSimpleName = filter.getClass().getSimpleName(); + + pathSearchTree.addPattern(pattern, (textSearched, matchedStartIndex, + matchedLength, callbackParameter) -> { if (!group.isEnabled()) return false; + LithoFilterParameters parameters = (LithoFilterParameters) callbackParameter; - return filter.isFiltered(parameters.identifier, parameters.path, parameters.protoBuffer, - group, type, matchedStartIndex); + final boolean isFiltered = filter.isFiltered(parameters.identifier, + parameters.path, parameters.protoBuffer, group, type, matchedStartIndex); + + if (isFiltered && BaseSettings.DEBUG.get()) { + if (type == Filter.FilterContentType.IDENTIFIER) { + Logger.printDebug(() -> "Filtered " + filterSimpleName + + " identifier: " + parameters.identifier); + } else { + Logger.printDebug(() -> "Filtered " + filterSimpleName + + " path: " + parameters.path); + } + } + + return isFiltered; } ); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java index d7c8e6caa..e1401f3ae 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java @@ -99,7 +99,7 @@ public class PlayerFlyoutMenuItemsFilter extends Filter { boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == videoQualityMenuFooter) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } if (contentIndex != 0) { @@ -111,11 +111,6 @@ public class PlayerFlyoutMenuItemsFilter extends Filter { return false; } - if (flyoutFilterGroupList.check(protobufBufferArray).isFiltered()) { - // Super class handles logging. - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return flyoutFilterGroupList.check(protobufBufferArray).isFiltered(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index b647d48c4..ef1cd5bb5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -278,27 +278,18 @@ public final class ShortsFilter extends Filter { if (contentType == FilterContentType.PATH) { if (matchedGroup == subscribeButton || matchedGroup == joinButton || matchedGroup == paidPromotionButton) { // Selectively filter to avoid false positive filtering of other subscribe/join buttons. - if (path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH)) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH); } if (matchedGroup == shortsCompactFeedVideoPath) { - if (shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(protobufBufferArray).isFiltered(); } // Video action buttons (comment, share, remix) have the same path. // Like and dislike are separate path filters and don't require buffer searching. if (matchedGroup == shortsActionBar) { - if (actionButton.check(path).isFiltered() - && videoActionButtonGroupList.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return actionButton.check(path).isFiltered() + && videoActionButtonGroupList.check(protobufBufferArray).isFiltered(); } if (matchedGroup == suggestedAction) { @@ -306,28 +297,23 @@ public final class ShortsFilter extends Filter { // This has a secondary effect of hiding all new un-identified actions // under the assumption that the user wants all suggestions hidden. if (isEverySuggestedActionFilterEnabled()) { - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } - if (suggestedActionsGroupList.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return suggestedActionsGroupList.check(protobufBufferArray).isFiltered(); } - } else { - // Feed/search identifier components. - if (matchedGroup == shelfHeader) { - // Because the header is used in watch history and possibly other places, check for the index, - // which is 0 when the shelf header is used for Shorts. - if (contentIndex != 0) return false; - } - - if (!shouldHideShortsFeedItems()) return false; + return true; } - // Super class handles logging. - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + // Feed/search identifier components. + if (matchedGroup == shelfHeader) { + // Because the header is used in watch history and possibly other places, check for the index, + // which is 0 when the shelf header is used for Shorts. + if (contentIndex != 0) return false; + } + + return shouldHideShortsFeedItems(); } private static boolean shouldHideShortsFeedItems() { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java index 8cde513bd..9b6224106 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java @@ -1,16 +1,12 @@ package app.revanced.extension.youtube.patches.playback.speed; -import static app.revanced.extension.shared.StringRef.sf; import static app.revanced.extension.shared.StringRef.str; -import android.preference.ListPreference; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; -import androidx.annotation.NonNull; - import java.util.Arrays; import app.revanced.extension.shared.Logger; @@ -21,8 +17,6 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class CustomPlaybackSpeedPatch { - private static final float PLAYBACK_SPEED_AUTO = Settings.PLAYBACK_SPEED_DEFAULT.defaultValue; - /** * Maximum playback speed, exclusive value. Custom speeds must be less than this value. *

@@ -47,11 +41,6 @@ public class CustomPlaybackSpeedPatch { */ private static long lastTimeOldPlaybackMenuInvoked; - /** - * PreferenceList entries and values, of all available playback speeds. - */ - private static String[] preferenceListEntries, preferenceListEntryValues; - static { final float holdSpeed = Settings.SPEED_TAP_AND_HOLD.get(); @@ -117,33 +106,6 @@ public class CustomPlaybackSpeedPatch { return false; } - /** - * Initialize a settings preference list with the available playback speeds. - */ - @SuppressWarnings("deprecation") - public static void initializeListPreference(ListPreference preference) { - if (preferenceListEntries == null) { - final int numberOfEntries = customPlaybackSpeeds.length + 1; - preferenceListEntries = new String[numberOfEntries]; - preferenceListEntryValues = new String[numberOfEntries]; - - // Auto speed (same behavior as unpatched). - preferenceListEntries[0] = sf("revanced_custom_playback_speeds_auto").toString(); - preferenceListEntryValues[0] = String.valueOf(PLAYBACK_SPEED_AUTO); - - int i = 1; - for (float speed : customPlaybackSpeeds) { - String speedString = String.valueOf(speed); - preferenceListEntries[i] = speedString + "x"; - preferenceListEntryValues[i] = speedString; - i++; - } - } - - preference.setEntries(preferenceListEntries); - preference.setEntryValues(preferenceListEntryValues); - } - /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java index 2283106bf..4d036509e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java @@ -1,6 +1,7 @@ package app.revanced.extension.youtube.patches.theme; import static app.revanced.extension.shared.StringRef.str; +import static app.revanced.extension.shared.Utils.clamp; import android.content.res.Resources; import android.graphics.Color; @@ -378,14 +379,4 @@ public final class SeekbarColorPatch { return originalColor; } } - - /** @noinspection SameParameterValue */ - private static int clamp(int value, int lower, int upper) { - return Math.max(lower, Math.min(value, upper)); - } - - /** @noinspection SameParameterValue */ - private static float clamp(float value, float lower, float upper) { - return Math.max(lower, Math.min(value, upper)); - } } \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java index a258dffd2..a0730c055 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java @@ -235,7 +235,7 @@ public class ReturnYouTubeDislike { final boolean compactLayout = Settings.RYD_COMPACT_LAYOUT.get(); if (!compactLayout) { - String leftSeparatorString = getTextDirectionString(); + String leftSeparatorString = Utils.getTextDirectionString(); final Spannable leftSeparatorSpan; if (isRollingNumber) { leftSeparatorSpan = new SpannableString(leftSeparatorString); @@ -279,12 +279,6 @@ public class ReturnYouTubeDislike { return new SpannableString(builder); } - private static @NonNull String getTextDirectionString() { - return Utils.isRightToLeftTextLayout() - ? "\u200F" // u200F = right to left character - : "\u200E"; // u200E = left to right character - } - /** * @return If the text is likely for a previously created likes/dislikes segmented span. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java new file mode 100644 index 000000000..c37b472d3 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java @@ -0,0 +1,29 @@ +package app.revanced.extension.youtube.returnyoutubedislike.ui; + +import android.content.Context; +import android.util.AttributeSet; + +import app.revanced.extension.youtube.settings.preference.UrlLinkPreference; + +/** + * Allows tapping the RYD about preference to open the website. + */ +@SuppressWarnings("unused") +public class ReturnYouTubeDislikeAboutPreference extends UrlLinkPreference { + { + externalUrl = "https://returnyoutubedislike.com"; + } + + public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + public ReturnYouTubeDislikeAboutPreference(Context context) { + super(context); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java new file mode 100644 index 000000000..dac275e4f --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java @@ -0,0 +1,126 @@ +package app.revanced.extension.youtube.returnyoutubedislike.ui; + +import static app.revanced.extension.shared.StringRef.str; + +import android.content.Context; +import android.preference.Preference; +import android.preference.PreferenceCategory; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.settings.BaseSettings; +import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi; + +@SuppressWarnings({"unused", "deprecation"}) +public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends PreferenceCategory { + + private static final boolean SHOW_RYD_DEBUG_STATS = BaseSettings.DEBUG.get(); + + private static String createSummaryText(int value, String summaryStringZeroKey, String summaryStringOneOrMoreKey) { + if (value == 0) { + return str(summaryStringZeroKey); + } + return str(summaryStringOneOrMoreKey, value); + } + + private static String createMillisecondStringFromNumber(long number) { + return String.format(str("revanced_ryd_statistics_millisecond_text"), number); + } + + public ReturnYouTubeDislikeDebugStatsPreferenceCategory(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ReturnYouTubeDislikeDebugStatsPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public ReturnYouTubeDislikeDebugStatsPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected View onCreateView(ViewGroup parent) { + if (!SHOW_RYD_DEBUG_STATS) { + // Use an empty view to hide without removing. + return new View(getContext()); + } + + return super.onCreateView(parent); + } + + protected void onAttachedToActivity() { + try { + super.onAttachedToActivity(); + if (!SHOW_RYD_DEBUG_STATS) { + return; + } + + Logger.printDebug(() -> "Updating stats preferences"); + removeAll(); + + addStatisticPreference( + "revanced_ryd_statistics_getFetchCallResponseTimeAverage_title", + createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeAverage()) + ); + + addStatisticPreference( + "revanced_ryd_statistics_getFetchCallResponseTimeMin_title", + createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMin()) + ); + + addStatisticPreference( + "revanced_ryd_statistics_getFetchCallResponseTimeMax_title", + createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMax()) + ); + + String fetchCallTimeWaitingLastSummary; + final long fetchCallTimeWaitingLast = ReturnYouTubeDislikeApi.getFetchCallResponseTimeLast(); + if (fetchCallTimeWaitingLast == ReturnYouTubeDislikeApi.FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT) { + fetchCallTimeWaitingLastSummary = str("revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary"); + } else { + fetchCallTimeWaitingLastSummary = createMillisecondStringFromNumber(fetchCallTimeWaitingLast); + } + addStatisticPreference( + "revanced_ryd_statistics_getFetchCallResponseTimeLast_title", + fetchCallTimeWaitingLastSummary + ); + + addStatisticPreference( + "revanced_ryd_statistics_getFetchCallCount_title", + createSummaryText(ReturnYouTubeDislikeApi.getFetchCallCount(), + "revanced_ryd_statistics_getFetchCallCount_zero_summary", + "revanced_ryd_statistics_getFetchCallCount_non_zero_summary" + ) + ); + + addStatisticPreference( + "revanced_ryd_statistics_getFetchCallNumberOfFailures_title", + createSummaryText(ReturnYouTubeDislikeApi.getFetchCallNumberOfFailures(), + "revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary", + "revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary" + ) + ); + + addStatisticPreference( + "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title", + createSummaryText(ReturnYouTubeDislikeApi.getNumberOfRateLimitRequestsEncountered(), + "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary", + "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary" + ) + ); + } catch (Exception ex) { + Logger.printException(() -> "onAttachedToActivity failure", ex); + } + } + + private void addStatisticPreference(String titleKey, String SummaryText) { + Preference statisticPreference = new Preference(getContext()); + statisticPreference.setSelectable(false); + statisticPreference.setTitle(str(titleKey)); + statisticPreference.setSummary(SummaryText); + addPreference(statisticPreference); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java index b9c193d1a..5a14ca39c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java @@ -11,8 +11,6 @@ import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toolbar; -import java.util.Objects; - import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.AppLanguage; @@ -21,8 +19,6 @@ import app.revanced.extension.youtube.ThemeHelper; import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.patches.spoof.SpoofAppVersionPatch; import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment; -import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment; -import app.revanced.extension.youtube.settings.preference.SponsorBlockPreferenceFragment; /** * Hooks LicenseActivity. @@ -88,28 +84,15 @@ public class LicenseActivityHook { licenseActivity.setContentView(getResourceIdentifier( "revanced_settings_with_toolbar", "layout")); - PreferenceFragment fragment; - String toolbarTitleResourceName; - String dataString = Objects.requireNonNull(licenseActivity.getIntent().getDataString()); - switch (dataString) { - case "revanced_sb_settings_intent": - toolbarTitleResourceName = "revanced_sb_settings_title"; - fragment = new SponsorBlockPreferenceFragment(); - break; - case "revanced_ryd_settings_intent": - toolbarTitleResourceName = "revanced_ryd_settings_title"; - fragment = new ReturnYouTubeDislikePreferenceFragment(); - break; - case "revanced_settings_intent": - toolbarTitleResourceName = "revanced_settings_title"; - fragment = new ReVancedPreferenceFragment(); - break; - default: - Logger.printException(() -> "Unknown setting: " + dataString); - return; + // Sanity check. + String dataString = licenseActivity.getIntent().getDataString(); + if (!"revanced_settings_intent".equals(dataString)) { + Logger.printException(() -> "Unknown intent: " + dataString); + return; } - createToolbar(licenseActivity, toolbarTitleResourceName); + PreferenceFragment fragment = new ReVancedPreferenceFragment(); + createToolbar(licenseActivity, fragment); //noinspection deprecation licenseActivity.getFragmentManager() @@ -122,7 +105,7 @@ public class LicenseActivityHook { } @SuppressLint("UseCompatLoadingForDrawables") - private static void createToolbar(Activity activity, String toolbarTitleResourceName) { + private static void createToolbar(Activity activity, PreferenceFragment fragment) { // Replace dummy placeholder toolbar. // This is required to fix submenu title alignment issue with Android ASOP 15+ ViewGroup toolBarParent = activity.findViewById( @@ -134,8 +117,7 @@ public class LicenseActivityHook { Toolbar toolbar = new Toolbar(toolBarParent.getContext()); toolbar.setBackgroundColor(ThemeHelper.getToolbarBackgroundColor()); toolbar.setNavigationIcon(ReVancedPreferenceFragment.getBackButtonDrawable()); - toolbar.setNavigationOnClickListener(view -> activity.onBackPressed()); - toolbar.setTitle(getResourceIdentifier(toolbarTitleResourceName, "string")); + toolbar.setTitle(getResourceIdentifier("revanced_settings_title", "string")); final int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, Utils.getContext().getResources().getDisplayMetrics()); @@ -148,6 +130,11 @@ public class LicenseActivityHook { } setToolbarLayoutParams(toolbar); + // Add Search Icon and EditText for ReVancedPreferenceFragment only. + if (fragment instanceof ReVancedPreferenceFragment) { + SearchViewController.addSearchViewComponents(activity, toolbar, (ReVancedPreferenceFragment) fragment); + } + toolBarParent.addView(toolbar, 0); } -} \ No newline at end of file +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java new file mode 100644 index 000000000..cb2b42d7a --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java @@ -0,0 +1,381 @@ +package app.revanced.extension.youtube.settings; + +import static app.revanced.extension.shared.StringRef.str; +import static app.revanced.extension.shared.Utils.getResourceIdentifier; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.graphics.drawable.GradientDrawable; +import android.view.MenuItem; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.SearchView; +import android.widget.TextView; +import android.widget.Toolbar; + +import androidx.annotation.NonNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.AppLanguage; +import app.revanced.extension.shared.settings.BaseSettings; +import app.revanced.extension.shared.settings.StringSetting; +import app.revanced.extension.youtube.ThemeHelper; +import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment; + +/** + * Controller for managing the search view in ReVanced settings. + */ +@SuppressWarnings({"deprecated", "DiscouragedApi"}) +public class SearchViewController { + private static final int MAX_HISTORY_SIZE = 5; + + private final SearchView searchView; + private final FrameLayout searchContainer; + private final Toolbar toolbar; + private final Activity activity; + private boolean isSearchActive; + private final CharSequence originalTitle; + private final Deque searchHistory; + private final AutoCompleteTextView autoCompleteTextView; + private final boolean showSettingsSearchHistory; + + /** + * Creates a background drawable for the SearchView with rounded corners. + */ + private static GradientDrawable createBackgroundDrawable(Context context) { + GradientDrawable background = new GradientDrawable(); + background.setShape(GradientDrawable.RECTANGLE); + background.setCornerRadius(28 * context.getResources().getDisplayMetrics().density); // 28dp corner radius. + int baseColor = ThemeHelper.getBackgroundColor(); + int adjustedColor = ThemeHelper.isDarkTheme() + ? ThemeHelper.adjustColorBrightness(baseColor, 1.11f) // Lighten for dark theme. + : ThemeHelper.adjustColorBrightness(baseColor, 0.95f); // Darken for light theme. + background.setColor(adjustedColor); + return background; + } + + /** + * Creates a background drawable for suggestion items with rounded corners. + */ + private static GradientDrawable createSuggestionBackgroundDrawable(Context context) { + GradientDrawable background = new GradientDrawable(); + background.setShape(GradientDrawable.RECTANGLE); + background.setCornerRadius(8 * context.getResources().getDisplayMetrics().density); // 8dp corner radius. + return background; + } + + /** + * Adds search view components to the activity. + */ + public static void addSearchViewComponents(Activity activity, Toolbar toolbar, ReVancedPreferenceFragment fragment) { + new SearchViewController(activity, toolbar, fragment); + } + + private SearchViewController(Activity activity, Toolbar toolbar, ReVancedPreferenceFragment fragment) { + this.activity = activity; + this.toolbar = toolbar; + this.originalTitle = toolbar.getTitle(); + this.showSettingsSearchHistory = Settings.SETTINGS_SEARCH_HISTORY.get(); + this.searchHistory = new LinkedList<>(); + StringSetting searchEntries = Settings.SETTINGS_SEARCH_ENTRIES; + if (showSettingsSearchHistory) { + String entries = searchEntries.get(); + if (!entries.isBlank()) { + searchHistory.addAll(Arrays.asList(entries.split("\n"))); + } + } else { + // Clear old saved history if the user turns off the feature. + searchEntries.resetToDefault(); + } + + // Retrieve SearchView and container from XML. + searchView = activity.findViewById(getResourceIdentifier( + "revanced_search_view", "id")); + searchContainer = activity.findViewById(getResourceIdentifier( + "revanced_search_view_container", "id")); + + // Initialize AutoCompleteTextView. + autoCompleteTextView = searchView.findViewById( + searchView.getContext().getResources().getIdentifier( + "android:id/search_src_text", null, null)); + + // Set background and query hint. + searchView.setBackground(createBackgroundDrawable(toolbar.getContext())); + searchView.setQueryHint(str("revanced_settings_search_hint")); + + // Configure RTL support based on app language. + AppLanguage appLanguage = BaseSettings.REVANCED_LANGUAGE.get(); + if (Utils.isRightToLeftLocale(appLanguage.getLocale())) { + searchView.setTextDirection(View.TEXT_DIRECTION_RTL); + searchView.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); + } + + // Set up search history suggestions. + if (showSettingsSearchHistory) { + setupSearchHistory(); + } + + // Set up query text listener. + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + try { + String queryTrimmed = query.trim(); + if (!queryTrimmed.isEmpty()) { + saveSearchQuery(queryTrimmed); + } + // Hide suggestions on submit. + if (showSettingsSearchHistory && autoCompleteTextView != null) { + autoCompleteTextView.dismissDropDown(); + } + } catch (Exception ex) { + Logger.printException(() -> "onQueryTextSubmit failure", ex); + } + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + try { + Logger.printDebug(() -> "Search query: " + newText); + fragment.filterPreferences(newText); + // Prevent suggestions from showing during text input. + if (showSettingsSearchHistory && autoCompleteTextView != null) { + if (!newText.isEmpty()) { + autoCompleteTextView.dismissDropDown(); + autoCompleteTextView.setThreshold(Integer.MAX_VALUE); // Disable autocomplete suggestions. + } else { + autoCompleteTextView.setThreshold(1); // Re-enable for empty input. + } + } + } catch (Exception ex) { + Logger.printException(() -> "onQueryTextChange failure", ex); + } + return true; + } + }); + + // Set menu and search icon. + final int actionSearchId = getResourceIdentifier("action_search", "id"); + toolbar.inflateMenu(getResourceIdentifier("revanced_search_menu", "menu")); + MenuItem searchItem = toolbar.getMenu().findItem(actionSearchId); + searchItem.setIcon(getResourceIdentifier(ThemeHelper.isDarkTheme() + ? "yt_outline_search_white_24" + : "yt_outline_search_black_24", + "drawable")).setTooltipText(null); + + // Set menu item click listener. + toolbar.setOnMenuItemClickListener(item -> { + try { + if (item.getItemId() == actionSearchId) { + if (!isSearchActive) { + openSearch(); + } + return true; + } + } catch (Exception ex) { + Logger.printException(() -> "menu click failure", ex); + } + return false; + }); + + // Set navigation click listener. + toolbar.setNavigationOnClickListener(view -> { + try { + if (isSearchActive) { + closeSearch(); + } else { + activity.onBackPressed(); + } + } catch (Exception ex) { + Logger.printException(() -> "navigation click failure", ex); + } + }); + } + + /** + * Sets up the search history suggestions for the SearchView with custom adapter. + */ + private void setupSearchHistory() { + if (autoCompleteTextView != null) { + SearchHistoryAdapter adapter = new SearchHistoryAdapter(activity, new ArrayList<>(searchHistory)); + autoCompleteTextView.setAdapter(adapter); + autoCompleteTextView.setThreshold(1); // Initial threshold for empty input. + autoCompleteTextView.setLongClickable(true); + + // Show suggestions only when search bar is active and query is empty. + autoCompleteTextView.setOnFocusChangeListener((v, hasFocus) -> { + if (hasFocus && isSearchActive && autoCompleteTextView.getText().length() == 0) { + autoCompleteTextView.showDropDown(); + } + }); + } + } + + /** + * Saves a search query to the search history. + * @param query The search query to save. + */ + private void saveSearchQuery(String query) { + if (!showSettingsSearchHistory) { + return; + } + searchHistory.remove(query); // Remove if already exists to update position. + searchHistory.addFirst(query); // Add to the most recent. + + // Remove extra old entries. + while (searchHistory.size() > MAX_HISTORY_SIZE) { + String last = searchHistory.removeLast(); + Logger.printDebug(() -> "Removing search history query: " + last); + } + + saveSearchHistory(); + + updateSearchHistoryAdapter(); + } + + /** + * Removes a search query from the search history. + * @param query The search query to remove. + */ + private void removeSearchQuery(String query) { + searchHistory.remove(query); + + saveSearchHistory(); + + updateSearchHistoryAdapter(); + } + + /** + * Save the search history to the shared preferences. + */ + private void saveSearchHistory() { + Logger.printDebug(() -> "Saving search history: " + searchHistory); + + Settings.SETTINGS_SEARCH_ENTRIES.save( + String.join("\n", searchHistory) + ); + } + + /** + * Updates the search history adapter with the latest history. + */ + private void updateSearchHistoryAdapter() { + if (autoCompleteTextView == null) { + return; + } + + SearchHistoryAdapter adapter = (SearchHistoryAdapter) autoCompleteTextView.getAdapter(); + if (adapter != null) { + adapter.clear(); + adapter.addAll(searchHistory); + adapter.notifyDataSetChanged(); + } + } + + /** + * Opens the search view and shows the keyboard. + */ + private void openSearch() { + isSearchActive = true; + toolbar.getMenu().findItem(getResourceIdentifier( + "action_search", "id")).setVisible(false); + toolbar.setTitle(""); + searchContainer.setVisibility(View.VISIBLE); + searchView.requestFocus(); + + // Show keyboard. + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT); + + // Show suggestions with a slight delay. + if (showSettingsSearchHistory && autoCompleteTextView != null && autoCompleteTextView.getText().length() == 0) { + searchView.postDelayed(() -> { + if (isSearchActive && autoCompleteTextView.getText().length() == 0) { + autoCompleteTextView.showDropDown(); + } + }, 100); // 100ms delay to ensure focus is stable. + } + } + + /** + * Closes the search view and hides the keyboard. + */ + private void closeSearch() { + isSearchActive = false; + toolbar.getMenu().findItem(getResourceIdentifier( + "action_search", "id")) + .setIcon(getResourceIdentifier(ThemeHelper.isDarkTheme() + ? "yt_outline_search_white_24" + : "yt_outline_search_black_24", + "drawable") + ).setVisible(true); + toolbar.setTitle(originalTitle); + searchContainer.setVisibility(View.GONE); + searchView.setQuery("", false); + + // Hide keyboard. + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); + } + + /** + * Custom ArrayAdapter for search history. + */ + private class SearchHistoryAdapter extends ArrayAdapter { + public SearchHistoryAdapter(Context context, List history) { + super(context, 0, history); + } + + @NonNull + @Override + public View getView(int position, View convertView, @NonNull android.view.ViewGroup parent) { + if (convertView == null) { + convertView = LinearLayout.inflate(getContext(), getResourceIdentifier( + "revanced_search_suggestion_item", "layout"), null); + } + + // Apply rounded corners programmatically. + convertView.setBackground(createSuggestionBackgroundDrawable(getContext())); + String query = getItem(position); + + // Set query text. + TextView textView = convertView.findViewById(getResourceIdentifier( + "suggestion_text", "id")); + if (textView != null) { + textView.setText(query); + } + + // Set click listener for inserting query into SearchView. + convertView.setOnClickListener(v -> { + searchView.setQuery(query, true); // Insert selected query and submit. + }); + + // Set long click listener for deletion confirmation. + convertView.setOnLongClickListener(v -> { + new AlertDialog.Builder(activity) + .setTitle(query) + .setMessage(str("revanced_settings_search_remove_message")) + .setPositiveButton(android.R.string.ok, + (dialog, which) -> removeSearchQuery(query)) + .setNegativeButton(android.R.string.cancel, null) + .show(); + return true; + }); + + return convertView; + } + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 29debf67e..4a36e6458 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -25,6 +25,8 @@ import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehavi import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.MANUAL_SKIP; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY_ONCE; + +import app.revanced.extension.shared.settings.preference.SharedPrefCategory; import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider.SwipeOverlayStyle; import android.graphics.Color; @@ -103,8 +105,9 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_MOVIES_SECTION = new BooleanSetting("revanced_hide_movies_section", TRUE); public static final BooleanSetting HIDE_NOTIFY_ME_BUTTON = new BooleanSetting("revanced_hide_notify_me_button", TRUE); public static final BooleanSetting HIDE_PLAYABLES = new BooleanSetting("revanced_hide_playables", TRUE); - public static final BooleanSetting HIDE_SEARCH_RESULT_RECOMMENDATIONS = new BooleanSetting("revanced_hide_search_result_recommendations", TRUE); + public static final BooleanSetting HIDE_SEARCH_RESULT_RECOMMENDATION_LABELS = new BooleanSetting("revanced_hide_search_result_recommendation_labels", TRUE); public static final BooleanSetting HIDE_SHOW_MORE_BUTTON = new BooleanSetting("revanced_hide_show_more_button", TRUE, true); + public static final BooleanSetting HIDE_TICKET_SHELF = new BooleanSetting("revanced_hide_ticket_shelf", FALSE); // Alternative thumbnails public static final EnumSetting ALT_THUMBNAIL_HOME = new EnumSetting<>("revanced_alt_thumbnail_home", ThumbnailOption.ORIGINAL); public static final EnumSetting ALT_THUMBNAIL_SUBSCRIPTIONS = new EnumSetting<>("revanced_alt_thumbnail_subscription", ThumbnailOption.ORIGINAL); @@ -139,6 +142,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_EMERGENCY_BOX = new BooleanSetting("revanced_hide_emergency_box", TRUE); public static final BooleanSetting HIDE_ENDSCREEN_CARDS = new BooleanSetting("revanced_hide_endscreen_cards", FALSE); public static final BooleanSetting HIDE_END_SCREEN_SUGGESTED_VIDEO = new BooleanSetting("revanced_end_screen_suggested_video", FALSE, true); + public static final BooleanSetting HIDE_RELATED_VIDEO_OVERLAY = new BooleanSetting("revanced_hide_related_video_overlay", FALSE, true); public static final BooleanSetting HIDE_HIDE_CHANNEL_GUIDELINES = new BooleanSetting("revanced_hide_channel_guidelines", TRUE); public static final BooleanSetting HIDE_INFO_PANELS = new BooleanSetting("revanced_hide_info_panels", TRUE); public static final BooleanSetting HIDE_INFO_CARDS = new BooleanSetting("revanced_hide_info_cards", FALSE); @@ -182,6 +186,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_COMMENTS_THANKS_BUTTON = new BooleanSetting("revanced_hide_comments_thanks_button", TRUE); // 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); public static final BooleanSetting HIDE_ATTRIBUTES_SECTION = new BooleanSetting("revanced_hide_attributes_section", FALSE); public static final BooleanSetting HIDE_CHAPTERS_SECTION = new BooleanSetting("revanced_hide_chapters_section", TRUE); public static final BooleanSetting HIDE_HOW_THIS_WAS_MADE_SECTION = new BooleanSetting("revanced_hide_how_this_was_made_section", FALSE); @@ -217,6 +222,8 @@ public class Settings extends BaseSettings { // General layout public static final BooleanSetting RESTORE_OLD_SETTINGS_MENUS = new BooleanSetting("revanced_restore_old_settings_menus", FALSE, true); + public static final BooleanSetting SETTINGS_SEARCH_HISTORY = new BooleanSetting("revanced_settings_search_history", TRUE, true); + public static final StringSetting SETTINGS_SEARCH_ENTRIES = new StringSetting("revanced_settings_search_entries", "", true); public static final EnumSetting CHANGE_FORM_FACTOR = new EnumSetting<>("revanced_change_form_factor", FormFactor.DEFAULT, true, "revanced_change_form_factor_user_dialog_message"); public static final BooleanSetting BYPASS_IMAGE_REGION_RESTRICTIONS = new BooleanSetting("revanced_bypass_image_region_restrictions", FALSE, true); public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE, true); @@ -340,19 +347,17 @@ public class Settings extends BaseSettings { public static final BooleanSetting SWIPE_LOWEST_VALUE_ENABLE_AUTO_BRIGHTNESS = new BooleanSetting("revanced_swipe_lowest_value_enable_auto_brightness", FALSE, true, parent(SWIPE_BRIGHTNESS)); // ReturnYoutubeDislike - public static final BooleanSetting RYD_ENABLED = new BooleanSetting("ryd_enabled", TRUE); - public static final StringSetting RYD_USER_ID = new StringSetting("ryd_user_id", "", false, false); - public static final BooleanSetting RYD_SHORTS = new BooleanSetting("ryd_shorts", TRUE, parent(RYD_ENABLED)); - public static final BooleanSetting RYD_DISLIKE_PERCENTAGE = new BooleanSetting("ryd_dislike_percentage", FALSE, parent(RYD_ENABLED)); - public static final BooleanSetting RYD_COMPACT_LAYOUT = new BooleanSetting("ryd_compact_layout", FALSE, parent(RYD_ENABLED)); - public static final BooleanSetting RYD_ESTIMATED_LIKE = new BooleanSetting("ryd_estimated_like", TRUE, parent(RYD_ENABLED)); - public static final BooleanSetting RYD_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("ryd_toast_on_connection_error", TRUE, parent(RYD_ENABLED)); + public static final BooleanSetting RYD_ENABLED = new BooleanSetting("revanced_ryd_enabled", TRUE); + public static final StringSetting RYD_USER_ID = new StringSetting("revanced_ryd_user_id", "", false, false); + public static final BooleanSetting RYD_SHORTS = new BooleanSetting("revanced_ryd_shorts", TRUE, parent(RYD_ENABLED)); + public static final BooleanSetting RYD_DISLIKE_PERCENTAGE = new BooleanSetting("revanced_ryd_dislike_percentage", FALSE, true, parent(RYD_ENABLED)); + public static final BooleanSetting RYD_COMPACT_LAYOUT = new BooleanSetting("revanced_ryd_compact_layout", FALSE, true, parent(RYD_ENABLED)); + public static final BooleanSetting RYD_ESTIMATED_LIKE = new BooleanSetting("revanced_ryd_estimated_like", TRUE, true, parent(RYD_ENABLED)); + public static final BooleanSetting RYD_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("revanced_ryd_toast_on_connection_error", TRUE, parent(RYD_ENABLED)); // SponsorBlock public static final BooleanSetting SB_ENABLED = new BooleanSetting("sb_enabled", TRUE); - /** - * Do not use directly, instead use {@link SponsorBlockSettings} - */ + /** Do not use id setting directly. Instead use {@link SponsorBlockSettings}. */ public static final StringSetting SB_PRIVATE_USER_ID = new StringSetting("sb_private_user_id_Do_Not_Share", ""); public static final IntegerSetting SB_CREATE_NEW_SEGMENT_STEP = new IntegerSetting("sb_create_new_segment_step", 150, parent(SB_ENABLED)); public static final BooleanSetting SB_VOTING_BUTTON = new BooleanSetting("sb_voting_button", FALSE, parent(SB_ENABLED)); @@ -416,12 +421,10 @@ public class Settings extends BaseSettings { // region Migration migrateOldSettingToNew(DEPRECATED_HIDE_PLAYER_BUTTONS, HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS); - migrateOldSettingToNew(DEPRECATED_HIDE_PLAYER_FLYOUT_VIDEO_QUALITY_FOOTER, HIDE_PLAYER_FLYOUT_VIDEO_QUALITY_FOOTER); - migrateOldSettingToNew(DEPRECATED_DISABLE_SUGGESTED_VIDEO_END_SCREEN, HIDE_END_SCREEN_SUGGESTED_VIDEO); - migrateOldSettingToNew(DEPRECATED_RESTORE_OLD_VIDEO_QUALITY_MENU, ADVANCED_VIDEO_QUALITY_MENU); + migrateOldSettingToNew(DEPRECATED_AUTO_CAPTIONS, DISABLE_AUTO_CAPTIONS); // Migrate renamed enum. //noinspection deprecation @@ -464,10 +467,15 @@ public class Settings extends BaseSettings { SPOOF_APP_VERSION_TARGET.resetToDefault(); } - if (!DEPRECATED_AUTO_CAPTIONS.isSetToDefault()) { - DISABLE_AUTO_CAPTIONS.save(true); - DEPRECATED_AUTO_CAPTIONS.resetToDefault(); - } + // RYD requires manually migrating old settings since the lack of + // a "revanced_" on the old setting causes duplicate key exceptions during export. + SharedPrefCategory revancedPrefs = Setting.preferences; + Setting.migrateFromOldPreferences(revancedPrefs, RYD_USER_ID, "ryd_user_id"); + Setting.migrateFromOldPreferences(revancedPrefs, RYD_ENABLED, "ryd_enabled"); + Setting.migrateFromOldPreferences(revancedPrefs, RYD_DISLIKE_PERCENTAGE, "ryd_dislike_percentage"); + Setting.migrateFromOldPreferences(revancedPrefs, RYD_COMPACT_LAYOUT, "ryd_compact_layout"); + Setting.migrateFromOldPreferences(revancedPrefs, RYD_ESTIMATED_LIKE, "ryd_estimated_like"); + Setting.migrateFromOldPreferences(revancedPrefs, RYD_TOAST_ON_CONNECTION_ERROR, "ryd_toast_on_connection_error"); // endregion @@ -478,4 +486,3 @@ public class Settings extends BaseSettings { // endregion } } - diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java index 5ca2e65dc..e5a16947f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java @@ -1,23 +1,15 @@ package app.revanced.extension.youtube.settings.preference; import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.preference.Preference; import android.util.AttributeSet; /** * Allows tapping the DeArrow about preference to open the DeArrow website. */ -@SuppressWarnings({"unused", "deprecation"}) -public class AlternativeThumbnailsAboutDeArrowPreference extends Preference { +@SuppressWarnings("unused") +public class AlternativeThumbnailsAboutDeArrowPreference extends UrlLinkPreference { { - setOnPreferenceClickListener(pref -> { - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse("https://dearrow.ajay.app")); - pref.getContext().startActivity(i); - return false; - }); + externalUrl = "https://dearrow.ajay.app"; } public AlternativeThumbnailsAboutDeArrowPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/CustomVideoSpeedListPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/CustomVideoSpeedListPreference.java new file mode 100644 index 000000000..eee8d2bca --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/CustomVideoSpeedListPreference.java @@ -0,0 +1,62 @@ +package app.revanced.extension.youtube.settings.preference; + +import static app.revanced.extension.shared.StringRef.sf; + +import android.content.Context; +import android.preference.ListPreference; +import android.util.AttributeSet; + +import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch; +import app.revanced.extension.youtube.settings.Settings; + +/** + * Custom video speeds used by {@link CustomPlaybackSpeedPatch}. + */ +@SuppressWarnings({"unused", "deprecation"}) +public final class CustomVideoSpeedListPreference extends ListPreference { + + /** + * Initialize a settings preference list with the available playback speeds. + */ + private void initializeEntryValues() { + float[] customPlaybackSpeeds = CustomPlaybackSpeedPatch.customPlaybackSpeeds; + final int numberOfEntries = customPlaybackSpeeds.length + 1; + String[] preferenceListEntries = new String[numberOfEntries]; + String[] preferenceListEntryValues = new String[numberOfEntries]; + + // Auto speed (same behavior as unpatched). + preferenceListEntries[0] = sf("revanced_custom_playback_speeds_auto").toString(); + preferenceListEntryValues[0] = String.valueOf(Settings.PLAYBACK_SPEED_DEFAULT.defaultValue); + + int i = 1; + for (float speed : customPlaybackSpeeds) { + String speedString = String.valueOf(speed); + preferenceListEntries[i] = speedString + "x"; + preferenceListEntryValues[i] = speedString; + i++; + } + + setEntries(preferenceListEntries); + setEntryValues(preferenceListEntryValues); + } + + { + initializeEntryValues(); + } + + public CustomVideoSpeedListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public CustomVideoSpeedListPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public CustomVideoSpeedListPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CustomVideoSpeedListPreference(Context context) { + super(context); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java index ecdcf03cf..1994bf368 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java @@ -19,12 +19,15 @@ public class HtmlPreference extends Preference { public HtmlPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } + public HtmlPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + public HtmlPreference(Context context, AttributeSet attrs) { super(context, attrs); } + public HtmlPreference(Context context) { super(context); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java index a2b6dbbfb..916378bf5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java @@ -1,5 +1,6 @@ package app.revanced.extension.youtube.settings.preference; +import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.Utils.getResourceIdentifier; import android.annotation.SuppressLint; @@ -9,34 +10,66 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.preference.ListPreference; import android.preference.Preference; +import android.preference.PreferenceCategory; +import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; -import android.util.Pair; +import android.preference.SwitchPreference; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; import android.util.TypedValue; import android.view.ViewGroup; import android.view.WindowInsets; import android.widget.TextView; import android.widget.Toolbar; +import androidx.annotation.CallSuper; +import androidx.annotation.Nullable; + +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; -import app.revanced.extension.shared.settings.EnumSetting; import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment; +import app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory; import app.revanced.extension.youtube.ThemeHelper; -import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch; import app.revanced.extension.youtube.settings.LicenseActivityHook; -import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup; /** * Preference fragment for ReVanced settings. - * - * @noinspection deprecation */ +@SuppressWarnings("deprecation") public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { + /** + * The main PreferenceScreen used to display the current set of preferences. + * This screen is manipulated during initialization and filtering to show or hide preferences. + */ + private PreferenceScreen preferenceScreen; + + /** + * A copy of the original PreferenceScreen created during initialization. + * Used to restore the preference structure to its initial state after filtering or other modifications. + */ + private PreferenceScreen originalPreferenceScreen; + + /** + * Used for searching preferences. A Collection of all preferences including nested preferences. + * Root preferences are excluded (no need to search what's on the root screen), + * but their sub preferences are included. + */ + private final List> allPreferences = new ArrayList<>(); + @SuppressLint("UseCompatLoadingForDrawables") public static Drawable getBackButtonDrawable() { final int backButtonResource = getResourceIdentifier(ThemeHelper.isDarkTheme() @@ -47,85 +80,140 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { } /** - * Sorts a preference list by menu entries, but preserves the first value as the first entry. - * - * @noinspection SameParameterValue + * Initializes the preference fragment, copying the original screen to allow full restoration. */ - private static void sortListPreferenceByValues(ListPreference listPreference, int firstEntriesToPreserve) { - CharSequence[] entries = listPreference.getEntries(); - CharSequence[] entryValues = listPreference.getEntryValues(); - final int entrySize = entries.length; - - if (entrySize != entryValues.length) { - // Xml array declaration has a missing/extra entry. - throw new IllegalStateException(); - } - - List> firstPairs = new ArrayList<>(firstEntriesToPreserve); - List> pairsToSort = new ArrayList<>(entrySize); - - for (int i = 0; i < entrySize; i++) { - Pair pair = new Pair<>(entries[i].toString(), entryValues[i].toString()); - if (i < firstEntriesToPreserve) { - firstPairs.add(pair); - } else { - pairsToSort.add(pair); - } - } - - pairsToSort.sort((pair1, pair2) - -> pair1.first.compareToIgnoreCase(pair2.first)); - - CharSequence[] sortedEntries = new CharSequence[entrySize]; - CharSequence[] sortedEntryValues = new CharSequence[entrySize]; - - int i = 0; - for (Pair pair : firstPairs) { - sortedEntries[i] = pair.first; - sortedEntryValues[i] = pair.second; - i++; - } - - for (Pair pair : pairsToSort) { - sortedEntries[i] = pair.first; - sortedEntryValues[i] = pair.second; - i++; - } - - listPreference.setEntries(sortedEntries); - listPreference.setEntryValues(sortedEntryValues); - } - @Override protected void initialize() { super.initialize(); try { - setPreferenceScreenToolbar(getPreferenceScreen()); + preferenceScreen = getPreferenceScreen(); + Utils.sortPreferenceGroups(preferenceScreen); - // If the preference was included, then initialize it based on the available playback speed. - Preference preference = findPreference(Settings.PLAYBACK_SPEED_DEFAULT.key); - if (preference instanceof ListPreference playbackPreference) { - CustomPlaybackSpeedPatch.initializeListPreference(playbackPreference); + // Store the original structure for restoration after filtering. + originalPreferenceScreen = getPreferenceManager().createPreferenceScreen(getContext()); + for (int i = 0, count = preferenceScreen.getPreferenceCount(); i < count; i++) { + originalPreferenceScreen.addPreference(preferenceScreen.getPreference(i)); } - sortPreferenceListMenu(Settings.CHANGE_START_PAGE); - sortPreferenceListMenu(Settings.SPOOF_VIDEO_STREAMS_LANGUAGE); - sortPreferenceListMenu(BaseSettings.REVANCED_LANGUAGE); + setPreferenceScreenToolbar(preferenceScreen); } catch (Exception ex) { Logger.printException(() -> "initialize failure", ex); } } - private void sortPreferenceListMenu(EnumSetting setting) { - Preference preference = findPreference(setting.key); - if (preference instanceof ListPreference languagePreference) { - sortListPreferenceByValues(languagePreference, 1); + /** + * Called when the fragment starts, ensuring all preferences are collected after initialization. + */ + @Override + public void onStart() { + super.onStart(); + try { + if (allPreferences.isEmpty()) { + // Must collect preferences on start and not in initialize since + // legacy SB settings are not loaded yet. + Logger.printDebug(() -> "Collecting preferences to search"); + + // Do not show root menu preferences in search results. + // Instead search for everything that's not shown when search is not active. + collectPreferences(preferenceScreen, 1, 0); + } + } catch (Exception ex) { + Logger.printException(() -> "onStart failure", ex); } } + /** + * Recursively collects all preferences from the screen or group. + * @param includeDepth Menu depth to start including preferences. + * A value of 0 adds all preferences. + */ + private void collectPreferences(PreferenceGroup group, int includeDepth, int currentDepth) { + for (int i = 0, count = group.getPreferenceCount(); i < count; i++) { + Preference preference = group.getPreference(i); + if (includeDepth <= currentDepth && !(preference instanceof PreferenceCategory) + && !(preference instanceof SponsorBlockPreferenceGroup)) { + + AbstractPreferenceSearchData data; + if (preference instanceof SwitchPreference switchPref) { + data = new SwitchPreferenceSearchData(switchPref); + } else if (preference instanceof ListPreference listPref) { + data = new ListPreferenceSearchData(listPref); + } else { + data = new PreferenceSearchData(preference); + } + + allPreferences.add(data); + } + + if (preference instanceof PreferenceGroup subGroup) { + collectPreferences(subGroup, includeDepth, currentDepth + 1); + } + } + } + + /** + * Filters the preferences using the given query string and applies highlighting. + */ + public void filterPreferences(String query) { + preferenceScreen.removeAll(); + + if (TextUtils.isEmpty(query)) { + // Restore original preferences and their titles/summaries/entries. + for (int i = 0, count = originalPreferenceScreen.getPreferenceCount(); i < count; i++) { + preferenceScreen.addPreference(originalPreferenceScreen.getPreference(i)); + } + + for (AbstractPreferenceSearchData data : allPreferences) { + data.clearHighlighting(); + } + + return; + } + + // Navigation path -> Category + Map categoryMap = new HashMap<>(); + String queryLower = Utils.removePunctuationToLowercase(query); + + Pattern queryPattern = Pattern.compile(Pattern.quote(Utils.removePunctuationToLowercase(query)), + Pattern.CASE_INSENSITIVE); + + for (AbstractPreferenceSearchData data : allPreferences) { + if (data.matchesSearchQuery(queryLower)) { + data.applyHighlighting(queryLower, queryPattern); + + String navigationPath = data.navigationPath; + PreferenceCategory group = categoryMap.computeIfAbsent(navigationPath, key -> { + PreferenceCategory newGroup = new PreferenceCategory(preferenceScreen.getContext()); + newGroup.setTitle(navigationPath); + preferenceScreen.addPreference(newGroup); + return newGroup; + }); + group.addPreference(data.preference); + } + } + + // Show 'No results found' if search results are empty. + if (categoryMap.isEmpty()) { + Preference noResultsPreference = new Preference(preferenceScreen.getContext()); + noResultsPreference.setTitle(str("revanced_settings_search_no_results_title", query)); + noResultsPreference.setSummary(str("revanced_settings_search_no_results_summary")); + noResultsPreference.setSelectable(false); + // Set icon for the placeholder preference. + noResultsPreference.setLayoutResource(getResourceIdentifier( + "revanced_preference_with_icon_no_search_result", "layout")); + noResultsPreference.setIcon(getResourceIdentifier( + ThemeHelper.isDarkTheme() ? "yt_outline_search_white_24" : "yt_outline_search_black_24", + "drawable")); + preferenceScreen.addPreference(noResultsPreference); + } + } + + /** + * Sets toolbar for all nested preference screens. + */ private void setPreferenceScreenToolbar(PreferenceScreen parentScreen) { - for (int i = 0, preferenceCount = parentScreen.getPreferenceCount(); i < preferenceCount; i++) { + for (int i = 0, count = parentScreen.getPreferenceCount(); i < count; i++) { Preference childPreference = parentScreen.getPreference(i); if (childPreference instanceof PreferenceScreen) { // Recursively set sub preferences. @@ -156,6 +244,7 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { toolbar.setTitle(childScreen.getTitle()); toolbar.setNavigationIcon(getBackButtonDrawable()); toolbar.setNavigationOnClickListener(view -> preferenceScreenDialog.dismiss()); + final int margin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics() ); @@ -177,3 +266,277 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { } } } + +@SuppressWarnings("deprecation") +class AbstractPreferenceSearchData { + /** + * @return The navigation path for the given preference, such as "Player > Action buttons". + */ + private static String getPreferenceNavigationString(Preference preference) { + Deque pathElements = new ArrayDeque<>(); + + while (true) { + preference = preference.getParent(); + + if (preference == null) { + if (pathElements.isEmpty()) { + return ""; + } + Locale locale = BaseSettings.REVANCED_LANGUAGE.get().getLocale(); + return Utils.getTextDirectionString(locale) + String.join(" > ", pathElements); + } + + if (!(preference instanceof NoTitlePreferenceCategory) + && !(preference instanceof SponsorBlockPreferenceGroup)) { + CharSequence title = preference.getTitle(); + if (title != null && title.length() > 0) { + pathElements.addFirst(title); + } + } + } + } + + /** + * Highlights the search query in the given text by applying color span. + * @param text The original text to process. + * @param queryPattern The search query to highlight. + * @return The text with highlighted query matches as a SpannableStringBuilder. + */ + static CharSequence highlightSearchQuery(CharSequence text, Pattern queryPattern) { + if (TextUtils.isEmpty(text)) { + return text; + } + + final int baseColor = ThemeHelper.getBackgroundColor(); + final int adjustedColor = ThemeHelper.isDarkTheme() + ? ThemeHelper.adjustColorBrightness(baseColor, 1.20f) // Lighten for dark theme. + : ThemeHelper.adjustColorBrightness(baseColor, 0.95f); // Darken for light theme. + BackgroundColorSpan highlightSpan = new BackgroundColorSpan(adjustedColor); + + SpannableStringBuilder spannable = new SpannableStringBuilder(text); + Matcher matcher = queryPattern.matcher(text); + + while (matcher.find()) { + spannable.setSpan( + highlightSpan, + matcher.start(), + matcher.end(), + SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE + ); + } + + return spannable; + } + + final T preference; + final String key; + final String navigationPath; + boolean highlightingApplied; + + @Nullable + CharSequence originalTitle; + @Nullable + String searchTitle; + + AbstractPreferenceSearchData(T pref) { + preference = pref; + key = Utils.removePunctuationToLowercase(pref.getKey()); + navigationPath = getPreferenceNavigationString(pref); + } + + @CallSuper + void updateSearchDataIfNeeded() { + if (highlightingApplied) { + // Must clear, otherwise old highlighting is still applied. + clearHighlighting(); + } + + CharSequence title = preference.getTitle(); + if (originalTitle != title) { // Check using reference equality. + originalTitle = title; + searchTitle = Utils.removePunctuationToLowercase(title); + } + } + + @CallSuper + boolean matchesSearchQuery(String query) { + updateSearchDataIfNeeded(); + + return key.contains(query) + || searchTitle != null && searchTitle.contains(query); + } + + @CallSuper + void applyHighlighting(String query, Pattern queryPattern) { + preference.setTitle(highlightSearchQuery(originalTitle, queryPattern)); + highlightingApplied = true; + } + + @CallSuper + void clearHighlighting() { + if (highlightingApplied) { + preference.setTitle(originalTitle); + highlightingApplied = false; + } + } +} + +/** + * Regular preference type that only uses the base preference summary. + * Should only be used if a more specific data class does not exist. + */ +@SuppressWarnings("deprecation") +class PreferenceSearchData extends AbstractPreferenceSearchData { + @Nullable + CharSequence originalSummary; + @Nullable + String searchSummary; + + PreferenceSearchData(Preference pref) { + super(pref); + } + + void updateSearchDataIfNeeded() { + super.updateSearchDataIfNeeded(); + + CharSequence summary = preference.getSummary(); + if (originalSummary != summary) { + originalSummary = summary; + searchSummary = Utils.removePunctuationToLowercase(summary); + } + } + + boolean matchesSearchQuery(String query) { + return super.matchesSearchQuery(query) + || searchSummary != null && searchSummary.contains(query); + } + + @Override + void applyHighlighting(String query, Pattern queryPattern) { + super.applyHighlighting(query, queryPattern); + + preference.setSummary(highlightSearchQuery(originalSummary, queryPattern)); + } + + @CallSuper + void clearHighlighting() { + if (highlightingApplied) { + preference.setSummary(originalSummary); + } + + super.clearHighlighting(); + } +} + +/** + * Switch preference type that uses summaryOn and summaryOff. + */ +@SuppressWarnings("deprecation") +class SwitchPreferenceSearchData extends AbstractPreferenceSearchData { + @Nullable + CharSequence originalSummaryOn, originalSummaryOff; + @Nullable + String searchSummaryOn, searchSummaryOff; + + SwitchPreferenceSearchData(SwitchPreference pref) { + super(pref); + } + + void updateSearchDataIfNeeded() { + super.updateSearchDataIfNeeded(); + + CharSequence summaryOn = preference.getSummaryOn(); + if (originalSummaryOn != summaryOn) { + originalSummaryOn = summaryOn; + searchSummaryOn = Utils.removePunctuationToLowercase(summaryOn); + } + + CharSequence summaryOff = preference.getSummaryOff(); + if (originalSummaryOff != summaryOff) { + originalSummaryOff = summaryOff; + searchSummaryOff = Utils.removePunctuationToLowercase(summaryOff); + } + } + + boolean matchesSearchQuery(String query) { + return super.matchesSearchQuery(query) + || searchSummaryOn != null && searchSummaryOn.contains(query) + || searchSummaryOff != null && searchSummaryOff.contains(query); + } + + @Override + void applyHighlighting(String query, Pattern queryPattern) { + super.applyHighlighting(query, queryPattern); + + preference.setSummaryOn(highlightSearchQuery(originalSummaryOn, queryPattern)); + preference.setSummaryOff(highlightSearchQuery(originalSummaryOff, queryPattern)); + } + + @CallSuper + void clearHighlighting() { + if (highlightingApplied) { + preference.setSummaryOn(originalSummaryOn); + preference.setSummaryOff(originalSummaryOff); + } + + super.clearHighlighting(); + } +} + +/** + * List preference type that uses entries. + */ +@SuppressWarnings("deprecation") +class ListPreferenceSearchData extends AbstractPreferenceSearchData { + @Nullable + CharSequence[] originalEntries; + @Nullable + String searchEntries; + + ListPreferenceSearchData(ListPreference pref) { + super(pref); + } + + void updateSearchDataIfNeeded() { + super.updateSearchDataIfNeeded(); + + CharSequence[] entries = preference.getEntries(); + if (originalEntries != entries) { + originalEntries = entries; + searchEntries = Utils.removePunctuationToLowercase(String.join(" ", entries)); + } + } + + boolean matchesSearchQuery(String query) { + return super.matchesSearchQuery(query) + || searchEntries != null && searchEntries.contains(query); + } + + @Override + void applyHighlighting(String query, Pattern queryPattern) { + super.applyHighlighting(query, queryPattern); + + if (originalEntries != null) { + final int length = originalEntries.length; + CharSequence[] highlightedEntries = new CharSequence[length]; + + for (int i = 0; i < length; i++) { + highlightedEntries[i] = highlightSearchQuery(originalEntries[i], queryPattern); + + // Cannot highlight the summary text, because ListPreference uses + // the toString() of the summary CharSequence which strips away all formatting. + } + + preference.setEntries(highlightedEntries); + } + } + + @CallSuper + void clearHighlighting() { + if (highlightingApplied) { + preference.setEntries(originalEntries); + } + + super.clearHighlighting(); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReturnYouTubeDislikePreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReturnYouTubeDislikePreferenceFragment.java deleted file mode 100644 index bb62386ac..000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReturnYouTubeDislikePreferenceFragment.java +++ /dev/null @@ -1,257 +0,0 @@ -package app.revanced.extension.youtube.settings.preference; - -import static app.revanced.extension.shared.StringRef.str; - -import android.app.Activity; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.preference.SwitchPreference; - -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.Utils; -import app.revanced.extension.shared.settings.Setting; -import app.revanced.extension.shared.settings.BaseSettings; -import app.revanced.extension.youtube.patches.ReturnYouTubeDislikePatch; -import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike; -import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi; -import app.revanced.extension.youtube.settings.Settings; - -/** @noinspection deprecation*/ -public class ReturnYouTubeDislikePreferenceFragment extends PreferenceFragment { - - /** - * If dislikes are shown on Shorts. - */ - private SwitchPreference shortsPreference; - - /** - * If dislikes are shown as percentage. - */ - private SwitchPreference percentagePreference; - - /** - * If segmented like/dislike button uses smaller compact layout. - */ - private SwitchPreference compactLayoutPreference; - - /** - * If hidden likes are replaced with an estimated value. - */ - private SwitchPreference estimatedLikesPreference; - - /** - * If segmented like/dislike button uses smaller compact layout. - */ - private SwitchPreference toastOnRYDNotAvailable; - - private void updateUIState() { - shortsPreference.setEnabled(Settings.RYD_SHORTS.isAvailable()); - percentagePreference.setEnabled(Settings.RYD_DISLIKE_PERCENTAGE.isAvailable()); - compactLayoutPreference.setEnabled(Settings.RYD_COMPACT_LAYOUT.isAvailable()); - estimatedLikesPreference.setEnabled(Settings.RYD_ESTIMATED_LIKE.isAvailable()); - toastOnRYDNotAvailable.setEnabled(Settings.RYD_TOAST_ON_CONNECTION_ERROR.isAvailable()); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - try { - Activity context = getActivity(); - PreferenceManager manager = getPreferenceManager(); - manager.setSharedPreferencesName(Setting.preferences.name); - PreferenceScreen preferenceScreen = manager.createPreferenceScreen(context); - setPreferenceScreen(preferenceScreen); - - SwitchPreference enabledPreference = new SwitchPreference(context); - enabledPreference.setChecked(Settings.RYD_ENABLED.get()); - enabledPreference.setTitle(str("revanced_ryd_enable_title")); - enabledPreference.setSummaryOn(str("revanced_ryd_enable_summary_on")); - enabledPreference.setSummaryOff(str("revanced_ryd_enable_summary_off")); - enabledPreference.setOnPreferenceChangeListener((pref, newValue) -> { - final Boolean rydIsEnabled = (Boolean) newValue; - Settings.RYD_ENABLED.save(rydIsEnabled); - ReturnYouTubeDislikePatch.onRYDStatusChange(rydIsEnabled); - - updateUIState(); - return true; - }); - preferenceScreen.addPreference(enabledPreference); - - shortsPreference = new SwitchPreference(context); - shortsPreference.setChecked(Settings.RYD_SHORTS.get()); - shortsPreference.setTitle(str("revanced_ryd_shorts_title")); - String shortsSummary = str("revanced_ryd_shorts_summary_on_disclaimer"); - shortsPreference.setSummaryOn(shortsSummary); - shortsPreference.setSummaryOff(str("revanced_ryd_shorts_summary_off")); - shortsPreference.setOnPreferenceChangeListener((pref, newValue) -> { - Settings.RYD_SHORTS.save((Boolean) newValue); - updateUIState(); - return true; - }); - preferenceScreen.addPreference(shortsPreference); - - percentagePreference = new SwitchPreference(context); - percentagePreference.setChecked(Settings.RYD_DISLIKE_PERCENTAGE.get()); - percentagePreference.setTitle(str("revanced_ryd_dislike_percentage_title")); - percentagePreference.setSummaryOn(str("revanced_ryd_dislike_percentage_summary_on")); - percentagePreference.setSummaryOff(str("revanced_ryd_dislike_percentage_summary_off")); - percentagePreference.setOnPreferenceChangeListener((pref, newValue) -> { - Settings.RYD_DISLIKE_PERCENTAGE.save((Boolean) newValue); - ReturnYouTubeDislike.clearAllUICaches(); - updateUIState(); - return true; - }); - preferenceScreen.addPreference(percentagePreference); - - compactLayoutPreference = new SwitchPreference(context); - compactLayoutPreference.setChecked(Settings.RYD_COMPACT_LAYOUT.get()); - compactLayoutPreference.setTitle(str("revanced_ryd_compact_layout_title")); - compactLayoutPreference.setSummaryOn(str("revanced_ryd_compact_layout_summary_on")); - compactLayoutPreference.setSummaryOff(str("revanced_ryd_compact_layout_summary_off")); - compactLayoutPreference.setOnPreferenceChangeListener((pref, newValue) -> { - Settings.RYD_COMPACT_LAYOUT.save((Boolean) newValue); - ReturnYouTubeDislike.clearAllUICaches(); - updateUIState(); - return true; - }); - preferenceScreen.addPreference(compactLayoutPreference); - - estimatedLikesPreference = new SwitchPreference(context); - estimatedLikesPreference.setChecked(Settings.RYD_ESTIMATED_LIKE.get()); - estimatedLikesPreference.setTitle(str("revanced_ryd_estimated_like_title")); - estimatedLikesPreference.setSummaryOn(str("revanced_ryd_estimated_like_summary_on")); - estimatedLikesPreference.setSummaryOff(str("revanced_ryd_estimated_like_summary_off")); - estimatedLikesPreference.setOnPreferenceChangeListener((pref, newValue) -> { - Settings.RYD_ESTIMATED_LIKE.save((Boolean) newValue); - ReturnYouTubeDislike.clearAllUICaches(); - updateUIState(); - return true; - }); - preferenceScreen.addPreference(estimatedLikesPreference); - - toastOnRYDNotAvailable = new SwitchPreference(context); - toastOnRYDNotAvailable.setChecked(Settings.RYD_TOAST_ON_CONNECTION_ERROR.get()); - toastOnRYDNotAvailable.setTitle(str("revanced_ryd_toast_on_connection_error_title")); - toastOnRYDNotAvailable.setSummaryOn(str("revanced_ryd_toast_on_connection_error_summary_on")); - toastOnRYDNotAvailable.setSummaryOff(str("revanced_ryd_toast_on_connection_error_summary_off")); - toastOnRYDNotAvailable.setOnPreferenceChangeListener((pref, newValue) -> { - Settings.RYD_TOAST_ON_CONNECTION_ERROR.save((Boolean) newValue); - updateUIState(); - return true; - }); - preferenceScreen.addPreference(toastOnRYDNotAvailable); - - updateUIState(); - - - // About category - - PreferenceCategory aboutCategory = new PreferenceCategory(context); - aboutCategory.setTitle(str("revanced_ryd_about")); - preferenceScreen.addPreference(aboutCategory); - - // ReturnYouTubeDislike Website - - Preference aboutWebsitePreference = new Preference(context); - aboutWebsitePreference.setTitle(str("revanced_ryd_attribution_title")); - aboutWebsitePreference.setSummary(str("revanced_ryd_attribution_summary")); - aboutWebsitePreference.setOnPreferenceClickListener(pref -> { - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse("https://returnyoutubedislike.com")); - pref.getContext().startActivity(i); - return false; - }); - aboutCategory.addPreference(aboutWebsitePreference); - - // RYD API connection statistics - - if (BaseSettings.DEBUG.get()) { - PreferenceCategory emptyCategory = new PreferenceCategory(context); // vertical padding - preferenceScreen.addPreference(emptyCategory); - - PreferenceCategory statisticsCategory = new PreferenceCategory(context); - statisticsCategory.setTitle(str("revanced_ryd_statistics_category_title")); - preferenceScreen.addPreference(statisticsCategory); - - Preference statisticPreference; - - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getFetchCallResponseTimeAverage_title")); - statisticPreference.setSummary(createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeAverage())); - preferenceScreen.addPreference(statisticPreference); - - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getFetchCallResponseTimeMin_title")); - statisticPreference.setSummary(createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMin())); - preferenceScreen.addPreference(statisticPreference); - - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getFetchCallResponseTimeMax_title")); - statisticPreference.setSummary(createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMax())); - preferenceScreen.addPreference(statisticPreference); - - String fetchCallTimeWaitingLastSummary; - final long fetchCallTimeWaitingLast = ReturnYouTubeDislikeApi.getFetchCallResponseTimeLast(); - if (fetchCallTimeWaitingLast == ReturnYouTubeDislikeApi.FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT) { - fetchCallTimeWaitingLastSummary = str("revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary"); - } else { - fetchCallTimeWaitingLastSummary = createMillisecondStringFromNumber(fetchCallTimeWaitingLast); - } - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getFetchCallResponseTimeLast_title")); - statisticPreference.setSummary(fetchCallTimeWaitingLastSummary); - preferenceScreen.addPreference(statisticPreference); - - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getFetchCallCount_title")); - statisticPreference.setSummary(createSummaryText(ReturnYouTubeDislikeApi.getFetchCallCount(), - "revanced_ryd_statistics_getFetchCallCount_zero_summary", - "revanced_ryd_statistics_getFetchCallCount_non_zero_summary")); - preferenceScreen.addPreference(statisticPreference); - - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getFetchCallNumberOfFailures_title")); - statisticPreference.setSummary(createSummaryText(ReturnYouTubeDislikeApi.getFetchCallNumberOfFailures(), - "revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary", - "revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary")); - preferenceScreen.addPreference(statisticPreference); - - statisticPreference = new Preference(context); - statisticPreference.setSelectable(false); - statisticPreference.setTitle(str("revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title")); - statisticPreference.setSummary(createSummaryText(ReturnYouTubeDislikeApi.getNumberOfRateLimitRequestsEncountered(), - "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary", - "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary")); - preferenceScreen.addPreference(statisticPreference); - } - - Utils.setPreferenceTitlesToMultiLineIfNeeded(preferenceScreen); - } catch (Exception ex) { - Logger.printException(() -> "onCreate failure", ex); - } - } - - private static String createSummaryText(int value, String summaryStringZeroKey, String summaryStringOneOrMoreKey) { - if (value == 0) { - return str(summaryStringZeroKey); - } - return String.format(str(summaryStringOneOrMoreKey), value); - } - - private static String createMillisecondStringFromNumber(long number) { - return String.format(str("revanced_ryd_statistics_millisecond_text"), number); - } - -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SponsorBlockPreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SponsorBlockPreferenceFragment.java deleted file mode 100644 index 751125274..000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SponsorBlockPreferenceFragment.java +++ /dev/null @@ -1,629 +0,0 @@ -package app.revanced.extension.youtube.settings.preference; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.preference.*; -import android.text.Html; -import android.text.InputType; -import android.util.TypedValue; -import android.widget.EditText; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.Utils; -import app.revanced.extension.shared.settings.Setting; -import app.revanced.extension.shared.settings.preference.ResettableEditTextPreference; -import app.revanced.extension.youtube.settings.Settings; -import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; -import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; -import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils; -import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategory; -import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategoryListPreference; -import app.revanced.extension.youtube.sponsorblock.objects.UserStats; -import app.revanced.extension.youtube.sponsorblock.requests.SBRequester; -import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockViewController; - -import static android.text.Html.fromHtml; -import static app.revanced.extension.shared.StringRef.str; - -@SuppressWarnings("deprecation") -public class SponsorBlockPreferenceFragment extends PreferenceFragment { - - private SwitchPreference sbEnabled; - private SwitchPreference addNewSegment; - private SwitchPreference votingEnabled; - private SwitchPreference autoHideSkipSegmentButton; - private SwitchPreference compactSkipButton; - private SwitchPreference squareLayout; - private SwitchPreference showSkipToast; - private SwitchPreference trackSkips; - private SwitchPreference showTimeWithoutSegments; - private SwitchPreference toastOnConnectionError; - - private ResettableEditTextPreference newSegmentStep; - private ResettableEditTextPreference minSegmentDuration; - private EditTextPreference privateUserId; - private EditTextPreference importExport; - private Preference apiUrl; - - private PreferenceCategory statsCategory; - private PreferenceCategory segmentCategory; - - private void updateUI() { - try { - final boolean enabled = Settings.SB_ENABLED.get(); - if (!enabled) { - SponsorBlockViewController.hideAll(); - SegmentPlaybackController.setCurrentVideoId(null); - } else if (!Settings.SB_CREATE_NEW_SEGMENT.get()) { - SponsorBlockViewController.hideNewSegmentLayout(); - } - // Voting and add new segment buttons automatically show/hide themselves. - - SponsorBlockViewController.updateLayout(); - - sbEnabled.setChecked(enabled); - - addNewSegment.setChecked(Settings.SB_CREATE_NEW_SEGMENT.get()); - addNewSegment.setEnabled(enabled); - - votingEnabled.setChecked(Settings.SB_VOTING_BUTTON.get()); - votingEnabled.setEnabled(enabled); - - autoHideSkipSegmentButton.setEnabled(enabled); - autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get()); - - compactSkipButton.setChecked(Settings.SB_COMPACT_SKIP_BUTTON.get()); - compactSkipButton.setEnabled(enabled); - - squareLayout.setChecked(Settings.SB_SQUARE_LAYOUT.get()); - squareLayout.setEnabled(enabled); - - showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get()); - showSkipToast.setEnabled(enabled); - - toastOnConnectionError.setChecked(Settings.SB_TOAST_ON_CONNECTION_ERROR.get()); - toastOnConnectionError.setEnabled(enabled); - - trackSkips.setChecked(Settings.SB_TRACK_SKIP_COUNT.get()); - trackSkips.setEnabled(enabled); - - showTimeWithoutSegments.setChecked(Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.get()); - showTimeWithoutSegments.setEnabled(enabled); - - newSegmentStep.setText((Settings.SB_CREATE_NEW_SEGMENT_STEP.get()).toString()); - newSegmentStep.setEnabled(enabled); - - minSegmentDuration.setText((Settings.SB_SEGMENT_MIN_DURATION.get()).toString()); - minSegmentDuration.setEnabled(enabled); - - privateUserId.setText(Settings.SB_PRIVATE_USER_ID.get()); - privateUserId.setEnabled(enabled); - - // If the user has a private user id, then include a subtext that mentions not to share it. - String importExportSummary = SponsorBlockSettings.userHasSBPrivateId() - ? str("revanced_sb_settings_ie_sum_warning") - : str("revanced_sb_settings_ie_sum"); - importExport.setSummary(importExportSummary); - - apiUrl.setEnabled(enabled); - importExport.setEnabled(enabled); - segmentCategory.setEnabled(enabled); - statsCategory.setEnabled(enabled); - } catch (Exception ex) { - Logger.printException(() -> "update settings UI failure", ex); - } - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - try { - Activity context = getActivity(); - PreferenceManager manager = getPreferenceManager(); - manager.setSharedPreferencesName(Setting.preferences.name); - PreferenceScreen preferenceScreen = manager.createPreferenceScreen(context); - setPreferenceScreen(preferenceScreen); - - SponsorBlockSettings.initialize(); - - sbEnabled = new SwitchPreference(context); - sbEnabled.setTitle(str("revanced_sb_enable_sb")); - sbEnabled.setSummary(str("revanced_sb_enable_sb_sum")); - preferenceScreen.addPreference(sbEnabled); - sbEnabled.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_ENABLED.save((Boolean) newValue); - updateUI(); - return true; - }); - - addAppearanceCategory(context, preferenceScreen); - - segmentCategory = new PreferenceCategory(context); - segmentCategory.setTitle(str("revanced_sb_diff_segments")); - preferenceScreen.addPreference(segmentCategory); - updateSegmentCategories(); - - addCreateSegmentCategory(context, preferenceScreen); - - addGeneralCategory(context, preferenceScreen); - - statsCategory = new PreferenceCategory(context); - statsCategory.setTitle(str("revanced_sb_stats")); - preferenceScreen.addPreference(statsCategory); - fetchAndDisplayStats(); - - addAboutCategory(context, preferenceScreen); - - Utils.setPreferenceTitlesToMultiLineIfNeeded(preferenceScreen); - - updateUI(); - } catch (Exception ex) { - Logger.printException(() -> "onCreate failure", ex); - } - } - - private void addAppearanceCategory(Context context, PreferenceScreen screen) { - PreferenceCategory category = new PreferenceCategory(context); - screen.addPreference(category); - category.setTitle(str("revanced_sb_appearance_category")); - - votingEnabled = new SwitchPreference(context); - votingEnabled.setTitle(str("revanced_sb_enable_voting")); - votingEnabled.setSummaryOn(str("revanced_sb_enable_voting_sum_on")); - votingEnabled.setSummaryOff(str("revanced_sb_enable_voting_sum_off")); - category.addPreference(votingEnabled); - votingEnabled.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_VOTING_BUTTON.save((Boolean) newValue); - updateUI(); - return true; - }); - - 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")); - category.addPreference(autoHideSkipSegmentButton); - autoHideSkipSegmentButton.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_AUTO_HIDE_SKIP_BUTTON.save((Boolean) newValue); - updateUI(); - return true; - }); - - compactSkipButton = new SwitchPreference(context); - compactSkipButton.setTitle(str("revanced_sb_enable_compact_skip_button")); - compactSkipButton.setSummaryOn(str("revanced_sb_enable_compact_skip_button_sum_on")); - compactSkipButton.setSummaryOff(str("revanced_sb_enable_compact_skip_button_sum_off")); - category.addPreference(compactSkipButton); - compactSkipButton.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_COMPACT_SKIP_BUTTON.save((Boolean) newValue); - updateUI(); - return true; - }); - - 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")); - category.addPreference(squareLayout); - squareLayout.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_SQUARE_LAYOUT.save((Boolean) newValue); - updateUI(); - return true; - }); - - 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(); - return true; - }); - category.addPreference(showSkipToast); - - showTimeWithoutSegments = new SwitchPreference(context); - showTimeWithoutSegments.setTitle(str("revanced_sb_general_time_without")); - showTimeWithoutSegments.setSummaryOn(str("revanced_sb_general_time_without_sum_on")); - showTimeWithoutSegments.setSummaryOff(str("revanced_sb_general_time_without_sum_off")); - showTimeWithoutSegments.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.save((Boolean) newValue); - updateUI(); - return true; - }); - category.addPreference(showTimeWithoutSegments); - } - - private void addCreateSegmentCategory(Context context, PreferenceScreen screen) { - PreferenceCategory category = new PreferenceCategory(context); - screen.addPreference(category); - category.setTitle(str("revanced_sb_create_segment_category")); - - addNewSegment = new SwitchPreference(context); - addNewSegment.setTitle(str("revanced_sb_enable_create_segment")); - addNewSegment.setSummaryOn(str("revanced_sb_enable_create_segment_sum_on")); - addNewSegment.setSummaryOff(str("revanced_sb_enable_create_segment_sum_off")); - category.addPreference(addNewSegment); - addNewSegment.setOnPreferenceChangeListener((preference1, o) -> { - Boolean newValue = (Boolean) o; - if (newValue && !Settings.SB_SEEN_GUIDELINES.get()) { - new AlertDialog.Builder(preference1.getContext()) - .setTitle(str("revanced_sb_guidelines_popup_title")) - .setMessage(str("revanced_sb_guidelines_popup_content")) - .setNegativeButton(str("revanced_sb_guidelines_popup_already_read"), null) - .setPositiveButton(str("revanced_sb_guidelines_popup_open"), (dialogInterface, i) -> openGuidelines()) - .setOnDismissListener(dialog -> Settings.SB_SEEN_GUIDELINES.save(true)) - .setCancelable(false) - .show(); - } - Settings.SB_CREATE_NEW_SEGMENT.save(newValue); - updateUI(); - return true; - }); - - newSegmentStep = new ResettableEditTextPreference(context); - newSegmentStep.setSetting(Settings.SB_CREATE_NEW_SEGMENT_STEP); - newSegmentStep.setTitle(str("revanced_sb_general_adjusting")); - newSegmentStep.setSummary(str("revanced_sb_general_adjusting_sum")); - newSegmentStep.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER); - newSegmentStep.setOnPreferenceChangeListener((preference1, newValue) -> { - try { - final int newAdjustmentValue = Integer.parseInt(newValue.toString()); - if (newAdjustmentValue != 0) { - Settings.SB_CREATE_NEW_SEGMENT_STEP.save(newAdjustmentValue); - return true; - } - } catch (NumberFormatException ex) { - Logger.printInfo(() -> "Invalid new segment step", ex); - } - - Utils.showToastLong(str("revanced_sb_general_adjusting_invalid")); - updateUI(); - return false; - }); - category.addPreference(newSegmentStep); - - Preference guidelinePreferences = new Preference(context); - guidelinePreferences.setTitle(str("revanced_sb_guidelines_preference_title")); - guidelinePreferences.setSummary(str("revanced_sb_guidelines_preference_sum")); - guidelinePreferences.setOnPreferenceClickListener(preference1 -> { - openGuidelines(); - return true; - }); - category.addPreference(guidelinePreferences); - } - - private void addGeneralCategory(final Context context, PreferenceScreen screen) { - PreferenceCategory category = new PreferenceCategory(context); - screen.addPreference(category); - category.setTitle(str("revanced_sb_general")); - - toastOnConnectionError = new SwitchPreference(context); - toastOnConnectionError.setTitle(str("revanced_sb_toast_on_connection_error_title")); - toastOnConnectionError.setSummaryOn(str("revanced_sb_toast_on_connection_error_summary_on")); - toastOnConnectionError.setSummaryOff(str("revanced_sb_toast_on_connection_error_summary_off")); - toastOnConnectionError.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_TOAST_ON_CONNECTION_ERROR.save((Boolean) newValue); - updateUI(); - return true; - }); - category.addPreference(toastOnConnectionError); - - trackSkips = new SwitchPreference(context); - trackSkips.setTitle(str("revanced_sb_general_skipcount")); - trackSkips.setSummaryOn(str("revanced_sb_general_skipcount_sum_on")); - trackSkips.setSummaryOff(str("revanced_sb_general_skipcount_sum_off")); - trackSkips.setOnPreferenceChangeListener((preference1, newValue) -> { - Settings.SB_TRACK_SKIP_COUNT.save((Boolean) newValue); - updateUI(); - return true; - }); - category.addPreference(trackSkips); - - minSegmentDuration = new ResettableEditTextPreference(context); - minSegmentDuration.setSetting(Settings.SB_SEGMENT_MIN_DURATION); - minSegmentDuration.setTitle(str("revanced_sb_general_min_duration")); - minSegmentDuration.setSummary(str("revanced_sb_general_min_duration_sum")); - minSegmentDuration.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); - minSegmentDuration.setOnPreferenceChangeListener((preference1, newValue) -> { - try { - Float minTimeDuration = Float.valueOf(newValue.toString()); - Settings.SB_SEGMENT_MIN_DURATION.save(minTimeDuration); - return true; - } catch (NumberFormatException ex) { - Logger.printInfo(() -> "Invalid minimum segment duration", ex); - } - - Utils.showToastLong(str("revanced_sb_general_min_duration_invalid")); - updateUI(); - return false; - }); - category.addPreference(minSegmentDuration); - - privateUserId = new EditTextPreference(context) { - protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { - Utils.setEditTextDialogTheme(builder); - - builder.setNeutralButton(str("revanced_sb_settings_copy"), (dialog, which) -> { - Utils.setClipboard(getEditText().getText().toString()); - }); - } - }; - privateUserId.setTitle(str("revanced_sb_general_uuid")); - privateUserId.setSummary(str("revanced_sb_general_uuid_sum")); - privateUserId.setOnPreferenceChangeListener((preference1, newValue) -> { - String newUUID = newValue.toString(); - if (!SponsorBlockSettings.isValidSBUserId(newUUID)) { - Utils.showToastLong(str("revanced_sb_general_uuid_invalid")); - return false; - } - - Settings.SB_PRIVATE_USER_ID.save(newUUID); - updateUI(); - fetchAndDisplayStats(); - return true; - }); - category.addPreference(privateUserId); - - apiUrl = new Preference(context); - apiUrl.setTitle(str("revanced_sb_general_api_url")); - apiUrl.setSummary(Html.fromHtml(str("revanced_sb_general_api_url_sum"))); - apiUrl.setOnPreferenceClickListener(preference1 -> { - EditText editText = new EditText(context); - editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI); - editText.setText(Settings.SB_API_URL.get()); - - DialogInterface.OnClickListener urlChangeListener = (dialog, buttonPressed) -> { - if (buttonPressed == DialogInterface.BUTTON_NEUTRAL) { - Settings.SB_API_URL.resetToDefault(); - Utils.showToastLong(str("revanced_sb_api_url_reset")); - } else if (buttonPressed == DialogInterface.BUTTON_POSITIVE) { - String serverAddress = editText.getText().toString(); - if (!SponsorBlockSettings.isValidSBServerAddress(serverAddress)) { - Utils.showToastLong(str("revanced_sb_api_url_invalid")); - } else if (!serverAddress.equals(Settings.SB_API_URL.get())) { - Settings.SB_API_URL.save(serverAddress); - Utils.showToastLong(str("revanced_sb_api_url_changed")); - } - } - }; - new AlertDialog.Builder(context) - .setTitle(apiUrl.getTitle()) - .setView(editText) - .setNegativeButton(android.R.string.cancel, null) - .setNeutralButton(str("revanced_sb_reset"), urlChangeListener) - .setPositiveButton(android.R.string.ok, urlChangeListener) - .show(); - return true; - }); - category.addPreference(apiUrl); - - importExport = new EditTextPreference(context) { - protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { - Utils.setEditTextDialogTheme(builder); - - builder.setNeutralButton(str("revanced_sb_settings_copy"), (dialog, which) -> { - Utils.setClipboard(getEditText().getText().toString()); - }); - } - }; - importExport.setTitle(str("revanced_sb_settings_ie")); - // Summary is set in updateUI() - importExport.getEditText().setInputType(InputType.TYPE_CLASS_TEXT - | InputType.TYPE_TEXT_FLAG_MULTI_LINE - | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - importExport.getEditText().setAutofillHints((String) null); - importExport.getEditText().setTextSize(TypedValue.COMPLEX_UNIT_PT, 8); - importExport.setOnPreferenceClickListener(preference1 -> { - importExport.getEditText().setText(SponsorBlockSettings.exportDesktopSettings()); - return true; - }); - importExport.setOnPreferenceChangeListener((preference1, newValue) -> { - SponsorBlockSettings.importDesktopSettings((String) newValue); - updateSegmentCategories(); - fetchAndDisplayStats(); - updateUI(); - return true; - }); - category.addPreference(importExport); - } - - private void updateSegmentCategories() { - try { - segmentCategory.removeAll(); - - Activity activity = getActivity(); - for (SegmentCategory category : SegmentCategory.categoriesWithoutUnsubmitted()) { - segmentCategory.addPreference(new SegmentCategoryListPreference(activity, category)); - } - } catch (Exception ex) { - Logger.printException(() -> "updateSegmentCategories failure", ex); - } - } - - private void addAboutCategory(Context context, PreferenceScreen screen) { - PreferenceCategory category = new PreferenceCategory(context); - screen.addPreference(category); - category.setTitle(str("revanced_sb_about")); - - { - Preference preference = new Preference(context); - category.addPreference(preference); - preference.setTitle(str("revanced_sb_about_api")); - preference.setSummary(str("revanced_sb_about_api_sum")); - preference.setOnPreferenceClickListener(preference1 -> { - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse("https://sponsor.ajay.app")); - preference1.getContext().startActivity(i); - return false; - }); - } - } - - private void openGuidelines() { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse("https://wiki.sponsor.ajay.app/w/Guidelines")); - getActivity().startActivity(intent); - } - - private void fetchAndDisplayStats() { - try { - statsCategory.removeAll(); - if (!SponsorBlockSettings.userHasSBPrivateId()) { - // User has never voted or created any segments. No stats to show. - addLocalUserStats(); - return; - } - - Preference loadingPlaceholderPreference = new Preference(this.getActivity()); - loadingPlaceholderPreference.setEnabled(false); - statsCategory.addPreference(loadingPlaceholderPreference); - if (Settings.SB_ENABLED.get()) { - loadingPlaceholderPreference.setTitle(str("revanced_sb_stats_loading")); - Utils.runOnBackgroundThread(() -> { - UserStats stats = SBRequester.retrieveUserStats(); - Utils.runOnMainThread(() -> { // get back on main thread to modify UI elements - addUserStats(loadingPlaceholderPreference, stats); - addLocalUserStats(); - }); - }); - } else { - loadingPlaceholderPreference.setTitle(str("revanced_sb_stats_sb_disabled")); - } - } catch (Exception ex) { - Logger.printException(() -> "fetchAndDisplayStats failure", ex); - } - } - - private void addUserStats(@NonNull Preference loadingPlaceholder, @Nullable UserStats stats) { - Utils.verifyOnMainThread(); - try { - if (stats == null) { - loadingPlaceholder.setTitle(str("revanced_sb_stats_connection_failure")); - return; - } - statsCategory.removeAll(); - Context context = statsCategory.getContext(); - - if (stats.totalSegmentCountIncludingIgnored > 0) { - // If user has not created any segments, there's no reason to set a username. - EditTextPreference preference = new ResettableEditTextPreference(context); - statsCategory.addPreference(preference); - String userName = stats.userName; - preference.setTitle(fromHtml(str("revanced_sb_stats_username", userName))); - preference.setSummary(str("revanced_sb_stats_username_change")); - preference.setText(userName); - preference.setOnPreferenceChangeListener((preference1, value) -> { - Utils.runOnBackgroundThread(() -> { - String newUserName = (String) value; - String errorMessage = SBRequester.setUsername(newUserName); - Utils.runOnMainThread(() -> { - if (errorMessage == null) { - preference.setTitle(fromHtml(str("revanced_sb_stats_username", newUserName))); - preference.setText(newUserName); - Utils.showToastLong(str("revanced_sb_stats_username_changed")); - } else { - preference.setText(userName); // revert to previous - SponsorBlockUtils.showErrorDialog(errorMessage); - } - }); - }); - return true; - }); - } - - { - // number of segment submissions (does not include ignored segments) - Preference preference = new Preference(context); - statsCategory.addPreference(preference); - String formatted = SponsorBlockUtils.getNumberOfSkipsString(stats.segmentCount); - preference.setTitle(fromHtml(str("revanced_sb_stats_submissions", formatted))); - preference.setSummary(str("revanced_sb_stats_submissions_sum")); - if (stats.totalSegmentCountIncludingIgnored == 0) { - preference.setSelectable(false); - } else { - preference.setOnPreferenceClickListener(preference1 -> { - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse("https://sb.ltn.fi/userid/" + stats.publicUserId)); - preference1.getContext().startActivity(i); - return true; - }); - } - } - - { - // "user reputation". Usually not useful, since it appears most users have zero reputation. - // But if there is a reputation, then show it here - Preference preference = new Preference(context); - preference.setTitle(fromHtml(str("revanced_sb_stats_reputation", stats.reputation))); - preference.setSelectable(false); - if (stats.reputation != 0) { - statsCategory.addPreference(preference); - } - } - - { - // time saved for other users - Preference preference = new Preference(context); - statsCategory.addPreference(preference); - - String stats_saved; - String stats_saved_sum; - if (stats.totalSegmentCountIncludingIgnored == 0) { - stats_saved = str("revanced_sb_stats_saved_zero"); - stats_saved_sum = str("revanced_sb_stats_saved_sum_zero"); - } else { - stats_saved = str("revanced_sb_stats_saved", - SponsorBlockUtils.getNumberOfSkipsString(stats.viewCount)); - stats_saved_sum = str("revanced_sb_stats_saved_sum", SponsorBlockUtils.getTimeSavedString((long) (60 * stats.minutesSaved))); - } - preference.setTitle(fromHtml(stats_saved)); - preference.setSummary(fromHtml(stats_saved_sum)); - preference.setOnPreferenceClickListener(preference1 -> { - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse("https://sponsor.ajay.app/stats/")); - preference1.getContext().startActivity(i); - return false; - }); - } - } catch (Exception ex) { - Logger.printException(() -> "addUserStats failure", ex); - } - } - - private void addLocalUserStats() { - // time the user saved by using SB - Preference preference = new Preference(statsCategory.getContext()); - statsCategory.addPreference(preference); - - Runnable updateStatsSelfSaved = () -> { - String formatted = SponsorBlockUtils.getNumberOfSkipsString(Settings.SB_LOCAL_TIME_SAVED_NUMBER_SEGMENTS.get()); - preference.setTitle(fromHtml(str("revanced_sb_stats_self_saved", formatted))); - String formattedSaved = SponsorBlockUtils.getTimeSavedString(Settings.SB_LOCAL_TIME_SAVED_MILLISECONDS.get() / 1000); - preference.setSummary(fromHtml(str("revanced_sb_stats_self_saved_sum", formattedSaved))); - }; - updateStatsSelfSaved.run(); - preference.setOnPreferenceClickListener(preference1 -> { - new AlertDialog.Builder(preference1.getContext()) - .setTitle(str("revanced_sb_stats_self_saved_reset_title")) - .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> { - Settings.SB_LOCAL_TIME_SAVED_NUMBER_SEGMENTS.resetToDefault(); - Settings.SB_LOCAL_TIME_SAVED_MILLISECONDS.resetToDefault(); - updateStatsSelfSaved.run(); - }) - .setNegativeButton(android.R.string.no, null).show(); - return true; - }); - } - -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/UrlLinkPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/UrlLinkPreference.java new file mode 100644 index 000000000..9570883cb --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/UrlLinkPreference.java @@ -0,0 +1,44 @@ +package app.revanced.extension.youtube.settings.preference; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.preference.Preference; +import android.util.AttributeSet; + +import app.revanced.extension.shared.Logger; + +/** + * Simple preference that opens a url when clicked. + */ +@SuppressWarnings("deprecation") +public class UrlLinkPreference extends Preference { + + protected String externalUrl; + + { + setOnPreferenceClickListener(pref -> { + if (externalUrl == null) { + Logger.printException(() -> "URL not set " + getClass().getSimpleName()); + return false; + } + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(externalUrl)); + pref.getContext().startActivity(i); + return true; + }); + } + + public UrlLinkPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + public UrlLinkPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + public UrlLinkPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + public UrlLinkPreference(Context context) { + super(context); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java index e8d64fb50..d03bde3bb 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java @@ -18,6 +18,7 @@ import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup; import app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour; import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategory; @@ -31,6 +32,7 @@ public class SponsorBlockSettings { @Override public void settingsImported(@Nullable Context context) { SegmentCategory.loadAllCategoriesFromSettings(); + SponsorBlockPreferenceGroup.settingsImported = true; } @Override public void settingsExported(@Nullable Context context) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java index ae92caaff..36204319c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java @@ -53,9 +53,9 @@ public class SegmentCategoryListPreference extends ListPreference { setEntryValues(isHighlightCategory ? CategoryBehaviour.getBehaviorKeyValuesWithoutSkipOnce() : CategoryBehaviour.getBehaviorKeyValues()); - setSummary(category.description.toString()); + super.setSummary(category.description.toString()); - updateTitleFromCategory(); + updateUI(); } @Override @@ -202,7 +202,7 @@ public class SegmentCategoryListPreference extends ListPreference { builder.setNeutralButton(str("revanced_sb_reset_color"), (dialog, which) -> { try { category.resetColorAndOpacity(); - updateTitleFromCategory(); + updateUI(); Utils.showToastShort(str("revanced_sb_color_reset")); } catch (Exception ex) { Logger.printException(() -> "setNeutralButton failure", ex); @@ -240,7 +240,7 @@ public class SegmentCategoryListPreference extends ListPreference { Utils.showToastShort(str("revanced_sb_color_invalid")); } - updateTitleFromCategory(); + updateUI(); } } catch (Exception ex) { Logger.printException(() -> "onDialogClosed failure", ex); @@ -251,7 +251,7 @@ public class SegmentCategoryListPreference extends ListPreference { categoryColor = applyOpacityToColor(categoryColor, categoryOpacity); } - private void updateTitleFromCategory() { + public void updateUI() { categoryColor = category.getColorNoOpacity(); categoryOpacity = category.getOpacity(); applyOpacityToCategoryColor(); @@ -268,4 +268,13 @@ public class SegmentCategoryListPreference extends ListPreference { private void updateOpacityText() { opacityEditText.setText(String.format(Locale.US, "%.2f", categoryOpacity)); } + + @Override + public void setSummary(CharSequence summary) { + // Ignore calls to set the summary. + // Summary is always the description of the category. + // + // This is required otherwise the ReVanced preference fragment + // sets all ListPreference summaries to show the current selection. + } } \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java index 4889c7671..ff0eaffcf 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java @@ -5,13 +5,19 @@ import androidx.annotation.NonNull; import org.json.JSONException; import org.json.JSONObject; +import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; + /** * SponsorBlock user stats */ public class UserStats { - @NonNull + /** + * How long to cache user stats objects. + */ + private static final long STATS_EXPIRATION_MILLISECONDS = 60 * 60 * 1000; // 60 minutes. + + private final String privateUserId; public final String publicUserId; - @NonNull public final String userName; /** * "User reputation". Unclear how SB determines this value. @@ -26,7 +32,13 @@ public class UserStats { public final int viewCount; public final double minutesSaved; - public UserStats(@NonNull JSONObject json) throws JSONException { + /** + * When this stat was fetched. + */ + public final long fetchTime; + + public UserStats(String privateSbId, @NonNull JSONObject json) throws JSONException { + privateUserId = privateSbId; publicUserId = json.getString("userID"); userName = json.getString("userName"); reputation = (float)json.getDouble("reputation"); @@ -35,11 +47,23 @@ public class UserStats { totalSegmentCountIncludingIgnored = segmentCount + ignoredSegmentCount; viewCount = json.getInt("viewCount"); minutesSaved = json.getDouble("minutesSaved"); + fetchTime = System.currentTimeMillis(); + } + + public boolean isExpired() { + if (STATS_EXPIRATION_MILLISECONDS < System.currentTimeMillis() - fetchTime) { + return true; + } + + // User changed their SB private user id. + return !SponsorBlockSettings.userHasSBPrivateId() + || !SponsorBlockSettings.getSBPrivateUserID().equals(privateUserId); } @NonNull @Override public String toString() { + // Do not include private user id in toString(). return "UserStats{" + "publicUserId='" + publicUserId + '\'' + ", userName='" + userName + '\'' diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java index 445b711dc..fea7664f1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java @@ -47,6 +47,9 @@ public class SBRequester { */ private static final int HTTP_STATUS_CODE_SUCCESS = 200; + @Nullable + private static volatile UserStats lastFetchedStats; + private SBRequester() { } @@ -181,6 +184,8 @@ public class SBRequester { Utils.showToastLong(str("revanced_sb_submit_failed_unknown_error", 0, ex.getMessage())); } catch (Exception ex) { Logger.printException(() -> "failed to submit segments", ex); // Should never happen. + } finally { + lastFetchedStats = null; // Fetch updated stats if needed. } } @@ -252,9 +257,17 @@ public class SBRequester { public static UserStats retrieveUserStats() { Utils.verifyOffMainThread(); try { - UserStats stats = new UserStats(getJSONObject(SBRoutes.GET_USER_STATS, SponsorBlockSettings.getSBPrivateUserID())); - Logger.printDebug(() -> "user stats: " + stats); - return stats; + UserStats stats = lastFetchedStats; + if (stats != null && !stats.isExpired()) { + return stats; + } + + String privateUserID = SponsorBlockSettings.getSBPrivateUserID(); + UserStats fetchedStats = new UserStats(privateUserID, + getJSONObject(SBRoutes.GET_USER_STATS, privateUserID)); + Logger.printDebug(() -> "user stats: " + fetchedStats); + lastFetchedStats = fetchedStats; + return fetchedStats; } catch (IOException ex) { Logger.printInfo(() -> "failed to retrieve user stats", ex); // info level, do not show a toast } catch (Exception ex) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java new file mode 100644 index 000000000..098f8d599 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java @@ -0,0 +1,26 @@ +package app.revanced.extension.youtube.sponsorblock.ui; + +import android.content.Context; +import android.util.AttributeSet; + +import app.revanced.extension.youtube.settings.preference.UrlLinkPreference; + +@SuppressWarnings("unused") +public class SponsorBlockAboutPreference extends UrlLinkPreference { + { + externalUrl = "https://sponsor.ajay.app"; + } + + public SponsorBlockAboutPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + public SponsorBlockAboutPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + public SponsorBlockAboutPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + public SponsorBlockAboutPreference(Context context) { + super(context); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java new file mode 100644 index 000000000..4ed3bf238 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java @@ -0,0 +1,471 @@ +package app.revanced.extension.youtube.sponsorblock.ui; + +import static app.revanced.extension.shared.StringRef.str; + +import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.preference.*; +import android.text.Html; +import android.text.InputType; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; + +import java.util.ArrayList; +import java.util.List; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.preference.ResettableEditTextPreference; +import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; +import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; +import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategory; +import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategoryListPreference; + +/** + * Lots of old code that could be converted to a half dozen custom preferences, + * but instead it's wrapped in this group container and all logic is handled here. + */ +@SuppressWarnings({"unused", "deprecation"}) +public class SponsorBlockPreferenceGroup extends PreferenceGroup { + + /** + * ReVanced settings were recently imported and the UI needs to be updated. + */ + public static boolean settingsImported; + + /** + * If the preferences have been created and added to this group. + */ + private boolean preferencesInitialized; + + private SwitchPreference sbEnabled; + private SwitchPreference addNewSegment; + private SwitchPreference votingEnabled; + private SwitchPreference autoHideSkipSegmentButton; + private SwitchPreference compactSkipButton; + private SwitchPreference squareLayout; + private SwitchPreference showSkipToast; + private SwitchPreference trackSkips; + private SwitchPreference showTimeWithoutSegments; + private SwitchPreference toastOnConnectionError; + + private ResettableEditTextPreference newSegmentStep; + private ResettableEditTextPreference minSegmentDuration; + private EditTextPreference privateUserId; + private EditTextPreference importExport; + private Preference apiUrl; + + private final List segmentCategories = new ArrayList<>(); + private PreferenceCategory segmentCategory; + + public SponsorBlockPreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public SponsorBlockPreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SponsorBlockPreferenceGroup(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + @SuppressLint("MissingSuperCall") + protected View onCreateView(ViewGroup parent) { + // Title is not shown. + return new View(getContext()); + } + + private void updateUI() { + try { + Logger.printDebug(() -> "updateUI"); + + final boolean enabled = Settings.SB_ENABLED.get(); + if (!enabled) { + SponsorBlockViewController.hideAll(); + SegmentPlaybackController.setCurrentVideoId(null); + } else if (!Settings.SB_CREATE_NEW_SEGMENT.get()) { + SponsorBlockViewController.hideNewSegmentLayout(); + } + // Voting and add new segment buttons automatically show/hide themselves. + + SponsorBlockViewController.updateLayout(); + + sbEnabled.setChecked(enabled); + + addNewSegment.setChecked(Settings.SB_CREATE_NEW_SEGMENT.get()); + addNewSegment.setEnabled(enabled); + + votingEnabled.setChecked(Settings.SB_VOTING_BUTTON.get()); + votingEnabled.setEnabled(enabled); + + autoHideSkipSegmentButton.setEnabled(enabled); + autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get()); + + compactSkipButton.setChecked(Settings.SB_COMPACT_SKIP_BUTTON.get()); + compactSkipButton.setEnabled(enabled); + + squareLayout.setChecked(Settings.SB_SQUARE_LAYOUT.get()); + squareLayout.setEnabled(enabled); + + showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get()); + showSkipToast.setEnabled(enabled); + + toastOnConnectionError.setChecked(Settings.SB_TOAST_ON_CONNECTION_ERROR.get()); + toastOnConnectionError.setEnabled(enabled); + + trackSkips.setChecked(Settings.SB_TRACK_SKIP_COUNT.get()); + trackSkips.setEnabled(enabled); + + showTimeWithoutSegments.setChecked(Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.get()); + showTimeWithoutSegments.setEnabled(enabled); + + newSegmentStep.setText((Settings.SB_CREATE_NEW_SEGMENT_STEP.get()).toString()); + newSegmentStep.setEnabled(enabled); + + minSegmentDuration.setText((Settings.SB_SEGMENT_MIN_DURATION.get()).toString()); + minSegmentDuration.setEnabled(enabled); + + privateUserId.setText(Settings.SB_PRIVATE_USER_ID.get()); + privateUserId.setEnabled(enabled); + + // If the user has a private user id, then include a subtext that mentions not to share it. + String importExportSummary = SponsorBlockSettings.userHasSBPrivateId() + ? str("revanced_sb_settings_ie_sum_warning") + : str("revanced_sb_settings_ie_sum"); + importExport.setSummary(importExportSummary); + + apiUrl.setEnabled(enabled); + importExport.setEnabled(enabled); + segmentCategory.setEnabled(enabled); + + for (SegmentCategoryListPreference category : segmentCategories) { + category.updateUI(); + } + } catch (Exception ex) { + Logger.printException(() -> "updateUI failure", ex); + } + } + + protected void onAttachedToActivity() { + try { + super.onAttachedToActivity(); + + if (preferencesInitialized) { + if (settingsImported) { + settingsImported = false; + updateUI(); + } + return; + } + + preferencesInitialized = true; + + Logger.printDebug(() -> "Creating settings preferences"); + Context context = getContext(); + SponsorBlockSettings.initialize(); + + sbEnabled = new SwitchPreference(context); + sbEnabled.setTitle(str("revanced_sb_enable_sb")); + sbEnabled.setSummary(str("revanced_sb_enable_sb_sum")); + addPreference(sbEnabled); + sbEnabled.setOnPreferenceChangeListener((preference1, newValue) -> { + Settings.SB_ENABLED.save((Boolean) newValue); + updateUI(); + return true; + }); + + PreferenceCategory appearanceCategory = new PreferenceCategory(context); + appearanceCategory.setTitle(str("revanced_sb_appearance_category")); + addPreference(appearanceCategory); + + votingEnabled = new SwitchPreference(context); + votingEnabled.setTitle(str("revanced_sb_enable_voting")); + votingEnabled.setSummaryOn(str("revanced_sb_enable_voting_sum_on")); + votingEnabled.setSummaryOff(str("revanced_sb_enable_voting_sum_off")); + votingEnabled.setOnPreferenceChangeListener((preference1, newValue) -> { + Settings.SB_VOTING_BUTTON.save((Boolean) newValue); + updateUI(); + return true; + }); + 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")); + compactSkipButton.setSummaryOff(str("revanced_sb_enable_compact_skip_button_sum_off")); + compactSkipButton.setOnPreferenceChangeListener((preference1, newValue) -> { + Settings.SB_COMPACT_SKIP_BUTTON.save((Boolean) newValue); + updateUI(); + return true; + }); + 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); + updateUI(); + return true; + }); + appearanceCategory.addPreference(squareLayout); + + 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(); + return true; + }); + appearanceCategory.addPreference(showSkipToast); + + showTimeWithoutSegments = new SwitchPreference(context); + showTimeWithoutSegments.setTitle(str("revanced_sb_general_time_without")); + showTimeWithoutSegments.setSummaryOn(str("revanced_sb_general_time_without_sum_on")); + showTimeWithoutSegments.setSummaryOff(str("revanced_sb_general_time_without_sum_off")); + showTimeWithoutSegments.setOnPreferenceChangeListener((preference1, newValue) -> { + Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.save((Boolean) newValue); + updateUI(); + return true; + }); + appearanceCategory.addPreference(showTimeWithoutSegments); + + segmentCategory = new PreferenceCategory(context); + segmentCategory.setTitle(str("revanced_sb_diff_segments")); + addPreference(segmentCategory); + + for (SegmentCategory category : SegmentCategory.categoriesWithoutUnsubmitted()) { + SegmentCategoryListPreference categoryPreference = new SegmentCategoryListPreference(context, category); + segmentCategories.add(categoryPreference); + segmentCategory.addPreference(categoryPreference); + } + + PreferenceCategory createSegmentCategory = new PreferenceCategory(context); + createSegmentCategory.setTitle(str("revanced_sb_create_segment_category")); + addPreference(createSegmentCategory); + + addNewSegment = new SwitchPreference(context); + addNewSegment.setTitle(str("revanced_sb_enable_create_segment")); + addNewSegment.setSummaryOn(str("revanced_sb_enable_create_segment_sum_on")); + addNewSegment.setSummaryOff(str("revanced_sb_enable_create_segment_sum_off")); + addNewSegment.setOnPreferenceChangeListener((preference1, o) -> { + Boolean newValue = (Boolean) o; + if (newValue && !Settings.SB_SEEN_GUIDELINES.get()) { + new AlertDialog.Builder(preference1.getContext()) + .setTitle(str("revanced_sb_guidelines_popup_title")) + .setMessage(str("revanced_sb_guidelines_popup_content")) + .setNegativeButton(str("revanced_sb_guidelines_popup_already_read"), null) + .setPositiveButton(str("revanced_sb_guidelines_popup_open"), (dialogInterface, i) -> openGuidelines()) + .setOnDismissListener(dialog -> Settings.SB_SEEN_GUIDELINES.save(true)) + .setCancelable(false) + .show(); + } + Settings.SB_CREATE_NEW_SEGMENT.save(newValue); + updateUI(); + return true; + }); + createSegmentCategory.addPreference(addNewSegment); + + newSegmentStep = new ResettableEditTextPreference(context); + newSegmentStep.setSetting(Settings.SB_CREATE_NEW_SEGMENT_STEP); + newSegmentStep.setTitle(str("revanced_sb_general_adjusting")); + newSegmentStep.setSummary(str("revanced_sb_general_adjusting_sum")); + newSegmentStep.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER); + newSegmentStep.setOnPreferenceChangeListener((preference1, newValue) -> { + try { + final int newAdjustmentValue = Integer.parseInt(newValue.toString()); + if (newAdjustmentValue != 0) { + Settings.SB_CREATE_NEW_SEGMENT_STEP.save(newAdjustmentValue); + return true; + } + } catch (NumberFormatException ex) { + Logger.printInfo(() -> "Invalid new segment step", ex); + } + + Utils.showToastLong(str("revanced_sb_general_adjusting_invalid")); + updateUI(); + return false; + }); + createSegmentCategory.addPreference(newSegmentStep); + + Preference guidelinePreferences = new Preference(context); + guidelinePreferences.setTitle(str("revanced_sb_guidelines_preference_title")); + guidelinePreferences.setSummary(str("revanced_sb_guidelines_preference_sum")); + guidelinePreferences.setOnPreferenceClickListener(preference1 -> { + openGuidelines(); + return true; + }); + createSegmentCategory.addPreference(guidelinePreferences); + + PreferenceCategory generalCategory = new PreferenceCategory(context); + generalCategory.setTitle(str("revanced_sb_general")); + addPreference(generalCategory); + + toastOnConnectionError = new SwitchPreference(context); + toastOnConnectionError.setTitle(str("revanced_sb_toast_on_connection_error_title")); + toastOnConnectionError.setSummaryOn(str("revanced_sb_toast_on_connection_error_summary_on")); + toastOnConnectionError.setSummaryOff(str("revanced_sb_toast_on_connection_error_summary_off")); + toastOnConnectionError.setOnPreferenceChangeListener((preference1, newValue) -> { + Settings.SB_TOAST_ON_CONNECTION_ERROR.save((Boolean) newValue); + updateUI(); + return true; + }); + generalCategory.addPreference(toastOnConnectionError); + + trackSkips = new SwitchPreference(context); + trackSkips.setTitle(str("revanced_sb_general_skipcount")); + trackSkips.setSummaryOn(str("revanced_sb_general_skipcount_sum_on")); + trackSkips.setSummaryOff(str("revanced_sb_general_skipcount_sum_off")); + trackSkips.setOnPreferenceChangeListener((preference1, newValue) -> { + Settings.SB_TRACK_SKIP_COUNT.save((Boolean) newValue); + updateUI(); + return true; + }); + generalCategory.addPreference(trackSkips); + + minSegmentDuration = new ResettableEditTextPreference(context); + minSegmentDuration.setSetting(Settings.SB_SEGMENT_MIN_DURATION); + minSegmentDuration.setTitle(str("revanced_sb_general_min_duration")); + minSegmentDuration.setSummary(str("revanced_sb_general_min_duration_sum")); + minSegmentDuration.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + minSegmentDuration.setOnPreferenceChangeListener((preference1, newValue) -> { + try { + Float minTimeDuration = Float.valueOf(newValue.toString()); + Settings.SB_SEGMENT_MIN_DURATION.save(minTimeDuration); + return true; + } catch (NumberFormatException ex) { + Logger.printInfo(() -> "Invalid minimum segment duration", ex); + } + + Utils.showToastLong(str("revanced_sb_general_min_duration_invalid")); + updateUI(); + return false; + }); + generalCategory.addPreference(minSegmentDuration); + + privateUserId = new EditTextPreference(context) { + protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { + Utils.setEditTextDialogTheme(builder); + + builder.setNeutralButton(str("revanced_sb_settings_copy"), (dialog, which) -> { + Utils.setClipboard(getEditText().getText().toString()); + }); + } + }; + privateUserId.setTitle(str("revanced_sb_general_uuid")); + privateUserId.setSummary(str("revanced_sb_general_uuid_sum")); + privateUserId.setOnPreferenceChangeListener((preference1, newValue) -> { + String newUUID = newValue.toString(); + if (!SponsorBlockSettings.isValidSBUserId(newUUID)) { + Utils.showToastLong(str("revanced_sb_general_uuid_invalid")); + return false; + } + + Settings.SB_PRIVATE_USER_ID.save(newUUID); + updateUI(); + return true; + }); + generalCategory.addPreference(privateUserId); + + apiUrl = new Preference(context); + apiUrl.setTitle(str("revanced_sb_general_api_url")); + apiUrl.setSummary(Html.fromHtml(str("revanced_sb_general_api_url_sum"))); + apiUrl.setOnPreferenceClickListener(preference1 -> { + EditText editText = new EditText(context); + editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI); + editText.setText(Settings.SB_API_URL.get()); + + DialogInterface.OnClickListener urlChangeListener = (dialog, buttonPressed) -> { + if (buttonPressed == DialogInterface.BUTTON_NEUTRAL) { + Settings.SB_API_URL.resetToDefault(); + Utils.showToastLong(str("revanced_sb_api_url_reset")); + } else if (buttonPressed == DialogInterface.BUTTON_POSITIVE) { + String serverAddress = editText.getText().toString(); + if (!SponsorBlockSettings.isValidSBServerAddress(serverAddress)) { + Utils.showToastLong(str("revanced_sb_api_url_invalid")); + } else if (!serverAddress.equals(Settings.SB_API_URL.get())) { + Settings.SB_API_URL.save(serverAddress); + Utils.showToastLong(str("revanced_sb_api_url_changed")); + } + } + }; + new AlertDialog.Builder(context) + .setTitle(apiUrl.getTitle()) + .setView(editText) + .setNegativeButton(android.R.string.cancel, null) + .setNeutralButton(str("revanced_sb_reset"), urlChangeListener) + .setPositiveButton(android.R.string.ok, urlChangeListener) + .show(); + return true; + }); + generalCategory.addPreference(apiUrl); + + importExport = new EditTextPreference(context) { + protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { + Utils.setEditTextDialogTheme(builder); + + builder.setNeutralButton(str("revanced_sb_settings_copy"), (dialog, which) -> { + Utils.setClipboard(getEditText().getText().toString()); + }); + } + }; + importExport.setTitle(str("revanced_sb_settings_ie")); + // Summary is set in updateUI() + importExport.getEditText().setInputType(InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_FLAG_MULTI_LINE + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + importExport.getEditText().setAutofillHints((String) null); + importExport.getEditText().setTextSize(TypedValue.COMPLEX_UNIT_PT, 8); + importExport.setOnPreferenceClickListener(preference1 -> { + importExport.getEditText().setText(SponsorBlockSettings.exportDesktopSettings()); + return true; + }); + importExport.setOnPreferenceChangeListener((preference1, newValue) -> { + SponsorBlockSettings.importDesktopSettings((String) newValue); + updateUI(); + return true; + }); + generalCategory.addPreference(importExport); + + Utils.setPreferenceTitlesToMultiLineIfNeeded(this); + + updateUI(); + } catch (Exception ex) { + Logger.printException(() -> "onAttachedToActivity failure", ex); + } + } + + private void openGuidelines() { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse("https://wiki.sponsor.ajay.app/w/Guidelines")); + getContext().startActivity(intent); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java new file mode 100644 index 000000000..d26a6f6be --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java @@ -0,0 +1,210 @@ +package app.revanced.extension.youtube.sponsorblock.ui; + +import static android.text.Html.fromHtml; +import static app.revanced.extension.shared.StringRef.str; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.preference.EditTextPreference; +import android.preference.Preference; +import android.preference.PreferenceCategory; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.preference.ResettableEditTextPreference; +import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; +import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils; +import app.revanced.extension.youtube.sponsorblock.objects.UserStats; +import app.revanced.extension.youtube.sponsorblock.requests.SBRequester; + +/** + * User skip stats. + * + * None of the preferences here show up in search results because + * a category cannot be added to another category for the search results. + * Additionally the stats must load remotely on a background thread which means the + * preferences are not available to collect for search when the settings first load. + */ +@SuppressWarnings({"unused", "deprecation"}) +public class SponsorBlockStatsPreferenceCategory extends PreferenceCategory { + + public SponsorBlockStatsPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public SponsorBlockStatsPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SponsorBlockStatsPreferenceCategory(Context context, AttributeSet attrs) { + super(context, attrs); + } + + protected void onAttachedToActivity() { + try { + super.onAttachedToActivity(); + + Logger.printDebug(() -> "Updating SB stats UI"); + final boolean enabled = Settings.SB_ENABLED.get(); + setEnabled(enabled); + removeAll(); + + if (!SponsorBlockSettings.userHasSBPrivateId()) { + // User has never voted or created any segments. Only local stats exist. + addLocalUserStats(); + return; + } + + Preference loadingPlaceholderPreference = new Preference(getContext()); + loadingPlaceholderPreference.setEnabled(false); + addPreference(loadingPlaceholderPreference); + + if (enabled) { + loadingPlaceholderPreference.setTitle(str("revanced_sb_stats_loading")); + Utils.runOnBackgroundThread(() -> { + UserStats stats = SBRequester.retrieveUserStats(); + Utils.runOnMainThread(() -> { // get back on main thread to modify UI elements + addUserStats(loadingPlaceholderPreference, stats); + addLocalUserStats(); + }); + }); + } else { + loadingPlaceholderPreference.setTitle(str("revanced_sb_stats_sb_disabled")); + } + } catch (Exception ex) { + Logger.printException(() -> "onAttachedToActivity failure", ex); + } + } + + private void addUserStats(Preference loadingPlaceholder, @Nullable UserStats stats) { + Utils.verifyOnMainThread(); + try { + if (stats == null) { + loadingPlaceholder.setTitle(str("revanced_sb_stats_connection_failure")); + return; + } + removeAll(); + Context context = getContext(); + + if (stats.totalSegmentCountIncludingIgnored > 0) { + // If user has not created any segments, there's no reason to set a username. + String userName = stats.userName; + EditTextPreference preference = new ResettableEditTextPreference(context); + preference.setTitle(fromHtml(str("revanced_sb_stats_username", userName))); + preference.setSummary(str("revanced_sb_stats_username_change")); + preference.setText(userName); + preference.setOnPreferenceChangeListener((preference1, value) -> { + Utils.runOnBackgroundThread(() -> { + String newUserName = (String) value; + String errorMessage = SBRequester.setUsername(newUserName); + Utils.runOnMainThread(() -> { + if (errorMessage == null) { + preference.setTitle(fromHtml(str("revanced_sb_stats_username", newUserName))); + preference.setText(newUserName); + Utils.showToastLong(str("revanced_sb_stats_username_changed")); + } else { + preference.setText(userName); // revert to previous + SponsorBlockUtils.showErrorDialog(errorMessage); + } + }); + }); + return true; + }); + addPreference(preference); + } + + { + // Number of segment submissions (does not include ignored segments). + Preference preference = new Preference(context); + String formatted = SponsorBlockUtils.getNumberOfSkipsString(stats.segmentCount); + preference.setTitle(fromHtml(str("revanced_sb_stats_submissions", formatted))); + preference.setSummary(str("revanced_sb_stats_submissions_sum")); + if (stats.totalSegmentCountIncludingIgnored == 0) { + preference.setSelectable(false); + } else { + preference.setOnPreferenceClickListener(preference1 -> { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse("https://sb.ltn.fi/userid/" + stats.publicUserId)); + preference1.getContext().startActivity(i); + return true; + }); + } + addPreference(preference); + } + + { + // "user reputation". Usually not useful since it appears most users have zero reputation. + // But if there is a reputation then show it here. + Preference preference = new Preference(context); + preference.setTitle(fromHtml(str("revanced_sb_stats_reputation", stats.reputation))); + preference.setSelectable(false); + if (stats.reputation != 0) { + addPreference(preference); + } + } + + { + // Time saved for other users. + Preference preference = new Preference(context); + + String stats_saved; + String stats_saved_sum; + if (stats.totalSegmentCountIncludingIgnored == 0) { + stats_saved = str("revanced_sb_stats_saved_zero"); + stats_saved_sum = str("revanced_sb_stats_saved_sum_zero"); + } else { + stats_saved = str("revanced_sb_stats_saved", + SponsorBlockUtils.getNumberOfSkipsString(stats.viewCount)); + stats_saved_sum = str("revanced_sb_stats_saved_sum", + SponsorBlockUtils.getTimeSavedString((long) (60 * stats.minutesSaved))); + } + preference.setTitle(fromHtml(stats_saved)); + preference.setSummary(fromHtml(stats_saved_sum)); + preference.setOnPreferenceClickListener(preference1 -> { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse("https://sponsor.ajay.app/stats/")); + preference1.getContext().startActivity(i); + return false; + }); + addPreference(preference); + } + } catch (Exception ex) { + Logger.printException(() -> "addUserStats failure", ex); + } + } + + private void addLocalUserStats() { + // Time the user saved by using SB. + Preference preference = new Preference(getContext()); + Runnable updateStatsSelfSaved = () -> { + String formatted = SponsorBlockUtils.getNumberOfSkipsString( + Settings.SB_LOCAL_TIME_SAVED_NUMBER_SEGMENTS.get()); + preference.setTitle(fromHtml(str("revanced_sb_stats_self_saved", formatted))); + + String formattedSaved = SponsorBlockUtils.getTimeSavedString( + Settings.SB_LOCAL_TIME_SAVED_MILLISECONDS.get() / 1000); + preference.setSummary(fromHtml(str("revanced_sb_stats_self_saved_sum", formattedSaved))); + }; + updateStatsSelfSaved.run(); + + preference.setOnPreferenceClickListener(preference1 -> { + new AlertDialog.Builder(preference1.getContext()) + .setTitle(str("revanced_sb_stats_self_saved_reset_title")) + .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> { + Settings.SB_LOCAL_TIME_SAVED_NUMBER_SEGMENTS.resetToDefault(); + Settings.SB_LOCAL_TIME_SAVED_MILLISECONDS.resetToDefault(); + updateStatsSelfSaved.run(); + }) + .setNegativeButton(android.R.string.no, null).show(); + return true; + }); + + addPreference(preference); + } +} diff --git a/gradle.properties b/gradle.properties index 92f0a3611..a1ec44b17 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.23.0 +version = 5.24.0-dev.9 diff --git a/patches/api/patches.api b/patches/api/patches.api index 7e9a01a9c..6cca1abda 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -240,6 +240,10 @@ public final class app/revanced/patches/instagram/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt { + public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/irplus/ad/RemoveAdsPatchKt { public static final fun getRemoveAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -872,6 +876,10 @@ public final class app/revanced/patches/spotify/misc/privacy/SanitizeSharingLink public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgetsKt { + public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt { public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1216,6 +1224,10 @@ public final class app/revanced/patches/youtube/layout/hide/player/flyoutmenupan public static final fun getHidePlayerFlyoutMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatchKt { + public static final fun getHideRelatedVideoOverlayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatchKt { public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1460,8 +1472,10 @@ public final class app/revanced/patches/youtube/misc/settings/PreferenceScreen : public final fun getGENERAL_LAYOUT ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getMISC ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getPLAYER ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getRETURN_YOUTUBE_DISLIKE ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getSEEKBAR ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getSHORTS ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getSPONSORBLOCK ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getSWIPE_CONTROLS ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getVIDEO ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt index 65d052729..1e5eb6d04 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/Fingerprints.kt @@ -9,6 +9,5 @@ internal val adInjectorFingerprint = fingerprint { parameters("L", "L") strings( "SponsoredContentController.insertItem", - "SponsoredContentController::Delivery", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt new file mode 100644 index 000000000..47ebe189b --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.instagram.misc.signature + +import app.revanced.patcher.fingerprint +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal val isValidSignatureClassFingerprint = fingerprint { + strings("The provider for uri '", "' is not trusted: ") +} + +internal val isValidSignatureMethodFingerprint = fingerprint { + parameters("L", "Z") + returns("Z") + custom { method, _ -> + method.indexOfFirstInstruction { + getReference()?.name == "keySet" + } >= 0 + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt new file mode 100644 index 000000000..5bc077c4b --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt @@ -0,0 +1,19 @@ +package app.revanced.patches.instagram.misc.signature + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +@Suppress("unused") +val signatureCheckPatch = bytecodePatch( + name = "Disable signature check", + description = "Disables the signature check that causes the app to crash on startup." +) { + compatibleWith("com.instagram.android"("378.0.0.52.68")) + + execute { + isValidSignatureMethodFingerprint + .match(isValidSignatureClassFingerprint.classDef) + .method + .returnEarly(true) + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt index 8332f2f24..109b973e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt @@ -4,10 +4,10 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val jwUtilCreateAdvertisementFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) +internal val jwPlayerConfigFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC) custom { methodDef, classDef -> - classDef.type == "Lnl/sanomamedia/android/nu/video/util/JWUtil;" && methodDef.name == "createAdvertising" + classDef.type == "Lcom/jwplayer/pub/api/configuration/PlayerConfig${'$'}Builder;" && methodDef.name == "advertisingConfig" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt index c09ce25e9..7aef3b3b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt @@ -2,8 +2,11 @@ package app.revanced.patches.nunl.ads import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.misc.extension.sharedExtensionPatch +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") @@ -11,23 +14,15 @@ val hideAdsPatch = bytecodePatch( name = "Hide ads", description = "Hide ads and sponsored articles in list pages and remove pre-roll ads on videos.", ) { - compatibleWith("nl.sanomamedia.android.nu"("11.0.0", "11.0.1", "11.1.0")) + compatibleWith("nl.sanomamedia.android.nu"("11.3.0")) dependsOn(sharedExtensionPatch("nunl", mainActivityOnCreateHook)) execute { // Disable video pre-roll ads. - // Whenever the app tries to create an ad via JWUtils.createAdvertising, don't actually tell the underlying JWPlayer library to do so => JWPlayer will not display ads. - jwUtilCreateAdvertisementFingerprint.method.addInstructions( - 0, - """ - new-instance v0, Lcom/jwplayer/pub/api/configuration/ads/VastAdvertisingConfig${'$'}Builder; - invoke-direct { v0 }, Lcom/jwplayer/pub/api/configuration/ads/VastAdvertisingConfig${'$'}Builder;->()V - invoke-virtual { v0 }, Lcom/jwplayer/pub/api/configuration/ads/VastAdvertisingConfig${'$'}Builder;->build()Lcom/jwplayer/pub/api/configuration/ads/VastAdvertisingConfig; - move-result-object v0 - return-object v0 - """, - ) + // Whenever the app tries to define the advertising config for JWPlayer, don't set the advertising config and directly return. + val iputInstructionIndex = jwPlayerConfigFingerprint.method.indexOfFirstInstructionOrThrow(Opcode.IPUT_OBJECT) + jwPlayerConfigFingerprint.method.removeInstructions(iputInstructionIndex, 1) // Filter injected content from API calls out of lists. arrayOf(screenMapperFingerprint, nextPageRepositoryImplFingerprint).forEach { diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt new file mode 100644 index 000000000..0fc536047 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.spotify.misc.widgets + +import app.revanced.patcher.fingerprint +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode + +internal val canBindAppWidgetPermissionFingerprint = fingerprint { + strings("android.permission.BIND_APPWIDGET") + opcodes(Opcode.AND_INT_LIT8) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt new file mode 100644 index 000000000..ad40f24e2 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt @@ -0,0 +1,19 @@ +package app.revanced.patches.spotify.misc.widgets + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +@Suppress("unused") +val fixThirdPartyLaunchersWidgets = bytecodePatch( + name = "Fix third party launchers widgets", + description = "Fixes Spotify widgets not working in third party launchers, like Nova Launcher.", +) { + compatibleWith("com.spotify.music") + + execute { + // Only system app launchers are granted the BIND_APPWIDGET permission. + // Override the method that checks for it to always return true, as this permission is not actually required + // for the widgets to work. + canBindAppWidgetPermissionFingerprint.method.returnEarly(true) + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 59d05ef5e..4eef1ea0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -143,6 +143,7 @@ val hideLayoutComponentsPatch = bytecodePatch( key = "revanced_hide_description_components_screen", preferences = setOf( SwitchPreference("revanced_hide_ai_generated_video_summary_section"), + SwitchPreference("revanced_hide_ask_section"), SwitchPreference("revanced_hide_attributes_section"), SwitchPreference("revanced_hide_chapters_section"), SwitchPreference("revanced_hide_info_cards_section"), @@ -222,8 +223,9 @@ val hideLayoutComponentsPatch = bytecodePatch( SwitchPreference("revanced_hide_movies_section"), SwitchPreference("revanced_hide_notify_me_button"), SwitchPreference("revanced_hide_playables"), - SwitchPreference("revanced_hide_search_result_recommendations"), + SwitchPreference("revanced_hide_search_result_recommendation_labels"), SwitchPreference("revanced_hide_show_more_button"), + SwitchPreference("revanced_hide_ticket_shelf"), SwitchPreference("revanced_hide_doodles"), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt new file mode 100644 index 000000000..0ca129863 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.layout.hide.relatedvideooverlay + +import app.revanced.patcher.fingerprint +import app.revanced.util.literal + +internal val relatedEndScreenResultsParentFingerprint = fingerprint { + returns("V") + literal{ appRelatedEndScreenResults } +} + +internal val relatedEndScreenResultsFingerprint = fingerprint { + returns("V") + parameters( + "I", + "Z", + "I", + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt new file mode 100644 index 000000000..06ffc0ca5 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt @@ -0,0 +1,83 @@ +package app.revanced.patches.youtube.layout.hide.relatedvideooverlay + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch +import app.revanced.patches.shared.misc.mapping.resourceMappings +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patcher.util.smali.ExternalLabel + +internal var appRelatedEndScreenResults = -1L + private set + +private val hideRelatedVideoOverlayResourcePatch = resourcePatch { + dependsOn( + resourceMappingPatch, + ) + + execute { + appRelatedEndScreenResults = resourceMappings[ + "layout", + "app_related_endscreen_results", + ] + } +} + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch;" + +@Suppress("unused") +val hideRelatedVideoOverlayPatch = bytecodePatch( + name = "Hide related video overlay", + description = "Adds an option to hide the related video overlay shown when swiping up in fullscreen.", +) { + dependsOn( + settingsPatch, + sharedExtensionPatch, + addResourcesPatch, + hideRelatedVideoOverlayResourcePatch, + ) + + compatibleWith( + "com.google.android.youtube"( + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41", + "19.47.53", + "20.07.39", + "20.12.46", + ) + ) + + execute { + addResources("youtube", "layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch") + + PreferenceScreen.PLAYER.addPreferences( + SwitchPreference("revanced_hide_related_video_overlay") + ) + + relatedEndScreenResultsFingerprint.match( + relatedEndScreenResultsParentFingerprint.originalClassDef + ).method.apply { + addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideRelatedVideoOverlay()Z + move-result v0 + if-eqz v0, :show + return-void + """, + ExternalLabel("show", getInstruction(0)) + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 1f3316396..bfedf0d1c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -6,7 +6,10 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.IntentPreference +import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch @@ -15,15 +18,18 @@ import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.misc.settings.addSettingPreference -import app.revanced.patches.youtube.misc.settings.newIntent +import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.conversionContextFingerprintToString import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateFingerprint import app.revanced.patches.youtube.video.videoid.hookPlayerResponseVideoId import app.revanced.patches.youtube.video.videoid.hookVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch -import app.revanced.util.* +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.findFreeRegister +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.returnLate 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 @@ -68,15 +74,24 @@ val returnYouTubeDislikePatch = bytecodePatch( execute { addResources("youtube", "layout.returnyoutubedislike.returnYouTubeDislikePatch") - addSettingPreference( - IntentPreference( - key = "revanced_settings_screen_09", - titleKey = "revanced_ryd_settings_title", - summaryKey = null, - icon = "@drawable/revanced_settings_screen_09_ryd", - layout = "@layout/preference_with_icon", - intent = newIntent("revanced_ryd_settings_intent"), + PreferenceScreen.RETURN_YOUTUBE_DISLIKE.addPreferences( + SwitchPreference("revanced_ryd_enabled"), + SwitchPreference("revanced_ryd_shorts"), + SwitchPreference("revanced_ryd_dislike_percentage"), + SwitchPreference("revanced_ryd_compact_layout"), + SwitchPreference("revanced_ryd_estimated_like"), + SwitchPreference("revanced_ryd_toast_on_connection_error"), + NonInteractivePreference( + key = "revanced_ryd_attribution", + tag = "app.revanced.extension.youtube.returnyoutubedislike.ui.ReturnYouTubeDislikeAboutPreference", + selectable = true, ), + PreferenceCategory( + key = "revanced_ryd_statistics_category", + sorting = PreferenceScreenPreference.Sorting.UNSORTED, + preferences = emptySet(), // Preferences are added by custom class at runtime. + tag = "app.revanced.extension.youtube.returnyoutubedislike.ui.ReturnYouTubeDislikeDebugStatsPreferenceCategory" + ) ) // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 832b70dcf..a4ae22d35 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -12,12 +12,13 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.settings.preference.IntentPreference +import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playercontrols.* import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch -import app.revanced.patches.youtube.misc.settings.addSettingPreference -import app.revanced.patches.youtube.misc.settings.newIntent +import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.* import app.revanced.patches.youtube.video.information.onCreateHook @@ -43,15 +44,32 @@ private val sponsorBlockResourcePatch = resourcePatch { execute { addResources("youtube", "layout.sponsorblock.sponsorBlockResourcePatch") - addSettingPreference( - IntentPreference( - key = "revanced_settings_screen_10", - titleKey = "revanced_sb_settings_title", - summaryKey = null, - icon = "@drawable/revanced_settings_screen_10_sb", - layout = "@layout/preference_with_icon", - intent = newIntent("revanced_sb_settings_intent"), + PreferenceScreen.SPONSORBLOCK.addPreferences( + // SB setting is old code with lots of custom preferences and updating behavior. + // Added as a preference group and not a fragment so the preferences are searchable. + PreferenceCategory( + key = "revanced_settings_screen_10_sponsorblock", + sorting = PreferenceScreenPreference.Sorting.UNSORTED, + preferences = emptySet(), // Preferences are added by custom class at runtime. + tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup" ), + PreferenceCategory( + key = "revanced_sb_stats", + sorting = PreferenceScreenPreference.Sorting.UNSORTED, + preferences = emptySet(), // Preferences are added by custom class at runtime. + tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockStatsPreferenceCategory" + ), + PreferenceCategory( + key = "revanced_sb_about", + sorting = PreferenceScreenPreference.Sorting.UNSORTED, + preferences = setOf( + NonInteractivePreference( + key = "revanced_sb_about_api", + tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockAboutPreference", + selectable = true, + ) + ) + ) ) arrayOf( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index 7dda5c308..a6cf8283a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -54,6 +54,7 @@ val changeStartPagePatch = bytecodePatch( ListPreference( key = "revanced_change_start_page", summaryKey = null, + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" ), SwitchPreference("revanced_change_start_page_always") ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index ec7d89363..06a28e7f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -74,6 +74,7 @@ private val settingsResourcePatch = resourcePatch { arrayOf( ResourceGroup("drawable", + "revanced_settings_cursor.xml", "revanced_settings_icon.xml", "revanced_settings_screen_00_about.xml", "revanced_settings_screen_01_ads.xml", @@ -84,12 +85,16 @@ private val settingsResourcePatch = resourcePatch { "revanced_settings_screen_06_shorts.xml", "revanced_settings_screen_07_seekbar.xml", "revanced_settings_screen_08_swipe_controls.xml", - "revanced_settings_screen_09_ryd.xml", - "revanced_settings_screen_10_sb.xml", + "revanced_settings_screen_09_return_youtube_dislike.xml", + "revanced_settings_screen_10_sponsorblock.xml", "revanced_settings_screen_11_misc.xml", "revanced_settings_screen_12_video.xml", ), - ResourceGroup("layout", "revanced_settings_with_toolbar.xml"), + ResourceGroup("layout", + "revanced_preference_with_icon_no_search_result.xml", + "revanced_search_suggestion_item.xml", + "revanced_settings_with_toolbar.xml"), + ResourceGroup("menu", "revanced_search_menu.xml") ).forEach { resourceGroup -> copyResources("settings", resourceGroup) } @@ -188,6 +193,7 @@ val settingsPatch = bytecodePatch( } PreferenceScreen.GENERAL_LAYOUT.addPreferences( + SwitchPreference("revanced_settings_search_history"), SwitchPreference("revanced_show_menu_icons") ) @@ -201,7 +207,8 @@ val settingsPatch = bytecodePatch( ), ListPreference( key = "revanced_language", - summaryKey = null + summaryKey = null, + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" ) ) @@ -347,10 +354,20 @@ object PreferenceScreen : BasePreferenceScreen() { layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) - - // RYD and SB are items 9 and 10. - // Menus are added in their own patch because they use an Intent and not a Screen. - + val RETURN_YOUTUBE_DISLIKE = Screen( + key = "revanced_settings_screen_09_return_youtube_dislike", + summaryKey = null, + icon = "@drawable/revanced_settings_screen_09_return_youtube_dislike", + layout = "@layout/preference_with_icon", + sorting = Sorting.UNSORTED, + ) + val SPONSORBLOCK = Screen( + key = "revanced_settings_screen_10_sponsorblock", + summaryKey = null, + icon = "@drawable/revanced_settings_screen_10_sponsorblock", + layout = "@layout/preference_with_icon", + sorting = Sorting.UNSORTED, + ) val MISC = Screen( key = "revanced_settings_screen_11_misc", summaryKey = null, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index f75eef328..9fbf5ddca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -62,7 +62,8 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({ summaryKey = null, // Language strings are declared in Setting patch. entriesKey = "revanced_language_entries", - entryValuesKey = "revanced_language_entry_values" + entryValuesKey = "revanced_language_entry_values", + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" ), SwitchPreference("revanced_spoof_video_streams_ios_force_avc"), SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt index ad6ee4a6c..9f601c74a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt @@ -38,6 +38,7 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { // Entries and values are set by the extension code based on the actual speeds available. entriesKey = null, entryValuesKey = null, + tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference" ), SwitchPreference("revanced_remember_playback_speed_last_selected") ) diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index d65a95eaa..0ca022201 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -65,35 +65,6 @@ fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): In val instruction = getInstruction(i) val instructionRegisters = instruction.registersUsed - if (instruction.isReturnInstruction) { - usedRegisters.addAll(instructionRegisters) - - // Use lowest register that hasn't been encountered. - val freeRegister = (0 until implementation!!.registerCount).find { - it !in usedRegisters - } - if (freeRegister != null) { - return freeRegister - } - if (bestFreeRegisterFound != null) { - return bestFreeRegisterFound - } - - // Somehow every method register was read from before any register was wrote to. - // In practice this never occurs. - throw IllegalArgumentException("Could not find a free register from startIndex: " + - "$startIndex excluding: $registersToExclude") - } - - if (instruction.isBranchInstruction) { - if (bestFreeRegisterFound != null) { - return bestFreeRegisterFound - } - // This method is simple and does not follow branching. - throw IllegalArgumentException("Encountered a branch statement before a free register could be found") - } - - val writeRegister = instruction.writeRegister if (writeRegister != null) { if (writeRegister !in usedRegisters) { @@ -114,6 +85,32 @@ fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): In } usedRegisters.addAll(instructionRegisters) + + if (instruction.isBranchInstruction) { + if (bestFreeRegisterFound != null) { + return bestFreeRegisterFound + } + // This method is simple and does not follow branching. + throw IllegalArgumentException("Encountered a branch statement before a free register could be found") + } + + if (instruction.isReturnInstruction) { + // Use lowest register that hasn't been encountered. + val freeRegister = (0 until implementation!!.registerCount).find { + it !in usedRegisters + } + if (freeRegister != null) { + return freeRegister + } + if (bestFreeRegisterFound != null) { + return bestFreeRegisterFound + } + + // Somehow every method register was read from before any register was wrote to. + // In practice this never occurs. + throw IllegalArgumentException("Could not find a free register from startIndex: " + + "$startIndex excluding: $registersToExclude") + } } // Some methods can have array payloads at the end of the method after a return statement. diff --git a/patches/src/main/resources/addresources/values-af-rZA/strings.xml b/patches/src/main/resources/addresources/values-af-rZA/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-af-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-af-rZA/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-am-rET/strings.xml b/patches/src/main/resources/addresources/values-am-rET/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-am-rET/strings.xml +++ b/patches/src/main/resources/addresources/values-am-rET/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index 64e64c93f..3dbb255ad 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" إعادة تعيين إعدادات ReVanced إلى الوضع الافتراضي تم استيراد %d إعدادات فشل الاستيراد: %s + إعدادات البحث + لم يتم العثور على نتائج لـ \".%s\" + جرّب كلمة مفتاحية أخرى + إزالة من سجل البحث؟ عرض أيقونات إعدادات ReVanced يتم عرض أيقونات الإعدادات لا يتم عرض أيقونات الإعدادات @@ -93,6 +97,9 @@ Second \"item\" text" استعادة قوائم الإعدادات القديمة يتم عرض قوائم الإعدادات القديمة لا يتم عرض قوائم الإعدادات القديمة + إظهار سجل البحث في الإعدادات + سجل البحث في الإعدادات معروض + لم يتم عرض سجل البحث في الإعدادات تعطيل تشغيل فيديوهات Shorts في الخلفية @@ -153,15 +160,18 @@ Second \"item\" text" إخفاء زر \'تنبيهي\' تم إخفاء الزر يتم عرض الزر - - إخفاء علامة \'الأشخاص الذين شاهدوا أيضًا\' - تم إخفاء العلامة - يتم عرض العلامة + + إخفاء علامات اقتراحات الفيديو + تم إخفاء علامات \'اقتراحات للمشاهدة\' و\'قد يعجبك أيضًا\' + يتم عرض علامات \'اقتراحات للمشاهدة\' و\'قد يعجبك أيضًا\' إخفاء زر \'عرض المزيد\' تم إخفاء الزر يتم عرض الزر + إخفاء رف التذاكر + تم إخفاء رف التذاكر + يتم عرض رف التذاكر إخفاء ردود الفعل المؤقتة تم إخفاء ردود الفعل المؤقتة يتم عرض ردود الفعل المؤقتة @@ -231,6 +241,9 @@ Second \"item\" text" إخفاء \'ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي\' تم إخفاء قسم ملخص الفيديو يتم عرض قسم ملخص الفيديو + إخفاء \"Ask\" + تم إخفاء قسم \"Ask\" + يتم عرض قسم \"Ask\" إخفاء الصفات تم إخفاء أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون يتم عرض أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون @@ -794,6 +807,11 @@ Second \"item\" text" الإعدادات ← التشغيل ← تشغيل الفيديو التالي تلقائيًا" يتم عرض الفيديو المقترح في شاشة النهاية + + إخفاء واجهة الفيديوهات ذات الصلة في وضع ملء الشاشة + تم إخفاء واجهة الفيديوهات ذات الصلة + يتم عرض واجهة الفيديوهات ذات الصلة + إخفاء الطابع الزمني للفيديو تم إخفاء الطابع الزمني @@ -831,10 +849,10 @@ Second \"item\" text" أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike مخفي بواسطة المالك - يتم عرض لم يعجبني - لا يتم عرض لم يعجبني + يتم عرض لم يعجبني + لا يتم عرض لم يعجبني عرض لم يعجني في فيديوهات Shorts - "يتم عرض مرات عدم الإعجاب في فيديوهات Shorts + "يتم عرض مرات عدم الإعجاب في فيديوهات Shorts التقييد: قد لا تظهر مرات عدم الإعجاب في وضع التصفح المتخفي" لا يتم عرض مرات عدم الإعجاب في فيديوهات Shorts @@ -851,7 +869,6 @@ Second \"item\" text" عرض ملاحظة إذا كان API غير متاح يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike - لمحة يتم توفير البيانات بواسطة the Return YouTube Dislike API. اضغط هنا لمعرفة المزيد ReturnYouTubeDislike API إحصائيات هذا الجهاز @@ -1058,7 +1075,7 @@ Second \"item\" text" تعديل توقيت المقطع يدويًا هل تود تعديل التوقيت لبداية أو نهاية المقطع؟ الوقت المحدد غير صحيح - إحصائيات + إحصائيات الإحصائيات غير متوفرة مؤقتًا (الواجهة غير متوفرة) جارٍ التحميل... @@ -1087,8 +1104,8 @@ Second \"item\" text" رمز اللون غير صالح إعادة تعيين اللون إعادة التعيين - لمحة - يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد ومشاهدة التنزيلات لمنصات أخرى + لمحة + يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد ومشاهدة التنزيلات لمنصات أخرى شكل نموذج التخطيط diff --git a/patches/src/main/resources/addresources/values-as-rIN/strings.xml b/patches/src/main/resources/addresources/values-as-rIN/strings.xml index 6d0e6d20c..fec4d1148 100644 --- a/patches/src/main/resources/addresources/values-as-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-as-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index badcf059c..5cb5334c3 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced tənzimləmələr standarta təyin edildi %d tənzimləmə idxal edildi Uğursuz idxal prosesi: %s + Axtarış tənzimləmələri + ‘%s’ üçün nəticə tapılmadı + Başqa açar sözü yoxla + Axtarış tarixçəsindən silinsin? ReVanced tənzimləmə nişanların göstər Tənzimləmə nişanları göstərilir Tənzimləmə nişanları göstərilmir @@ -93,6 +97,9 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et." Köhnə tənzimləmələr bölmələrin bərpa et Köhnə tənzimləmələr bölmələri göstərilir Köhnə tənzimləmələr bölmələri göstərilmir + Axtarış tarixçəsi tənzimləməsin göstər + Axtarış tarixçəsi tənzimləməsi göstərilir + Axtarış tarixçəsi tənzimləməsi göstərilmir Shorts arxa plan oynatmasın qapat @@ -153,15 +160,18 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız." \"Mənə bildir\" düyməsini gizlət Düymə gizlidir Düymə göstərilir - - \"İnsanlar həmçinin izləyiblər\" etiketin gizlət - Etiket gizlidir - Etiket göstərilir + + Video tövsiyə etiketlərini gizlət + \"İnsanlar həmçinin izləyiblər\" və \"Bunu da bəyənə bilərsiniz\" etiketləri gizlədilib + \"İnsanlar həmçinin izləyiblər\" və \"Bunu da bəyənə bilərsiniz\" etiketləri görünür \'Daha çox göstər\' düyməsini gizlət Düymə gizlidir Düymə göstərilir + Bilet bölməsin gizlət + Bilet bölməsi gizlidir + Bilet bölməsi görünür Vaxtlı reaksiyaları gizlət Zamanlanmış reaksiyalar gizlədilir Zamanlanmış reaksiyalar göstərilir @@ -231,6 +241,9 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız." \"AI ilə yaradılan video xülasəsini\" gizlət Video xülasə bölməsi gizlədilib Video xülasə bölməsi göstərilir + Soruş\'u Gizlət + Soruş bölməsi gizlidir + \"Soruş\" bölməsi göstərilir Atributları Gizlət Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri gizlədilir Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri görünür @@ -793,6 +806,11 @@ Audio trek seçimin göstərmək üçün \"Video axınları saxtalaşdır\"ı iO Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunuş → Növbəti videonu avtomatik oxudun" Son ekranda bildirilən video göstərilir + + Əlaqəli video örtüyünü tam ekranda gizlət + Əlaqəli video örtüyü gizlədilib + Əlaqəli video örtüyü göstərilir + Video vaxt möhürünü gizlət Vaxt möhürü gizlidir @@ -830,10 +848,10 @@ Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunu Ryd ilə səsvermə üçün videonu yenidən yüklə Sahib tərəfindən gizlədilib - Bəyənməmələr göstərilir - Bəyənməmələr göstərilmir + Bəyənməmələr göstərilir + Bəyənməmələr göstərilmir \"Shorts\"da bəyənməmə sayını göstər - "Bəyənməmələr Shorts-da göstərilir + "Bəyənməmələr Shorts-da göstərilir Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər" Bəyənməmələr Shorts-da göstərilmir @@ -850,7 +868,6 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər" API əlçatan deyilsə ani bildiriş göstər Return YouTube Dislike əlçatan deyilsə ani bildiriş göstər Return YouTube Dislike əlçatan deyilsə ani bildiriş göstərmə - Haqqında Məlumat Return YouTube Dislike API vasitəsilə alınır. Ətraflı öyrənmək üçün bura toxun Bu cihazda Return YouTube Dislike API statistikası @@ -1057,7 +1074,7 @@ Təqdim etməyə hazırdır?" Bölüm vaxtına əl ilə düzəliş et Bölümün başlanğıc və ya bitiş vaxtlarına düzəliş etmək istəyirsiniz? Yanlış vaxt verilmişdir - Statistikalar + Statistikalar Statistikalar müvəqqəti mövcud deyil (API işləmir) Yüklənir... @@ -1086,8 +1103,8 @@ Təqdim etməyə hazırdır?" Etibarsız rəng kodu Rəngi sıfırla Sıfırlayın - Haqqında - Məlumat SponsorBlock API tərəfindən təqdim edilir. Daha ətraflı öyrənmək və digər platformalar üzrə yükləmələrə baxmaq üçün bura toxunun + Haqqında + Məlumat SponsorBlock API tərəfindən təqdim edilir. Daha ətraflı öyrənmək və digər platformalar üzrə yükləmələrə baxmaq üçün bura toxunun Tərtibat forma göstəricisi diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index 82ff2b6aa..63d92c4d5 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Налады ReVanced скінуты да стандартных Імпартавана %d налад Памылка імпарту: %s + Пошук налад + Нічога не знойдзена для \",%s\" + Паспрабуйце іншае ключавое слова + Выдаліць з гісторыі пошуку? Паказваць значкі налад ReVanced Значкі налад паказваюцца Значкі налад не паказваюцца @@ -93,6 +97,9 @@ Second \"item\" text" Аднавіць старое меню налад Старыя меню налад паказваюцца Старыя меню налад не паказваюцца + Паказваць гісторыю пошуку ў наладах + Паказваецца гісторыя пошуку ў наладах + Гісторыя пошуку налад не паказваецца Адключыць прайграванне Shorts у фонавым @@ -153,15 +160,18 @@ Second \"item\" text" Схаваць кнопку \"Паведаміць мне\" Кнопка схавана Паказана кнопка - - Схаваць надпіс «Людзі таксама глядзелі» - Надпіс схаваны - Надпіс паказаны + + Схаваць надпісы з рэкамендацыямі відэа + Надпісы \"Людзі таксама глядзелі\" і \"Вам таксама можа спадабацца\" схаваныя + Надпісы \"Людзі таксама глядзелі\" і \"Вам таксама можа спадабацца\" паказаныя Схаваць кнопку \"Паказаць больш\" Кнопка схавана Паказана кнопка + Схаваць паліцу білетаў + Паліца білетаў схавана + Паліца білетаў паказана Схаваць рэакцыі па часе Часовыя рэакцыі схаваныя Паказваюцца рэакцыі па часе @@ -231,6 +241,9 @@ Second \"item\" text" Схаваць «Зводку відэа, згенэраваную штучным інтэлектам» Раздзел зводкі відэа схаваны Раздзел зводкі відэа паказаны + Схаваць «Спытаць» + Раздзел «Спытаць» схаваны + Раздзел «Спытаць» паказаны Схаваць атрыбуты Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» схаваныя Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» паказаныя @@ -794,6 +807,11 @@ Second \"item\" text" Налады → Прайграванне → Аўтаматычнае прайграванне наступнага відэа" Паказваць прапанаванае відэа на канчатковым экране + + Схаваць накладку звязанага відэа ў поўнаэкранным рэжыме + Накладка звязанага відэа схавана + Накладка звязанага відэа паказана + Схаваць метку часу відэа Метка часу схавана @@ -831,10 +849,10 @@ Second \"item\" text" Перазагрузіце відэа, каб прагаласаваць з дапамогай функцыі \"Вярнуць не падабаецца YouTube\" Схавана ўладальнікам - Дызлайкі паказаны - Дызлайкі не паказваюцца + Дызлайкі паказаны + Дызлайкі не паказваюцца Паказвайце \"не падабаецца\" на Shorts - "Дызлайкі на Shorts паказаныя + "Дызлайкі на Shorts паказаныя Абмежаванне: дызлайкі могуць не адлюстроўвацца ў рэжыме інкогніта" Дызлайкі на Shorts не паказаныя @@ -851,7 +869,6 @@ Second \"item\" text" Паказаць тост, калі API недаступны Тост паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная Тост не паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная - Пра праграму Дадзеныя прадастаўляюцца Return YouTube Dislikes API. Націсніце тут, каб даведацца больш Статыстыка ReturnYouTubeDislike API гэтай прылады @@ -1059,7 +1076,7 @@ Second \"item\" text" Рэдагаваць час сегмента ўручную Вы жадаеце змяніць час для пачатку або канца сегмента? Указаны няправільны час - Статыстыка + Статыстыка Статыстыка часова недаступная (API не працуе) Загрузка... @@ -1088,8 +1105,8 @@ Second \"item\" text" Няправільны код колеру Скінуць колер Скінуць - Пра праграму - Дадзеныя прадастаўляюцца API SponsorBlock. Націсніце тут, каб даведацца больш і паглядзець спампоўкі для іншых платформаў + Пра праграму + Дадзеныя прадастаўляюцца API SponsorBlock. Націсніце тут, каб даведацца больш і паглядзець спампоўкі для іншых платформаў Фармат экрана diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index 480e3e823..9f83dc52a 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Настройките на ReVanced бяха нулирани Следните настройки бяха импортирани успешно: %d Импортирането беше неуспешно: %s + Търсене на настройки + Няма намерени резултати за \",%s\" + Опитайте друга ключова дума + Премахване от историята на търсенията? Показване на иконите на настройките на ReVanced Иконите на настройките се показват Иконите на настройките не се показват @@ -93,6 +97,9 @@ Second \"item\" text" Възстановяване на старите менюта за настройки Старите менюта с настройки се показват Старите менюта с настройки не се показват + Показване на историята на търсенията в настройките + Историята на търсенията в настройките е показана + Историята на търсенията в настройките не се показва Възпроизвеждане на Shorts в фонов режим @@ -153,15 +160,18 @@ Second \"item\" text" Скриване на бутона \"Уведоми ме\" Бутона \"Уведоми ме\" е скрит Бутона \"Уведоми ме\" се показва - - Скриване на етикета \"Хората също гледаха\" - Етикетът е скрит - Етикетът е показан + + Скриване на етикетите с видео препоръки + Етикетите „Други потребители също гледаха“ и „Може също да харесате“ са скрити + Етикетите „Други потребители също гледаха“ и „Може също да харесате“ са показани Скриване на бутона \"Покажи още\" Бутона Покажи още е скрит Бутона Покажи още се показва + Скриване на рафта за билети + Рафтът за билети е скрит + Рафтът за билети е показан Скриване на времевите реакции Времевите реакции са скрити Времевите реакции се показват @@ -231,6 +241,9 @@ Second \"item\" text" Скриване на \"AI-генерирано видео резюме\" Скрит е разделът с видео резюме Показва се разделът с видео резюме + Скриване на „Попитай“ + Скрит раздел „Попитай“ + Показване на раздел „Попитай“ Скриване на атрибути Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са скрити Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са показани @@ -794,6 +807,11 @@ Second \"item\" text" Настройки → Възпроизвеждане → Автоматично пускане на следващото видео" Предложеното видео в края на екрана е показано + + Скриване на наслагването на свързани видеоклипове в цял екран + Наслагването на свързани видеоклипове е скрито + Наслагването на свързани видеоклипове е показано + Скриване на клеймото за време на видеоклипа Скрито @@ -831,10 +849,10 @@ Second \"item\" text" Презареди видеото за гласуване с ReturnYouTubeDislike Скрито от собственика - Нехаресванията се показват - Нехаресванията не се показват + Нехаресванията се показват + Нехаресванията не се показват Пок. нехаресвания в кратките клипове - "Нехаресванията на Shorts са показани + "Нехаресванията на Shorts са показани Ограничение: Нехаресванията може да не се показват в режим инкогнито" Нехаресванията на Shorts не са показани @@ -851,7 +869,6 @@ Second \"item\" text" Показване на известие, ако API не е наличен Показва известие, ако Return YouTube Dislike не е наличен Не се показва известие, ако ReturnYouTube Dislike не е наличен - За програмата Данните за нехаресване са от Return YouTube Dislike API. Докоснете за да научите повече Статистика Return YouTube Dislike API на това устройство @@ -1058,7 +1075,7 @@ Second \"item\" text" Ръчно редактиране на времената на частта Желаете ли да редактирате времената за начало или край на частта? Зададено е невалидно време - Статистика + Статистика Статистиките временно не са налични (API не работи) Зареждане... @@ -1087,8 +1104,8 @@ Second \"item\" text" Невалидна стойност за цвета Възстановяване на цвят Възстанови - За програмата - Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния + За програмата + Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния Формат на екрана /Таблет, Телфон, .../ diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index 80a0498cf..de95e72d4 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced সেটিং ডিফল্ট সেট করা হয়েছে %d সেটিং আমদানি হয়েছে আমদানি করা যায়নি: %s + অনুসন্ধান সেটিংস + \'%s\'-এর জন্য কোন ফলাফল পাওয়া যায়নি + অন্য কোনো কীওয়ার্ড চেষ্টা করুন + অনুসন্ধান ইতিহাস থেকে সরাবেন? ReVanced সেটিং আইকন দেখান সেটিং আইকন দেখানো হয়েছে সেটিং আইকন দেখানো হচ্ছে না @@ -93,6 +97,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ পুরানো সেটিংস মেনু পুনরুদ্ধার করুন পুরাতন সেটিংস মেনু দেখানো হচ্ছে পুরাতন সেটিংস মেনু দেখানো হচ্ছে না + অনুসন্ধান সেটিংসের ইতিহাস দেখান + সেটিংস অনুসন্ধান ইতিহাস দেখানো হয়েছে + সেটিংস অনুসন্ধান ইতিহাস দেখানো হয় না Shorts ব্যাকগ্রাউন্ড প্লে অক্ষম করুন @@ -153,15 +160,18 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ \'আমাকে জানান\' বোতাম লুকান বোতাম লুকানো আছে বোতাম দেখানো আছে - - \'People also watched\' লেবেল লুকান - লেবেল লুকানো আছে - লেবেল দেখানো হয়েছে + + ভিডিও প্রস্তাবনা লেবেল লুকান + \"\'লোকেরা আরও দেখেছে\' এবং \'আপনি সম্ভবত পছন্দ করতে পারেন\' লেবেলগুলি লুকানো আছে\" + \"\'লোকেরা আরও দেখেছে\' এবং \'আপনি সম্ভবত পছন্দ করতে পারেন\' লেবেলগুলি দেখানো হয়েছে\" \'আরও দেখান\' বোতাম লুকান বোতাম লুকানো আছে বোতাম দেখানো আছে + টিকিট তাক লুকান + টিকিট তাক লুকানো আছে + টিকিট তাক দেখানো হয়েছে সময় অনুযায়ী প্রতিক্রিয়া লুকান সময় অনুযায়ী প্রতিক্রিয়া লুকিয়ে রয়েছে সময় অনুযায়ী প্রতিক্রিয়া প্রদর্শিত হয়েছে @@ -231,6 +241,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ \'AI-জেনারেটেড ভিডিও সারসংক্ষেপ\' লুকান ভিডিও সারসংক্ষেপ বিভাগ লুকানো আছে ভিডিও সারসংক্ষেপ বিভাগ দেখানো হয়েছে + জিজ্ঞাসা লুকান + জিজ্ঞাসা বিভাগ লুকানো আছে + জিজ্ঞাসা বিভাগ দেখানো হয়েছে বৈশিষ্ট্যাবলী লুকান বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি লুকানো আছে বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি দেখানো হয়েছে @@ -794,6 +807,11 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন সেটিংস → প্লেব্যাক → অটো প্লে পরবর্তী ভিডিও" শেষ স্ক্রীনে প্রস্তাবিত ভিডিও দেখানো হয়েছে + + পূর্ণ-স্ক্রীনে সম্পর্কিত ভিডিও ওভারলে লুকান + সম্পর্কিত ভিডিও ওভারলে লুকানো আছে + সম্পর্কিত ভিডিও ওভারলে দেখানো হয়েছে + ভিডিওর সময়স্ট্যাম্প লুকান সময়স্ট্যাম্প লুকিয়ে রয়েছে @@ -831,10 +849,10 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন ReturnYouTubeDislike দিয়ে ভোট দিতে ভিডিও আবার লোড করুন মালিক কর্তৃক লুকানো - অপছন্দগুলো প্রদর্শিত হয়েছে - অপছন্দগুলো প্রদর্শিত হয়নি + অপছন্দগুলো প্রদর্শিত হয়েছে + অপছন্দগুলো প্রদর্শিত হয়নি Shorts এ অপছন্দ দেখান - "Shorts-এ অপছন্দগুলি দেখানো হয়েছে + "Shorts-এ অপছন্দগুলি দেখানো হয়েছে সীমাবদ্ধতা: ছদ্মবেশী মোডে অপছন্দগুলি নাও দেখা যেতে পারে" Shorts-এ অপছন্দগুলি দেখানো হয়নি @@ -851,7 +869,6 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন API উপলভ্য না থাকলে একটি টোস্ট দেখান Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে না - সম্পর্কিত তথ্য প্রদান করা হয় Return YouTube Dislike API দ্বারা। আরও জানতে এখানে ট্যাপ করুন এই ডিভাইসের ReturnYouTubeDislike API পরিসংখ্যান @@ -1058,7 +1075,7 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন সেগমেন্টের সময় ম্যানুয়ালি সম্পাদনা করুন আপনি কি সেগমেন্টের শুরু বা শেষের সময় সম্পাদনা করতে চান? ভুল সময় দেয়া হয়েছে - পরিসংখ্যান + পরিসংখ্যান পরিসংখ্যান সাময়িকভাবে উপলব্ধ নেই (API ডাউন) লোড হচ্ছে... @@ -1087,8 +1104,8 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন রংয়ের ভুল কোড রং আবার সেট করুন পুনরায় সেট করুন - সম্পর্কিত - ডেটা SponsorBlock API দ্বারা সরবরাহ করা হয়। আরও জানতে এবং অন্যান্য প্ল্যাটফর্মের ডাউনলোড দেখতে এখানে ট্যাপ করুন + সম্পর্কিত + ডেটা SponsorBlock API দ্বারা সরবরাহ করা হয়। আরও জানতে এবং অন্যান্য প্ল্যাটফর্মের ডাউনলোড দেখতে এখানে ট্যাপ করুন লেআউট ফর্ম ফ্যাক্টর diff --git a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml +++ b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index 16dd15cba..3ca5abe19 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" La configuració de ReVanced s\'ha restablert als valors predeterminats S\'han importat %d configuracions No s\'ha pogut importar: %s + Cerca a la configuració + No s\'han trobat resultats per a «%s» + Prova una altra paraula clau + Voleu suprimir-ho de l\'historial de cerca? Mostra les icones de configuració de ReVanced Es mostren les icones de configuració No es mostren les icones de configuració @@ -93,6 +97,9 @@ Toca el botó Continua i permet els canvis d'optimització." Restaurar els menús de configuració antics Es mostren els menús de configuració antics No es mostren els menús de configuració antics + Mostra l\'historial de cerca de la configuració + Es mostra l\'historial de cerca de la configuració + L\'historial de cerca de la configuració no es mostra Desactivar la reproducció en segon pla de Shorts @@ -153,15 +160,18 @@ No se t'informarà de cap esdeveniment inesperat." Amaga el botó \"M\'avisa\" El botó està amagat El botó es mostra - - Amaga l\'etiqueta \"La gent també ha mirat\" - L\'etiqueta s\'amaga - L\'etiqueta es mostra + + Amaga les etiquetes de recomanació de vídeos + Les etiquetes «Altres usuaris també han vist» i «Potser també t\'agradarà» estan ocultes + Les etiquetes «Altres usuaris també han vist» i «Potser també t\'agradarà» es mostren Amaga el botó \'Mostra més\' El botó està amagat El botó es mostra + Amaga la secció de tiquets + La secció de tiquets està amagada + La secció de tiquets es mostra Amaga les reaccions temporitzades S\'han amagat les reaccions temporitzades Es mostren les reaccions temporitzades @@ -231,6 +241,9 @@ No se t'informarà de cap esdeveniment inesperat." Amaga «Resum de vídeo generat per IA» S\'ha amagat la secció de resum del vídeo Es mostra la secció de resum del vídeo + Amaga la secció «Pregunta» + La secció «Pregunta» està amagada + La secció «Pregunta» es mostra Amaga els atributs Les seccions Llocs destacats, Jocs, Música i Persones esmentades s\'amaguen Les seccions Llocs destacats, Jocs, Música i Persones esmentades es mostren @@ -794,6 +807,11 @@ La reproducció automàtica es pot canviar a la configuració de YouTube: Configuració → Reproducció → Reprodueix el vídeo següent automàticament" Es mostra el vídeo suggerit de la pantalla final + + Amaga la superposició de vídeos relacionats a pantalla completa + La superposició de vídeos relacionats està amagada + Es mostra la superposició de vídeos relacionats + Amagar segell de temps del vídeo El segell de temps està ocult @@ -831,10 +849,10 @@ Configuració → Reproducció → Reprodueix el vídeo següent automàticament Recarrega el vídeo per votar utilitzant Return YouTube Dislike Amagat per l\'amo - Els \"no m\'agrada\" es mostren - Els \"no m\'agrada\" no es mostren + Els \"no m\'agrada\" es mostren + Els \"no m\'agrada\" no es mostren Mostrar \"no m\'agrada\" a Shorts - "Els \"no m'agrada\" als Shorts es mostren + "Els \"no m'agrada\" als Shorts es mostren Limitació: és possible que els \"no m'agrada\" no apareguin en mode d'incògnit" Els \"no m\'agrada\" als Shorts no es mostren @@ -851,7 +869,6 @@ Limitació: és possible que els \"no m'agrada\" no apareguin en mode d'incògni Mostrar una \"toast\" si l\'API no està disponible La \"toast\" es mostra si Return YouTube Dislike no està disponible La \"toast\" no es mostra si Return YouTube Dislike no està disponible - Quant a Les dades són proporcionades per l\'API de Return YouTube Dislike. Toca aquí per obtenir més informació Estadístiques de l\'API de ReturnYouTubeDislike d\'aquest dispositiu @@ -1057,7 +1074,7 @@ Preparat per enviar?" Editeu el temps del segment manualment Voleu editar el temps per a l\'inici o el final del segment? Temps invàlid proporcionat - Estadístiques + Estadístiques Les estadístiques no estan disponibles temporalment (l\'API no funciona) S\'està carregant... @@ -1086,8 +1103,8 @@ Preparat per enviar?" Codi de color invàlid Restableix el color Restablir - Quant a - Les dades són proporcionades per l\'API de SponsorBlock. Toca aquí per a saber-ne més i veure les descàrregues per a altres plataformes + Quant a + Les dades són proporcionades per l\'API de SponsorBlock. Toca aquí per a saber-ne més i veure les descàrregues per a altres plataformes Factor de forma del disseny diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index a584529de..d2eb23f23 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Nastavení ReVanced obnoveno do výchozího stavu Importováno %d nastavení Importováni selhalo: %s + Hledat nastavení + Nebyly nalezeny žádné výsledky pro \",%s\" + Zkuste jiné klíčové slovo + Odebrat z historie vyhledávání? Zobrazit ikony nastavení ReVanced Ikony nastavení se zobrazují Ikony nastavení se nezobrazují @@ -93,6 +97,9 @@ Klepněte na tlačítko Pokračovat a povolte změny optimalizace." Obnovit staré menu nastavení Staré menu nastavení se zobrazují Staré menu nastavení se nezobrazují + Zobrazit historii vyhledávání v nastavení + Historie vyhledávání v nastavení je zobrazena + Historie vyhledávání nastavení se nezobrazuje Zakázat automatické přehrávání Shorts v pozadí @@ -153,15 +160,18 @@ Nebudete informováni o žádné neočekávané události." Skrýt tlačitko \'Upozorněte mě\' Tlačítko je skryté Tlačítko je zobrazeno - - Skrýt štítek „Lidé také sledovali“ - Štítek je skrytý - Štítek je zobrazen + + Skrýt popisky doporučení videí + Popisky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ jsou skryté + Popisky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ jsou zobrazené Skrýt tlačítko „Zobrazit více“ Tlačítko je skryto Tlačítko je zobrazeno + Skrýt panel Vstupenek + Panel Vstupenek je skrytý + Panel Vstupenek je zobrazen Skrýt reakce zobrazené po čase Reakce zobrazené po čase jsou skryty Reakce se zobrazují po čase @@ -231,6 +241,9 @@ Nebudete informováni o žádné neočekávané události." Skrýt „Souhrn videa generovaný pomocí AI“ Sekce se souhrnem videa je skrytá Sekce se souhrnem videa je zobrazena + Skrýt sekci Zeptat se + Sekce Zeptat se je skrytá + Sekce Zeptat se je zobrazena Skrýt atributy Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou skryté Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou zobrazené @@ -794,6 +807,11 @@ Automatické přehrávání lze změnit v nastavení YouTube: Nastavení → Přehrávání → Automatické přehrávání dalšího videa" Navrhované video na konci obrazovky se zobrazuje + + Skrýt překryv souvisejícího videa v režimu celé obrazovky + Překryv souvisejícího videa je skrytý + Překryv souvisejícího videa je zobrazen + Skrýt čas videa Čas je skrytý @@ -831,10 +849,10 @@ Nastavení → Přehrávání → Automatické přehrávání dalšího videa"Načtěte video znovu, abyste hlasovali pomocí Return YouTube Dislike Skryto vlastníkem - Nelíbí se se zobrazují - Nelíbí se se nezobrazují + Nelíbí se se zobrazují + Nelíbí se se nezobrazují Zobrazit nelíbí se v Shorts - "Počty „Nelíbí se mi“ u Shorts jsou zobrazeny + "Počty „Nelíbí se mi“ u Shorts jsou zobrazeny Omezení: Počty „Nelíbí se mi“ se nemusí zobrazit v anonymním režimu" Počty „Nelíbí se mi“ u Shorts nejsou zobrazeny @@ -851,7 +869,6 @@ Omezení: Počty „Nelíbí se mi“ se nemusí zobrazit v anonymním režimu"< Zobrazit toast, pokud API není dostupné Toast se zobrazí, pokud Return YouTube Dislike není dostupný Toast se nezobrazí, pokud Return YouTube Dislike není dostupný - O aplikaci Data jsou poskytována API Return YouTube Dislike. Klepnutím se dozvíte více Statistiky API ReturnYouTubeDislike tohoto zařízení @@ -1057,7 +1074,7 @@ Jste připraveni k odeslání?" Upravit načasování segmentu ručně Chcete upravit načasování pro začátek nebo konec segmentu? Zadán neplatný čas - Statistiky + Statistiky Statistiky jsou dočasně nedostupné (server API je mimo provoz) Načítání... @@ -1086,8 +1103,8 @@ Jste připraveni k odeslání?" Neplatný kód barvy Resetovat barvu Výchozí - O aplikaci - Data poskytuje rozhraní API SponsorBlock. Klepněte zde, abyste se dozvěděli více a zobrazili si soubory ke stažení pro další platformy + O aplikaci + Data poskytuje rozhraní API SponsorBlock. Klepněte zde, abyste se dozvěděli více a zobrazili si soubory ke stažení pro další platformy Rozvržení formuláře diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index f87cc7bb8..c2945d790 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced-indstillinger nulstillet til standard %d indstillinger importeret Import mislykkedes: %s + Søg i indstillinger + Ingen resultater fundet for \'%s\' + Prøv et andet søgeord + Fjern fra søgehistorik? Vis ReVanced-indstillingsikoner Indstillingsikoner vises Indstillingsikoner vises ikke @@ -93,6 +97,9 @@ Tap på knappen Fortsæt, og tillad optimeringsændringer." Gendan gamle indstillingsmenuer Gamle indstillingsmenuer er vist Gamle indstillingsmenuer er ikke vist + Vis indstillingssøgehistorik + Indstillingssøgehistorik vises + Søgehistorik for indstillinger vises ikke Deaktiver baggrundsafspilning af Shorts @@ -151,12 +158,18 @@ Du modtager ikke notifikationer om uventede hændelser." Skjul knappen \'Underret mig\' Knappen er skjult Knappen er vist - + + Skjul etiketter for videoanbefalinger + Etiketterne \"Folk så også\" og \"Du kan måske også lide\" er skjulte + Etiketterne \"Folk så også\" og \"Du kan måske også lide\" vises Skjul knappen \'Vis mere\' Knappen er skjult Knappen er vist + Skjul billetreolen + Billetreolen er skjult + Billetreolen vises Skjul tidsreaktioner Tidsreaktioner skjules Tidsreaktioner vises @@ -223,6 +236,9 @@ Du modtager ikke notifikationer om uventede hændelser." Skjul \"AI-genereret videooversigt\" Videooversigtssektionen er skjult Videooversigtssektionen vises + Skjul Spørg + Spørgsmål sektionen er skjult + Spørgsmål sektionen vises Kapitler sektion er skjult Kapitel afsnit er vist Info-kort sektion er skjult @@ -757,6 +773,11 @@ Automatisk afspilning kan ændres i YouTube-indstillinger: Indstillinger → Afspilning → Afspil næste video automatisk" Foreslået video på slutskærmen vises + + Skjul relateret video-overlay i fuldskærm + Relateret video-overlay er skjult + Relateret video-overlay vises + Skjul tidsstempel på video Tidsstempel er skjult @@ -793,8 +814,8 @@ Indstillinger → Afspilning → Afspil næste video automatisk" Genindlæs video for at stemme ved hjælp af Return YouTube Dislike Skjult af ejer - Dislikationer vises - Dislikationer vises ikke + Dislikationer vises + Dislikationer vises ikke Vis ikke på Shorts Synes ikke som procent @@ -807,7 +828,6 @@ Indstillinger → Afspilning → Afspil næste video automatisk" Vis en toast hvis API ikke er tilgængelig Toast vises, hvis Return YouTube Dislike ikke er tilgængelig Toast vises ikke, hvis Return YouTube Dislike ikke er tilgængelig - Om Data leveres af Return YouTube Dislike API. Tryk her for at få mere at vide ReturnYouTubeDislike API statistikker for denne enhed @@ -1005,7 +1025,7 @@ Er du klar til at indsende?" Rediger timing af segment manuelt Vil du redigere timingen for start eller afslutning af segmentet? Ugyldig tid givet - Statistik + Statistik Indlæser... SponsorBloker er deaktiveret @@ -1033,8 +1053,8 @@ Er du klar til at indsende?" Ugyldig farvekode Nulstil farve Nulstil - Om - Data leveres af SponsorBlock API. Tryk her for at få flere oplysninger og se downloads til andre platforme + Om + Data leveres af SponsorBlock API. Tryk her for at få flere oplysninger og se downloads til andre platforme Layout-formfaktor diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index 1fabd417e..f79a40bdd 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced-Einstellungen auf Standardwerte zurückgesetzt %d Einstellungen importiert Import fehlgeschlagen: %s + Sucheinstellungen + Keine Ergebnisse für „%s“ gefunden + Versuchen Sie ein anderes Schlüsselwort + Aus Suchverlauf entfernen? ReVanced-Einstellungssymbole anzeigen Einstellungssymbole werden angezeigt Einstellungssymbole werden nicht angezeigt @@ -89,6 +93,9 @@ Tippen Sie auf die Schaltfläche \"Fortfahren\" und erlauben Sie die Optimierung Alte Einstellungsmenüs wiederherstellen Alte Einstellungsmenüs werden angezeigt Alte Einstellungsmenüs werden nicht angezeigt + Suchverlauf der Einstellungen anzeigen + Suchverlauf der Einstellungen wird angezeigt + Der Suchverlauf der Einstellungen wird nicht angezeigt Shorts-Hintergrundwiedergabe deaktivieren @@ -149,15 +156,18 @@ Sie werden nicht über unerwartete Ereignisse informiert." \'Benachrichtigungen\' Button ausblenden Button ist ausgeblendet Button wird angezeigt - - \'Leute haben auch angeschaut\'-Label ausblenden - Label ist ausgeblendet - Label wird angezeigt + + Videovorschlag-Labels ausblenden + Die Labels „Nutzer haben sich auch angesehen“ und „Ihnen könnte auch gefallen“ sind ausgeblendet + Die Labels „Nutzer haben sich auch angesehen“ und „Ihnen könnte auch gefallen“ werden angezeigt \'Mehr anzeigen\' Button ausblenden Button ist ausgeblendet Button wird angezeigt + Ticket-Reihe ausblenden + Ticket-Reihe ist ausgeblendet + Ticket-Reihe wird angezeigt Zeitliche Reaktionen ausblenden Zeitgesteuerte Reaktionen sind ausgeblendet Zeitgesteuerte Reaktionen werden angezeigt @@ -227,6 +237,9 @@ Sie werden nicht über unerwartete Ereignisse informiert." \'KI-generierte Videozusammenfassung\' ausblenden Videozusammenfassungsbereich ist ausgeblendet Videozusammenfassungsbereich wird angezeigt + Ask ausblenden + Ask Abschnitt ist ausgeblendet + Ask Abschnitt wird angezeigt Attribute ausblenden Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen sind ausgeblendet Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen werden angezeigt @@ -787,6 +800,11 @@ Die automatische Wiedergabe kann in den YouTube-Einstellungen geändert werden: Einstellungen → Wiedergabe → Nächstes Video automatisch abspielen" Das vorgeschlagene Video auf dem Endbildschirm wird angezeigt + + Zugehöriges Video-Overlay im Vollbildmodus ausblenden + Zugehöriges Video-Overlay ist ausgeblendet + Zugehöriges Video-Overlay wird angezeigt + Verstecke Video-Zeitstempel Zeitstempel ist ausgeblendet @@ -824,10 +842,10 @@ Einstellungen → Wiedergabe → Nächstes Video automatisch abspielen" Video neu laden, um mit Return YouTube Dislike abzustimmen Vom Eigentümer verborgen - Dislikes werden angezeigt - Dislikes werden nicht angezeigt + Dislikes werden angezeigt + Dislikes werden nicht angezeigt Dislikes auf Shorts anzeigen - "Dislikes für Shorts werden angezeigt + "Dislikes für Shorts werden angezeigt Einschränkung: Dislikes werden möglicherweise nicht im Inkognito-Modus angezeigt" Dislikes für Shorts werden nicht angezeigt @@ -844,7 +862,6 @@ Einschränkung: Dislikes werden möglicherweise nicht im Inkognito-Modus angezei Einen Toast anzeigen, wenn die API nicht verfügbar ist Toast wird angezeigt, wenn YouTube-Ablehnung nicht verfügbar ist Toast wird nicht angezeigt, wenn YouTube-Dislike nicht verfügbar ist - Über Daten werden von der YouTube Dislike API zurückgegeben. Tippe hier, um mehr zu erfahren Gibt die API-Statistiken dieses Geräts zurück @@ -1051,7 +1068,7 @@ Bereit zum Einreichen?" Timing des Segments manuell bearbeiten Möchtest du den Zeitpunkt für den Anfang oder das Ende des Segments bearbeiten? Ungültige Zeit angegeben - Statistiken + Statistiken Statistiken sind vorübergehend nicht verfügbar (API ist ausgefallen) Lädt... @@ -1080,8 +1097,8 @@ Bereit zum Einreichen?" Ungültiger Farbcode Farbe zurücksetzen Zurücksetzen - Über - Daten werden von der SponsorBlock API bereitgestellt. Tippe hier, um mehr zu erfahren und Downloads für andere Plattformen zu sehen + Über + Daten werden von der SponsorBlock API bereitgestellt. Tippe hier, um mehr zu erfahren und Downloads für andere Plattformen zu sehen Anordnungsformfactor diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index 2a08f13a2..7a6374031 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Επαναφέρθηκαν οι προεπιλεγμένες ρυθμίσεις ReVanced Έγινε εισαγωγή %d ρυθμίσεων Η εισαγωγή απέτυχε: %s + Αναζήτηση ρυθμίσεων + Δεν βρέθηκαν αποτελέσματα για το \'%s\' + Δοκιμάστε μια άλλη λέξη-κλειδί + Κατάργηση από το ιστορικό αναζήτησης; Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced Τα εικονίδια ρυθμίσεων εμφανίζονται Τα εικονίδια ρυθμίσεων δεν εμφανίζονται @@ -93,6 +97,9 @@ Second \"item\" text" Επαναφορά παλιών μενού ρυθμίσεων Τα παλιά μενού ρυθμίσεων εμφανίζονται Τα νέα μενού ρυθμίσεων εμφανίζονται + Εμφάνιση ιστορικού αναζήτησης ρυθμίσεων + Το ιστορικό αναζήτησης ρυθμίσεων εμφανίζεται + Το ιστορικό αναζήτησης ρυθμίσεων δεν εμφανίζεται Απενεργοποίηση αναπαραγωγής παρασκηνίου για τα Shorts @@ -155,15 +162,18 @@ Second \"item\" text" Κουμπί «Να λαμβάνω ειδοποιήσεις» Κρυμμένο Εμφανίζεται - - Ετικέτα «Άλλοι χρήστες παρακολούθησαν επίσης» - Κρυμμένη - Εμφανίζεται + + Ετικέτες προτάσεων βίντεο + Κρυμμένες\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» + Εμφανίζονται\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» Κουμπί «Εμφάνιση περισσότερων» Κρυμμένο Εμφανίζεται + Ενότητα εισιτηρίων + Κρυμμένη + Εμφανίζεται Συγχρονισμένες αντιδράσεις Κρυμμένες Εμφανίζονται @@ -233,6 +243,9 @@ Second \"item\" text" Σύνοψη βίντεο που δημιουργήθηκε από AI Κρυμμένη Εμφανίζεται + Ενότητα «Ερώτηση» + Κρυμμένη + Εμφανίζεται Ενότητα ιδιοτήτων Κρυμμένη.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν» Εμφανίζεται.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν» @@ -796,6 +809,11 @@ Second \"item\" text" Ρυθμίσεις → Αναπαραγωγή→ Αυτόματη αναπαραγωγή επόμενου βίντεο" Εμφανίζεται + + Σχετιζόμενο βίντεο σε πλήρη οθόνη + Κρυμμένο + Εμφανίζεται + Χρονική πρόοδος βίντεο Κρυμμένη @@ -833,10 +851,10 @@ Second \"item\" text" Επαναφορτώστε το βίντεο για να ψηφίσετε χρησιμοποιώντας το Return YouTube Dislike Κρυμμένα από τον ιδιοκτήτη - Τα «Δεν μου αρέσει» εμφανίζονται - Τα «Δεν μου αρέσει» δεν εμφανίζονται + Τα «Δεν μου αρέσει» εμφανίζονται + Τα «Δεν μου αρέσει» δεν εμφανίζονται Εμφάνιση στα Shorts - "Τα «Δεν μου αρέσει» εμφανίζονται στα Shorts + "Τα «Δεν μου αρέσει» εμφανίζονται στα Shorts Περιορισμός: Ενδέχεται να μην εμφανίζονται σε ανώνυμη λειτουργία" Τα «Δεν μου αρέσει» δεν εμφανίζονται στα Shorts @@ -851,9 +869,8 @@ Second \"item\" text" Τα βίντεο με απενεργοποιημένα «Μου αρέσει» εμφανίζουν έναν εκτιμώμενο αριθμό «Μου αρέσει» Τα εκτιμώμενα «Μου αρέσει» δεν εμφανίζονται Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο - Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο - Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο - Σχετικά με + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο Τα δεδομένα Dislike παρέχονται από το API του Return YouTube Dislike. Πατήστε εδώ για να μάθετε περισσότερα Στατιστικά ReturnYouTubeDislike API αυτής της συσκευής @@ -911,8 +928,8 @@ Second \"item\" text" Το κουμπί παράλειψης κρύβεται μετά από μερικά δευτερόλεπτα Το κουμπί παράλειψης εμφανίζεται σε όλο το τμήμα Εμφάνιση μηνύματος κατά την παράλειψη - Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε για να δείτε ένα παράδειγμα - Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης. Πατήστε για να δείτε ένα παράδειγμα + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε για να δείτε ένα παράδειγμα + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης. Πατήστε για να δείτε ένα παράδειγμα Εμφάνιση μήκους βίντεο χωρίς τα τμήματα Εμφανίζεται το μήκος βίντεο μείον όλα τα τμήματα, σε παρένθεση δίπλα στο πλήρες μήκος βίντεο Εμφανίζεται το πλήρες μήκος του βίντεο @@ -931,8 +948,8 @@ Second \"item\" text" Δείξτε μου Γενικά Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο - Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο - Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο Mετρητής παραλείψεων τμημάτων Επιτρέπει στον πίνακα κατάταξης SponsorBlock να γνωρίζει πόσος χρόνος εξοικονομήθηκε. Αποστέλλεται ένα μήνυμα στον πίνακα κατάταξης κάθε φορά που παραλείπεται ένα τμήμα Ο μετρητής παραλείψεων δεν είναι ενεργός @@ -1059,7 +1076,7 @@ Second \"item\" text" Επεξεργασία χρονισμού του τμήματος χειροκίνητα Θέλετε να επεξεργαστείτε τον χρονισμό του τμήματος από την αρχή ή από το τέλος του τμήματος; Δόθηκε μη έγκυρος χρόνος - Στατιστικά + Στατιστικά Τα στατιστικά είναι προσωρινά μη διαθέσιμα (το API είναι εκτός λειτουργίας) Φόρτωση... @@ -1088,8 +1105,8 @@ Second \"item\" text" Μη έγκυρος κωδικός χρώματος Επαναφορά χρώματος Επαναφορά - Σχετικά με - Τα δεδομένα παρέχονται από το SponsorBlock API. Πατήστε για να μάθετε περισσότερα και να δείτε λήψεις για άλλες πλατφόρμες + Σχετικά με + Τα δεδομένα παρέχονται από το SponsorBlock API. Πατήστε για να μάθετε περισσότερα και να δείτε λήψεις για άλλες πλατφόρμες Αλλαγή μορφής διάταξης @@ -1261,8 +1278,8 @@ Second \"item\" text" Πατήστε για να μάθετε περισσότερα για το DeArrow" Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο - Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο - Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο Διεύθυνση API του DeArrow Η διεύθυνση URL του τελικού σημείου αποθήκευσης μικρογραφιών DeArrow Λήψεις ακίνητων καρέ diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index c3297571b..e03c5daee 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Configuración ReVanced restablecida por defecto Configuración importada de %d Error de importación: %s + Ajustes de búsqueda + No se encontraron resultados para «%s» + Prueba con otra palabra clave + ¿Quitar del historial de búsqueda? Mostrar iconos de configuración de ReVanced Se muestran los iconos de configuración No se muestran los iconos de configuración @@ -92,6 +96,9 @@ Desactivar las optimizaciones de batería para MicroG no afectará negativamente Restaurar los menús de configuración antiguos Se muestran los menús de configuración antiguos No se muestran los menús de configuración antiguos + Mostrar el historial de búsqueda de ajustes + Se muestra el historial de búsqueda de ajustes + El historial de búsqueda de ajustes no se muestra Desactivar la reproducción en segundo plano de Shorts @@ -150,15 +157,18 @@ Desactivar las optimizaciones de batería para MicroG no afectará negativamente Ocultar el botón \'Notificarme\' Botón oculto Se muestra el botón - - Ocultar la etiqueta \"También vieron\" - La etiqueta está oculta - Se muestra la etiqueta + + Ocultar etiquetas de recomendaciones de video + Las etiquetas \"También vieron\" y \"También te puede gustar\" están ocultas + Las etiquetas \"También vieron\" y \"También te puede gustar\" se muestran Ocultar botón \'Mostrar más\' Botón oculto Se muestra el botón + Ocultar estante de boletos + El estante de boletos está oculto + El estante de boletos está visible Ocultar reacciones temporizadas Las reacciones temporizadas están ocultas Se muestran reacciones temporizadas @@ -228,6 +238,9 @@ Desactivar las optimizaciones de batería para MicroG no afectará negativamente Ocultar \"Resumen de video generado por IA\" La sección de resumen del video está oculta La sección de resumen del video se muestra + Ocultar pregunta + La sección de preguntas está oculta + Se muestra la sección de preguntas Ocultar atributos Las secciones Lugares destacados, Juegos, Música y Personas mencionadas están ocultas Las secciones Lugares destacados, Juegos, Música y Personas mencionadas se muestran @@ -791,6 +804,11 @@ La reproducción automática se puede cambiar en la configuración de YouTube: Configuración → Reproducción → Reproducir el siguiente vídeo automáticamente" Se muestra el vídeo sugerido de la pantalla final + + Ocultar la superposición de videos relacionados en pantalla completa + Se oculta la superposición de videos relacionados + Se muestra la superposición de videos relacionados + Ocultar fecha y hora de vídeo Marca de tiempo oculta @@ -828,10 +846,10 @@ Configuración → Reproducción → Reproducir el siguiente vídeo automáticam Recargar vídeo para votar usando Return YouTube Dislike Oculto por el propietario - Dislikes son mostrados - No se muestran Dislikes + Dislikes son mostrados + No se muestran Dislikes Mostrar no me gusta en Shorts - "Los Dislikes en los Shorts se muestran + "Los Dislikes en los Shorts se muestran Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito" No se muestran los Dislikes en los Shorts @@ -848,7 +866,6 @@ Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito"< Mostrar un brindis si la API no está disponible Toast se muestra si Devolución de YouTube Dislike no está disponible Toast no se muestra si Devolución de YouTube Dislike no está disponible - Acerca de Los datos son proporcionados por la API de Retorno de YouTube. Pulse aquí para aprender más Devuelve las estadísticas de la API de este dispositivo @@ -1046,7 +1063,7 @@ Ya existe" Modificar el tiempo del segmento manualmente ¿Quieres modificar el tiempo de inicio o final del segmento? Tiempo dado no válido - Estadísticas + Estadísticas Las estadísticas no están disponibles temporalmente (la API está inactiva) Cargando... @@ -1075,8 +1092,8 @@ Ya existe" Código de color inválido Reiniciar color Restablecer - Acerca de - Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas + Acerca de + Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas Diseño del diseño factor diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index 559ec1b3e..3763d8631 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVancedi seaded on lähtestatud Imporditi %d seadet Importimine ebaõnnestus: %s + Otsi seadetest + Otsingule „%s” ei leitud tulemusi + Proovi mõnda muud märksõna + Kas eemaldada otsinguajaloost? Näita ReVancedi seadete ikoone Seadete ikoonid on näidatud Seadete ikoonid ei ole nähtavad @@ -93,6 +97,9 @@ Vajutage jätkamise nuppu ja lubage optimeerimismuutused." Taasta vanad seadete menüüd Vanad seadete menüüd on kuvatud Vanad seadete menüüd ei ole kuvatud + Kuva seadete otsinguajalugu + Seadete otsinguajalugu on näidatud + Seadete otsingu ajalugu ei kuvata Shorts taustavideo esitamine lülitada @@ -153,15 +160,18 @@ Teid ei teavitata ühestki ootamatust sündmusest." Peida nupu \"Teata mulle\" Nupp on peidetud Nupp on kuvatud - - Peida silt \"Inimesed vaatasid ka\" - Silt on peidetud - Silt on kuvatud + + Peida video soovitusmärgised + Märgised „Inimesed vaatasid ka“ ja „Sulle võib samuti meeldida“ on peidetud + Märgised „Inimesed vaatasid ka“ ja „Sulle võib samuti meeldida“ on näidatud Peida nupp \"Kuva rohkem\" Nupp on peidetud Nupp on nähtav + Peida pääsmeriiul + Pääsmeriiul on peidetud + Pääsmeriiul on nähtav Peida ajastatud reaktsioonid Ajastatud reaktsioonid on peidetud Ajastatud reaktsioonid on nähtavad @@ -231,6 +241,9 @@ Teid ei teavitata ühestki ootamatust sündmusest." Peida „AI-ga loodud video kokkuvõte” Video kokkuvõtte osa on peidetud Video kokkuvõtte osa on näidatud + Peida küsi + Küsi osa on peidetud + Küsi osa on nähtav Peida atribuudid Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on peidetud Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on kuvatud @@ -794,6 +807,11 @@ Automaatesitust saab muuta YouTube'i seadetes: Seaded → Taasesitus → Esita järgmine video automaatselt" Lõpuekraani soovitatud video on näidatud + + Peida seotud video ülekatte täisekraanil + Seotud video ülekatte on peidetud + Seotud video ülekatte on näidatud + Peida video ajamärk Ajamärk on peidetud @@ -831,10 +849,10 @@ Seaded → Taasesitus → Esita järgmine video automaatselt" Laadi video uuesti, et hääletada Return YouTube Dislike\'i abil Peidetud omaniku poolt - Mittemeeldimised on nähtavad - Mittemeeldimised pole nähtavad + Mittemeeldimised on nähtavad + Mittemeeldimised pole nähtavad Näita mittemeeldimisi Shorts\'il - "Ei meeldimised on kuvatud teenuses Shorts + "Ei meeldimised on kuvatud teenuses Shorts Piirang: Ei meeldimised ei pruugi inkognito režiimis kuvada" Ei meeldimised pole kuvatud teenuses Shorts @@ -851,7 +869,6 @@ Piirang: Ei meeldimised ei pruugi inkognito režiimis kuvada" Näita teadet, kui API pole saadaval Teade näidatakse, kui Return YouTube Dislike pole saadaval Teadet ei näidata, kui Return YouTube Dislike pole saadaval - Teave Andmed on pakutud Return YouTube Dislike API poolt. Puuduta siia, et saada lisateavet ReturnYouTubeDislike API statistika sellel seadmel @@ -1058,7 +1075,7 @@ Kas olete esitamiseks valmis?" Muuda segmendi ajastust käsitsi Kas soovite muuta segmendi algus- või lõpppunkti ajastust? Sisestatud aega ei ole võimalik analüüsida - Statistika + Statistika Statistika pole ajutiselt saadaval (API on maas) Laen... @@ -1087,8 +1104,8 @@ Kas olete esitamiseks valmis?" Vigane värvikood Lähtesta värv Lähtesta - Teave - Andmed on pärit SponsorBlock API-st. Puudutage siia, et saada lisateavet ja vaadata allalaadimisi teistele platvormidele + Teave + Andmed on pärit SponsorBlock API-st. Puudutage siia, et saada lisateavet ja vaadata allalaadimisi teistele platvormidele Paigutuse vormitegur diff --git a/patches/src/main/resources/addresources/values-eu-rES/strings.xml b/patches/src/main/resources/addresources/values-eu-rES/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-eu-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-eu-rES/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml index f5901cede..d4c4d8952 100644 --- a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml +++ b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml @@ -64,7 +64,7 @@ Second \"item\" text" - + @@ -154,6 +154,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index 74f193c4e..7757d978a 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Revanced-asetukset nollattiin %d asetusta tuotiin Tuonti epäonnistui: %s + Hakuasetukset + Tuloksia ei löytynyt haulle \"%s\" + Kokeile toista avainsanaa + Poistetaanko hakuhistoriasta? Näytä ReVanced-asetuskuvakkeet Asetuskuvakkeet näytetään Asetuskuvakkeita ei näytetä @@ -93,6 +97,9 @@ Napauta jatka-painiketta ja salli optimoinnin muutokset." Palauta vanhat asetusvalikot Vanhat asetusvalikot näytetään Vanhoja asetusvalikoita ei näytetä + Näytä asetusten hakuhistoria + Asetusten hakuhistoria näytetään + Asetusten hakuhistoriaa ei näytetä Poista Shortsien taustatoisto käytöstä @@ -153,15 +160,16 @@ Et saa ilmoituksia odottamattomista tapahtumista." Piilota \"Ilmoita minulle\" -painike Painike on piilotettu Painike näytetään - - Piilota \'\"Ihmiset katselivat myös\" -tunniste - Tunniste on piilotettu - Tunniste näytetään + + Piilota videosuositusten otsikot Piilota \"Näytä lisää\" -painike Painike on piilotettu Painike näytetään + Piilota lippuhylly + Lippuhylly on piilotettu + Lippuhylly näytetään Piilota ajoitetut reaktiot Ajoitetut reaktiot on piilotettu Ajoitetut reaktiot näytetään @@ -791,6 +799,11 @@ Automaattista toistoa voidaan muuttaa YouTube-asetuksissa: Asetukset → Toisto → Toista seuraava video automaattisesti" Loppunäytön ehdotettu video näytetään + + Piilota liittyvien videoiden peittokuva kokoruututilassa + Liittyvien videoiden peittokuva on piilotettu + Liittyvien videoiden peittokuva näytetään + Piilota videon aikaleima Aikaleima on piilotettu @@ -828,10 +841,10 @@ Asetukset → Toisto → Toista seuraava video automaattisesti" Lataa video uudelleen äänestääksesi Return YouTube Dislikellä Omistajan piilottama - Ei-tykkäykset näytetään - Ei-tykkäyksiä ei näytetä + Ei-tykkäykset näytetään + Ei-tykkäyksiä ei näytetä Näytä ei-tykkykset Shortseissa - "Ei-tykkäykset näytetään Shortseissa + "Ei-tykkäykset näytetään Shortseissa Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa" Ei-tykkäyksiä ei näytetä Shortseissa @@ -848,7 +861,6 @@ Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa" Näytä ponnahdusilmoitus, jos API ei ole käytettävissä Ponnahdusilmoitus näytetään, jos Return YouTube Dislike ei ole käytettävissä Ponnahdusilmoitusta ei näytetä, jos Return YouTube Dislike ei ole käytettävissä - Tietoja Tiedot ovat peräisin Return YouTube Disliken API:sta. Napauta tästä lukeaksesi lisää Tämän laitteen ReturnYouTubeDislike API -tilastot @@ -1055,7 +1067,7 @@ Oletko valmis lähettämään?" Muokkaa osion ajoitusta manuaalisesti Haluatko muokata osion alku- vai loppuaikaa? Annettu aika on virheellinen - Tilastot + Tilastot Tilastot eivät tilapäisesti saatavilla (API ei ole käytettävissä) Ladataan... @@ -1084,8 +1096,8 @@ Oletko valmis lähettämään?" Virheellinen värikoodi Nollaa väri Nollaa - Tietoja - Tiedot tarjoaa SponsorBlock API. Napauta tätä saadaksesi lisätietoja ja nähdäksesi lataukset muille alustoille + Tietoja + Tiedot tarjoaa SponsorBlock API. Napauta tätä saadaksesi lisätietoja ja nähdäksesi lataukset muille alustoille Ulkoasun asettelu diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index 276ec1d79..a646bdb1c 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" I-reset ang mga ReVanced na setting sa default Na-import ang %d na mga setting Nabigo ang pag-import: %s + Maghanap ng mga setting + Walang nakitang resulta para sa \'%s\' + Subukan ang ibang keyword + Alisin sa history ng paghahanap? Ipakita ang mga icon ng setting ng ReVanced Ipinapakita ang mga icon ng setting Hindi ipinapakita ang mga icon ng setting @@ -93,6 +97,9 @@ Tapikin ang pindutan ng pagpapatuloy at payagan ang mga pagbabago sa pag-optimiz Ibalik ang dating mga menu ng setting Ipinapakita ang mga lumang menu ng setting Hindi ipinapakita ang mga lumang menu ng setting + Ipakita ang history ng paghahanap sa mga setting + Ipinapakita ang history ng paghahanap sa mga setting + Hindi ipinapakita ang kasaysayan ng paghahanap sa Mga Setting I-disable ang pag-playback ng Shorts sa background @@ -153,15 +160,18 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan." Itago ang button na \"Abisuhan ako\" Nakatago ang button Ang pindutan ay ipinapakita - - Itago ang label na \'Napanood din ng mga tao\' - Nakatago ang label - Ipinapakita ang label + + Itago ang mga label ng rekomendasyon sa video + Nakatago ang mga label na \"\'People also watched\'\" at \"\'You might also like\'\" + Ipinapakita ang mga label na \"\'People also watched\'\" at \"\'You might also like\'\" Itago ang button na \"Ipakita ang higit pa\" Nakatago ang button Ang pindutan ay ipinapakita + Itago ang shelf ng ticket + Nakatago ang ticket shelf + Ipinapakita ang ticket shelf Itago ang mga naka-time na reaksyon Nakatago ang mga naka-time na reaksyon Ang mga naka-time na reaksyon ay ipinapakita @@ -231,6 +241,9 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan." Itago ang \'Buod ng video na binuo ng AI\' Nakatago ang seksyon ng buod ng video Ipinapakita ang seksyon ng buod ng video + Itago ang Magtanong + Nakatago ang seksyon ng Magtanong + Ipinapakita ang seksyon ng Magtanong Itago ang Mga Katangian Nakatago ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit Ipinapakita ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit @@ -792,6 +805,11 @@ Maaaring baguhin ang Autoplay sa mga setting ng YouTube: Mga Setting → Pag-playback → I-autoplay ang susunod na video" Ipinapakita ang iminungkahing video sa dulo ng screen + + Itago ang kaugnay na video overlay sa fullscreen + Nakatago ang kaugnay na video overlay + Ipinapakita ang kaugnay na video overlay + Itago ang timestamp ng video Nakatago ang timestamp @@ -829,10 +847,10 @@ Mga Setting → Pag-playback → I-autoplay ang susunod na video" I-reload ang video para bumoto gamit ang Return YouTube Dislike Nakatago ng may-ari - Ang mga hindi gusto ay ipinapakita - Hindi ipinapakita ang mga hindi gusto + Ang mga hindi gusto ay ipinapakita + Hindi ipinapakita ang mga hindi gusto Ipakita ang mga hindi gusto sa Shorts - "Ipinapakita ang mga Dislike sa Shorts + "Ipinapakita ang mga Dislike sa Shorts Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode" Hindi ipinapakita ang mga Dislike sa Shorts @@ -849,7 +867,6 @@ Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode" Magpakita ng toast kung hindi available ang API Ipapakita ang toast kung hindi available ang Return YouTube Dislike Hindi ipinapakita ang toast kung hindi available ang Return YouTube Dislike - Tungkol Ang data ay ibinibigay ng Return YouTube Dislike API. Mag-tap dito para matuto pa ReturnYouTubeDislike API statistics ng device na ito @@ -1056,7 +1073,7 @@ Isumite na ba?" Manu-manong i-edit ang timing ng segment Gusto mo bang i-edit ang timing para sa pagsisimula o pagtatapos ng segment? Hindi wastong oras ang ibinigay - Istatistika + Istatistika Pansamantalang hindi available ang mga Stats (down ang API) Naglo-load... @@ -1085,8 +1102,8 @@ Isumite na ba?" Di-wastong code ng kulay I-reset ang kulay I-reset - Tungkol - Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform + Tungkol + Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform Layout form factor diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index 14e29636c..0a0d32b9d 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Paramètres ReVanced réinitialisés aux valeurs par défaut %d paramètres importés Importation échouée : %s + Rechercher dans les paramètres + Aucun résultat trouvé pour \"%s\" + Essayez un autre mot-clé + Supprimer de l\'historique des recherches ? Afficher les icônes des paramètres ReVanced Les icônes des paramètres sont affichées Les icônes des paramètres ne sont pas affichées @@ -93,6 +97,9 @@ Appuyez sur le bouton Continuer et autorisez les modifications." Restaurer les anciens menus des paramètres Les anciens menus des paramètres sont affichés Les anciens menus des paramètres ne sont pas affichés + Afficher l\'historique de recherche des paramètres + L\'historique de recherche des paramètres est affiché + L\'historique de recherche des paramètres n\'est pas affiché Désactiver la lecture en arrière-plan des Shorts @@ -153,15 +160,18 @@ Vous ne serez pas informé des événements inattendus." Masquer le bouton M\'avertir Le bouton est masqué Le bouton est affiché - - Masquer le libellé \"Découvrez également cette vidéo\" - Le libellé est masqué - Le libellé est affiché + + Masquer les libellés de recommandation de vidéos + Les libellés \"Les internautes ont aussi regardé\" et \"Découvrez également\" sont masqués + Les libellés \"Les internautes ont aussi regardé\" et \"Découvrez également\" sont affichés Masquer le bouton Afficher plus Le bouton est masqué Le bouton est affiché + Masquer l\'étagère des billets + L\'étagère des billets est masquée + L\'étagère des billets est affichée Masquer les réactions minutées Les réactions minutées sont masquées Les réactions minutées sont affichées @@ -231,6 +241,9 @@ Vous ne serez pas informé des événements inattendus." Masquer \"Résumé de la vidéo généré par IA\" La section du résumé de la vidéo est masquée La section du résumé de la vidéo est affichée + Masquer \"Demander\" + La section Demander est masquée + La section Demander est affichée Masquer les attributions Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont masquées Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont affichées @@ -794,6 +807,11 @@ La lecture automatique peut être modifiée dans les paramètres de YouTube : Paramètres → Lecture → Lecture automatique de la vidéo suivante" L\'écran de fin suggérant une vidéo est affiché + + Masquer l\'overlay de vidéos similaires en plein écran + L\'overlay de vidéos similaires est masqué + L\'overlay de vidéos similaires est affiché + Masquer le temps écoulé et la durée totale Le temps écoulé et la durée totale sont masqués @@ -831,10 +849,10 @@ Paramètres → Lecture → Lecture automatique de la vidéo suivante" Rechargez la vidéo pour voter avec Return YouTube Dislike Masqué par le propriétaire - Les \"Je n\'aime pas\" sont affichés - Les \"Je n\'aime pas\" ne sont pas affichés + Les \"Je n\'aime pas\" sont affichés + Les \"Je n\'aime pas\" ne sont pas affichés Afficher les \"Je n\'aime pas\" sur les Shorts - "Les \"Je n'aime pas\" sont affichés sur les Shorts + "Les \"Je n'aime pas\" sont affichés sur les Shorts Limitation : Il se peut que les \"Je n'aime pas\" n'apparaissent pas en mode navigation privée" Les \"Je n\'aime pas\" ne sont pas affichés sur les Shorts @@ -851,7 +869,6 @@ Limitation : Il se peut que les \"Je n'aime pas\" n'apparaissent pas en mode na Afficher un message toast si l\'API n\'est pas disponible Un message toast est affiché si Return YouTube Dislike n\'est pas disponible Aucun message toast affiché si Return YouTube Dislike n\'est pas disponible - À propos Les données sont fournies par l\'API Return YouTube Dislike. Appuyez ici pour en savoir plus. Statistiques de l\'API Return Youtube Dislike pour cet appareil @@ -1057,7 +1074,7 @@ Prêt à soumettre ?" Modifier la durée du segment manuellement Voulez-vous modifier le début ou la fin du segment ? Temps fourni invalide - Statistiques + Statistiques Les statistiques sont temporairement indisponibles (API injoignable) Chargement... @@ -1086,8 +1103,8 @@ Prêt à soumettre ?" Code couleur invalide Réinitialiser la couleur Réinitialiser - À propos - Les données sont fournies par l\'API SponsorBlock. Appuyez ici pour en savoir plus et pour voir les téléchargements pour les autres plateformes. + À propos + Les données sont fournies par l\'API SponsorBlock. Appuyez ici pour en savoir plus et pour voir les téléchargements pour les autres plateformes. Format de mise en page diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index 5a2f05701..f2ee4103c 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Athshocraigh socruithe ReVanced go réamhshocrú Iompórtáladh %d socruithe Theip ar allmhairiú: %s + Cuardaigh socruithe + Ní bhfuarthas aon toradh ar \'%s\' + Bain triail as eochairfhocal eile + Bain as stair an chuardaigh? Taispeáin deilbhíní socruithe ReVanced Taispeántar deilbhíní socruithe Ní thaispeántar deilbhíní socraithe @@ -93,6 +97,9 @@ Brúigh an cnaipe leanúnaí agus ligean athruithe optúimíochta." Athshocraigh roghanna seanghléasanna Taispeántar sean-roghchláir socruithe Ní thaispeántar sean-roghchláir socruithe + Taispeáin stair cuardaigh na socruithe + Taispeántar stair cuardaigh na socruithe + Ní thaispeántar stair cuardaigh na socruithe Díchumasaigh seinnte Cúlra Shorts @@ -153,15 +160,18 @@ Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne." Folaigh cnaipe \'Cuir in iúl dom\' Tá an cnaipe i bhfolach Taispeántar an cnaipe - - Folaigh an lipéad \'D\'amharc daoine eile freisin\' - Tá an lipéad i bhfolach - Taispeántar an lipéad + + Folaigh lipéid moltaí físeáin + Tá lipéid \",,D’fhéach daoine eile air freisin\",, agus \",,B’fhéidir gur mhaith leat é seo freisin\",, folaithe + Tá lipéid \",,D’fhéach daoine eile air freisin\",, agus \",,B’fhéidir gur mhaith leat é seo freisin\",, ar taispeáint Folaigh cnaipe \'Taispeáin tuilleadh\' Tá an cnaipe i bhfolach Taispeántar an cnaipe + Folaigh an seilf ticéad + Tá an seilf ticéad i bhfolach + Taispeántar an seilf ticéad Folaigh frithghníomhartha ama Tá frithghníomhartha ama i bhfolach Taispeántar frithghníomhartha ama @@ -231,6 +241,9 @@ Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne." Folaigh \'Achoimre físeáin arna giniúint ag AI\' Tá an chuid achoimre físeáin i bhfolach Taispeántar an chuid achoimre físeáin + Folaigh Fiafraigh + Tá rannóg na Fiafraí i bhfolach + Taispeántar rannóg na Fiafraí Folaigh Tréithe Tá ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear i bhfolach Taispeántar ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear @@ -794,6 +807,11 @@ Is féidir an uathshein a athrú i socruithe YouTube: Socruithe → Athsheinm → Uathshein físeán eile" Taispeántar físeán molta deireadh scáileáin + + Folaigh forleagan físeáin ghaolmhair i mód lánscáileáin + Tá forleagan físeáin ghaolmhair i bhfolach + Taispeántar forleagan físeáin ghaolmhair + Folaigh stampa ama an fhíseáin Tá stampa ama i bhfolach @@ -831,10 +849,10 @@ Socruithe → Athsheinm → Uathshein físeán eile" Athlódáil físeán chun vótáil ag baint úsáide as Return YouTube Dislike I bhfolach ag úinéir - Taispeántar rudaí nach dtaitníonn leo - Ní thaispeántar nach dtaitníonn leat + Taispeántar rudaí nach dtaitníonn leo + Ní thaispeántar nach dtaitníonn leat Taispeáin neamhthaitníonn ar Shorts - "Taispeántar easaontais ar Shorts + "Taispeántar easaontais ar Shorts Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito" Ní thaispeántar easaontais ar Shorts @@ -851,7 +869,6 @@ Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito"Taispeáin tósta mura bhfuil API ar fáil Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil Ní thaispeántar tóst mura bhfuil Return YouTube Dislike ar fáil - Maidir Soláthraíonn an API Return YouTube Dislike sonraí. Tapáil anseo chun tuilleadh a fhoghlaim Staitisticí API returnieYouTubeDislike den fheiste seo @@ -1058,7 +1075,7 @@ Maithe chun cur isteach?" Cuir uainiú deighleog in eagar Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? Am neamhbhailí tugtha - Staitisticí + Staitisticí Níl stats ar fáil go sealadach (tá API síos) Á lódáil... @@ -1087,8 +1104,8 @@ Maithe chun cur isteach?" Cód dath neamhbhailí Athshocraigh dath Athshocraigh - Maidir - Soláthraíonn an API SponsorBlock sonraí. Tapáil anseo chun níos mó a fhoghlaim agus íoslódálacha a fheiceáil d\'ardáin eile + Maidir + Soláthraíonn an API SponsorBlock sonraí. Tapáil anseo chun níos mó a fhoghlaim agus íoslódálacha a fheiceáil d\'ardáin eile Fábos fóirmeanna foirmiúin diff --git a/patches/src/main/resources/addresources/values-gl-rES/strings.xml b/patches/src/main/resources/addresources/values-gl-rES/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-gl-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-gl-rES/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml +++ b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 4d025abe4..da9bf76a6 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" A ReVanced beállítások visszaállnak az alapértelmezettre %d beállítás importálva Sikertelen importálás: %s + Beállítások keresése + Nincs találat erre: „%s” + Próbáljon ki egy másik kulcsszót + Eltávolítja a keresési előzményekből? ReVanced beállításikonok megjelenítése A beállításikonok láthatók A beállítások ikonjai nem jelennek meg @@ -93,6 +97,9 @@ Kattintson a folytatás gombra, és engedélyezze az optimalizálási módosít Régi beállítási menük visszaállítása A régi beállítások menüpontok megjelennek A régi beállítások menüpontok nem jelennek meg + Beállítások keresési előzményeinek megjelenítése + A beállítások keresési előzményei láthatók + A beállítások keresési előzményei nincsenek megjelenítve A Shorts háttérben történő lejátszásának letiltása @@ -153,15 +160,18 @@ Nem fog értesülni semmilyen váratlan eseményről." \"Értesítést kérek\" gomb elrejtése A gomb el van rejtve A gomb megjelenik - - A(z) „Mások is megnézték” felirat elrejtése - A címke rejtett - A címke látható + + Videóajánló címkék elrejtése + A „Nézők emellett ezt is megnézték” és a „Neked is tetszhet” címkék rejtve vannak + A „Nézők emellett ezt is megnézték” és a „Neked is tetszhet” címkék láthatók \'Továbbiak megjelenítése\' gomb elrejtése A gomb el van rejtve A gomb megjelenik + Jegyek polcának elrejtése + A jegyek polca el van rejtve + A jegyek polca látható Időzített reakciók elrejtése Az időzített reakciók elrejtve Az időzített reakciók megjelenítve @@ -231,6 +241,9 @@ Nem fog értesülni semmilyen váratlan eseményről." „AI-generált videó összefoglaló” elrejtése A videó összefoglaló szekció rejtve A videó összefoglaló szekció látható + Kérdezés elrejtése + A kérdezés szakasz el van rejtve + A kérdezés szakasz megjelenik Attribútumok elrejtése A kiemelt helyek, játékok, zene és említett személyek szakaszai rejtettek A kiemelt helyek, játékok, zene és említett személyek szakaszai láthatók @@ -794,6 +807,11 @@ Az automatikus lejátszás a YouTube beállításaiban módosítható: Beállítások → Lejátszás → Következő videó automatikus lejátszása" A befejező képernyőn lévő javasolt videó látható + + Kapcsolódó videó fedőréteg elrejtése teljes képernyőn + A kapcsolódó videó fedőréteg rejtve van + A kapcsolódó videó fedőréteg látható + Videó időbélyegzőjének elrejtése Az időbélyegző elrejtve @@ -831,10 +849,10 @@ Beállítások → Lejátszás → Következő videó automatikus lejátszása"< Töltse újra a videót a Return YouTube Dislike-hoz A tulajdonos elrejtette - A nem tetszések megjelennek - A nem tetszések nem jelennek meg + A nem tetszések megjelennek + A nem tetszések nem jelennek meg A nem tetszések megjelenítése a Shorts videóknál - "A nem tetszések a Shorts-on láthatók + "A nem tetszések a Shorts-on láthatók Korlátozás: A nem tetszések inkognitómódban nem jelenhetnek meg" A nem tetszések a Shorts-on nem láthatók @@ -851,7 +869,6 @@ Korlátozás: A nem tetszések inkognitómódban nem jelenhetnek meg" Üzenet megjelenítése, ha az API nem elérhető Üzenet megjelenítése, ha a Return YouTube Dislike nem elérhető Nem jelenik meg üzenet, ha a Return YouTube Dislike nem elérhető - Rólunk Az adatokat a Return YouTube Dislike API biztosítja. További információért koppintson ide ReturnYouTubeDislike API statisztika az eszközön @@ -1057,7 +1074,7 @@ Készen állsz a beküldésre?" A szakasz időzítésének kézi beállítása Akarja szerkeszteni a rész kezdetének vagy végének időzítését? Érvénytelen idő van megadva - Statisztikák + Statisztikák A statisztikák átmenetileg nem érhetők el (az API nem működik) Betöltés... @@ -1086,8 +1103,8 @@ Készen állsz a beküldésre?" Érvénytelen színkód Színek visszaállítása Visszaállítás - Rólunk - Az adatokat a SponsorBlock API biztosítja. Koppintson ide, ha többet szeretne megtudni és megtekintené a letöltéseket más platformokra + Rólunk + Az adatokat a SponsorBlock API biztosítja. Koppintson ide, ha többet szeretne megtudni és megtekintené a letöltéseket más platformokra Elrendezési űrlap faktor diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index 29a06445a..e2bd8317d 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced կարգավորումները վերադրվել են դեֆոլտային Import %d կարգավորում Import-ը ձախողվել է։ %s + Որոնման կարգավորումներ + «%s»-ի համար արդյունքներ չեն գտնվել + Փորձեք այլ հիմնաբառ + Հեռացնե՞լ որոնման պատմությունից: Ցուցադրել ReVanced-ի կարգավորումների պատկերակները Կարգավորումների պատկերակները ցուցադրվում են Կարգավորումների պատկերակները ցուցադրված չեն @@ -93,6 +97,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Վերականգնել հին սահմանումների մենյուները Նախկին կարգավորումների մենյուները ցուցադրվում են Նախկին կարգավորումների մենյուները չեն ցուցադրվում + Ցույց տալ կարգավորումների որոնման պատմությունը + Կարգավորումների որոնման պատմությունը ցուցադրվում է + Կարգավորումների որոնման պատմությունը ցույց չի տրվում Անջատել Shorts-ի ֆոնային վերարտադրությունը @@ -153,15 +160,18 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել \'Notify me\' կոճակը Կոճակը թաքցված է Կոճակը ցույց է տրվում - - Թաքցնել \"Դիտողները նաև դիտել են\" պիտակը - Պիտակը թաքցված է - Պիտակը ցուցադրվում է + + Թաքցնել տեսանյութի առաջարկությունների պիտակները + «Դիտել են նաև» և «Ձեզ նույնպես կարող է դուր գալ» պիտակները թաքցված են + «Դիտել են նաև» և «Ձեզ նույնպես կարող է դուր գալ» պիտակները ցուցադրվում են Թաքցնել \'Show more\' կոճակը Կոճակը թաքցված է Կոճակը ցույց է տրվում + Թաքցնել տոմսարկղի մարզը + Տոմսարկղի մարզը թաքցված է + Տոմսարկղի մարզը ցուցադրվում է Թաքցնել ժամանակավոր ռեակցիաները Ժամանակավոր ռեակցիաները թաքցված են Ժամանակավոր ռեակցիաները ցույց են տրվում @@ -231,6 +241,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել «AI-ով ստեղծված տեսանյութի ամփոփումը» Տեսանյութի ամփոփման բաժինը թաքցված է Տեսանյութի ամփոփման բաժինը ցուցադրվում է + Թաքցնել հարցումը + Հարցումների բաժինը թաքցված է + Հարցումների բաժինը ցուցադրվում է Թաքցնել հատկանիշները Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները թաքցված են Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները ցուցադրվում են @@ -794,6 +807,11 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Կարգավորումներ → Վերարտադրում → Ավտոմատ նվագարկել հաջորդ տեսանյութը" Վերջնական էկրանին առաջարկվող տեսանյութը ցուցադրվում է + + Թաքցնել կապակցված տեսանյութի վահանակը լիաէկրան ռեժիմում + Կապակցված տեսանյութի վահանակը թաքցված է + Կապակցված տեսանյութի վահանակը ցուցադրվում է + Թաքցնել տեսանյութի ժամանակային կետը Ժամանակային կետը թաքցված է @@ -831,10 +849,10 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Վերբեռնել տեսանյութը՝ քվեարկելու համար Return YouTube Dislike-ի միջոցով Թաքցված է սեփականատիրոջ կողմից - \"Dislike\"-երը ցուցադրվում են - \"Dislike\"-երը չեն ցուցադրվում + \"Dislike\"-երը ցուցադրվում են + \"Dislike\"-երը չեն ցուցադրվում Ցուցադրել \"Dislike\"-երը Shorts-ում - "\"Dislike\"-երը Shorts-ում ցուցադրվում են + "\"Dislike\"-երը Shorts-ում ցուցադրվում են Սահմանափակում. \"Dislike\"-երը կարող են չերևալ անհայտ ռեժիմում" \"Dislike\"-երը Shorts-ում չեն ցուցադրվում @@ -851,7 +869,6 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Ցուցադրել \"toast\", եթե API-ն հասանելի չէ \"Toast\"-ը ցուցադրվում է, եթե Return YouTube Dislike-ը հասանելի չէ \"Toast\"-ը չի ցուցադրվում, եթե Return YouTube Dislike-ը հասանելի չէ - Ծրագրի մասին Տվյալները տրամադրվում են Return YouTube Dislike API-ի միջոցով. Սեղմեք այստեղ՝ ավելին իմանալու համար Return YouTube Dislike API-ի կարգավիճակը այս հարմարանքի համար @@ -1058,7 +1075,7 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ Խմբագրեք հատվածի ժամանակը ձեռքով Մի՞թե ցանկանում եք խմբագրել հատվածի սկիզբը կամ ավարտը։ Նշված ժամանակը անվավեր է - Վիճակագրություն + Վիճակագրություն Վիճակագրությունը ժամանակավորապես հասանելի չէ (API-ն անջատված է) Բեռնվում է... @@ -1087,8 +1104,8 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ Անվավեր գույնի կոդ Վերագործարկել գույնը Վերագործարկել - Ծրագրի մասին - Տվյալները մատուցվում են SponsorBlock API-ի կողմից։ Սեղմեք այստեղ՝ ավելի շատ իմանալու և այլ հարթակների համար ներբեռնումները տեսնելու + Ծրագրի մասին + Տվյալները մատուցվում են SponsorBlock API-ի կողմից։ Սեղմեք այստեղ՝ ավելի շատ իմանալու և այլ հարթակների համար ներբեռնումները տեսնելու Ձևաչափի փոփոխություն diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 188f2387a..1adcf77c0 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Pengaturan ReVanced diatur ke setelan awal Mengimpor setelan %d Impor gagal: %s + Pengaturan pencarian + Tidak ada hasil yang ditemukan untuk \'%s\' + Coba kata kunci lain + Hapus dari riwayat pencarian? Tampilkan ikon pengaturan ReVanced Ikon pengaturan ditampilkan Ikon pengaturan tidak ditampilkan @@ -93,6 +97,9 @@ Ketuk tombol lanjutkan dan izinkan perubahan pengoptimalan." Pulihkan menu pengaturan lama Menu pengaturan lama ditampilkan Menu pengaturan lama tidak ditampilkan + Tampilkan pengaturan riwayat pencarian + Pengaturan riwayat pencarian ditampilkan + Pengaturan riwayat pencarian tidak ditampilkan Nonaktifkan pemutaran Shorts di latar belakang @@ -153,15 +160,18 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga." Sembunyikan \'Beri tahu saya\' Tombol disembunyikan Tombol ditampilkan - - Sembunyikan label \'Orang juga menonton\' - Label disembunyikan - Label ditampilkan + + Sembunyikan label rekomendasi video + Label \'Orang lain juga menonton\' dan \'Anda mungkin juga suka\' disembunyikan + Label \'Orang lain juga menonton\' dan \'Anda mungkin juga suka\' ditampilkan Sembunyikan tombol \'Tampilkan selengkapnya\' Tombol disembunyikan Tombol ditampilkan + Sembunyikan rak tiket + Rak tiket disembunyikan + Rak tiket ditampilkan Sembunyikan reaksi terjadwal Reaksi terjadwal disembunyikan Reaksi terjadwal ditampilkan @@ -231,6 +241,9 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga." Sembunyikan \'Ringkasan video yang dibuat AI\' Bagian ringkasan video disembunyikan Bagian ringkasan video ditampilkan + Sembunyikan Tanya + Bagian Tanya disembunyikan + Bagian Tanya ditampilkan Sembunyikan Atribut Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang disembunyikan Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang ditampilkan @@ -794,6 +807,11 @@ Pemutaran otomatis dapat diubah di pengaturan YouTube: Pengaturan → Pemutaran → Putar otomatis video berikutnya" Video yang disarankan di layar akhir ditampilkan + + Sembunyikan hamparan video terkait dalam layar penuh + Hamparan video terkait disembunyikan + Hamparan video terkait ditampilkan + Sembunyikan timestamp video Timestamp disembunyikan @@ -831,10 +849,10 @@ Pengaturan → Pemutaran → Putar otomatis video berikutnya" Muat ulang video untuk memilih Return YouTube Dislike Disembunyikan oleh pemilik - Dislike ditampilkan - Dislike tidak ditampilkan + Dislike ditampilkan + Dislike tidak ditampilkan Tampilkan dislike di Shorts - "Dislike pada Shorts ditampilkan + "Dislike pada Shorts ditampilkan Batasan: Dislike mungkin tidak muncul dalam mode penyamaran" Dislike pada Shorts tidak ditampilkan @@ -851,7 +869,6 @@ Batasan: Dislike mungkin tidak muncul dalam mode penyamaran" Tampilkan pesan timbul jika API tidak tersedia Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia - Tentang Data disediakan oleh API Return YouTube Dislike. Tekan di sini untuk mempelajari lebih lanjut Statistik API ReturnYoutubeDislike dari perangkat ini @@ -1057,7 +1074,7 @@ Siap mengirim?" Ubah waktu segmen secara manual Apakah Anda ingin menubah waktu awal atau akhir segmen? Waktu yang diberikan tidak sah - Statistik + Statistik Statistik sementara tidak tersedia (API tidak aktif) Memuat... @@ -1086,8 +1103,8 @@ Siap mengirim?" Kode warna tidak sah Atur ulang warna Setel ulang - Tentang - Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain + Tentang + Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain Faktor bentuk tata letak diff --git a/patches/src/main/resources/addresources/values-is-rIS/strings.xml b/patches/src/main/resources/addresources/values-is-rIS/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-is-rIS/strings.xml +++ b/patches/src/main/resources/addresources/values-is-rIS/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index 589f273f7..c51c0994f 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Reimposta le impostazioni di ReVanced a quelle predefinite Importate %d impostazioni Importazione non riuscita: %s + Cerca impostazioni + Nessun risultato trovato per \".%s\" + Prova un\'altra parola chiave + Rimuovere dalla cronologia di ricerca? Mostra le icone delle impostazioni di ReVanced Le icone delle impostazioni vengono mostrate Le icone delle impostazioni non vengono mostrate @@ -93,6 +97,9 @@ Tocca il pulsante Continua e consenti le modifiche di ottimizzazione." Ripristina i vecchi menu delle impostazioni I vecchi menu delle impostazioni vengono mostrati I vecchi menu delle impostazioni non vengono mostrati + Mostra la cronologia di ricerca delle impostazioni + La cronologia di ricerca delle impostazioni è visualizzata + La cronologia di ricerca delle impostazioni non viene mostrata Disattiva la riproduzione degli Shorts in background @@ -153,15 +160,18 @@ Non sarai notificato di eventi imprevisti." Nascondi il pulsante \'Avvisami\' Il pulsante è nascosto Il pulsante è visibile - - Nascondi l\'etichetta \"Altri utenti hanno guardato\" - L\'etichetta è nascosta - L\'etichetta è visibile + + Nascondi le etichette dei video consigliati + Le etichette \"Altri video guardati\" e \"Potrebbe piacerti anche\" sono nascoste + Le etichette \"Altri video guardati\" e \"Potrebbe piacerti anche\" sono mostrate Nascondi il pulsante \'Mostra di più\' Il pulsante è nascosto Il pulsante è visibile + Nascondi la sezione dei biglietti + La sezione dei biglietti è nascosta + La sezione dei biglietti è visibile Nascondi le reazioni a tempo Le reazioni a tempo sono nascoste Le reazioni a tempo sono visibili @@ -231,6 +241,9 @@ Non sarai notificato di eventi imprevisti." Nascondi \"Riepilogo video generato dall\'AI\" La sezione del riepilogo video è nascosta La sezione del riepilogo video è visibile + Nascondi \"Chiedi\" + La sezione \"Chiedi\" è nascosta + La sezione \"Chiedi\" è visibile Nascondi Attributi Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono nascoste Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono visibili @@ -794,6 +807,11 @@ L'autoplay può essere modificato nelle impostazioni di YouTube: Impostazioni → Riproduzione → Riproduzione automatica video successivo" Il video suggerito nella schermata finale è mostrato + + Nascondi la sovrapposizione dei video correlati a schermo intero + La sovrapposizione dei video correlati è nascosta + La sovrapposizione dei video correlati è visualizzata + Nascondi timestamp video Il timestamp è nascosto @@ -831,10 +849,10 @@ Impostazioni → Riproduzione → Riproduzione automatica video successivo"Ricarica il video per votare usando Return YouTube Dislike Nascosto dal proprietario - I Non Mi Piace sono visibili - I Non Mi Piace non sono visibili + I Non Mi Piace sono visibili + I Non Mi Piace non sono visibili Mostra i Non Mi Piace degli Shorts - "I \"Non mi piace\" sugli Shorts sono visualizzati + "I \"Non mi piace\" sugli Shorts sono visualizzati Limitazione: i \"Non mi piace\" potrebbero non apparire in modalità incognito" I \"Non mi piace\" sugli Shorts non sono visualizzati @@ -851,7 +869,6 @@ Limitazione: i \"Non mi piace\" potrebbero non apparire in modalità incognito"< Mostra un toast se l\'API non è disponibile Una notifica è mostrata se Return YouTube Dislike non è disponibile Nessuna notifica viene mostrata se Return YouTube Dislike non è disponibile - Informazioni I dati vengono forniti dall\'API Return YouTube Dislike. Tocca qui per saperne di più Statistiche dell\'API di ReturnYouTubeDislike per questo dispositivo @@ -1057,7 +1074,7 @@ Pronto per l'invio?" Modifica manualmente i tempi del segmento Vuoi modificare il tempo di l\'inizio o la fine del segmento? Minutaggio fornito non valido - Statistiche + Statistiche Le statistiche non sono temporaneamente disponibili (l\'API non è attiva) Caricamento... @@ -1086,8 +1103,8 @@ Pronto per l'invio?" Codice colore non valido Ripristina colore Reimposta - Informazioni - I dati sono forniti dall\'API di SponsorBlock. Tocca qui per saperne di più e vedere i download per altre piattaforme + Informazioni + I dati sono forniti dall\'API di SponsorBlock. Tocca qui per saperne di più e vedere i download per altre piattaforme Fattore di forma del layout diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index aeb6d0979..e16a86143 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -153,10 +153,7 @@ Second \"item\" text" הסתר לחצן \'אני רוצה לקבל התראה\' הלחצן מוסתר הלחצן מוצג - - הסתר תווית \'אנשים צפו גם\' - התווית מוסתרת - התווית מוצגת + הסתר לחצן \'הצג עוד\' @@ -778,6 +775,8 @@ Second \"item\" text" הגדרות ← הפעלה ← הפעלה אוטומטית של הסרטון הבא" סרטון מוצע של מסך סיום מוצג + + הסתר חותמת זמן של סרטון חותמת זמן מוסתרת @@ -815,10 +814,10 @@ Second \"item\" text" רענן סרטון כדי להצביע באמצעות Return YouTube Dislike מוסתר על ידי הבעלים - דיסלייקים מוצגים - דיסלייקים אינם מוצגים + דיסלייקים מוצגים + דיסלייקים אינם מוצגים הצג דיסלייקים ב-Shorts - "דיסלייקים ב-Shorts מוצגים + "דיסלייקים ב-Shorts מוצגים מגבלה: ייתכן שלא יופיעו דיסלייקים במצב פרטי" דיסלייקים ב-Shorts אינם מוצגים @@ -835,7 +834,6 @@ Second \"item\" text" הצג הודעה קופצת אם ה-API אינו זמין הודעה קופצת מוצגת אם Return YouTube Dislike אינו זמין הודעה קופצת אינה מוצגת אם Return YouTube Dislike אינו זמין - אודות הנתונים מסופקים על ידי Return YouTube Dislike API. הקש כאן כדי ללמוד עוד סטטיסטיקת ReturnYouTubeDislike API של מכשיר זה @@ -1041,7 +1039,7 @@ Second \"item\" text" ערוך את תזמון המקטע באופן ידני האם ברצונך לערוך את התזמון עבור ההתחלה או הסיום של המקטע? ניתן זמן לא חוקי - סטטיסטיקה + סטטיסטיקה סטטיסטיקה אינה זמינה באופן זמני (API מושבת) טוען... @@ -1070,8 +1068,8 @@ Second \"item\" text" קוד צבע לא חוקי אפס צבע איפוס - אודות - הנתונים מסופקים על ידי SponsorBlock API. הקש כאן כדי ללמוד עוד ולראות הורדות עבור פלטפורמות אחרות + אודות + הנתונים מסופקים על ידי SponsorBlock API. הקש כאן כדי ללמוד עוד ולראות הורדות עבור פלטפורמות אחרות גורם צורת הפריסה diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index 2ab5925f6..bdae717f7 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced 設定をデフォルトにリセット %d 個の設定をインポートしました インポート失敗: %s + 設定を検索 + \'%s\' に一致する設定は見つかりませんでした + 別のキーワードを試してください + 検索履歴から削除しますか? ReVanced 設定にアイコンを表示する ReVanced 設定にアイコンが表示されます ReVanced 設定にアイコンは表示されません @@ -94,6 +98,9 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ 設定メニューを旧バージョンに戻す 旧バージョンの設定メニューが表示されます 通常の設定メニューが表示されます + 設定の検索履歴を表示する + 設定の検索履歴は表示されます + 設定の検索履歴は表示されません ショート動画のバックグラウンド再生を無効にする @@ -156,15 +163,18 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ 「通知を受け取る」ボタンを非表示 「通知を受け取る」ボタンは表示されません 「通知を受け取る」ボタンは表示されます - - 「他の人はこの動画も視聴しています」ラベルを非表示 - 「他の人はこの動画も視聴しています」ラベルは表示されません - 「他の人はこの動画も視聴しています」ラベルは表示されます + + おすすめラベルを非表示 + サムネイル下の「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは表示されません + サムネイル下の「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは表示されます 「もっと見る」ボタンを非表示 「もっと見る」ボタンは表示されません 「もっと見る」ボタンは表示されます + チケット欄を非表示 + チケット欄は表示されません + チケット欄は表示されます Timed Reaction を非表示 Timed Reaction とチャット欄のハートマーク アイコンは表示されません Timed Reaction とチャット欄のハートマー ク アイコンは表示されます @@ -234,6 +244,9 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ 「AI 生成による動画の要約」を非表示 動画の要約セクションは表示されません 動画の要約セクションは表示されます + 質問セクションを非表示 + 質問セクションは表示されません + 質問セクションは表示されます 関連情報を非表示 注目の場所 / ゲーム / 音楽 / 言及された人物セクションは表示されません 注目の場所 / ゲーム / 音楽 / 言及された人物セクションは表示されます @@ -790,12 +803,17 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ ナビゲーション バーは表示されます - 再生終了時の「関連動画」を非表示 - "「関連動画」は、再生終了時にプレーヤー画面に表示されませんが、自動再生がオンの場合は自動で再生されます + 再生終了時の「関連動画」オーバーレイを非表示 + "再生終了時に、「関連動画」オーバーレイはプレーヤー画面に表示されませんが、自動再生がオンの場合は次の動画が自動で再生されます 自動再生の設定は YouTube の設定で変更できます: 設定 → 再生 → 次の動画を自動再生" - 「関連動画」は、再生終了時にプレーヤー画面に表示されます + 再生終了時に、「関連動画」オーバーレイがプレーヤー画面に表示されます + + + 全画面表示の「次の動画」オーバーレイを非表示 + 「次の動画」オーバーレイは表示されません + 「次の動画」オーバーレイは表示されます タイムスタンプを非表示 @@ -834,10 +852,10 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ Return YouTube Dislike を使用するには動画を再読み込みしてください 所有者によって非表示 - 低評価数が表示されます - 低評価数は表示されません + 低評価数が表示されます + 低評価数は表示されません Shortsで低評価数を表示する - "Shortsの低評価が表示されます + "Shortsの低評価が表示されます 制限事項: シークレット モードでは低評価が表示されない場合があります" Shortsの低評価は表示されません @@ -854,7 +872,6 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ API 利用不可時にトーストを表示 Return YouTube Dislike が利用できない場合、トースト ポップアップが表示されます Return YouTube Dislike が利用できない場合でもトースト ポップアップは表示されません - Return YouTube Dislike について このデータはReturn YouTube Dislike APIによって提供されています。詳細はここをタップしてください このデバイスでのReturnYouTubeDislike API 統計情報 @@ -1058,7 +1075,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ セグメントのタイミングを手動で編集 セグメントの開始または終了のタイミングを編集しますか? 時間の値が無効です - 統計 + 統計 統計情報は一時的に利用できません (API がダウンしています) 読み込み中... @@ -1087,8 +1104,8 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ 色の値が無効です 色をリセット リセット - SponsorBlock について - SponsorBlock APIによって提供されるデータです。詳細はこちらをタップしてください。 + SponsorBlock について + SponsorBlock APIによって提供されるデータです。詳細はこちらをタップしてください。 レイアウト @@ -1231,9 +1248,9 @@ Automotive レイアウト 編集したシークバーの色が表示されます デフォルトのシークバーの色が表示されます シークバーの色 - シークバーの色を編集します + シークバーの色の値を編集します シークバーのアクセント カラー - シークバーのアクセントカラーを編集します + シークバーのアクセントカラーの値を編集します シークバーの色の値が無効です diff --git a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml +++ b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml +++ b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-km-rKH/strings.xml b/patches/src/main/resources/addresources/values-km-rKH/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-km-rKH/strings.xml +++ b/patches/src/main/resources/addresources/values-km-rKH/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 9f732a008..d5bb6263a 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -24,7 +24,7 @@ Second \"item\" text" 환경 검사에 실패함 공식 홈페이지 열기 닫기 - <h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 사전에 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 제거하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다. + <h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 사전에 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 삭제하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다. 다른 기기에서 패치됨 ReVanced Manager에 의해 설치되지 않음 10분 이상 전에 패치됨 @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced 설정을 기본값으로 초기화합니다 %d 설정을 가져왔습니다 설정을 가져올 수 없습니다: %s + 설정 검색 + \'%s\'에 대한 검색 결과가 없습니다 + 다른 키워드를 검색해 보세요 + 검색 기록에서 삭제하시겠습니까? ReVanced 설정 아이콘 표시하기 설정 아이콘을 표시합니다 설정 아이콘을 표시하지 않습니다 @@ -55,7 +59,7 @@ Second \"item\" text" ReVanced Patches <i>%s</i><br>버전을 사용 중입니다 알림 - 개발자 버전이므로<br>알려지지 않은 문제점이<br>발생할 수 있습니다 + Pre-Release 버전이므로<br>알려지지 않은 문제점이<br>발생할 수 있습니다 공식 링크 @@ -93,6 +97,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 이전 설정 메뉴 복원하기 이전 설정 메뉴를 표시합니다 이전 설정 메뉴를 표시하지 않습니다 + 설정 검색 기록 표시하기 + 설정 검색 기록을 표시합니다 + 설정 검색 기록을 표시하지 않습니다 Shorts 백그라운드 재생 비활성화하기 @@ -157,15 +164,18 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 \'알림 받기\' 버튼 숨기기 \'알림 받기\' 버튼이 숨겨집니다 \'알림 받기\' 버튼이 표시됩니다 - - \'시청자가 이 동영상도 시청함\' 라벨 숨기기 - 라벨이 숨겨집니다 - 라벨이 표시됩니다 + + 동영상 추천 라벨 숨기기 + 다음 동영상 추천 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 + 다음 동영상 추천 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 \'자세히 보기\' 버튼 숨기기 \'자세히 보기\' 버튼이 숨겨집니다 \'자세히 보기\' 버튼이 표시됩니다 + 콘서트 티켓 선반 숨기기 + 콘서트 티켓 선반이 숨겨집니다\n• 일부 국가에서는 아직 서비스가 제공되지 않습니다 + 콘서트 티켓 선반이 표시됩니다\n• 일부 국가에서는 아직 서비스가 제공되지 않습니다 실시간 이모티콘 리액션 숨기기 실시간 이모티콘 리액션이 숨겨집니다 실시간 이모티콘 리액션이 표시됩니다 @@ -235,6 +245,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 AI 생성 동영상 요약 섹션 숨기기 AI 생성 동영상 요약 섹션이 숨겨집니다 AI 생성 동영상 요약 섹션이 표시됩니다 + 요청 버튼 숨기기 + 요청 섹션이 숨겨집니다 + 요청 섹션이 표시됩니다 속성 섹션 숨기기 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 숨겨집니다 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 표시됩니다 @@ -410,9 +423,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 버튼을 표시하지 않습니다 - 시청 경고 다이얼로그 제거하기 - 다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상, etc. - 다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상, etc. + 시청 경고 다이얼로그 삭제하기 + 다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 삭제합니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상, etc. + 다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 삭제하지 않습니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상, etc. 이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다. @@ -672,8 +685,8 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 롤링 넘버 애니메이션 비활성화하기 - 다음 롤링 넘버 애니메이션을 비활성화합니다\n• 조회수, 시청자 수 롤링 애니메이션 (플레이어 하단)\n• 좋아요 수, 조회수 롤링 애니메이션 (동영상 설명) - 다음 롤링 넘버 애니메이션을 활성화합니다\n• 조회수, 시청자 수 롤링 애니메이션 (플레이어 하단)\n• 좋아요 수, 조회수 롤링 애니메이션 (동영상 설명) + 다음 롤링 넘버 애니메이션을 비활성화합니다:\n• 조회수, 시청자 수 롤링 애니메이션 (플레이어 하단)\n• 좋아요 수, 조회수 롤링 애니메이션 (동영상 설명) + 다음 롤링 넘버 애니메이션을 활성화합니다:\n• 조회수, 시청자 수 롤링 애니메이션 (플레이어 하단)\n• 좋아요 수, 조회수 롤링 애니메이션 (동영상 설명) 동영상 플레이어 재생바 숨기기 @@ -794,6 +807,11 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 설정 → 재생 → 다음 동영상 자동재생" 최종 화면에서 다음 재생 추천 동영상이 표시됩니다 + + 전체 화면에서 관련 동영상 오버레이 숨기기 + 관련 동영상 오버레이가 숨겨집니다 + 관련 동영상 오버레이가 표시됩니다 + 동영상 타임스탬프 숨기기 타임스탬프가 숨겨집니다 @@ -831,10 +849,10 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 ReturnYouTubeDislike를 사용하여 투표하려면 동영상을 다시 로드하세요 소유자에 의해 숨겨짐 - 싫어요 수를 표시합니다 - 싫어요 수를 표시하지 않습니다 + 싫어요 수를 표시합니다 + 싫어요 수를 표시하지 않습니다 Shorts에서 싫어요 수 표시하기 - "Shorts에서 싫어요 수를 표시합니다 + "Shorts에서 싫어요 수를 표시합니다 알려진 문제점: • 사용자가 로그인을 하지 않았거나 시크릿 모드에서는 싫어요 수가 표시되지 않을 수 있습니다" @@ -852,7 +870,6 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 API를 사용할 수 없을 때, 팝업 메시지 표시하기 ReturnYouTubeDislike를 사용할 수 없을 때, 팝업 메시지를 표시합니다 ReturnYouTubeDislike를 사용할 수 없을 때, 팝업 메시지를 표시하지 않습니다 - 정보 싫어요 수의 데이터는 Return YouTube Dislike API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 누르세요 이 기기의 ReturnYouTubeDislike API 사용 통계 @@ -975,7 +992,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 주제와 관련 없는 구간 전반적인 동영상의 주제를 이해하는 데 필요 없는 내용을 포함하고 있습니다 음악이 아닌 구간 - 뮤직 비디오에서 음악이 아닌 구간이 해당됩니다 + 음악 동영상에서 음악이 아닌 구간이 해당됩니다 건너뛰기 하이라이트 스폰서 광고 건너뛰기 @@ -1058,7 +1075,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 직접 시간 구간 편집하기 구간의 시작이나 끝을 편집하시겠습니까? 잘못된 시간 형식입니다 - 기록 + 기록 기록을 일시적으로 가져올 수 없습니다 (응답 시간 초과) 불러오는 중 ... @@ -1087,8 +1104,8 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 잘못된 헥스 코드입니다 색상 초기화 초기화 - 정보 - 건너뛸 구간의 데이터는 SponsorBlock API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 누르세요 + 정보 + 건너뛸 구간의 데이터는 SponsorBlock API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 누르세요 레이아웃 폼 팩터 변경하기 @@ -1315,7 +1332,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요" 알림 수신을 위한 클라우드 메시징을 설정할 수 있습니다 - 최근에 계정 로그인 정보를 변경했다면 MicroG를 제거하고 다시 설치하세요. + 최근에 계정 로그인 정보를 변경했다면 MicroG를 삭제하고 다시 설치하세요. 리다이렉션 없이 링크 바로 열기 @@ -1328,9 +1345,9 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요" 앱 내에서 외부 링크를 열 때, 내부 브라우저를 사용합니다 - 추적 쿼리를 제거한 링크 공유하기 - 링크를 공유할 때, URL에서 추적 쿼리 매개변수를 제거합니다 (URL의 뒷부분 \'?si=...\' 이 제거됨) - 링크를 공유할 때, URL에서 추적 쿼리 매개변수를 제거하지 않습니다 + 추적 쿼리를 삭제한 링크 공유하기 + 링크를 공유할 때, URL에서 추적 쿼리 매개변수를 삭제합니다 (URL의 뒷부분 \'?si=...\' 이 삭제됨) + 링크를 공유할 때, URL에서 추적 쿼리 매개변수를 삭제하지 않습니다 동영상을 확대할 때, 진동 피드백 비활성화하기 @@ -1411,8 +1428,8 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요" 이 설정을 비활성화하면 동영상 재생 문제가 발생할 수 있습니다. 기본 클라이언트 iOS AVC (H.264) 강제로 활성화하기 - 동영상 코덱을 AVC (H.264)로 강제로 활성화합니다\n\n• 일부 VP9 코덱 동영상에서 제거되었던 화질 값이 표시될 수 있습니다\n• 최대 화질 값이 1080p이므로, 초고화질 동영상을 재생할 수 없습니다\n• HDR 동영상을 재생할 수 없습니다 - 동영상 코덱을 자동으로 결정합니다\n\n• 예전에 업로드된 동영상을 재생했는데 VP9 코덱 응답을 받았을 경우, 일부 화질값이 제거되어 360p와 1080p(Premium 기능)만 선택가능할 수 있거나 화질 메뉴를 선택불가능할 수 있습니다 + 동영상 코덱을 AVC (H.264)로 강제로 활성화합니다\n\n• 일부 VP9 코덱 동영상에서 삭제되었던 화질 값이 표시될 수 있습니다\n• 최대 화질 값이 1080p이므로, 초고화질 동영상을 재생할 수 없습니다\n• HDR 동영상을 재생할 수 없습니다 + 동영상 코덱을 자동으로 결정합니다\n\n• 예전에 업로드된 동영상을 재생했는데 VP9 코덱 응답을 받았을 경우, 일부 화질값이 삭제되어 360p와 1080p(Premium 기능)만 선택가능할 수 있거나 화질 메뉴를 선택불가능할 수 있습니다 "이 설정를 활성화하면 배터리 수명이 향상되고, 동영상 재생 끊김 문제가 해결될 수 있습니다. AVC의 최대 화질 값은 1080p이고, OPUS 코덱을 사용불가 및 HDR 동영상을 재생할 수 없으며, 동영상을 재생했을 경우에는 VP9 또는 AV1보다 더 많은 모바일 데이터를 사용되오니 주의하세요." @@ -1452,11 +1469,11 @@ AVC의 최대 화질 값은 1080p이고, OPUS 코덱을 사용불가 및 HDR 동 동영상 광고를 차단하지 않습니다 - 메시지를 제거합니다 - 제거된 메시지 표시하기 - 제거된 메시지 표시하지 않기 - 스포일러 뒤에 제거된 메시지 숨기기 - 제거된 메시지를 줄이 그어진 텍스트로 표시하기 + 메시지를 삭제합니다 + 삭제된 메시지 표시하기 + 삭제된 메시지 표시하지 않기 + 스포일러 뒤에 삭제된 메시지 숨기기 + 삭제된 메시지를 줄이 그어진 텍스트로 표시하기 채널 포인트 자동 적립하기 diff --git a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml +++ b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml +++ b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 2d2ff6aa2..4542a178e 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced nustatymai atstatyti į numatytuosius Importuota %d nustatymų Importavimas nepavyko: %s + Ieškoti nustatymų + Nerasta rezultatų pagal „%s“ + Bandykite kitą raktinį žodį + Pašalinti iš paieškos istorijos? Rodyti „ReVanced“ nustatymų piktogramas Nustatymų piktogramos yra rodomos Nenurodomos nustatymų piktogramos @@ -93,6 +97,9 @@ Palieskite mygtuką Tęsti ir leiskite optimizavimo pakeitimus." Atkurti senus nustatymų meniu Rodomi seni nustatymų meniu Seni nustatymų meniu nerodomi + Rodyti nustatymų paieškos istoriją + Nustatymų paieškos istorija rodoma + Nustatymų paieškos istorija nerodoma Išjungti \"Shorts\" foninį atkūrimą @@ -153,15 +160,18 @@ Apie netikėtus įvykius nebus pranešta." Slėpti mygtuką \"Pranešti man\" Mygtukas yra paslėptas Mygtukas yra rodomas - - Slėpti etiketę „Žiūrintys taip pat žiūrėjo“ - Etiketė paslėpta - Etiketė rodoma + + Slėpti vaizdo įrašo rekomendacijų etiketes + Paslėptos etiketės „Žmonės taip pat žiūrėjo“ ir „Jums taip pat gali patikti“ + Rodomos etiketės „Žmonės taip pat žiūrėjo“ ir „Jums taip pat gali patikti“ Slėpti mygtuką \"Rodyti daugiau\" Mygtukas yra paslėptas Mygtukas yra rodomas + Slėpti bilietų lentyną + Bilietų lentyna yra paslėpta + Bilietų lentyna yra rodoma Slėpti laiku įvykusias reakcijas Laiku įvykusios reakcijos yra paslėptos Laiku įvykusios reakcijos yra rodomos @@ -231,6 +241,9 @@ Apie netikėtus įvykius nebus pranešta." Slėpti „AI sukurtos vaizdo įrašo santraukos“ Vaizdo įrašo santraukos skyrius yra paslėptas Vaizdo įrašo santraukos skyrius yra rodomas + Slėpti \"Klausti\" + Skyrius „Klausti“ yra paslėptas + Skyrius „Klausti“ yra rodomas Slėpti atributus Teminių vietų, žaidimų, muzikos ir minimų žmonių skyriai yra paslėpti Teminių vietų, žaidimų, muzikos ir minimų žmonių skyriai yra rodomi @@ -792,6 +805,11 @@ Automatinį paleidimą galima pakeisti „YouTube“ nustatymuose: Nustatymai → Atkūrimas → Automatiškai leisti kitą vaizdo įrašą" Pabaigos ekrane siūlomas vaizdo įrašas rodomas + + Slėpti susijusio vaizdo įrašo perdangą per visą ekraną + Susijusio vaizdo įrašo perdanga paslėpta + Rodoma susijusio vaizdo įrašo perdanga + Slėpti vaizdo įrašo laiko žymę Laiko žymė paslėpta @@ -829,10 +847,10 @@ Nustatymai → Atkūrimas → Automatiškai leisti kitą vaizdo įrašą"Perkraukite vaizdo įrašą, kad balsuotumėte naudodami „Return YouTube Dislike“ Paslėpta savininko - \"Nepatinka\" rodomi - \"Nepatinka\" nerodomi + \"Nepatinka\" rodomi + \"Nepatinka\" nerodomi Rodyti \"Nepatinka\" Shorts - "Nepritarimai „Shorts“ rodomi + "Nepritarimai „Shorts“ rodomi Apribojimas: nepritarimai gali būti nerodomi inkognito režimu" Nepritarimai „Shorts“ nerodomi @@ -849,7 +867,6 @@ Apribojimas: nepritarimai gali būti nerodomi inkognito režimu" Rodyti pranešimą, jei API nepasiekiamas Pranešimas rodomas, jei „Return YouTube Dislike“ nepasiekiamas Pranešimas nerodomas, jei „Return YouTube Dislike“ nepasiekiamas - Apie Duomenys pateikiami „Return YouTube Dislike“ API. Bakstelėkite čia, norėdami sužinoti daugiau „ReturnYouTubeDislike“ API statistika šioje įrenginyje @@ -1057,7 +1074,7 @@ Ar paruošta pateikti?" Rankiniu būdu redaguoti segmento laiką Ar norite redaguoti segmento pradžios ar pabaigos laiką? Nurodytas neteisingas laikas - Statistika + Statistika Statistika laikinai nepasiekiama (API neveikia) Kraunama... @@ -1086,8 +1103,8 @@ Ar paruošta pateikti?" Netinkamas spalvos kodas Atstatyti spalvą Atstatyti - Apie - Duomenys pateikiami per \"SponsorBlock\" API. Bakstelėkite čia, kad sužinotumėte daugiau ir pamatytumėte atsisiuntimus kitoms platformoms + Apie + Duomenys pateikiami per \"SponsorBlock\" API. Bakstelėkite čia, kad sužinotumėte daugiau ir pamatytumėte atsisiuntimus kitoms platformoms Išdėstymas: formos faktorius diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index 90d3b8e62..149e74ac4 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced iestatījumi atiestatīti uz noklusējuma vērtībām Importēti %d iestatījumi Importēšana neizdevās: %s + Meklēt iestatījumus + Nav atrasts neviens rezultāts atbilstoši \'%s\' + Mēģiniet citu atslēgvārdu + Noņemt no meklēšanas vēstures? Rādīt ReVanced iestatījumu ikonas Iestatījumu ikonas tiek rādītas Ikonas iestatījumos netiek rādītas @@ -93,6 +97,9 @@ Nospiediet turpināt pogu un atļaujiet optimizācijas izmaiņas." Atjaunot vecās iestatījumu izvēlnes Tiek rādītas vecās iestatījumu izvēlnes Vecās iestatījumu izvēlnes netiek rādītas + Rādīt iestatījumu meklēšanas vēsturi + Iestatījumu meklēšanas vēsture tiek rādīta + Iestatījumu meklēšanas vēsture netiek rādīta Atspējot Shorts fonu atskaņošanu @@ -153,15 +160,18 @@ Jūs netiksit informēts par neparedzētiem notikumiem." Paslēpt \"Paziņot\" pogu Poga ir paslēpta Poga ir redzama - - Paslēpt etiķeti \"Skatītāji arī skatījās\" - Etiķete ir paslēpta - Etiķete ir redzama + + Paslēpt video ieteikumu etiķetes + Etiķetes “Skatītāji arī skatījās” un “Jums varētu patikt” ir paslēptas + Etiķetes “Skatītāji arī skatījās” un “Jums varētu patikt” ir redzamas Paslēpt \"Rādīt vairāk\" pogu Poga ir paslēpta Poga ir redzama + Paslēpt biļešu plauktu + Biļešu plaukts ir paslēpts + Biļešu plaukts ir redzams Paslēpt laika reakcijas Laika reakcijas ir paslēptas Laika reakcijas ir redzamas @@ -231,6 +241,9 @@ Jūs netiksit informēts par neparedzētiem notikumiem." Paslēpt \"AI ģenerēta video kopsavilkums\" Video kopsavilkuma sadaļa ir paslēpta Video kopsavilkuma sadaļa ir rādīta + Slēpt Jautāt + Jautājumu sadaļa ir paslēpta + Jautājumu sadaļa ir redzama Paslēpt atribūtus Piedāvātās vietas, spēles, mūzika un pieminētie cilvēki ir paslēpti Piedāvātās vietas, spēles, mūzika un pieminētie cilvēki ir redzami @@ -794,6 +807,11 @@ Automātisko atskaņošanu var mainīt YouTube iestatījumos: Iestatījumi → Atskaņošana → Automātiski atskaņot nākamo video" Ieteiktais video beigu ekrānā ir redzams + + Slēpt saistīto video pārklājumu pilnekrāna režīmā + Saistīto video pārklājums ir paslēpts + Saistīto video pārklājums ir redzams + Paslēpt video laika zīmi Laika zīme ir paslēpta @@ -831,10 +849,10 @@ Iestatījumi → Atskaņošana → Automātiski atskaņot nākamo video"Pārstartējiet video, lai balsotu, izmantojot Return YouTube Dislike Slēpts no īpašnieka - Nepatīk pogas ir redzamas - Nepatīk pogas nav redzamas + Nepatīk pogas ir redzamas + Nepatīk pogas nav redzamas Rādīt nepatīk pogas Shorts - "Nepatīk pie Shorts ir redzami + "Nepatīk pie Shorts ir redzami Ierobežojums: Nepatīk var neparādīties inkognito režīmā" Nepatīk pie Shorts nav redzami @@ -851,7 +869,6 @@ Ierobežojums: Nepatīk var neparādīties inkognito režīmā" Rādīt paziņojumu, ja API nav pieejama Paziņojums tiks rādīts, ja Return YouTube Dislike nav pieejams Paziņojums netiks rādīts, ja Return YouTube Dislike nav pieejams - Par Dati ir nodrošināti ar Return YouTube Dislike API. Pieskarieties šeit, lai uzzinātu vairāk ReturnYouTubeDislike API statistika šai ierīcei @@ -1057,7 +1074,7 @@ Vai esat gatavs iesniegt?" Rediģēt segmenta laika iestatījumus manuāli Vai vēlaties rediģēt segmenta sākuma vai beigu laika iestatījumus? Norādīts nepareizs laiks - Statistika + Statistika Statistika īslaicīgi nav pieejama (API ir izslēgts) Ielādē... @@ -1086,8 +1103,8 @@ Vai esat gatavs iesniegt?" Nederīgs krāsas kods Atiestatīt krāsu Atiestatīt - Par - Dati tiek sniegti no SponsorBlock API. Pieskarieties šeit, lai uzzinātu vairāk un skatītu lejupielādes citām platformām + Par + Dati tiek sniegti no SponsorBlock API. Pieskarieties šeit, lai uzzinātu vairāk un skatītu lejupielādes citām platformām Izmēģinājuma formāts diff --git a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml +++ b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml +++ b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml +++ b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-my-rMM/strings.xml b/patches/src/main/resources/addresources/values-my-rMM/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-my-rMM/strings.xml +++ b/patches/src/main/resources/addresources/values-my-rMM/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml +++ b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index f891d779e..3e613df68 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced-instellingen zijn teruggezet naar de standaardinstellingen %d instellingen geïmporteerd Importeren mislukt: %s + Zoekinstellingen + Geen resultaten gevonden voor \", %s\" + Probeer een ander trefwoord + Verwijderen uit zoekgeschiedenis? Pictogrammen voor ReVanced-instellingen weergeven Instellingspictogrammen worden weergegeven Pictogrammen voor instellingen worden niet weergegeven @@ -93,6 +97,9 @@ Tik op de knop Doorgaan en sta wijzigingen in de optimalisatie toe." Oude instellingenmenu\'s herstellen Oude instellingenmenu\'s worden getoond Oude instellingenmenu\'s worden niet getoond + Zoekgeschiedenis instellingen weergeven + Zoekgeschiedenis instellingen wordt weergegeven + De zoekgeschiedenis van de instellingen wordt niet weergegeven Shorts-achtergrondafspelen uitschakelen @@ -153,15 +160,18 @@ U wordt niet op de hoogte gesteld van onverwachte gebeurtenissen." \'Herinnering sturen\' knop verbergen De knop is verborgen Knop wordt weergegeven - - Label \'Kijkers bekeken ook\' verbergen - Label is verborgen - Label wordt weergegeven + + Videolabellessen met aanbevelingen verbergen + De labels \'Mensen keken ook\' en \'Misschien vind je dit ook leuk\' zijn verborgen + De labels \'Mensen keken ook\' en \'Misschien vind je dit ook leuk\' worden weergegeven Verberg knop \'Meer weergeven\' De knop is verborgen Knop wordt weergegeven + Ticketsectie verbergen + Ticketsectie is verborgen + Ticketsectie is getoond Verberg getimede reacties Gectimed reacties worden verborgen Gectimed reacties worden getoond @@ -231,6 +241,9 @@ U wordt niet op de hoogte gesteld van onverwachte gebeurtenissen." \'AI-gegenereerde videosamenvatting\' verbergen Transcriptgedeelte is verborgen Videobeschrijvingssectie is zichtbaar + Vraag verbergen + Vraaggedeelte is verborgen + Vraaggedeelte wordt weergegeven Kenmerken verbergen Specifieke plaatsen, Games, Muziek en Mensen genoemd secties zijn verborgen Specifieke plaatsen, Games, Muziek en Mensen genoemd secties worden weergegeven @@ -794,6 +807,11 @@ Automatisch afspelen kan worden gewijzigd in de YouTube-instellingen: Instellingen → Afspelen → Volgende video automatisch afspelen" Voorgestelde video op eindscherm wordt getoond + + Verberg gerelateerde video-overlay in volledig scherm + Gerelateerde video-overlay is verborgen + Gerelateerde video-overlay wordt weergegeven + Verberg de videotijd De tijd is verborgen @@ -831,10 +849,10 @@ Instellingen → Afspelen → Volgende video automatisch afspelen" Herlaad video om te stemmen via Return YouTube Dislike Verborgen door eigenaar - \"Dislikes\" worden weergegeven - \"Dislikes\" worden niet weergegeven + \"Dislikes\" worden weergegeven + \"Dislikes\" worden niet weergegeven Toon onlikes op Shorts - "Vind ik niet leuk op Shorts worden weergegeven + "Vind ik niet leuk op Shorts worden weergegeven Beperking: Vind ik niet leuk verschijnen mogelijk niet in de incognitomodus" Vind ik niet leuk op Shorts worden niet weergegeven @@ -851,7 +869,6 @@ Beperking: Vind ik niet leuk verschijnen mogelijk niet in de incognitomodus"Toon een \"toast\" als de API niet beschikbaar is \"Toast\" wordt getoond als Return YouTube Dislike niet beschikbaar is \"Toast\" wordt niet getoond als Return YouTube Dislike niet beschikbaar is - Over Data wordt aangeleverd door de Return YouTube Dislike API. Tik hier voor meer informatie ReturnYouTubeDislike API-statistieken van dit apparaat @@ -1058,7 +1075,7 @@ Klaar om in te dienen?" Bewerk timing van segment handmatig Wil je de timing van het begin of einde van het segment bewerken? Ongeldige tijd opgegeven - Statistieken + Statistieken Statistieken zijn tijdelijk niet beschikbaar (API is down) Bezig met laden... @@ -1087,8 +1104,8 @@ Klaar om in te dienen?" Ongeldige kleurcode Kleur resetten Herstellen naar standaard - Over - Gegevens worden geleverd door de SponsorBlock API. Tik hier om meer te weten te komen en downloads te bekijken voor andere platforms + Over + Gegevens worden geleverd door de SponsorBlock API. Tik hier om meer te weten te komen en downloads te bekijken voor andere platforms Indelingsvormfactor diff --git a/patches/src/main/resources/addresources/values-or-rIN/strings.xml b/patches/src/main/resources/addresources/values-or-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-or-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-or-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 7a635e661..552507398 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Przywrócono domyślne ustawienia ReVanced Zaimportowano %d ustawień Importowanie nie powiodło się: %s + Szukaj w ustawieniach + Brak wyników dla „%s” + Spróbuj innego słowa kluczowego + Usunąć z historii wyszukiwania? Pokaż ikony ustawień ReVanced Ikony ustawień są widoczne Ikony ustawień nie są wyświetlane @@ -93,6 +97,9 @@ Naciśnij przycisk Kontynuuj i zezwól na zmiany optymalizacji." Przywróć stare menu ustawień Wyświetlane są stare menu ustawień Stare menu ustawień nie są wyświetlane + Pokaż historię wyszukiwania ustawień + Historia wyszukiwania ustawień jest wyświetlana + Historia wyszukiwania w ustawieniach jest niewidoczna Wyłącz odtwarzanie Shortsów w tle @@ -153,15 +160,18 @@ Nie będziesz informowany o żadnych nieoczekiwanych zdarzeniach." Ukryj przycisk \'Powiadom mnie\' Przycisk jest ukryty Przycisk jest widoczny - - Ukryj etykietę „Oglądane przez innych” - Etykieta jest ukryta - Etykieta jest widoczna + + Ukryj etykiety z rekomendacjami wideo + Etykiety „Oglądane także przez innych” i „To także może Ci się spodobać” są ukryte + Etykiety „Oglądane także przez innych” i „To także może Ci się spodobać” są wyświetlane Ukryj przycisk \'Pokaż więcej\' Przycisk jest ukryty Przycisk jest widoczny + Ukryj pasek z biletami + Pasek z biletami jest ukryty + Pasek z biletami jest widoczny Ukryj reakcje czasowe Reakcje czasowe są ukryte Reakcje czasowe są widoczne @@ -231,6 +241,9 @@ Nie będziesz informowany o żadnych nieoczekiwanych zdarzeniach." Ukryj sekcję „Podsumowanie wideo wygenerowane przez AI” Sekcja podsumowania wideo jest ukryta Sekcja podsumowania wideo jest widoczna + Ukryj Pytanie + Sekcja Pytania jest ukryta + Sekcja Pytania jest widoczna Ukryj atrybuty Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są ukryte Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są widoczne @@ -794,6 +807,11 @@ Automatyczne odtwarzanie można zmienić w ustawieniach YouTube: Ustawienia → Odtwarzanie → Autoodtwarzanie następnego filmu" Sugerowane wideo na ekranie końcowym jest wyświetlane + + Ukryj nakładkę powiązanych filmów w trybie pełnoekranowym + Nakładka powiązanych filmów jest ukryta + Wyświetlana jest nakładka powiązanych filmów + Znacznik czasu filmu Znacznik czasu jest ukryty @@ -831,10 +849,10 @@ Ustawienia → Odtwarzanie → Autoodtwarzanie następnego filmu" Odśwież film, aby zagłosować za pomocą Return YouTube Dislike Ukryte przez właściciela - Łapki w dół są widoczne - Łapki w dół są ukryte + Łapki w dół są widoczne + Łapki w dół są ukryte Łapki w dół na Shortsach - "Oceny negatywne na Shorts są widoczne + "Oceny negatywne na Shorts są widoczne Ograniczenie: Oceny negatywne mogą nie pojawiać się w trybie incognito" Oceny negatywne na Shorts nie są widoczne @@ -851,7 +869,6 @@ Ograniczenie: Oceny negatywne mogą nie pojawiać się w trybie incognito"Komunikat o niedostępności API Komunikat jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny Komunikat nie jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny - O aplikacji Dane są dostarczane przez API Return YouTube Dislike. Dotknij tutaj, aby dowiedzieć się więcej Statystyki ReturnYouTubeDislike tego urządzenia @@ -1058,7 +1075,7 @@ Gotowy do przesłania?" Edytuj ręcznie czas segmentu Czy chcesz edytować czas rozpoczęcia lub zakończenia segmentu? Podano nieprawidłowy format czasu - Statystyki + Statystyki Statystyki są tymczasowo niedostępne (API nie działa) Wczytywanie... @@ -1087,8 +1104,8 @@ Gotowy do przesłania?" Nieprawidłowy kod koloru Resetuj kolor Resetuj - O aplikacji - Dane są dostarczane przez API SponsorBlock. Dotknij tutaj, aby dowiedzieć się więcej i pobrać na inne platformy + O aplikacji + Dane są dostarczane przez API SponsorBlock. Dotknij tutaj, aby dowiedzieć się więcej i pobrać na inne platformy Współczynnik kształtu diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index 982ca845d..3d6027222 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Configurações do ReVanced redefinidas para o padrão Configurações %d importadas Importação falhou: %s + Configurações de pesquisa + Nenhum resultado encontrado para \",%s\" + Tente outra palavra-chave + Remover do histórico de pesquisa? Mostrar ícones de configuração do ReVanced Ícones de configuração são mostrados Os ícones de configuração não são mostrados @@ -91,6 +95,9 @@ Toque no botão continuar e permita as mudanças de otimização. " Restaurar menus de configurações antigos Os menus de configurações antigos são mostrados. Os menus de configurações antigos não são mostrados. + Mostrar histórico de pesquisa das configurações + O histórico de pesquisa das configurações é mostrado + O histórico de pesquisa de configurações não é exibido Desativar reprodução de fundo dos Shorts @@ -151,15 +158,18 @@ Você não será notificado sobre nenhum evento inesperado." Ocultar botão \'Notificar-me\' Botão está oculto O botão é mostrado - - Ocultar o rótulo \"Pessoas também assistiram\" - O rótulo está oculto - O rótulo é mostrado + + Ocultar rótulos de recomendação de vídeo + Os rótulos \"As pessoas também assistiram\" e \"Você pode gostar também\" estão ocultos + Os rótulos \"As pessoas também assistiram\" e \"Você pode gostar também\" são mostrados Ocultar botão \'Mostrar mais\' Botão está oculto O botão é mostrado + Ocultar seção de ingressos + Seção de ingressos oculta + Seção de ingressos exibida Ocultar reações cronometradas Reações cronometradas estão ocultas Reações cronometradas não estão ocultas @@ -229,6 +239,9 @@ Você não será notificado sobre nenhum evento inesperado." Ocultar \"Resumo de vídeo gerado por IA\" Seção de resumo do vídeo está oculta Seção de resumo do vídeo é mostrada + Ocultar Perguntar + A seção de perguntas está oculta + A seção de perguntas é mostrada Ocultar atributos As seções de lugares em destaque, jogos, música e pessoas mencionadas estão ocultas As seções de lugares em destaque, jogos, música e pessoas mencionadas são mostradas @@ -792,6 +805,11 @@ A reprodução automática pode ser alterada nas configurações do YouTube: Configurações → Reprodução → Reproduzir próximo vídeo automaticamente" O vídeo sugerido na tela final é exibido + + Ocultar a sobreposição de vídeos relacionados em tela cheia + A sobreposição de vídeos relacionados está oculta + A sobreposição de vídeos relacionados é mostrada + Ocultar tempo do vídeo Tempo está oculto @@ -829,10 +847,10 @@ Configurações → Reprodução → Reproduzir próximo vídeo automaticamente" Recarregue o vídeo para votar usando o Return YouTube Dislike Oculto pelo proprietário - Não gostei está oculto - Não gostei não está oculto + Não gostei está oculto + Não gostei não está oculto Mostrar não gostei no Shorts - "\"Não gostei\" nos Shorts são mostrados + "\"Não gostei\" nos Shorts são mostrados Limitação: \"Não gostei\" podem não aparecer no modo anônimo" \"Não gostei\" nos Shorts não são mostrados @@ -849,7 +867,6 @@ Limitação: \"Não gostei\" podem não aparecer no modo anônimo" Exibir uma notificação flutuante se a API não estiver disponível Notificação flutuante vai ser exibida se o Return YouTube Dislike não estiver disponível Notificação flutuante não vai ser exibida se o Return YouTube Dislike não estiver disponível - Sobre Os dados são fornecidos pela API do Return Dislike YouTube. Toque aqui para saber mais Estatísticas da API do Return YouTube Dislike deste dispositivo @@ -1055,7 +1072,7 @@ Pronto para enviar?" Editar tempo do segmento manualmente Deseja editar o tempo de início ou fim do segmento? Tempo inserido inválido - Estatísticas + Estatísticas As estatísticas não estão disponíveis temporariamente (API está inativa) Carregando... @@ -1084,8 +1101,8 @@ Pronto para enviar?" Código de cor inválido Redefinir cor Resetar - Sobre - Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver como baixar para outras plataformas + Sobre + Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver como baixar para outras plataformas Layout fator de forma diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index d5bd80a93..162ed02dd 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" As definições do ReVanced foram redefinidas para a predefinição Configurações importadas: %d A importação falhou: %s + Configurações de pesquisa + Nenhum resultado encontrado para \"%s\" + Tente outra palavra-chave + Remover do histórico de pesquisa? Mostrar ícones de configuração do ReVanced Os ícones de configuração são mostrados Os ícones de configuração não são mostrados @@ -93,6 +97,9 @@ Toque no botão continuar e permita as alterações de otimização." Restaurar menus de configurações antigos Os menus de configurações antigos são mostrados Os menus de configurações antigos não são mostrados + Mostrar histórico de pesquisa de configurações + O histórico de pesquisa de configurações é exibido + O histórico de pesquisa de configurações não é exibido Desativar reprodução de fundo de Shorts @@ -153,15 +160,18 @@ Não será notificado de quaisquer eventos inesperados." Ocultar botão \'Notificar-me\' O botão está escondido O botão está visível - - Ocultar o rótulo \"Pessoas também assistiram\" - O rótulo está oculto - O rótulo é mostrado + + Ocultar rótulos de recomendação de vídeo + Os rótulos \"As pessoas também assistiram\" e \"Você também pode gostar\" estão ocultos + Os rótulos \"As pessoas também assistiram\" e \"Você também pode gostar\" são mostrados Ocultar botão \'Mostrar mais\' O botão está escondido O botão está visível + Ocultar prateleira de ingressos + Prateleira de ingressos oculta + Prateleira de ingressos exibida Esconder reações cronometradas Reações temporizadas estão escondidas Reações temporizadas são visíveis @@ -231,6 +241,9 @@ Não será notificado de quaisquer eventos inesperados." Ocultar \"Resumo de vídeo gerado por IA\" A seção de resumo do vídeo está oculta A seção de resumo do vídeo é mostrada + Ocultar \"Perguntar\" + A seção \"Perguntar\" está oculta + A seção \"Perguntar\" está visível Ocultar atributos As seções Lugares em destaque, Jogos, Música e Pessoas mencionadas estão ocultas As seções Lugares em destaque, Jogos, Música e Pessoas mencionadas são mostradas @@ -794,6 +807,11 @@ A reprodução automática pode ser alterada nas configurações do YouTube: Configurações → Reprodução → Reproduzir o próximo vídeo automaticamente" O vídeo sugerido na tela final é exibido + + Ocultar a sobreposição de vídeos relacionados em tela cheia + A sobreposição de vídeos relacionados está oculta + A sobreposição de vídeos relacionados é mostrada + Esconder timestamp do vídeo Timestamp está escondido @@ -831,10 +849,10 @@ Configurações → Reprodução → Reproduzir o próximo vídeo automaticament Recarregue para votar usando Return YouTube Dislike Oculto pelo proprietário - Descurtidas são visíveis - Não há curtidas visíveis + Descurtidas são visíveis + Não há curtidas visíveis Mostrar não curtidas na abreviação - "As não gostos em Shorts são mostradas + "As não gostos em Shorts são mostradas Limitação: As não gostos podem não aparecer no modo anônimo" As não gostos em Shorts não são mostradas @@ -851,7 +869,6 @@ Limitação: As não gostos podem não aparecer no modo anônimo" Mostrar uma notificação flutuante se a API não estiver disponível Toast é exibida se Retornar o Youtube Dislike não estiver disponível Toast não é exibida se Retornar o YouTube Dislike não estiver disponível - Sobre Os dados são fornecidos pela API Return Dislike do YouTube. Toque aqui para saber mais Estatísticas da API deste dispositivo RetnYouTubeDislike @@ -1058,7 +1075,7 @@ Pronto para enviar?" Editar tempo de segmento manualmente Você deseja editar o tempo para o início ou o fim do segmento? Data inválida - Estatísticas + Estatísticas As estatísticas não estão disponíveis temporariamente (API está em baixo) A carregar... @@ -1087,8 +1104,8 @@ Pronto para enviar?" Código de cor inválido Redefinir cor Repor - Sobre - Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver downloads para outras plataformas + Sobre + Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver downloads para outras plataformas Fator de forma do layout diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index eb26c7549..490018070 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Setările ReVanced au fost resetate la valorile implicite Au fost importate %d setări Importare eșuată: %s + Caută în setări + Nu s-au găsit rezultate pentru „%s” + Încearcă un alt cuvânt cheie + Eliminați din istoricul căutărilor? Afișați pictogramele de setări ReVanced Pictogramele de setări sunt afișate Pictogramele setărilor nu sunt afișate @@ -93,6 +97,9 @@ Apăsați butonul continuare și permiteți modificările de optimizare."Restaurare meniuri setări vechi Meniurile de setări vechi sunt afișate Meniurile de setări vechi nu sunt afișate + Afișează istoricul căutărilor în setări + Se afișează istoricul căutărilor în setări + Istoricul căutărilor în setări nu este afișat Dezactivează redarea în fundal a Shorts @@ -153,15 +160,18 @@ Nu veți fi notificat de niciun eveniment neașteptat." Ascunde butonul \'Notifică-mă\' Butonul este ascuns Butonul este afișat - - Ascunde eticheta „Persoanele au mai urmărit și” - Eticheta este ascunsă - Eticheta este afișată + + Ascunde etichetele de recomandare video + Etichetele „Alții au mai urmărit” și „S-ar putea să-ți placă și” sunt ascunse + Etichetele „Alții au mai urmărit” și „S-ar putea să-ți placă și” sunt afișate Ascunderea butonului „Afișează mai multe” Butonul este ascuns Butonul este afișat + Ascunde raftul de bilete + Raftul de bilete este ascuns + Raftul de bilete este afișat Ascunde reacţiile cronologie Reacţiile cronologice sunt ascunse Reacţiile cronologice sunt evidenţiate @@ -231,6 +241,9 @@ Nu veți fi notificat de niciun eveniment neașteptat." Ascundeți \"Rezumat video generat de AI\" Secțiunea de rezumat video este ascunsă Secțiunea de rezumat video este afișată + Ascunde Întreabă + Secțiunea Întreabă este ascunsă + Secțiunea Întreabă este afișată Ascunde Atributele Secțiunile Locuri recomandate, Jocuri, Muzică și Persoane menționate sunt ascunse Secțiunile Locuri recomandate, Jocuri, Muzică și Persoane menționate sunt afișate @@ -794,6 +807,11 @@ Redarea automată poate fi modificată în setările YouTube: Setări → Redare → Redare automată videoclipul următor" Videoclipul sugerat de pe ecranul final este afișat + + Ascunde suprapunerea video asociată în ecran complet + Suprapunerea video asociată este ascunsă + Suprapunerea video asociată este afișată + Ascunde marcajul temporal video Marcajul de timp este ascuns @@ -831,10 +849,10 @@ Setări → Redare → Redare automată videoclipul următor" Reîncarcă videoclipul pentru a vota folosind Returnare YouTube Dislike Ascuns de proprietar - Dislike-urile sunt afișate - Dislike-urile nu sunt afișate + Dislike-urile sunt afișate + Dislike-urile nu sunt afișate Arată displace pe scurtmetraje - "Aprecierile negative pe Shorts sunt afișate + "Aprecierile negative pe Shorts sunt afișate Limitare: Este posibil ca aprecierile negative să nu apară în modul incognito" Aprecierile negative pe Shorts nu sunt afișate @@ -851,7 +869,6 @@ Limitare: Este posibil ca aprecierile negative să nu apară în modul incognito Arată un toast dacă API-ul nu este disponibil Toast este afișat dacă Returnarea YouTube Dislike nu este disponibilă Toast nu este afișat dacă Returnarea YouTube Dislike nu este disponibilă - Despre Datele sunt furnizate de API-ul Returnare YouTube Dislike. Atinge aici pentru a afla mai multe ReturnYouTubeDislike statistici API ale acestui dispozitiv @@ -1057,7 +1074,7 @@ Ești gata să trimiți?" Editați sincronizarea segmentului manual Doriți să editați sincronizarea pentru începutul sau sfârșitul segmentului? Oră nevalidă dată - Statistici + Statistici Statisticile nu sunt disponibile temporar (API este defect) Se încarcă... @@ -1086,8 +1103,8 @@ Ești gata să trimiți?" Cod culoare nevalid Resetare culoare Resetează - Despre - Datele sunt furnizate de API-ul SponsorBlock. Apasă aici pentru a afla mai multe și a vedea descărcările pentru alte platforme + Despre + Datele sunt furnizate de API-ul SponsorBlock. Apasă aici pentru a afla mai multe și a vedea descărcările pentru alte platforme Formatul aspectului formularului diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index 804cf9dbb..f1e2135e7 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Настройки ReVanced восстановлены до значений по умолчанию Импортировано %d настроек Ошибка импорта: %s + Поиск настроек + По запросу \"%s\" ничего не найдено + Попробуйте другое ключевое слово + Удалить из истории поиска? Показать иконки в настройках ReVanced Иконки в настройках ReVanced показаны Иконки в настройках ReVanced скрыты @@ -93,6 +97,9 @@ Second \"item\" text" Включить старое меню настроек Старое меню настроек включено Новое меню настроек включено + Показать историю поиска настроек + История поиска настроек показана + История поиска настроек скрыта Отключить воспроизведение Shorts в фоновом режиме @@ -153,15 +160,18 @@ Second \"item\" text" Скрыть кнопку \"Прислать уведомление\" Кнопка \"Прислать уведомление\" под плеером скрыта Кнопка \"Прислать уведомление\" под плеером показана - - Скрыть рекомендации \"Зрители также посмотрели\" - Рекомендации \"Зрители также посмотрели\" в ленте скрыты - Рекомендации \"Зрители также посмотрели\" в ленте показаны + + Скрыть метки видеорекомендаций + Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска скрыты + Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска показаны Скрыть кнопку \"Показать еще\" Кнопка \"Показать еще\" в результатах поиска скрыта Кнопка \"Показать еще\" в результатах поиска показана + Скрыть секцию билетов + Секция билетов под плеером скрыта + Секция билетов под плеером показана Скрыть временные реакции Временные реакции в комментариях и живом чате скрыты Временные реакции в комментариях и живом чате показаны @@ -231,6 +241,9 @@ Second \"item\" text" Скрыть секцию AI-резюме видео Секция AI-резюме видео в описании видео скрыта Секция AI-резюме видео в описании видео показана + Скрыть раздел \"Спросить\" + Раздел \"Спросить\" в описании видео скрыт + Раздел \"Спросить\" в описании видео показан Скрыть раздел атрибутов Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" скрыты Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" показаны @@ -794,6 +807,11 @@ Second \"item\" text" Настройки → Фоновое воспроизведение → Следующее видео" Предлагаемые видео в конце просмотра показаны + + Скрыть похожие видео в полноэкранном режиме + Похожие видео в полноэкранном режиме скрыты + Похожие видео в полноэкранном режиме показаны + Скрыть метку времени видео Метка времени видео над полосой прогресса скрыта @@ -831,10 +849,10 @@ Second \"item\" text" Обновите видео для голосования с помощью Return YouTube Dislike Скрыто владельцем - Дизлайки показаны - Дизлайки скрыты + Дизлайки показаны + Дизлайки скрыты Показать дизлайки в Shorts - "Дизлайки в Shorts показаны + "Дизлайки в Shorts показаны Ограничение: дизлайки могут не показываться в режиме инкогнито" Дизлайки в Shorts скрыты @@ -851,7 +869,6 @@ Second \"item\" text" Уведомление при недоступности API Всплывающее уведомление при недоступности Return YouTube Dislike показано Всплывающее уведомление при недоступности Return YouTube Dislike скрыто - Об интеграции Данные предоставлены Return YouTube Dislike API. Нажмите для дополнительной информации Статистика Return YouTube Dislike API этого устройства @@ -1058,7 +1075,7 @@ Second \"item\" text" Изменить время сегмента вручную Вы хотите изменить время начала или окончания сегмента? Указано неверное время - Статистика + Статистика Статистика временно недоступна (API отключен) Загрузка... @@ -1087,8 +1104,8 @@ Second \"item\" text" Неверный код цвета Сбросить цвет Сбросить - Об интеграции - Данные предоставлены SponsorBlock API. Нажмите для дополнительной информации и просмотра загрузок для других платформ + Об интеграции + Данные предоставлены SponsorBlock API. Нажмите для дополнительной информации и просмотра загрузок для других платформ Макет интерфейса diff --git a/patches/src/main/resources/addresources/values-si-rLK/strings.xml b/patches/src/main/resources/addresources/values-si-rLK/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-si-rLK/strings.xml +++ b/patches/src/main/resources/addresources/values-si-rLK/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index 4b43d1235..3ce11cac4 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Nastavenia ReVanced sa obnovia na predvolené Počet importovaných nastavení: %d Import zlyhal: %s + Hľadať nastavenia + Pre výraz \",%s\" sa nenašli žiadne výsledky + Skúste iné kľúčové slovo + Odstrániť z histórie vyhľadávania? Zobraziť ikony nastavení ReVanced Ikony nastavení sa zobrazujú Ikony nastavení sa nezobrazujú @@ -91,6 +95,9 @@ Vypnutie optimalizácie batérie pre MicroG nebude mať negatívny vplyv na spot Obnoviť staré ponuky nastavení Staré ponuky nastavení sa zobrazujú Staré ponuky nastavení sa nezobrazujú + Zobraziť históriu vyhľadávania v nastaveniach + História vyhľadávania v nastaveniach je zobrazená + História vyhľadávania nastavení sa nezobrazuje Zakázať prehrávanie Shorts na pozadí @@ -151,15 +158,18 @@ Nebudete informovaní o žiadnych nepredvídaných udalostiach." Skryť tlačidlo \"Upozorniť ma\" Tlačidlo je skryté Tlačidlo je zobrazené - - Skryť označenie „Ľudia tiež sledovali“ - Označenie je skryté - Označenie je zobrazené + + Skryť štítky s odporúčaním videa + Štítky „Používatelia si tiež pozreli“ a „Mohlo by sa vám páčiť“ sú skryté + Štítky „Používatelia si tiež pozreli“ a „Mohlo by sa vám páčiť“ sú zobrazené Skryť tlačidlo \"Zobraziť viac\" Tlačidlo je skryté Tlačidlo je zobrazené + Skryť panel lístkov + Panel lístkov je skrytý + Je zobrazený panel lístkov Skryť načasované reakcie Časované reakcie sú skryté Sú zobrazené načasované reakcie @@ -229,6 +239,9 @@ Nebudete informovaní o žiadnych nepredvídaných udalostiach." Skryť „Súhrn videa generovaný AI“ Sekcia so súhrnom videa je skrytá Sekcia so súhrnom videa je zobrazená + Skryť \"Opýtať sa\" + Sekcia \"Opýtať sa\" je skrytá + Sekcia \"Opýtať sa\" je zobrazená Skryť atribúty Sekcie Odporúčané miesta, Hry, Hudba a Spomenutí ľudia sú skryté Sekcie Odporúčané miesta, Hry, Hudba a Spomenutí ľudia sú zobrazené @@ -787,6 +800,11 @@ Automatické prehrávanie je možné zmeniť v nastaveniach YouTube: Nastavenia → Prehrávanie → Automatické prehrávanie ďalšieho videa" Navrhované video na konci obrazovky sa zobrazuje + + Skryť prekrytie súvisiaceho videa v režime celej obrazovky + Prekrytie súvisiaceho videa je skryté + Prekrytie súvisiaceho videa sa zobrazuje + Skryť časovú pečiatku videa Časová pečiatka je skrytá @@ -824,10 +842,10 @@ Nastavenia → Prehrávanie → Automatické prehrávanie ďalšieho videa"Znova načítajte video a hlasujte pomocou funkcie Vrátiť Nepáči sa mi na YouTube Skryté vlastníkom - Nepáči sa mi - Nepáči sa mi nie sú zobrazené + Nepáči sa mi + Nepáči sa mi nie sú zobrazené Zobrazovať, že sa mi nepáči v Shorts videách - "Hodnotenia Nepáči sa mi to na Shorts sú zobrazené + "Hodnotenia Nepáči sa mi to na Shorts sú zobrazené Obmedzenie: Hodnotenia Nepáči sa mi to sa nemusia zobraziť v anonymnom režime" Hodnotenia Nepáči sa mi to na Shorts sa nezobrazujú @@ -844,7 +862,6 @@ Obmedzenie: Hodnotenia Nepáči sa mi to sa nemusia zobraziť v anonymnom režim Ukážte prípitok, ak API nie je k dispozícii Ak nie je k dispozícii možnosť Vrátiť Nepáči sa mi na YouTube, zobrazí sa toast Toast sa nezobrazuje, ak nie je k dispozícii možnosť Vrátiť Nepáči sa mi na YouTube - Informácie Údaje poskytuje rozhranie Return YouTube Dislike API. Klepnutím sem sa dozviete viac Štatistiky rozhrania ReturnYouTubeDislike API tohto zariadenia @@ -1048,7 +1065,7 @@ Pripravené na odoslanie?" Ručne upravte časovanie segmentu Chcete upraviť časovanie pre začiatok alebo koniec segmentu? Zadaný neplatný čas - Štatistiky + Štatistiky Štatistiky sú dočasne nedostupné (API je mimo prevádzky) Načítava sa... @@ -1077,8 +1094,8 @@ Pripravené na odoslanie?" Neplatný kód farby Obnoviť farbu Resetovať - Informácie - Údaje poskytuje SponsorBlock API. Klepnutím sem sa dozviete viac a zobrazíte súbory na stiahnutie pre iné platformy + Informácie + Údaje poskytuje SponsorBlock API. Klepnutím sem sa dozviete viac a zobrazíte súbory na stiahnutie pre iné platformy Formát rozloženia diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index d61f1c318..8a665c963 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced nastavitve ponastavljene na privzeto Uvoženih %d nastavitev Uvoz ni uspel: %s + Iskanje nastavitev + Za \"%s\" ni bilo najdenih rezultatov + Poskusite z drugo ključno besedo + Odstrani iz zgodovine iskanja? Pokaži ikone nastavitev ReVanced Ikone nastavitev so prikazane Ikone nastavitev niso prikazane @@ -93,6 +97,9 @@ Tapnite gumb za nadaljevanje in dovolite spremembe optimizacij." Obnovi stare menije nastavitev Prikazani so stari meniji nastavitev Stari meniji nastavitev niso prikazani + Pokaži zgodovino iskanja nastavitev + Zgodovina iskanja nastavitev je prikazana + Zgodovina iskanja nastavitev ni prikazana Onemogoči predvajanje Shorts v ozadju @@ -153,15 +160,18 @@ Ne boste obveščeni o nobenih nepričakovanih dogodkih." Skrij gumb \"Obvesti me\" Gumb je skrit Gumb je prikazan - - Skrij oznako »Ljudje so si ogledali tudi« - Oznaka je skrita - Oznaka je prikazana + + Skrij oznake priporočil videoposnetkov + Oznaki »Ljudje so si ogledali tudi« in »Morda vam bo všeč tudi« sta skriti + Oznaki »Ljudje so si ogledali tudi« in »Morda vam bo všeč tudi« sta prikazani Skrij gumb \"Prikaži več\" Gumb je skrit Gumb je prikazan + Skrij polico za vstopnice + Polica za vstopnice je skrita + Polica za vstopnice je prikazana Skrij časovno usklajene reakcije Časovno usklajene reakcije so skrite Časovno usklajene reakcije so prikazane @@ -231,6 +241,9 @@ Ne boste obveščeni o nobenih nepričakovanih dogodkih." Skrij »Povzetek videoposnetka, ustvarjenega z umetno inteligenco« Razdelek s povzetkom videoposnetka je skrit Razdelek s povzetkom videoposnetka je prikazan + Skrij Vprašaj + Razdelek »Vprašaj« je skrit + Razdelek »Vprašaj« je prikazan Skrij atribute Razdelki s priporočenimi kraji, igrami, glasbo in omenjenimi osebami so skriti Razdelki s priporočenimi kraji, igrami, glasbo in omenjenimi osebami so prikazani @@ -794,6 +807,11 @@ Samodejno predvajanje lahko spremenite v nastavitvah YouTube: Nastavitve → Predvajanje → Samodejno predvajanje naslednjega videoposnetka" Predlagani videoposnetek na koncu zaslona je prikazan + + Skrij prekrivni element s sorodnim videoposnetkom v celozaslonskem načinu + Prekrivni element s sorodnim videoposnetkom je skrit + Prekrivni element s sorodnim videoposnetkom je prikazan + Skrij časovni žig videoposnetka Časovni žig je skrit @@ -831,10 +849,10 @@ Nastavitve → Predvajanje → Samodejno predvajanje naslednjega videoposnetka"< Znova naloži videoposnetek, da glasuješ z Return YouTube Dislike Skrito s strani lastnika - Všečkov ne so prikazani - Všečkov ne niso prikazani + Všečkov ne so prikazani + Všečkov ne niso prikazani Pokaži všečkov ne na Shorts - "Število »Ni mi všeč« pri elementih Shorts je prikazano + "Število »Ni mi všeč« pri elementih Shorts je prikazano Omejitev: Število »Ni mi všeč« se morda ne bo prikazalo v načinu brez beleženja zgodovine" Število »Ni mi všeč« pri elementih Shorts ni prikazano @@ -851,7 +869,6 @@ Omejitev: Število »Ni mi všeč« se morda ne bo prikazalo v načinu brez bele Pokaži obvestilo, če API ni na voljo Obvestilo se prikaže, če Return YouTube Dislike ni na voljo Obvestilo se ne prikaže, če Return YouTube Dislike ni na voljo - O programu Podatki so zagotovljeni s strani API-ja Return YouTube Dislike. Tapnite tukaj, če želite izvedeti več Statistika API-ja ReturnYouTubeDislike za to napravo @@ -1057,7 +1074,7 @@ Ali ste pripravljeni na oddajo?" Ročno uredi časovni zamik segmenta Želiš urediti časovni zamik za začetek ali konec segmenta? Vnesen je neveljaven čas - Statistika + Statistika Statistika začasno ni na voljo (API ne deluje) Nalaganje... @@ -1086,8 +1103,8 @@ Ali ste pripravljeni na oddajo?" Neveljavna koda barve Ponastavi barvo Ponastavi - O programu - Podatki so zagotovljeni s strani SponsorBlock API. Tapnite tukaj, da izveste več in si ogledate prenose za druge platforme + O programu + Podatki so zagotovljeni s strani SponsorBlock API. Tapnite tukaj, da izveste več in si ogledate prenose za druge platforme Postavitev obrazca diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index 9dc085645..00acf2823 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Cilësimet e ReVanced u rivendosën në cilësimet e parazgjedhura Importuan %d cilësime Importimi dështoi: %s + Kërko cilësimet + Nuk u gjet asnjë rezultat për \'%s\' + Provo një fjalë kyçe tjetër + Hiq nga historiku i kërkimit? Shfaq ikonat e cilësimeve të ReVanced Ikonat e cilësimeve shfaqen Ikonat e cilësimeve nuk shfaqen @@ -93,6 +97,9 @@ Prekni butonin vazhdo dhe lejoni ndryshimet e optimizimit." Rikthe menutë e vjetër të konfigurimeve Menutë e vjetër të cilësimeve shfaqen Menutë e vjetër të cilësimeve nuk shfaqen + Shfaq historikun e kërkimeve të cilësimeve + Historiku i kërkimeve të cilësimeve është shfaqur + Historia e kërkimit të cilësimeve nuk shfaqet Çaktivizo luajtjen në sfond të Shorts @@ -153,15 +160,18 @@ Ju nuk do të njoftoheni për ndonjë ngjarje të papritur." Fshih butonin \"Njoftomë\" Butoni është i fshehur Butoni është i dukshëm - - Fshih etiketën \'Njerëzit shikuan gjithashtu\' - Etiketa është e fshehur - Etiketa është e shfaqur + + Fshih etiketat e rekomandimit të videos + Etiketat \"Edhe të tjerë e shikuan\" dhe \"Mund të të pëlqejë gjithashtu\" janë fshehur + Etiketat \"Edhe të tjerë e shikuan\" dhe \"Mund të të pëlqejë gjithashtu\" janë shfaqur Fshih butonin \"Trego më shumë\" Butoni është i fshehur Butoni është i dukshëm + Fshih raftin e biletave + Rafti i biletave është i fshehur + Rafti i biletave është i dukshëm Fshih reagimet e kohës Reagimet e kohës janë të fshehura Reagimet e kohës janë të dukshme @@ -231,6 +241,9 @@ Ju nuk do të njoftoheni për ndonjë ngjarje të papritur." Fshih \"Përmbledhjen e videos të krijuar nga AI\" Seksioni i përmbledhjes së videos është i fshehur Seksioni i përmbledhjes së videos është i dukshme + Fshih Pyet + Seksioni Pyet është i fshehur + Seksioni Pyet është i dukshëm Fshih Atributet Vendndodhjet e veçuara, Lojërat, Muzika dhe seksionet e personave të përmendur janë të fshehura Vendndodhjet e veçuara, Lojërat, Muzika dhe seksionet e personave të përmendur janë të shfaqura @@ -794,6 +807,11 @@ Luajtja automatike mund të ndryshohet në cilësimet e YouTube: Cilësimet → Luajtja → Luaj automatikisht videon tjetër" Videoja e sugjeruar në ekranin fundor shfaqet + + Fshih mbivendosjen e videos së lidhur në ekran të plotë + Mbivendosja e videos së lidhur është fshehur + Mbivendosja e videos së lidhur shfaqet + Fsheh vulën e kohës së videos Vula e kohës është e fshehur @@ -831,10 +849,10 @@ Cilësimet → Luajtja → Luaj automatikisht videon tjetër" Rikarkoni videon për të votuar duke përdorur Return YouTube Dislike Fshehur nga pronari - \"Nuk më pëlqen\" janë të dukshme - \"Nuk më pëlqen\" nuk janë të dukshme + \"Nuk më pëlqen\" janë të dukshme + \"Nuk më pëlqen\" nuk janë të dukshme Shfaq \"Nuk më pëlqen\" në Shorts - "Mospëlqimet në Shorts janë të shfaqura + "Mospëlqimet në Shorts janë të shfaqura Kufizimi: Mospëlqimet mund të mos shfaqen në modalitetin incognito" Mospëlqimet në Shorts nuk janë të shfaqura @@ -851,7 +869,6 @@ Kufizimi: Mospëlqimet mund të mos shfaqen në modalitetin incognito" Shfaq një toast nëse API nuk është në dispozicion Toast shfaqet nëse Return YouTube Dislike nuk është në dispozicion Toast nuk shfaqet nëse Return YouTube Dislike nuk është në dispozicion - Rreth Të dhënat ofrohen nga Return YouTube Dislike API. Prekni këtu për të mësuar më shumë Statistikat e ReturnYouTubeDislike API të këtij pajisje @@ -1056,7 +1073,7 @@ Gati per te dhene?" Redakto kohën e segmentit manualisht Dëshironi të redaktoni kohën për fillimin ose fundin e segmentit? Kohë e pavlefshme e dhënë - Statistikat + Statistikat Statistikat aktualisht nuk janë të disponueshme (API nuk funksionon) Po ngarkohet... @@ -1085,8 +1102,8 @@ Gati per te dhene?" Kod ngjyre i pavlefshëm Rikthe ngjyrën Rikthe - Rreth - Të dhënat janë siguruar nga API e SponsorBlock. Prekni këtu për të mësuar më shumë dhe për të parë shkarkimet për platformat e tjera + Rreth + Të dhënat janë siguruar nga API e SponsorBlock. Prekni këtu për të mësuar më shumë dhe për të parë shkarkimet për platformat e tjera Faktor i formularit të shtrirjes diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index 002c37efd..c1ecfd1cb 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Podešavanja ReVanceda su vraćena na podrazumevane vrednosti Uvezeno %d podešavanja Neuspešan uvoz: %s + Pretraži podešavanja + Nisu pronađeni rezultati za „%s” + Pokušajte sa drugom ključnom reči + Ukloniti iz istorije pretrage? Prikaži ikonice podešavanja ReVanceda Ikonice podešavanja su prikazane Ikonice podešavanja nisu prikazane @@ -93,6 +97,9 @@ Dodirnite dugme „Nastavi” i dozvolite promene optimizacije." Vrati stare menije podešavanja Prikazuju se stari meniji podešavanja Ne prikazuju se stari meniji podešavanja + Prikaži istoriju pretrage podešavanja + Istorija pretrage podešavanja je prikazana + Istorija pretrage podešavanja nije prikazana Onemogući puštanje Shorts videa u pozadini @@ -153,15 +160,18 @@ Nećete biti obavešteni ni o kakvim neočekivanim događajima." Sakrij dugme „Obavesti me” Dugme „Obavesti me” je skriveno Dugme „Obavesti me” je prikazano - - Sakrij oznaku „Drugi su takođe gledali ovaj video” - Oznaka je skrivena - Oznaka je prikazana + + Sakrij oznake preporuka videa + Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se dopasti i ovo” su skrivene + Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se dopasti i ovo” su prikazane Sakrij dugme „Prikaži još” Dugme „Prikaži još” je skriveno Dugme „Prikaži još” je prikazano + Sakrij policu sa kartama + Polica sa kartama je skrivena + Polica sa kartama je prikazana Sakrij vremenske reakcije Vremenske reakcije su skrivene Vremenske reakcije su prikazane @@ -231,6 +241,9 @@ Nećete biti obavešteni ni o kakvim neočekivanim događajima." Sakrij „Rezime videa koji je generisala veštačka inteligencija” Odeljak „Rezime videa” je skriven Odeljak „Rezime videa” je prikazan + Sakrij odeljak „Pitaj” + Odeljak „Pitaj” je skriven + Odeljak „Pitaj” je prikazan Sakrij atribute Odeljci „Istaknuta mesta”, „Igre”, „Muzika” i „Pomenuti ljudi” su skriveni Odeljci „Istaknuta mesta”, „Igre”, „Muzika” i „Pomenuti ljudi” su prikazani @@ -794,6 +807,11 @@ Autoplej se može promeniti u podešavanjima YouTubea: Podešavanja → Reprodukcija → Automatski pusti sledeći video" Predloženi video na završnom ekranu je prikazan + + Sakrij srodne videe u režimu celog ekrana + Srodni videi u režimu celog ekrana su skriveni + Srodni videi u režimu celog ekrana su prikazani + Sakrij vremensku oznaku videa Vremenska oznaka videa je skrivena @@ -831,10 +849,10 @@ Podešavanja → Reprodukcija → Automatski pusti sledeći video" Osvežite video da biste glasali pomoću ReturnYouTubeDislike Skriveno od strane vlasnika - Nesviđanja su prikazana - Nesviđanja nisu prikazana + Nesviđanja su prikazana + Nesviđanja nisu prikazana Prikaži nesviđanja na Shorts videima - "Nesviđanja na Shorts videima su prikazana + "Nesviđanja na Shorts videima su prikazana Ograničenje: Nesviđanja se možda neće pojaviti u režimu bez arhiviranja" Nesviđanja na Shorts videima nisu prikazana @@ -851,7 +869,6 @@ Ograničenje: Nesviđanja se možda neće pojaviti u režimu bez arhiviranja"Prikaži iskačuće obaveštenje ako API nije dostupan Iskačuće obaveštenje je prikazano, ako Return YouTube Dislike nije dostupan Iskačuće obaveštenje nije prikazano, ako Return YouTube Dislike nije dostupan - O programu Podatke obezbeđuje Return YouTube Dislike API. Dodirnite ovde da saznate više Statistike ReturnYouTubeDislike API-ja za ovaj uređaj @@ -1057,7 +1074,7 @@ Spreman za podnošenje?" Ručno izmenite vreme segmenta Želite li da izmenite vreme početka ili kraja segmenta? Dato je nevažeće vreme - Statistika + Statistika Statistike privremeno nisu dostupne (API ne radi) Učitavanje… @@ -1086,8 +1103,8 @@ Spreman za podnošenje?" Nevažeći kôd boje Resetuj boju Resetuj - O programu - Podatke obezbeđuje SponsorBlock API. Dodirnite ovde da saznate više i vidite preuzimanja za druge platforme + O programu + Podatke obezbeđuje SponsorBlock API. Dodirnite ovde da saznate više i vidite preuzimanja za druge platforme Faktor forme izgleda diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 37a41fa5a..8ca4c7ebf 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Подешавања ReVanced-а су враћена на подразумеване вредности Увезено %d подешавања Неуспешан увоз: %s + Претражите подешавања + Нису пронађени резултати за „%s” + Покушајте са другом кључном речи + Уклонити из историје претраге? Прикажи иконице подешавања ReVanced-а Иконице подешавања су приказане Иконице подешавања нису приказане @@ -93,6 +97,9 @@ Second \"item\" text" Врати старе меније подешавања Приказују се стари менији подешавања Не приказују се стари менији подешавања + Прикажи историју претраге подешавања + Историја претраге подешавања је приказана + Историја претраге подешавања није приказана Онемогући пуштање Shorts видеа у позадини @@ -153,15 +160,18 @@ Second \"item\" text" Сакриј дугме „Обавести ме” Дугме „Обавести ме” је скривено Дугме „Обавести ме” је приказано - - Сакриј ознаку „Други су такође гледали овај видео” - Ознака је скривена - Ознака је приказана + + Сакриј ознаке препорука видеа + Ознаке „Други су такође гледали овај видео” и „Можда ће вам се допасти и ово” су скривене + Ознаке „Други су такође гледали овај видео” и „Можда ће вам се допасти и ово” су приказане Сакриј дугме „Прикажи још” Дугме „Прикажи још” је скривено Дугме „Прикажи још” је приказано + Сакриј полицу са картама + Полица са картама је скривена + Полица са картама је приказана Сакриј временске реакције Временске реакције су скривене Временске реакције су приказане @@ -231,6 +241,9 @@ Second \"item\" text" Сакриј „Резиме видеа који је генерисала вештачка интелигенција” Одељак „Резиме видеа” је скривен Одељак „Резиме видеа” је приказан + Сакриј одељак „Питај” + Одељак „Питај” је скривен + Одељак „Питај” је приказан Сакриј атрибуте Одељци „Истакнута места”, „Игре”, „Музика” и „Поменути људи” су скривени Одељци „Истакнута места”, „Игре”, „Музика” и „Поменути људи” су приказани @@ -794,6 +807,11 @@ Second \"item\" text" Подешавања → Репродукција → Аутоматски пусти следећи видео" Предложени видео на завршном екрану је приказан + + Сакриј сродне видее у режиму целог екрана + Сродни видеи у режиму целог екрана су скривени + Сродни видеи у режиму целог екрана су приказани + Сакриј временску ознаку видеа Временска ознака видеа је скривена @@ -831,10 +849,10 @@ Second \"item\" text" Освежите видео да бисте гласали помоћу ReturnYouTubeDislike Скривено од стране власника - Несвиђања су приказана - Несвиђања нису приказана + Несвиђања су приказана + Несвиђања нису приказана Прикажи несвиђања на Shorts видеима - "Несвиђања на Shorts видеима су приказана + "Несвиђања на Shorts видеима су приказана Ограничење: Несвиђања се можда неће појавити у режиму без архивирања" Несвиђања на Shorts видеима нису приказана @@ -851,7 +869,6 @@ Second \"item\" text" Прикажи искачуће обавештење ако API није доступан Искачуће обавештење је приказано, ако Return YouTube Dislike није доступан Искачуће обавештење није приказано, ако Return YouTube Dislike није доступан - О програму Податке обезбеђује Return YouTube Dislike API. Додирните овде да сазнате више Статистике ReturnYouTubeDislike API-ја за овај уређај @@ -1057,7 +1074,7 @@ Second \"item\" text" Ручно измените време сегмента Желите ли да измените време почетка или краја сегмента? Дато је неважеће време - Статистика + Статистика Статистике привремено нису доступне (API не ради) Учитавање… @@ -1086,8 +1103,8 @@ Second \"item\" text" Неважећи кôд боје Ресетуј боју Ресетуј - О програму - Податке обезбеђује SponsorBlock API. Додирните овде да сазнате више и видите преузимања за друге платформе + О програму + Податке обезбеђује SponsorBlock API. Додирните овде да сазнате више и видите преузимања за друге платформе Фактор форме изгледа diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 66d125d5a..0eca7a7f7 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced-inställningarna återställda till standard Importerade %d inställningar Importen misslyckades: %s + Sökinställningar + Inga resultat hittades för \"%s\" + Försök med ett annat sökord + Ta bort från sökhistoriken? Visa ikoner för ReVanced-inställningar Inställningsikoner visas Ikoner för inställningar visas inte @@ -93,6 +97,9 @@ Tryck på Fortsätt-knappen och tillåt optimeringsändringar." Återställ gamla inställningsmenyer Gamla inställningsmenyer visas Gamla inställningsmenyer visas inte + Visa sökhistorik för inställningar + Sökhistorik för inställningar visas + Sökhistoriken för inställningar visas inte Inaktivera Shorts bakgrundsuppspelning @@ -153,15 +160,18 @@ Du kommer inte att bli meddelad om oväntade händelser." Dölj knappen \'Meddela mig\' Knappen är dold Knappen är synlig - - Dölj etiketten \"Folk tittade även på\" - Etiketten är dold - Etiketten visas + + Dölj etiketter för videorekommendationer + Etiketterna \"Folk tittade även på\" och \"Du kanske också gillar\" är dolda + Etiketterna \"Folk tittade även på\" och \"Du kanske också gillar\" visas Dölj knappen \"Visa mer\" Knappen är dold Knappen är synlig + Dölj biljettpanelen + Biljettpanelen är dold + Biljettpanelen visas Dölj tidsinställda reaktioner Tidsinställda reaktioner är dolda Tidsinställda reaktioner är synliga @@ -231,6 +241,9 @@ Du kommer inte att bli meddelad om oväntade händelser." Dölj \"AI-genererad videosammanfattning\" Videoöversiktssektionen är dold Videoöversiktssektionen visas + Dölj Fråga + Fråga-avsnittet är dolt + Fråga-avsnittet visas Dölj attribut Avsnitten Utvalda platser, Spel, Musik och Personer som nämns är dolda Avsnitten Utvalda platser, Spel, Musik och Personer som nämns visas @@ -794,6 +807,11 @@ Automatisk uppspelning kan ändras i YouTube-inställningarna: Inställningar → Uppspelning → Spela upp nästa video automatiskt" Föreslagen video på slutskärmen visas + + Dölj relaterad video-overlay i helskärm + Relaterad video-overlay är dold + Relaterad video-overlay visas + Dölj videotidsstämpel Tidsstämpel är dold @@ -831,10 +849,10 @@ Inställningar → Uppspelning → Spela upp nästa video automatiskt" Ladda om video för att rösta med Return YouTube Dislike Dold av ägaren - Ogilla är synliga - Ogilla visas inte + Ogilla är synliga + Ogilla visas inte Visa ogillande på Shorts - "Ogillanden visas på Shorts + "Ogillanden visas på Shorts Begränsning: Ogillanden kanske inte visas i inkognitoläge" Ogillanden på Shorts visas inte @@ -851,7 +869,6 @@ Begränsning: Ogillanden kanske inte visas i inkognitoläge" Visa ett meddelande om API inte är tillgängligt Visa ett meddelande om Return YouTube Dislike inte är tillgängligt Visa inget meddelande om Return YouTube Dislike inte är tillgängligt - Om Data tillhandahålls av Return YouTube Tycker inte om API. Tryck här för att läsa mer ReturnYouTubeDislike API-statistik för denna enhet @@ -1057,7 +1074,7 @@ Redo att skicka in?" Redigera tid för segment manuellt Vill du ändra tidpunkten för starten eller slutet av segmentet? Ogiltig tid angiven - Statistik + Statistik Statistik är tillfälligt inte tillgänglig (API är nere) Laddar... @@ -1086,8 +1103,8 @@ Redo att skicka in?" Ogiltig färgkod Återställ färg Återställ - Om - Data tillhandahålls av SponsorBlock API. Tryck här för att läsa mer och se nedladdningar för andra plattformar + Om + Data tillhandahålls av SponsorBlock API. Tryck här för att läsa mer och se nedladdningar för andra plattformar Formulärformfaktor diff --git a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml +++ b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-te-rIN/strings.xml b/patches/src/main/resources/addresources/values-te-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-te-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-te-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index 6eef0c014..4c8d7fb4e 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" การตั้งค่า ReVanced ถูกตั้งค่าเป็นค่าเริ่มต้น นำเข้าการตั้งค่า %d การนำเข้าล้มเหลว: %s + ค้นหาในการตั้งค่า + ไม่พบผลลัพธ์สำหรับ \",%s\" + ลองใช้คำหลักอื่น + นำออกจากประวัติการค้นหาใช่ไหม แสดงไอคอนการตั้งค่า ReVanced ไอคอนการตั้งค่าจะปรากฏขึ้น ไม่แสดงไอคอนการตั้งค่า @@ -93,6 +97,9 @@ Second \"item\" text" กู้คืนเมนูการตั้งค่าแบบเก่า แสดงเมนูการตั้งค่าแบบเก่า ไม่แสดงเมนูการตั้งค่าแบบเก่า + แสดงประวัติการค้นหาในการตั้งค่า + ประวัติการค้นหาในการตั้งค่าจะปรากฏ + ไม่แสดงประวัติการค้นหาการตั้งค่า ปิดการเล่นพื้นหลัง Shorts @@ -153,15 +160,18 @@ Second \"item\" text" ซ่อนปุ่ม \"แจ้งเตือนฉัน\" ปุ่มถูกซ่อน ปุ่มถูกแสดง - - ซ่อนป้ายกำกับ \'ผู้ที่รับชมคนอื่น ๆ\' - ป้ายกำกับถูกซ่อน - ป้ายกำกับแสดงอยู่ + + ซ่อนป้ายกำกับแนะนำวิดีโอ + ป้ายกำกับ \"คนอื่นๆ ก็ดู\" และ \"คุณอาจจะชอบ\" ถูกซ่อนอยู่ + ป้ายกำกับ \"คนอื่นๆ ก็ดู\" และ \"คุณอาจจะชอบ\" แสดงอยู่ ซ่อนปุ่ม \"แสดงเพิ่มเติม\" ปุ่มถูกซ่อน ปุ่มถูกแสดง + ซ่อนชั้นวางตั๋ว + ชั้นวางตั๋วถูกซ่อนอยู่ + ชั้นวางตั๋วแสดงอยู่ ซ่อนปฏิกิริยาตามเวลา ปฏิกิริยาตามเวลาถูกซ่อน ปฏิกิริยาตามเวลาถูกแสดง @@ -231,6 +241,9 @@ Second \"item\" text" ซ่อน \",สรุปวิดีโอที่สร้างโดย AI\" ส่วนสรุปวิดีโอถูกซ่อน ส่วนสรุปวิดีโอปรากฏ + ซ่อน Ask + ส่วน Ask ถูกซ่อนไว้ + ส่วน Ask ถูกแสดง ซ่อนแอตทริบิวต์ ส่วนสถานที่แนะนำ, เกม, เพลง และบุคคลที่กล่าวถึงถูกซ่อน ส่วนสถานที่แนะนำ, เกม, เพลง และบุคคลที่กล่าวถึงแสดงอยู่ @@ -792,6 +805,11 @@ Second \"item\" text" การตั้งค่า → การเล่น → เล่นวิดีโอถัดไปอัตโนมัติ" วิดีโอแนะนำในหน้าจอสิ้นสุดจะปรากฏ + + ซ่อนภาพซ้อนวิดีโอที่เกี่ยวข้องในแบบเต็มหน้าจอ + ภาพซ้อนวิดีโอที่เกี่ยวข้องถูกซ่อนอยู่ + วิดีโอที่เกี่ยวข้องแสดงอยู่ + ซ่อนเวลาของวิดีโอ เวลาถูกซ่อนอยู่ @@ -829,10 +847,10 @@ Second \"item\" text" รีโหลดวิดีโอเพื่อลงคะแนนโดยใช้ Return YouTube Dislike ซ่อนโดยเจ้าของ - แสดง \"ไม่ชอบ\" - ไม่แสดง \"ไม่ชอบ\" + แสดง \"ไม่ชอบ\" + ไม่แสดง \"ไม่ชอบ\" แสดง \"ไม่ชอบ\" ใน Shorts - "การไม่ถูกใจใน Shorts แสดงอยู่ + "การไม่ถูกใจใน Shorts แสดงอยู่ ข้อจำกัด: การไม่ถูกใจอาจไม่ปรากฏในโหมดไม่ระบุตัวตน" การไม่ถูกใจใน Shorts ไม่ได้แสดงอยู่ @@ -849,7 +867,6 @@ Second \"item\" text" แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน ข้อความแจ้งเตือนแสดงขึ้น หาก Return YouTube Dislike ไม่พร้อมใช้งาน Toast ไม่ปรากฏขึ้นหาก ไม่สามารถใช้งาน Return YouTube Dislike - เกี่ยวกับ ข้อมูลนี้ให้มาโดย Return YouTube Dislike API。 แตะที่นี่เพื่อเรียนรู้เพิ่มเติม อุปกรณ์นี้ @@ -1056,7 +1073,7 @@ User id ของคุณเหมือนกับรหัสผ่าน แก้ไขส่วนแบบมือ คุณต้องการแก้ไขจุดเริ่มต้นและจุดจบของส่วนนี้ไหม? ค่าเวลาที่ให้มาผิดพลาด - สถิติ + สถิติ สถิติไม่พร้อมใช้งานชั่วคราว (API ไม่ทำงาน) กำลังโหลด... @@ -1085,8 +1102,8 @@ User id ของคุณเหมือนกับรหัสผ่าน รหัสสีไม่ถูกต้อง รีเซ็ตสี รีเซ็ต - เกี่ยวกับ - ข้อมูลนี้มาจาก SponsorBlock API แตะที่นี่เพื่อเรียนรู้เพิ่มเติมและดูการดาวน์โหลดสำหรับแพลตฟอร์มอื่น ๆ + เกี่ยวกับ + ข้อมูลนี้มาจาก SponsorBlock API แตะที่นี่เพื่อเรียนรู้เพิ่มเติมและดูการดาวน์โหลดสำหรับแพลตฟอร์มอื่น ๆ รูปแบบเค้าโครง diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index 3c5eda1c9..51c6302b8 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced ayarları varsayılanlara sıfırlandı %d ayar içe aktarıldı İçe aktarılamadı: %s + Ayarları ara + \'%s\' için sonuç bulunamadı + Başka bir anahtar kelime deneyin + Arama geçmişinden kaldırılsın mı? ReVanced ayar simgelerini göster Ayar simgeleri gösteriliyor Ayar simgeleri gösterilmiyor @@ -93,6 +97,9 @@ Devam düğmesine dokunun ve optimizasyon değişikliklerine izin verin."Eski ayarlar menülerini geri getir Eski ayarlar menüleri gösteriliyor Eski ayarlar menüleri gösterilmiyor + Ayarlar arama geçmişini göster + Ayarlar arama geçmişi gösteriliyor + Ayarlar arama geçmişi gösterilmiyor Shorts\'un arka planda oynatılmasını devre dışı bırak @@ -153,15 +160,18 @@ Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz." \'Hatırlatma oluştur\' düğmesini gizle Düğme gizli Düğme görünür - - \'İnsanlar şunu da izledi\' etiketini gizle - Etiket gizli - Etiket görünür + + Video öneri etiketlerini gizle + \"İnsanların İzlediği Diğer Videolar\" ve \"Şunlar da Hoşunuza Gidebilir\" etiketleri gizli + \"İnsanların İzlediği Diğer Videolar\" ve \"Şunlar da Hoşunuza Gidebilir\" etiketleri görünür \'Daha fazla göster\' düğmesini gizle Düğme gizli Düğme görünür + Bilet rafını gizle + Bilet rafı gizli + Bilet rafı görünür Süreli tepkileri gizle Süreli tepkiler gizli Süreli tepkiler görünür @@ -231,6 +241,9 @@ Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz." \'Yapay zeka tarafından oluşturulan video özeti\'ni gizle Video özeti bölümü gizli Video özeti bölümü görünür + \'Sor\'u gizle + Sor kısmı gizli + Sor kısmı görünür Nitelikleri gizle Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler bölümleri gizli Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler bölümleri görünür @@ -794,6 +807,11 @@ Otomatik oynatma YouTube ayarlarından değiştirilebilir: Ayarlar → Oynatma → Sonraki videoyu otomatik oynat" Bitiş ekranı önerilen videosu gösteriliyor + + Tam ekranda alâkalı video panelini gizle + Alâkalı video paneli gizli + Alâkalı video paneli görünür + Video zaman damgasını gizle Video zaman damgası gizli @@ -831,10 +849,10 @@ Ayarlar → Oynatma → Sonraki videoyu otomatik oynat" Return YouTube Dislike ile oylamak için videoyu yenileyin Sahibi tarafından gizlendi - Beğenilmeme sayıları gösteriliyor - Beğenilmeme sayıları gösterilmiyor + Beğenilmeme sayıları gösteriliyor + Beğenilmeme sayıları gösterilmiyor Shorts\'ta beğenilmeme sayılarını göster - "Shorts'ta beğenilmeme sayıları gösteriliyor + "Shorts'ta beğenilmeme sayıları gösteriliyor Kısıtlama: Beğenilmeme sayıları gizli modda görünmeyebilir" Shorts\'ta beğenilmeme sayıları gösterilmiyor @@ -851,7 +869,6 @@ Kısıtlama: Beğenilmeme sayıları gizli modda görünmeyebilir" API kullanılamadığında bir uyarı göster Return YouTube Dislike kullanılamadığında uyarı gösterilir Return YouTube Dislike kullanılamadığında uyarı gösterilmez - Hakkında Veri, Return YouTube Dislike API\'sinden sağlanır. Daha fazla bilgi için dokunun Bu cihazın ReturnYouTubeDislike API istatistikleri @@ -1058,7 +1075,7 @@ Göndermeye hazır mısınız?" Kısmın zamanlamasını el ile ayarlayın Kısmın başlangıcını mı, bitişini mi düzenlemek istiyorsunuz? Geçersiz süre girildi - İstatistikler + İstatistikler İstatistikler geçici olarak kullanılamıyor (API kapalı) Yükleniyor... @@ -1087,8 +1104,8 @@ Göndermeye hazır mısınız?" Geçersiz renk kodu Rengi sıfırla Sıfırla - Hakkında - Veri, SponsorBlock API\'sinden sağlanır. Daha fazla bilgi ve diğer platformlar için indirmeleri görmek için dokunun + Hakkında + Veri, SponsorBlock API\'sinden sağlanır. Daha fazla bilgi ve diğer platformlar için indirmeleri görmek için dokunun Düzen form faktörü diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index bbb2a659f..3c2326c9f 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Налаштування ReVanced скинуто до стандартних Імпортовано %d налаштувань Не вдалося імпортувати: %s + Пошук налаштувань + За запитом \'%s\' нічого не знайдено + Спробуйте інше ключове слово + Видалити з історії пошуку? Показувати іконки в налаштуваннях ReVanced Іконки в налаштуваннях показуються Іконки в налаштуваннях не показуються @@ -93,6 +97,9 @@ Second \"item\" text" Відновити старе меню налаштувань Показується старе меню налаштувань Показується нове меню налаштувань + Показувати історію пошуку налаштувань + Історія пошуку налаштувань показується + Історія пошуку налаштувань не показується Вимкнути фонове відтворення Shorts @@ -137,7 +144,8 @@ Second \"item\" text" • Продовжити перегляд • Переглянути більше каналів • Покупки -• Дивитися знову" +• Дивитися знову +• Найдоречніші" Горизонтальні полиці показуються @@ -153,15 +161,18 @@ Second \"item\" text" Приховати кнопку \"Сповістити\" Кнопку \"Сповістити\" приховано Кнопка \"Сповістити\" показується - - Приховати мітку \"Люди також дивилися\" - Мітку приховано - Мітка показується + + Приховати мітки відеорекомендацій + Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" приховано + Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" показуються Приховати кнопку \"Показати більше\" Кнопку \"Показати більше\" приховано Кнопка \"Показати більше\" показується + Приховати полицю квитків + Полицю квитків приховано + Полиця квитків показується Приховати тимчасові реакції Тимчасові реакції приховано Тимчасові реакції показуються @@ -231,6 +242,9 @@ Second \"item\" text" Приховати секцію \"Короткий переказ від ШІ\" Секцію \"Короткий переказ\" приховано Секція \"Короткий переказ\" показується + Приховати \"Запитати\" + Секцію \"Запитати\" приховано + Секція \"Запитати\" показується Приховати секції атрибутів Секції \"Місця на відео\", \"Ігри\", \"Музика\" та \"Люди, згадані у відео\" приховано Секції \"Місця на відео\", \"Ігри\", \"Музика\" та \"Люди, згадані у відео\" показуються @@ -794,6 +808,11 @@ Second \"item\" text" Налаштування → Відтворення → Автовідтворення наступного відео" Пропоноване відео на кінцевому екрані показується + + Приховати пов’язані відео в повноекранному режимі + Пов’язані відео під час проведення пальцем вверх у повноекранному режимі приховано + Пов’язані відео під час проведення пальцем вверх у повноекранному режимі показуються + Приховати мітку часу відео Мітку часу відео над панеллю прогресу приховано @@ -831,10 +850,10 @@ Second \"item\" text" Оновіть відео, щоб проголосувати за допомогою Return YouTube Dislike Приховано власником - Дизлайки показуються - Дизлайки не показуються + Дизлайки показуються + Дизлайки не показуються Показувати дизлайки в Shorts - "Дизлайки в Shorts показуються + "Дизлайки в Shorts показуються Обмеження: Дизлайки не можуть показуватися в анонімному режимі" Дизлайки в Shorts не показуються @@ -851,7 +870,6 @@ Second \"item\" text" Показувати тост, якщо API не доступний Тост показується, якщо Return YouTube Dislike не доступний Тост не показується, якщо Return YouTube Dislike не доступний - Про інтеграцію Дані надаються через API Return YouTube Dislike. Натисніть тут, щоб дізнатися більше Статистика API ReturnYouTubeDislike цього пристрою @@ -1057,7 +1075,7 @@ Second \"item\" text" Редагувати час сегмента вручну Ви хочете змінити час початку чи кінця сегмента? Вказано неправильний час - Статистика + Статистика Статистика тимчасово недоступна (API не працює) Завантаження... @@ -1086,8 +1104,8 @@ Second \"item\" text" Невірний код кольору Скинути колір Скинути - Про інтеграцію - Дані надаються через API SponsorBlock. Натисніть тут, щоб дізнатися більше та побачити завантаження для інших платформ + Про інтеграцію + Дані надаються через API SponsorBlock. Натисніть тут, щоб дізнатися більше та побачити завантаження для інших платформ Макет інтерфейсу diff --git a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml +++ b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index 549c22816..885b15e6d 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" Cài đặt ReVanced đặt lại thành mặc định Đã nhập cài đặt %d Nhập thất bại: %s + Tìm kiếm + Không tìm thấy kết quả nào cho \'%s\' + Thử một từ khóa khác + Xóa khỏi lịch sử tìm kiếm? Hiện biểu tượng cài đặt ReVanced Các biểu tượng cài đặt được hiển thị Các biểu tượng cài đặt không được hiển thị @@ -93,6 +97,9 @@ Nhấn nút tiếp tục và cho phép thay đổi lựa chọn tối ưu hóa." Khôi phục trình đơn cài đặt cũ Các trình đơn cài đặt cũ được hiển thị Các trình đơn cài đặt cũ không được hiển thị + Hiển thị lịch sử tìm kiếm trong cài đặt + Đã hiển thị lịch sử tìm kiếm trong cài đặt + Không hiển thị lịch sử tìm kiếm trong phần cài đặt Tắt phát nền cho Shorts @@ -153,15 +160,18 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Ẩn nút \'Thông báo cho tôi\' Nút đã bị ẩn Nút được hiển thị - - Ẩn nhãn \'Mọi người cũng đã xem\' - Nhãn đã bị ẩn - Nhãn được hiển thị + + Ẩn nhãn video đề xuất + Nhãn “Mọi người cũng xem” và “Bạn cũng có thể thích” đã bị ẩn + Nhãn “Mọi người cũng xem” và “Bạn cũng có thể thích” được hiển thị Ẩn nút \'Hiện thêm\' Nút đã bị ẩn Nút được hiển thị + Ẩn kệ vé + Kệ vé đã bị ẩn + Kệ vé đang hiển thị Ẩn phản ứng theo thời gian Phản ứng theo thời gian đã bị ẩn Phản ứng theo thời gian được hiển thị @@ -231,6 +241,9 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Ẩn \'Bản tóm tắt video do AI tạo\' Phần tóm tắt video đã bị ẩn Phần tóm tắt video được hiển thị + Ẩn Hỏi + Phần Hỏi đã bị ẩn + Phần Hỏi được hiển thị Ẩn Thuộc tính Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập đã bị ẩn Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiển thị @@ -267,9 +280,9 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Đã hiện trong video liên quan Bình luận Ẩn hoặc hiện các thành phần bình luận - Ẩn Tóm tắt Trò chuyện AI - Tóm tắt trò chuyện đã bị ẩn - Tóm tắt trò chuyện được hiển thị + Ẩn Tóm tắt cuộc trò chuyện AI + Tóm tắt cuộc trò chuyện đã bị ẩn + Tóm tắt cuộc trò chuyện được hiển thị Ẩn tóm tắt Bình luận AI Tóm tắt bình luận đã bị ẩn Tóm tắt bình luận được hiển thị @@ -689,17 +702,17 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Ẩn Shorts trong thẻ trang chủ Ẩn trong thẻ trang chủ và video liên quan - Hiện trong thẻ trang chủ và video liên quan + Hiển thi trong thẻ trang chủ và video liên quan Ẩn Shorts trong thẻ kênh đăng ký Bị ẩn trong thẻ kênh đăng ký - Được hiện trong nguồn đăng ký + Được hiển thị trong nguồn đăng ký Ẩn Shorts trong kết quả tìm kiếm Bị ẩn trong kết quả tìm kiếm - Được hiện trong kết quả tìm kiếm + Được hiển thị trong kết quả tìm kiếm Ẩn Shorts trong lịch sử xem Đã ẩn trong lịch sử xem - Đã hiện trong lịch sử xem + Đã hiển thị trong lịch sử xem Ẩn nút Tham gia Nút tham gia đã bị ẩn @@ -732,7 +745,7 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Ẩn nút Sắp diễn ra Nút sắp diễn ra đã bị ẩn Nút sắp diễn ra được hiển thị - Ẩn nút Màn hình xanh + Ẩn nút Phông xanh Nút phông xanh đã bị ẩn Nút phông xanh được hiển thị Ẩn nút hashtag @@ -794,6 +807,11 @@ Có thể thay đổi Tự động phát trong phần cài đặt YouTube: Cài đặt → Phát → Tự động phát video tiếp theo" Video được đề xuất ở màn hình kết thúc được hiển thị + + Ẩn lớp phủ video liên quan ở chế độ toàn màn hình + Lớp phủ video liên quan đã bị ẩn + Lớp phủ video liên quan được hiển thị + Ẩn dấu thời gian video Dấu thời gian đã bị ẩn @@ -831,10 +849,10 @@ Cài đặt → Phát → Tự động phát video tiếp theo" Tải lại video để bình chọn bằng Return YouTube Dislike Bị ẩn bởi chủ sở hữu - Số lượt không thích được hiển thị - Số lượt không thích không được hiển thị + Số lượt không thích được hiển thị + Số lượt không thích không được hiển thị Hiện số lượt không thích trong Shorts - "Số lượt không thích trên Shorts được hiển thị + "Số lượt không thích trên Shorts được hiển thị Hạn chế: Số lượt không thích có thể không xuất hiện ở chế độ ẩn danh" Số lượt không thích trên Shorts không được hiển thị @@ -851,7 +869,6 @@ Hạn chế: Số lượt không thích có thể không xuất hiện ở chế Hiện thông báo nổi nếu API không khả dụng Thông báo nổi được hiển thị nếu Return YouTube Dislike không khả dụng Thông báo nổi không được hiển thị nếu Return YouTube Dislike không khả dụng - Giới thiệu Dữ liệu được cung cấp bởi API Return YouTube Dislike. Nhấn vào đây để tìm hiểu thêm Thống kê API ReturnYouTubeDislike của thiết bị này @@ -1057,7 +1074,7 @@ Bạn đã sẵn sàng gửi?" Chỉnh sửa thời gian của phân đoạn theo cách thủ công Bạn có muốn thay đổi thời gian bắt đầu hoặc kết thúc của phân đoạn không? Thời gian đã đặt không hợp lệ - Thống kê + Thống kê Số liệu thống kê tạm thời không khả dụng (API ngừng hoạt động) Đang tải... @@ -1086,8 +1103,8 @@ Bạn đã sẵn sàng gửi?" Mã màu không hợp lệ Đặt lại màu Đặt lại - Giới thiệu - Dữ liệu được cung cấp bởi API SponsorBlock. Nhấn vào đây để tìm hiểu thêm và xem các bản tải cho các nền tảng khác + Giới thiệu + Dữ liệu được cung cấp bởi API SponsorBlock. Nhấn vào đây để tìm hiểu thêm và xem các bản tải cho các nền tảng khác Bố cục dạng yếu tố diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index cded58f00..116e28465 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced 设置重置为默认 导入 %d 个设置 导入失败:%s + 搜索设置 + 未找到“%s”的结果 + 尝试其他关键字 + 从搜索历史记录中删除? 显示ReVanced设置图标 设置图标已显示 未显示设置图标 @@ -93,6 +97,9 @@ Second \"item\" text" 恢复旧设置菜单 显示旧设置菜单 不显示旧设置菜单 + 显示设置搜索历史记录 + 设置搜索历史记录已显示 + 不显示设置搜索历史记录 禁用 Shorts 后台播放 @@ -153,15 +160,18 @@ Second \"item\" text" 隐藏「通知我」按钮 按钮已隐藏 按钮已显示 - - 隐藏“大家也在看”标签 - 标签已隐藏 - 标签已显示 + + 隐藏视频推荐标签 + “人们还观看过”和“您可能也喜欢”标签已隐藏 + “人们还观看过”和“您可能也喜欢”标签已显示 隐藏「显示更多」按钮 按钮已隐藏 按钮已显示 + 隐藏票券架 + 票券架已隐藏 + 票券架已显示 隐藏限时反应 定时表情反应已隐藏 定时表情反应已显示 @@ -231,6 +241,9 @@ Second \"item\" text" 隐藏“AI 生成的视频摘要” 视频摘要部分已隐藏 视频摘要部分已显示 + 隐藏“提问” + “提问”部分已隐藏 + “提问”部分已显示 隐藏属性 已隐藏“精选地点”、“游戏”、“音乐”和“提及的人物”部分 已显示“精选地点”、“游戏”、“音乐”和“提及的人物”部分 @@ -794,6 +807,11 @@ Second \"item\" text" 设置 → 播放 → 自动播放下一个视频" 显示片尾画面推荐视频 + + 在全屏模式下隐藏相关视频叠加层 + 相关视频叠加层已隐藏 + 相关视频叠加层已显示 + 隐藏视频时间戳 时间戳已隐藏 @@ -831,10 +849,10 @@ Second \"item\" text" 重新加载视频,使用 Return YouTube Dislike 投票 所有者已隐藏 - 点踩数已显示 - 点踩数已隐藏 + 点踩数已显示 + 点踩数已隐藏 在 Shorts 上显示点踩数 - "Shorts 上显示“不喜欢” + "Shorts 上显示“不喜欢” 限制:在隐身模式下可能不显示“不喜欢”" Shorts 上不显示“不喜欢” @@ -851,7 +869,6 @@ Second \"item\" text" 如果 API 不可用,则显示提示 如果 Return YouTube Dislike 不可用,则显示提示 如果 Return YouTube Dislike 不可用,则不显示提示 - 关于 数据由 Return YouTube Dislike API 提供。点击此处了解更多 ReturnYouTubeDislike API 设备统计信息 @@ -1062,7 +1079,7 @@ Second \"item\" text" 手动编辑线段时间 您想要编辑片段开始或结束的时间吗? 给定的时间无效 - 统计 + 统计 统计信息暂时不可用(API 已关闭) 正在加载… @@ -1091,8 +1108,8 @@ Second \"item\" text" 无效的颜色代码 重置颜色 重置 - 关于 - 数据由 SponsorBlock API 提供。点击这里了解更多信息并查看其他平台的下载内容 + 关于 + 数据由 SponsorBlock API 提供。点击这里了解更多信息并查看其他平台的下载内容 设备外形尺寸 diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index c47b0d054..ac4b3c1fd 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -42,6 +42,8 @@ Second \"item\" text" 將 ReVanced 設定重設為預設值 已匯入 %d 個設定 無法匯入:%s + 搜尋設定 + 要從搜尋記錄中移除嗎? 顯示 ReVanced 設定圖示 已顯示設定圖示 未顯示設定圖示 @@ -93,6 +95,9 @@ Second \"item\" text" 還原舊版設定選單 已顯示舊版設定選單 不顯示舊版設定選單 + 顯示設定搜尋記錄 + 顯示設定搜尋記錄 + 不顯示設定搜尋記錄 停用背景播放 Shorts @@ -153,10 +158,7 @@ Second \"item\" text" 隱藏「通知我」按鈕 已隱藏按鈕 已顯示按鈕 - - 隱藏「其他人還看了」標籤 - 已隱藏標籤 - 已顯示標籤 + 隱藏「顯示更多」按鈕 @@ -231,6 +233,7 @@ Second \"item\" text" 隱藏「AI 產生的影片摘要」 已隱藏影片摘要區塊 已顯示影片摘要區塊 + 隱藏詢問 隱藏屬性 已隱藏精選地點、遊戲、音樂和提及的人區塊 已顯示精選地點、遊戲、音樂和提及的人區塊 @@ -782,6 +785,8 @@ Second \"item\" text" 設定 → 播放 → 自動播放下一個影片" 已顯示片尾推薦影片 + + 隱藏影片時間戳記 已隱藏時間戳記 @@ -819,10 +824,10 @@ Second \"item\" text" 重新載入影片以使用 Return YouTube Dislike 進行投票 已由擁有者隱藏 - 已顯示不喜歡人數 - 不顯示不喜歡人數 + 已顯示不喜歡人數 + 不顯示不喜歡人數 在 Shorts 中顯示不喜歡人數 - "已顯示 Shorts 的不喜歡人數 + "已顯示 Shorts 的不喜歡人數 限制:在無痕模式下可能不會顯示不喜歡人數" 不顯示 Shorts 的不喜歡人數 @@ -839,7 +844,6 @@ Second \"item\" text" 若 API 無法使用,顯示提示 如果 Return YouTube Dislike 無法使用,則顯示提示訊息 如果 Return YouTube Dislike 無法使用,則不會顯示提示訊息 - 關於 資料由 Return YouTube Dislike API 提供。輕觸這裡來了解詳情 回傳這部裝置的 ReturnYouTubeDislike API 統計資料 @@ -1047,7 +1051,7 @@ Second \"item\" text" 手動編輯片段的時間 您想編輯片段開始或結束的時間嗎? 所選擇的時間無效 - 統計 + 統計 統計資料暫時不可用(API 離線) 載入中… @@ -1076,8 +1080,8 @@ Second \"item\" text" 無效的顏色代碼 重設顏色 重設 - 關於 - 資料由 SponsorBlock API 提供。輕觸這裡來了解更多資訊和查看其他平台的下載 + 關於 + 資料由 SponsorBlock API 提供。輕觸這裡來了解更多資訊和查看其他平台的下載 版面配置形式 diff --git a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml index ed07bda61..24e47c741 100644 --- a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml @@ -44,7 +44,7 @@ Second \"item\" text" - + @@ -134,6 +134,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 98ce9cb16..95a31b71f 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -42,6 +42,10 @@ Second \"item\" text" ReVanced settings reset to default Imported %d settings Import failed: %s + Search settings + No results found for \'%s\' + Try another keyword + Remove from search history? Show ReVanced setting icons Setting icons are shown Setting icons are not shown @@ -145,11 +149,15 @@ Tap the continue button and allow optimization changes." Shorts Seekbar Swipe controls + Return YouTube Dislike Miscellaneous Video Restore old settings menus Old settings menus are shown Old settings menus are not shown + Show settings search history + Settings search history is shown + Settings search history is not shown Disable Shorts background play @@ -210,15 +218,18 @@ You will not be notified of any unexpected events." Hide \'Notify me\' button Button is hidden Button is shown - - Hide \'People also watched\' label - Label is hidden - Label is shown + + Hide video recommendation labels + \'People also watched\' and \'You might also like\' labels are hidden + \'People also watched\' and \'You might also like\' labels are shown Hide \'Show more\' button Button is hidden Button is shown + Hide ticket shelf + Ticket shelf is hidden + Ticket shelf is shown Hide timed reactions Timed reactions are hidden Timed reactions are shown @@ -288,6 +299,9 @@ You will not be notified of any unexpected events." Hide \'AI-generated video summary\' Video summary section is hidden Video summary section is shown + Hide Ask + Ask section is hidden + Ask section is shown Hide Attributes Featured places, Games, Music, and People mentioned sections are hidden Featured places, Games, Music, and People mentioned sections are shown @@ -855,6 +869,11 @@ Autoplay can be changed in YouTube settings: Settings → Playback → Autoplay next video" End screen suggested video is shown + + Hide related video overlay in fullscreen + Related video overlay is hidden + Related video overlay is shown + Hide video timestamp Timestamp is hidden @@ -883,7 +902,6 @@ Settings → Playback → Autoplay next video" Player overlay opacity must be between 0-100 - Return YouTube Dislike Dislikes are temporarily not available (API timed out) Dislikes are not available (status %d) @@ -893,11 +911,11 @@ Settings → Playback → Autoplay next video" Reload video to vote using Return YouTube Dislike Hidden by owner - Return YouTube Dislike - Dislikes are shown - Dislikes are not shown + Return YouTube Dislike + Dislikes are shown + Dislikes are not shown Show dislikes on Shorts - "Dislikes on Shorts are shown + "Dislikes on Shorts are shown Limitation: Dislikes may not appear in incognito mode" Dislikes on Shorts are not shown @@ -914,7 +932,6 @@ Limitation: Dislikes may not appear in incognito mode" Show a toast if API is not available Toast is shown if Return YouTube Dislike is not available Toast is not shown if Return YouTube Dislike is not available - About ReturnYouTubeDislike.com Data is provided by the Return YouTube Dislike API. Tap here to learn more @@ -956,7 +973,7 @@ This feature works best with a video quality of 720p or lower and when using a v Seekbar thumbnails will appear in fullscreen - SponsorBlock + SponsorBlock Enable SponsorBlock SponsorBlock is a crowdsourced system for skipping annoying parts of YouTube videos Appearance @@ -1123,7 +1140,7 @@ Ready to submit?" Edit timing of segment manually Do you want to edit the timing for the start or end of the segment? Invalid time given - Stats + Stats Stats are temporarily not available (API is down) Loading... @@ -1152,9 +1169,9 @@ Ready to submit?" Invalid color code Reset color Reset - About - sponsor.ajay.app - Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms + About + sponsor.ajay.app + Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms Layout form factor diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_cursor.xml b/patches/src/main/resources/settings/drawable/revanced_settings_cursor.xml new file mode 100644 index 000000000..8443ab1e6 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_cursor.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_ryd.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml similarity index 100% rename from patches/src/main/resources/settings/drawable/revanced_settings_screen_09_ryd.xml rename to patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sb.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml similarity index 100% rename from patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sb.xml rename to patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml diff --git a/patches/src/main/resources/settings/host/values/styles.xml b/patches/src/main/resources/settings/host/values/styles.xml index 7c8412f9f..bf13d53ac 100644 --- a/patches/src/main/resources/settings/host/values/styles.xml +++ b/patches/src/main/resources/settings/host/values/styles.xml @@ -22,4 +22,8 @@ true @android:color/transparent + diff --git a/patches/src/main/resources/settings/layout/revanced_preference_with_icon_no_search_result.xml b/patches/src/main/resources/settings/layout/revanced_preference_with_icon_no_search_result.xml new file mode 100644 index 000000000..c81406ca6 --- /dev/null +++ b/patches/src/main/resources/settings/layout/revanced_preference_with_icon_no_search_result.xml @@ -0,0 +1,39 @@ + + + + + + + + diff --git a/patches/src/main/resources/settings/layout/revanced_search_suggestion_item.xml b/patches/src/main/resources/settings/layout/revanced_search_suggestion_item.xml new file mode 100644 index 000000000..3d65900d2 --- /dev/null +++ b/patches/src/main/resources/settings/layout/revanced_search_suggestion_item.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/patches/src/main/resources/settings/layout/revanced_settings_with_toolbar.xml b/patches/src/main/resources/settings/layout/revanced_settings_with_toolbar.xml index 238dc5f79..14c2d0e13 100644 --- a/patches/src/main/resources/settings/layout/revanced_settings_with_toolbar.xml +++ b/patches/src/main/resources/settings/layout/revanced_settings_with_toolbar.xml @@ -1,34 +1,63 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> - - + android:layout_height="match_parent" + android:fitsSystemWindows="true" + android:orientation="vertical" + android:transitionGroup="true"> - + + android:background="@color/yt_white1" + android:elevation="0dp"> + + + + + + + + + + + + + android:id="@+id/revanced_settings_fragments" + android:layout_width="match_parent" + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/patches/src/main/resources/settings/menu/revanced_search_menu.xml b/patches/src/main/resources/settings/menu/revanced_search_menu.xml new file mode 100644 index 000000000..de562b2dd --- /dev/null +++ b/patches/src/main/resources/settings/menu/revanced_search_menu.xml @@ -0,0 +1,8 @@ + +

+ + \ No newline at end of file