mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-05-20 16:27:11 +02:00
chore: Merge branch dev
to main
(#4947)
This commit is contained in:
commit
fa3c690684
69
CHANGELOG.md
69
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)
|
||||
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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<Pair<CharSequence, CharSequence>> firstEntries = new ArrayList<>(firstEntriesToPreserve);
|
||||
SortedMap<String, Pair<CharSequence, CharSequence>> lastEntries = new TreeMap<>();
|
||||
|
||||
for (int i = 0; i < entrySize; i++) {
|
||||
Pair<CharSequence, CharSequence> 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<CharSequence, CharSequence> pair : firstEntries) {
|
||||
sortedEntries[i] = pair.first;
|
||||
sortedEntryValues[i] = pair.second;
|
||||
i++;
|
||||
}
|
||||
|
||||
for (Pair<CharSequence, CharSequence> 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());
|
||||
}
|
||||
}
|
@ -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.
|
||||
* <p>
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
* <p>
|
||||
* 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.
|
||||
*
|
||||
* <p>
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
@ -576,7 +576,7 @@ final class KeywordContentFilter extends Filter {
|
||||
MutableReference<String> 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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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.
|
||||
* <p>
|
||||
@ -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.
|
||||
*/
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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.
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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<String> 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<String> {
|
||||
public SearchHistoryAdapter(Context context, List<String> 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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<ThumbnailOption> ALT_THUMBNAIL_HOME = new EnumSetting<>("revanced_alt_thumbnail_home", ThumbnailOption.ORIGINAL);
|
||||
public static final EnumSetting<ThumbnailOption> 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<FormFactor> 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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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<AbstractPreferenceSearchData<?>> 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<Pair<String, String>> firstPairs = new ArrayList<>(firstEntriesToPreserve);
|
||||
List<Pair<String, String>> pairsToSort = new ArrayList<>(entrySize);
|
||||
|
||||
for (int i = 0; i < entrySize; i++) {
|
||||
Pair<String, String> 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<String, String> pair : firstPairs) {
|
||||
sortedEntries[i] = pair.first;
|
||||
sortedEntryValues[i] = pair.second;
|
||||
i++;
|
||||
}
|
||||
|
||||
for (Pair<String, String> 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<String, PreferenceCategory> 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<T extends Preference> {
|
||||
/**
|
||||
* @return The navigation path for the given preference, such as "Player > Action buttons".
|
||||
*/
|
||||
private static String getPreferenceNavigationString(Preference preference) {
|
||||
Deque<CharSequence> 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<Preference> {
|
||||
@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<SwitchPreference> {
|
||||
@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<ListPreference> {
|
||||
@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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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.
|
||||
}
|
||||
}
|
@ -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 + '\''
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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<SegmentCategoryListPreference> 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -9,6 +9,5 @@ internal val adInjectorFingerprint = fingerprint {
|
||||
parameters("L", "L")
|
||||
strings(
|
||||
"SponsoredContentController.insertItem",
|
||||
"SponsoredContentController::Delivery",
|
||||
)
|
||||
}
|
||||
|
@ -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<MethodReference>()?.name == "keySet"
|
||||
} >= 0
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;-><init>()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 {
|
||||
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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"),
|
||||
)
|
||||
|
||||
|
@ -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",
|
||||
)
|
||||
}
|
@ -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))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
@ -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.
|
||||
|
@ -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(
|
||||
|
@ -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")
|
||||
)
|
||||
|
@ -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,
|
||||
|
@ -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"),
|
||||
|
@ -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")
|
||||
)
|
||||
|
@ -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.
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">إعادة تعيين إعدادات ReVanced إلى الوضع الافتراضي</string>
|
||||
<string name="revanced_settings_import_success">تم استيراد %d إعدادات</string>
|
||||
<string name="revanced_settings_import_failure_parse">فشل الاستيراد: %s</string>
|
||||
<string name="revanced_settings_search_hint">إعدادات البحث</string>
|
||||
<string name="revanced_settings_search_no_results_title">لم يتم العثور على نتائج لـ \".%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">جرّب كلمة مفتاحية أخرى</string>
|
||||
<string name="revanced_settings_search_remove_message">إزالة من سجل البحث؟</string>
|
||||
<string name="revanced_show_menu_icons_title">عرض أيقونات إعدادات ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">يتم عرض أيقونات الإعدادات</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">لا يتم عرض أيقونات الإعدادات</string>
|
||||
@ -93,6 +97,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">استعادة قوائم الإعدادات القديمة</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">يتم عرض قوائم الإعدادات القديمة</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">لا يتم عرض قوائم الإعدادات القديمة</string>
|
||||
<string name="revanced_settings_search_history_title">إظهار سجل البحث في الإعدادات</string>
|
||||
<string name="revanced_settings_search_history_summary_on">سجل البحث في الإعدادات معروض</string>
|
||||
<string name="revanced_settings_search_history_summary_off">لم يتم عرض سجل البحث في الإعدادات</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">تعطيل تشغيل فيديوهات Shorts في الخلفية</string>
|
||||
@ -153,15 +160,18 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_notify_me_button_title">إخفاء زر \'تنبيهي\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">تم إخفاء الزر</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">يتم عرض الزر</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">إخفاء علامة \'الأشخاص الذين شاهدوا أيضًا\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">تم إخفاء العلامة</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">يتم عرض العلامة</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">إخفاء علامات اقتراحات الفيديو</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">تم إخفاء علامات \'اقتراحات للمشاهدة\' و\'قد يعجبك أيضًا\'</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">يتم عرض علامات \'اقتراحات للمشاهدة\' و\'قد يعجبك أيضًا\'</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">إخفاء زر \'عرض المزيد\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">تم إخفاء الزر</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">يتم عرض الزر</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">إخفاء رف التذاكر</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">تم إخفاء رف التذاكر</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">يتم عرض رف التذاكر</string>
|
||||
<string name="revanced_hide_timed_reactions_title">إخفاء ردود الفعل المؤقتة</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">تم إخفاء ردود الفعل المؤقتة</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">يتم عرض ردود الفعل المؤقتة</string>
|
||||
@ -231,6 +241,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">إخفاء \'ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي\'</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">تم إخفاء قسم ملخص الفيديو</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">يتم عرض قسم ملخص الفيديو</string>
|
||||
<string name="revanced_hide_ask_section_title">إخفاء \"Ask\"</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">تم إخفاء قسم \"Ask\"</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">يتم عرض قسم \"Ask\"</string>
|
||||
<string name="revanced_hide_attributes_section_title">إخفاء الصفات</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">تم إخفاء أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">يتم عرض أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون</string>
|
||||
@ -794,6 +807,11 @@ Second \"item\" text"</string>
|
||||
الإعدادات ← التشغيل ← تشغيل الفيديو التالي تلقائيًا"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">يتم عرض الفيديو المقترح في شاشة النهاية</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">إخفاء واجهة الفيديوهات ذات الصلة في وضع ملء الشاشة</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">تم إخفاء واجهة الفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">يتم عرض واجهة الفيديوهات ذات الصلة</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">إخفاء الطابع الزمني للفيديو</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">تم إخفاء الطابع الزمني</string>
|
||||
@ -831,10 +849,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">مخفي بواسطة المالك</string>
|
||||
<string name="revanced_ryd_enable_summary_on">يتم عرض لم يعجبني</string>
|
||||
<string name="revanced_ryd_enable_summary_off">لا يتم عرض لم يعجبني</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">يتم عرض لم يعجبني</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">لا يتم عرض لم يعجبني</string>
|
||||
<string name="revanced_ryd_shorts_title">عرض لم يعجني في فيديوهات Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"يتم عرض مرات عدم الإعجاب في فيديوهات Shorts
|
||||
<string name="revanced_ryd_shorts_summary_on">"يتم عرض مرات عدم الإعجاب في فيديوهات Shorts
|
||||
|
||||
التقييد: قد لا تظهر مرات عدم الإعجاب في وضع التصفح المتخفي"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">لا يتم عرض مرات عدم الإعجاب في فيديوهات Shorts</string>
|
||||
@ -851,7 +869,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">عرض ملاحظة إذا كان API غير متاح</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike</string>
|
||||
<string name="revanced_ryd_about">لمحة</string>
|
||||
<string name="revanced_ryd_attribution_summary">يتم توفير البيانات بواسطة the Return YouTube Dislike API. اضغط هنا لمعرفة المزيد</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API إحصائيات هذا الجهاز</string>
|
||||
@ -1058,7 +1075,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">تعديل توقيت المقطع يدويًا</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">هل تود تعديل التوقيت لبداية أو نهاية المقطع؟</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">الوقت المحدد غير صحيح</string>
|
||||
<string name="revanced_sb_stats">إحصائيات</string>
|
||||
<string name="revanced_sb_stats_title">إحصائيات</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">الإحصائيات غير متوفرة مؤقتًا (الواجهة غير متوفرة)</string>
|
||||
<string name="revanced_sb_stats_loading">جارٍ التحميل...</string>
|
||||
@ -1087,8 +1104,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_color_invalid">رمز اللون غير صالح</string>
|
||||
<string name="revanced_sb_reset_color">إعادة تعيين اللون</string>
|
||||
<string name="revanced_sb_reset">إعادة التعيين</string>
|
||||
<string name="revanced_sb_about">لمحة</string>
|
||||
<string name="revanced_sb_about_api_sum">يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد ومشاهدة التنزيلات لمنصات أخرى</string>
|
||||
<string name="revanced_sb_about_title">لمحة</string>
|
||||
<string name="revanced_sb_about_api_summary">يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد ومشاهدة التنزيلات لمنصات أخرى</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">شكل نموذج التخطيط</string>
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced tənzimləmələr standarta təyin edildi</string>
|
||||
<string name="revanced_settings_import_success">%d tənzimləmə idxal edildi</string>
|
||||
<string name="revanced_settings_import_failure_parse">Uğursuz idxal prosesi: %s</string>
|
||||
<string name="revanced_settings_search_hint">Axtarış tənzimləmələri</string>
|
||||
<string name="revanced_settings_search_no_results_title">‘%s’ üçün nəticə tapılmadı</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Başqa açar sözü yoxla</string>
|
||||
<string name="revanced_settings_search_remove_message">Axtarış tarixçəsindən silinsin?</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced tənzimləmə nişanların göstər</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Tənzimləmə nişanları göstərilir</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Tənzimləmə nişanları göstərilmir</string>
|
||||
@ -93,6 +97,9 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et."
|
||||
<string name="revanced_restore_old_settings_menus_title">Köhnə tənzimləmələr bölmələrin bərpa et</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Köhnə tənzimləmələr bölmələri göstərilir</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Köhnə tənzimləmələr bölmələri göstərilmir</string>
|
||||
<string name="revanced_settings_search_history_title">Axtarış tarixçəsi tənzimləməsin göstər</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Axtarış tarixçəsi tənzimləməsi göstərilir</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Axtarış tarixçəsi tənzimləməsi göstərilmir</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Shorts arxa plan oynatmasın qapat</string>
|
||||
@ -153,15 +160,18 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">\"Mənə bildir\" düyməsini gizlət</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Düymə gizlidir</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Düymə göstərilir</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">\"İnsanlar həmçinin izləyiblər\" etiketin gizlət</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Etiket gizlidir</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Etiket göstərilir</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Video tövsiyə etiketlərini gizlət</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">\"İnsanlar həmçinin izləyiblər\" və \"Bunu da bəyənə bilərsiniz\" etiketləri gizlədilib</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">\"İnsanlar həmçinin izləyiblər\" və \"Bunu da bəyənə bilərsiniz\" etiketləri görünür</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">\'Daha çox göstər\' düyməsini gizlət</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Düymə gizlidir</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Düymə göstərilir</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Bilet bölməsin gizlət</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Bilet bölməsi gizlidir</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Bilet bölməsi görünür</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Vaxtlı reaksiyaları gizlət</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Zamanlanmış reaksiyalar gizlədilir</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Zamanlanmış reaksiyalar göstərilir</string>
|
||||
@ -231,6 +241,9 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">\"AI ilə yaradılan video xülasəsini\" gizlət</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Video xülasə bölməsi gizlədilib</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Video xülasə bölməsi göstərilir</string>
|
||||
<string name="revanced_hide_ask_section_title">Soruş\'u Gizlət</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Soruş bölməsi gizlidir</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">\"Soruş\" bölməsi göstərilir</string>
|
||||
<string name="revanced_hide_attributes_section_title">Atributları Gizlət</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri gizlədilir</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri görünür</string>
|
||||
@ -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"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Son ekranda bildirilən video göstərilir</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Əlaqəli video örtüyünü tam ekranda gizlət</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Əlaqəli video örtüyü gizlədilib</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Əlaqəli video örtüyü göstərilir</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Video vaxt möhürünü gizlət</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Vaxt möhürü gizlidir</string>
|
||||
@ -830,10 +848,10 @@ Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunu
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Ryd ilə səsvermə üçün videonu yenidən yüklə</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Sahib tərəfindən gizlədilib</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Bəyənməmələr göstərilir</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Bəyənməmələr göstərilmir</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Bəyənməmələr göstərilir</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Bəyənməmələr göstərilmir</string>
|
||||
<string name="revanced_ryd_shorts_title">\"Shorts\"da bəyənməmə sayını göstər</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Bəyənməmələr Shorts-da göstərilir
|
||||
<string name="revanced_ryd_shorts_summary_on">"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"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Bəyənməmələr Shorts-da göstərilmir</string>
|
||||
@ -850,7 +868,6 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">API əlçatan deyilsə ani bildiriş göstər</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Return YouTube Dislike əlçatan deyilsə ani bildiriş göstər</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Return YouTube Dislike əlçatan deyilsə ani bildiriş göstərmə</string>
|
||||
<string name="revanced_ryd_about">Haqqında</string>
|
||||
<string name="revanced_ryd_attribution_summary">Məlumat Return YouTube Dislike API vasitəsilə alınır. Ətraflı öyrənmək üçün bura toxun</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Bu cihazda Return YouTube Dislike API statistikası</string>
|
||||
@ -1057,7 +1074,7 @@ Təqdim etməyə hazırdır?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Bölüm vaxtına əl ilə düzəliş et</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Bölümün başlanğıc və ya bitiş vaxtlarına düzəliş etmək istəyirsiniz?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Yanlış vaxt verilmişdir</string>
|
||||
<string name="revanced_sb_stats">Statistikalar</string>
|
||||
<string name="revanced_sb_stats_title">Statistikalar</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Statistikalar müvəqqəti mövcud deyil (API işləmir)</string>
|
||||
<string name="revanced_sb_stats_loading">Yüklənir...</string>
|
||||
@ -1086,8 +1103,8 @@ Təqdim etməyə hazırdır?"</string>
|
||||
<string name="revanced_sb_color_invalid">Etibarsız rəng kodu</string>
|
||||
<string name="revanced_sb_reset_color">Rəngi sıfırla</string>
|
||||
<string name="revanced_sb_reset">Sıfırlayın</string>
|
||||
<string name="revanced_sb_about">Haqqında</string>
|
||||
<string name="revanced_sb_about_api_sum">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</string>
|
||||
<string name="revanced_sb_about_title">Haqqında</string>
|
||||
<string name="revanced_sb_about_api_summary">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</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Tərtibat forma göstəricisi</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Налады ReVanced скінуты да стандартных</string>
|
||||
<string name="revanced_settings_import_success">Імпартавана %d налад</string>
|
||||
<string name="revanced_settings_import_failure_parse">Памылка імпарту: %s</string>
|
||||
<string name="revanced_settings_search_hint">Пошук налад</string>
|
||||
<string name="revanced_settings_search_no_results_title">Нічога не знойдзена для \",%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Паспрабуйце іншае ключавое слова</string>
|
||||
<string name="revanced_settings_search_remove_message">Выдаліць з гісторыі пошуку?</string>
|
||||
<string name="revanced_show_menu_icons_title">Паказваць значкі налад ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Значкі налад паказваюцца</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Значкі налад не паказваюцца</string>
|
||||
@ -93,6 +97,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Аднавіць старое меню налад</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Старыя меню налад паказваюцца</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Старыя меню налад не паказваюцца</string>
|
||||
<string name="revanced_settings_search_history_title">Паказваць гісторыю пошуку ў наладах</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Паказваецца гісторыя пошуку ў наладах</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Гісторыя пошуку налад не паказваецца</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Адключыць прайграванне Shorts у фонавым</string>
|
||||
@ -153,15 +160,18 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Схаваць кнопку \"Паведаміць мне\"</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Кнопка схавана</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Паказана кнопка</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Схаваць надпіс «Людзі таксама глядзелі»</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Надпіс схаваны</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Надпіс паказаны</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Схаваць надпісы з рэкамендацыямі відэа</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Надпісы \"Людзі таксама глядзелі\" і \"Вам таксама можа спадабацца\" схаваныя</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Надпісы \"Людзі таксама глядзелі\" і \"Вам таксама можа спадабацца\" паказаныя</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Схаваць кнопку \"Паказаць больш\"</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Кнопка схавана</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Паказана кнопка</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Схаваць паліцу білетаў</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Паліца білетаў схавана</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Паліца білетаў паказана</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Схаваць рэакцыі па часе</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Часовыя рэакцыі схаваныя</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Паказваюцца рэакцыі па часе</string>
|
||||
@ -231,6 +241,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Схаваць «Зводку відэа, згенэраваную штучным інтэлектам»</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Раздзел зводкі відэа схаваны</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Раздзел зводкі відэа паказаны</string>
|
||||
<string name="revanced_hide_ask_section_title">Схаваць «Спытаць»</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Раздзел «Спытаць» схаваны</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Раздзел «Спытаць» паказаны</string>
|
||||
<string name="revanced_hide_attributes_section_title">Схаваць атрыбуты</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» схаваныя</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» паказаныя</string>
|
||||
@ -794,6 +807,11 @@ Second \"item\" text"</string>
|
||||
Налады → Прайграванне → Аўтаматычнае прайграванне наступнага відэа"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Паказваць прапанаванае відэа на канчатковым экране</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Схаваць накладку звязанага відэа ў поўнаэкранным рэжыме</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Накладка звязанага відэа схавана</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Накладка звязанага відэа паказана</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Схаваць метку часу відэа</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Метка часу схавана</string>
|
||||
@ -831,10 +849,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Перазагрузіце відэа, каб прагаласаваць з дапамогай функцыі \"Вярнуць не падабаецца YouTube\"</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Схавана ўладальнікам</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Дызлайкі паказаны</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Дызлайкі не паказваюцца</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Дызлайкі паказаны</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Дызлайкі не паказваюцца</string>
|
||||
<string name="revanced_ryd_shorts_title">Паказвайце \"не падабаецца\" на Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Дызлайкі на Shorts паказаныя
|
||||
<string name="revanced_ryd_shorts_summary_on">"Дызлайкі на Shorts паказаныя
|
||||
|
||||
Абмежаванне: дызлайкі могуць не адлюстроўвацца ў рэжыме інкогніта"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Дызлайкі на Shorts не паказаныя</string>
|
||||
@ -851,7 +869,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Паказаць тост, калі API недаступны</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Тост паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Тост не паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная</string>
|
||||
<string name="revanced_ryd_about">Пра праграму</string>
|
||||
<string name="revanced_ryd_attribution_summary">Дадзеныя прадастаўляюцца Return YouTube Dislikes API. Націсніце тут, каб даведацца больш</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Статыстыка ReturnYouTubeDislike API гэтай прылады</string>
|
||||
@ -1059,7 +1076,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Рэдагаваць час сегмента ўручную</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Вы жадаеце змяніць час для пачатку або канца сегмента?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Указаны няправільны час</string>
|
||||
<string name="revanced_sb_stats">Статыстыка</string>
|
||||
<string name="revanced_sb_stats_title">Статыстыка</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Статыстыка часова недаступная (API не працуе)</string>
|
||||
<string name="revanced_sb_stats_loading">Загрузка...</string>
|
||||
@ -1088,8 +1105,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_color_invalid">Няправільны код колеру</string>
|
||||
<string name="revanced_sb_reset_color">Скінуць колер</string>
|
||||
<string name="revanced_sb_reset">Скінуць</string>
|
||||
<string name="revanced_sb_about">Пра праграму</string>
|
||||
<string name="revanced_sb_about_api_sum">Дадзеныя прадастаўляюцца API SponsorBlock. Націсніце тут, каб даведацца больш і паглядзець спампоўкі для іншых платформаў</string>
|
||||
<string name="revanced_sb_about_title">Пра праграму</string>
|
||||
<string name="revanced_sb_about_api_summary">Дадзеныя прадастаўляюцца API SponsorBlock. Націсніце тут, каб даведацца больш і паглядзець спампоўкі для іншых платформаў</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Фармат экрана</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Настройките на ReVanced бяха нулирани</string>
|
||||
<string name="revanced_settings_import_success">Следните настройки бяха импортирани успешно: %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Импортирането беше неуспешно: %s</string>
|
||||
<string name="revanced_settings_search_hint">Търсене на настройки</string>
|
||||
<string name="revanced_settings_search_no_results_title">Няма намерени резултати за \",%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Опитайте друга ключова дума</string>
|
||||
<string name="revanced_settings_search_remove_message">Премахване от историята на търсенията?</string>
|
||||
<string name="revanced_show_menu_icons_title">Показване на иконите на настройките на ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Иконите на настройките се показват</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Иконите на настройките не се показват</string>
|
||||
@ -93,6 +97,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Възстановяване на старите менюта за настройки</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Старите менюта с настройки се показват</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Старите менюта с настройки не се показват</string>
|
||||
<string name="revanced_settings_search_history_title">Показване на историята на търсенията в настройките</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Историята на търсенията в настройките е показана</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Историята на търсенията в настройките не се показва</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Възпроизвеждане на Shorts в фонов режим</string>
|
||||
@ -153,15 +160,18 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Скриване на бутона \"Уведоми ме\"</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Бутона \"Уведоми ме\" е скрит</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Бутона \"Уведоми ме\" се показва</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Скриване на етикета \"Хората също гледаха\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Етикетът е скрит</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Етикетът е показан</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Скриване на етикетите с видео препоръки</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Етикетите „Други потребители също гледаха“ и „Може също да харесате“ са скрити</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Етикетите „Други потребители също гледаха“ и „Може също да харесате“ са показани</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Скриване на бутона \"Покажи още\"</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Бутона Покажи още е скрит</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Бутона Покажи още се показва</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Скриване на рафта за билети</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Рафтът за билети е скрит</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Рафтът за билети е показан</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Скриване на времевите реакции</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Времевите реакции са скрити</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Времевите реакции се показват</string>
|
||||
@ -231,6 +241,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Скриване на \"AI-генерирано видео резюме\"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Скрит е разделът с видео резюме</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Показва се разделът с видео резюме</string>
|
||||
<string name="revanced_hide_ask_section_title">Скриване на „Попитай“</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Скрит раздел „Попитай“</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Показване на раздел „Попитай“</string>
|
||||
<string name="revanced_hide_attributes_section_title">Скриване на атрибути</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са скрити</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са показани</string>
|
||||
@ -794,6 +807,11 @@ Second \"item\" text"</string>
|
||||
Настройки → Възпроизвеждане → Автоматично пускане на следващото видео"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Предложеното видео в края на екрана е показано</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Скриване на наслагването на свързани видеоклипове в цял екран</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Наслагването на свързани видеоклипове е скрито</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Наслагването на свързани видеоклипове е показано</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Скриване на клеймото за време на видеоклипа</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Скрито</string>
|
||||
@ -831,10 +849,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Презареди видеото за гласуване с ReturnYouTubeDislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Скрито от собственика</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Нехаресванията се показват</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Нехаресванията не се показват</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Нехаресванията се показват</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Нехаресванията не се показват</string>
|
||||
<string name="revanced_ryd_shorts_title">Пок. нехаресвания в кратките клипове</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Нехаресванията на Shorts са показани
|
||||
<string name="revanced_ryd_shorts_summary_on">"Нехаресванията на Shorts са показани
|
||||
|
||||
Ограничение: Нехаресванията може да не се показват в режим инкогнито"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Нехаресванията на Shorts не са показани</string>
|
||||
@ -851,7 +869,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Показване на известие, ако API не е наличен</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Показва известие, ако Return YouTube Dislike не е наличен</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Не се показва известие, ако ReturnYouTube Dislike не е наличен</string>
|
||||
<string name="revanced_ryd_about">За програмата</string>
|
||||
<string name="revanced_ryd_attribution_summary">Данните за нехаресване са от Return YouTube Dislike API. Докоснете за да научите повече</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Статистика Return YouTube Dislike API на това устройство</string>
|
||||
@ -1058,7 +1075,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Ръчно редактиране на времената на частта</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Желаете ли да редактирате времената за начало или край на частта?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Зададено е невалидно време</string>
|
||||
<string name="revanced_sb_stats">Статистика</string>
|
||||
<string name="revanced_sb_stats_title">Статистика</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Статистиките временно не са налични (API не работи)</string>
|
||||
<string name="revanced_sb_stats_loading">Зареждане...</string>
|
||||
@ -1087,8 +1104,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_color_invalid">Невалидна стойност за цвета</string>
|
||||
<string name="revanced_sb_reset_color">Възстановяване на цвят</string>
|
||||
<string name="revanced_sb_reset">Възстанови</string>
|
||||
<string name="revanced_sb_about">За програмата</string>
|
||||
<string name="revanced_sb_about_api_sum">Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния</string>
|
||||
<string name="revanced_sb_about_title">За програмата</string>
|
||||
<string name="revanced_sb_about_api_summary">Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Формат на екрана /Таблет, Телфон, .../</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced সেটিং ডিফল্ট সেট করা হয়েছে</string>
|
||||
<string name="revanced_settings_import_success">%d সেটিং আমদানি হয়েছে</string>
|
||||
<string name="revanced_settings_import_failure_parse">আমদানি করা যায়নি: %s</string>
|
||||
<string name="revanced_settings_search_hint">অনুসন্ধান সেটিংস</string>
|
||||
<string name="revanced_settings_search_no_results_title">\'%s\'-এর জন্য কোন ফলাফল পাওয়া যায়নি</string>
|
||||
<string name="revanced_settings_search_no_results_summary">অন্য কোনো কীওয়ার্ড চেষ্টা করুন</string>
|
||||
<string name="revanced_settings_search_remove_message">অনুসন্ধান ইতিহাস থেকে সরাবেন?</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced সেটিং আইকন দেখান</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">সেটিং আইকন দেখানো হয়েছে</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">সেটিং আইকন দেখানো হচ্ছে না</string>
|
||||
@ -93,6 +97,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_restore_old_settings_menus_title">পুরানো সেটিংস মেনু পুনরুদ্ধার করুন</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">পুরাতন সেটিংস মেনু দেখানো হচ্ছে</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">পুরাতন সেটিংস মেনু দেখানো হচ্ছে না</string>
|
||||
<string name="revanced_settings_search_history_title">অনুসন্ধান সেটিংসের ইতিহাস দেখান</string>
|
||||
<string name="revanced_settings_search_history_summary_on">সেটিংস অনুসন্ধান ইতিহাস দেখানো হয়েছে</string>
|
||||
<string name="revanced_settings_search_history_summary_off">সেটিংস অনুসন্ধান ইতিহাস দেখানো হয় না</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Shorts ব্যাকগ্রাউন্ড প্লে অক্ষম করুন</string>
|
||||
@ -153,15 +160,18 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_notify_me_button_title">\'আমাকে জানান\' বোতাম লুকান</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">বোতাম লুকানো আছে</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">বোতাম দেখানো আছে</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">\'People also watched\' লেবেল লুকান</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">লেবেল লুকানো আছে</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">লেবেল দেখানো হয়েছে</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">ভিডিও প্রস্তাবনা লেবেল লুকান</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">\"\'লোকেরা আরও দেখেছে\' এবং \'আপনি সম্ভবত পছন্দ করতে পারেন\' লেবেলগুলি লুকানো আছে\"</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">\"\'লোকেরা আরও দেখেছে\' এবং \'আপনি সম্ভবত পছন্দ করতে পারেন\' লেবেলগুলি দেখানো হয়েছে\"</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">\'আরও দেখান\' বোতাম লুকান</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">বোতাম লুকানো আছে</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">বোতাম দেখানো আছে</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">টিকিট তাক লুকান</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">টিকিট তাক লুকানো আছে</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">টিকিট তাক দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_timed_reactions_title">সময় অনুযায়ী প্রতিক্রিয়া লুকান</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">সময় অনুযায়ী প্রতিক্রিয়া লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">সময় অনুযায়ী প্রতিক্রিয়া প্রদর্শিত হয়েছে</string>
|
||||
@ -231,6 +241,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">\'AI-জেনারেটেড ভিডিও সারসংক্ষেপ\' লুকান</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">ভিডিও সারসংক্ষেপ বিভাগ লুকানো আছে</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">ভিডিও সারসংক্ষেপ বিভাগ দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_ask_section_title">জিজ্ঞাসা লুকান</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">জিজ্ঞাসা বিভাগ লুকানো আছে</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">জিজ্ঞাসা বিভাগ দেখানো হয়েছে</string>
|
||||
<string name="revanced_hide_attributes_section_title">বৈশিষ্ট্যাবলী লুকান</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি লুকানো আছে</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি দেখানো হয়েছে</string>
|
||||
@ -794,6 +807,11 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
সেটিংস → প্লেব্যাক → অটো প্লে পরবর্তী ভিডিও"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">শেষ স্ক্রীনে প্রস্তাবিত ভিডিও দেখানো হয়েছে</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">পূর্ণ-স্ক্রীনে সম্পর্কিত ভিডিও ওভারলে লুকান</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">সম্পর্কিত ভিডিও ওভারলে লুকানো আছে</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">সম্পর্কিত ভিডিও ওভারলে দেখানো হয়েছে</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">ভিডিওর সময়স্ট্যাম্প লুকান</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">সময়স্ট্যাম্প লুকিয়ে রয়েছে</string>
|
||||
@ -831,10 +849,10 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">ReturnYouTubeDislike দিয়ে ভোট দিতে ভিডিও আবার লোড করুন</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">মালিক কর্তৃক লুকানো</string>
|
||||
<string name="revanced_ryd_enable_summary_on">অপছন্দগুলো প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_ryd_enable_summary_off">অপছন্দগুলো প্রদর্শিত হয়নি</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">অপছন্দগুলো প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">অপছন্দগুলো প্রদর্শিত হয়নি</string>
|
||||
<string name="revanced_ryd_shorts_title">Shorts এ অপছন্দ দেখান</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Shorts-এ অপছন্দগুলি দেখানো হয়েছে
|
||||
<string name="revanced_ryd_shorts_summary_on">"Shorts-এ অপছন্দগুলি দেখানো হয়েছে
|
||||
|
||||
সীমাবদ্ধতা: ছদ্মবেশী মোডে অপছন্দগুলি নাও দেখা যেতে পারে"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Shorts-এ অপছন্দগুলি দেখানো হয়নি</string>
|
||||
@ -851,7 +869,6 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">API উপলভ্য না থাকলে একটি টোস্ট দেখান</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে না</string>
|
||||
<string name="revanced_ryd_about">সম্পর্কিত</string>
|
||||
<string name="revanced_ryd_attribution_summary">তথ্য প্রদান করা হয় Return YouTube Dislike API দ্বারা। আরও জানতে এখানে ট্যাপ করুন</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">এই ডিভাইসের ReturnYouTubeDislike API পরিসংখ্যান</string>
|
||||
@ -1058,7 +1075,7 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">সেগমেন্টের সময় ম্যানুয়ালি সম্পাদনা করুন</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">আপনি কি সেগমেন্টের শুরু বা শেষের সময় সম্পাদনা করতে চান?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">ভুল সময় দেয়া হয়েছে</string>
|
||||
<string name="revanced_sb_stats">পরিসংখ্যান</string>
|
||||
<string name="revanced_sb_stats_title">পরিসংখ্যান</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">পরিসংখ্যান সাময়িকভাবে উপলব্ধ নেই (API ডাউন)</string>
|
||||
<string name="revanced_sb_stats_loading">লোড হচ্ছে...</string>
|
||||
@ -1087,8 +1104,8 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
|
||||
<string name="revanced_sb_color_invalid">রংয়ের ভুল কোড</string>
|
||||
<string name="revanced_sb_reset_color">রং আবার সেট করুন</string>
|
||||
<string name="revanced_sb_reset">পুনরায় সেট করুন</string>
|
||||
<string name="revanced_sb_about">সম্পর্কিত</string>
|
||||
<string name="revanced_sb_about_api_sum">ডেটা SponsorBlock API দ্বারা সরবরাহ করা হয়। আরও জানতে এবং অন্যান্য প্ল্যাটফর্মের ডাউনলোড দেখতে এখানে ট্যাপ করুন</string>
|
||||
<string name="revanced_sb_about_title">সম্পর্কিত</string>
|
||||
<string name="revanced_sb_about_api_summary">ডেটা SponsorBlock API দ্বারা সরবরাহ করা হয়। আরও জানতে এবং অন্যান্য প্ল্যাটফর্মের ডাউনলোড দেখতে এখানে ট্যাপ করুন</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">লেআউট ফর্ম ফ্যাক্টর</string>
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">La configuració de ReVanced s\'ha restablert als valors predeterminats</string>
|
||||
<string name="revanced_settings_import_success">S\'han importat %d configuracions</string>
|
||||
<string name="revanced_settings_import_failure_parse">No s\'ha pogut importar: %s</string>
|
||||
<string name="revanced_settings_search_hint">Cerca a la configuració</string>
|
||||
<string name="revanced_settings_search_no_results_title">No s\'han trobat resultats per a «%s»</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Prova una altra paraula clau</string>
|
||||
<string name="revanced_settings_search_remove_message">Voleu suprimir-ho de l\'historial de cerca?</string>
|
||||
<string name="revanced_show_menu_icons_title">Mostra les icones de configuració de ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Es mostren les icones de configuració</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">No es mostren les icones de configuració</string>
|
||||
@ -93,6 +97,9 @@ Toca el botó Continua i permet els canvis d'optimització."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Restaurar els menús de configuració antics</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Es mostren els menús de configuració antics</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">No es mostren els menús de configuració antics</string>
|
||||
<string name="revanced_settings_search_history_title">Mostra l\'historial de cerca de la configuració</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Es mostra l\'historial de cerca de la configuració</string>
|
||||
<string name="revanced_settings_search_history_summary_off">L\'historial de cerca de la configuració no es mostra</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Desactivar la reproducció en segon pla de Shorts</string>
|
||||
@ -153,15 +160,18 @@ No se t'informarà de cap esdeveniment inesperat."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Amaga el botó \"M\'avisa\"</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">El botó està amagat</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">El botó es mostra</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Amaga l\'etiqueta \"La gent també ha mirat\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">L\'etiqueta s\'amaga</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">L\'etiqueta es mostra</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Amaga les etiquetes de recomanació de vídeos</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Les etiquetes «Altres usuaris també han vist» i «Potser també t\'agradarà» estan ocultes</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Les etiquetes «Altres usuaris també han vist» i «Potser també t\'agradarà» es mostren</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Amaga el botó \'Mostra més\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">El botó està amagat</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">El botó es mostra</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Amaga la secció de tiquets</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">La secció de tiquets està amagada</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">La secció de tiquets es mostra</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Amaga les reaccions temporitzades</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">S\'han amagat les reaccions temporitzades</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Es mostren les reaccions temporitzades</string>
|
||||
@ -231,6 +241,9 @@ No se t'informarà de cap esdeveniment inesperat."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Amaga «Resum de vídeo generat per IA»</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">S\'ha amagat la secció de resum del vídeo</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Es mostra la secció de resum del vídeo</string>
|
||||
<string name="revanced_hide_ask_section_title">Amaga la secció «Pregunta»</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">La secció «Pregunta» està amagada</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">La secció «Pregunta» es mostra</string>
|
||||
<string name="revanced_hide_attributes_section_title">Amaga els atributs</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Les seccions Llocs destacats, Jocs, Música i Persones esmentades s\'amaguen</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Les seccions Llocs destacats, Jocs, Música i Persones esmentades es mostren</string>
|
||||
@ -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"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Es mostra el vídeo suggerit de la pantalla final</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Amaga la superposició de vídeos relacionats a pantalla completa</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">La superposició de vídeos relacionats està amagada</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Es mostra la superposició de vídeos relacionats</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Amagar segell de temps del vídeo</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">El segell de temps està ocult</string>
|
||||
@ -831,10 +849,10 @@ Configuració → Reproducció → Reprodueix el vídeo següent automàticament
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Recarrega el vídeo per votar utilitzant Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Amagat per l\'amo</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Els \"no m\'agrada\" es mostren</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Els \"no m\'agrada\" no es mostren</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Els \"no m\'agrada\" es mostren</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Els \"no m\'agrada\" no es mostren</string>
|
||||
<string name="revanced_ryd_shorts_title">Mostrar \"no m\'agrada\" a Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Els \"no m'agrada\" als Shorts es mostren
|
||||
<string name="revanced_ryd_shorts_summary_on">"Els \"no m'agrada\" als Shorts es mostren
|
||||
|
||||
Limitació: és possible que els \"no m'agrada\" no apareguin en mode d'incògnit"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Els \"no m\'agrada\" als Shorts no es mostren</string>
|
||||
@ -851,7 +869,6 @@ Limitació: és possible que els \"no m'agrada\" no apareguin en mode d'incògni
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Mostrar una \"toast\" si l\'API no està disponible</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">La \"toast\" es mostra si Return YouTube Dislike no està disponible</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">La \"toast\" no es mostra si Return YouTube Dislike no està disponible</string>
|
||||
<string name="revanced_ryd_about">Quant a</string>
|
||||
<string name="revanced_ryd_attribution_summary">Les dades són proporcionades per l\'API de Return YouTube Dislike. Toca aquí per obtenir més informació</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Estadístiques de l\'API de ReturnYouTubeDislike d\'aquest dispositiu</string>
|
||||
@ -1057,7 +1074,7 @@ Preparat per enviar?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Editeu el temps del segment manualment</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Voleu editar el temps per a l\'inici o el final del segment?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Temps invàlid proporcionat</string>
|
||||
<string name="revanced_sb_stats">Estadístiques</string>
|
||||
<string name="revanced_sb_stats_title">Estadístiques</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Les estadístiques no estan disponibles temporalment (l\'API no funciona)</string>
|
||||
<string name="revanced_sb_stats_loading">S\'està carregant...</string>
|
||||
@ -1086,8 +1103,8 @@ Preparat per enviar?"</string>
|
||||
<string name="revanced_sb_color_invalid">Codi de color invàlid</string>
|
||||
<string name="revanced_sb_reset_color">Restableix el color</string>
|
||||
<string name="revanced_sb_reset">Restablir</string>
|
||||
<string name="revanced_sb_about">Quant a</string>
|
||||
<string name="revanced_sb_about_api_sum">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</string>
|
||||
<string name="revanced_sb_about_title">Quant a</string>
|
||||
<string name="revanced_sb_about_api_summary">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</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Factor de forma del disseny</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Nastavení ReVanced obnoveno do výchozího stavu</string>
|
||||
<string name="revanced_settings_import_success">Importováno %d nastavení</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importováni selhalo: %s</string>
|
||||
<string name="revanced_settings_search_hint">Hledat nastavení</string>
|
||||
<string name="revanced_settings_search_no_results_title">Nebyly nalezeny žádné výsledky pro \",%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Zkuste jiné klíčové slovo</string>
|
||||
<string name="revanced_settings_search_remove_message">Odebrat z historie vyhledávání?</string>
|
||||
<string name="revanced_show_menu_icons_title">Zobrazit ikony nastavení ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikony nastavení se zobrazují</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikony nastavení se nezobrazují</string>
|
||||
@ -93,6 +97,9 @@ Klepněte na tlačítko Pokračovat a povolte změny optimalizace."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Obnovit staré menu nastavení</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Staré menu nastavení se zobrazují</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Staré menu nastavení se nezobrazují</string>
|
||||
<string name="revanced_settings_search_history_title">Zobrazit historii vyhledávání v nastavení</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Historie vyhledávání v nastavení je zobrazena</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Historie vyhledávání nastavení se nezobrazuje</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Zakázat automatické přehrávání Shorts v pozadí</string>
|
||||
@ -153,15 +160,18 @@ Nebudete informováni o žádné neočekávané události."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Skrýt tlačitko \'Upozorněte mě\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Tlačítko je skryté</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Tlačítko je zobrazeno</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Skrýt štítek „Lidé také sledovali“</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Štítek je skrytý</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Štítek je zobrazen</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Skrýt popisky doporučení videí</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Popisky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ jsou skryté</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Popisky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ jsou zobrazené</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Skrýt tlačítko „Zobrazit více“</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Tlačítko je skryto</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Tlačítko je zobrazeno</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Skrýt panel Vstupenek</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Panel Vstupenek je skrytý</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Panel Vstupenek je zobrazen</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Skrýt reakce zobrazené po čase</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Reakce zobrazené po čase jsou skryty</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Reakce se zobrazují po čase</string>
|
||||
@ -231,6 +241,9 @@ Nebudete informováni o žádné neočekávané události."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Skrýt „Souhrn videa generovaný pomocí AI“</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Sekce se souhrnem videa je skrytá</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Sekce se souhrnem videa je zobrazena</string>
|
||||
<string name="revanced_hide_ask_section_title">Skrýt sekci Zeptat se</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Sekce Zeptat se je skrytá</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Sekce Zeptat se je zobrazena</string>
|
||||
<string name="revanced_hide_attributes_section_title">Skrýt atributy</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou skryté</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou zobrazené</string>
|
||||
@ -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"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Navrhované video na konci obrazovky se zobrazuje</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Skrýt překryv souvisejícího videa v režimu celé obrazovky</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Překryv souvisejícího videa je skrytý</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Překryv souvisejícího videa je zobrazen</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Skrýt čas videa</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Čas je skrytý</string>
|
||||
@ -831,10 +849,10 @@ Nastavení → Přehrávání → Automatické přehrávání dalšího videa"</
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Načtěte video znovu, abyste hlasovali pomocí Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Skryto vlastníkem</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Nelíbí se se zobrazují</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Nelíbí se se nezobrazují</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Nelíbí se se zobrazují</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Nelíbí se se nezobrazují</string>
|
||||
<string name="revanced_ryd_shorts_title">Zobrazit nelíbí se v Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Počty „Nelíbí se mi“ u Shorts jsou zobrazeny
|
||||
<string name="revanced_ryd_shorts_summary_on">"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"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Počty „Nelíbí se mi“ u Shorts nejsou zobrazeny</string>
|
||||
@ -851,7 +869,6 @@ Omezení: Počty „Nelíbí se mi“ se nemusí zobrazit v anonymním režimu"<
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Zobrazit toast, pokud API není dostupné</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Toast se zobrazí, pokud Return YouTube Dislike není dostupný</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Toast se nezobrazí, pokud Return YouTube Dislike není dostupný</string>
|
||||
<string name="revanced_ryd_about">O aplikaci</string>
|
||||
<string name="revanced_ryd_attribution_summary">Data jsou poskytována API Return YouTube Dislike. Klepnutím se dozvíte více</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Statistiky API ReturnYouTubeDislike tohoto zařízení</string>
|
||||
@ -1057,7 +1074,7 @@ Jste připraveni k odeslání?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Upravit načasování segmentu ručně</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Chcete upravit načasování pro začátek nebo konec segmentu?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Zadán neplatný čas</string>
|
||||
<string name="revanced_sb_stats">Statistiky</string>
|
||||
<string name="revanced_sb_stats_title">Statistiky</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Statistiky jsou dočasně nedostupné (server API je mimo provoz)</string>
|
||||
<string name="revanced_sb_stats_loading">Načítání...</string>
|
||||
@ -1086,8 +1103,8 @@ Jste připraveni k odeslání?"</string>
|
||||
<string name="revanced_sb_color_invalid">Neplatný kód barvy</string>
|
||||
<string name="revanced_sb_reset_color">Resetovat barvu</string>
|
||||
<string name="revanced_sb_reset">Výchozí</string>
|
||||
<string name="revanced_sb_about">O aplikaci</string>
|
||||
<string name="revanced_sb_about_api_sum">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</string>
|
||||
<string name="revanced_sb_about_title">O aplikaci</string>
|
||||
<string name="revanced_sb_about_api_summary">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</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Rozvržení formuláře</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced-indstillinger nulstillet til standard</string>
|
||||
<string name="revanced_settings_import_success">%d indstillinger importeret</string>
|
||||
<string name="revanced_settings_import_failure_parse">Import mislykkedes: %s</string>
|
||||
<string name="revanced_settings_search_hint">Søg i indstillinger</string>
|
||||
<string name="revanced_settings_search_no_results_title">Ingen resultater fundet for \'%s\'</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Prøv et andet søgeord</string>
|
||||
<string name="revanced_settings_search_remove_message">Fjern fra søgehistorik?</string>
|
||||
<string name="revanced_show_menu_icons_title">Vis ReVanced-indstillingsikoner</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Indstillingsikoner vises</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Indstillingsikoner vises ikke</string>
|
||||
@ -93,6 +97,9 @@ Tap på knappen Fortsæt, og tillad optimeringsændringer."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Gendan gamle indstillingsmenuer</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Gamle indstillingsmenuer er vist</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Gamle indstillingsmenuer er ikke vist</string>
|
||||
<string name="revanced_settings_search_history_title">Vis indstillingssøgehistorik</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Indstillingssøgehistorik vises</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Søgehistorik for indstillinger vises ikke</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Deaktiver baggrundsafspilning af Shorts</string>
|
||||
@ -151,12 +158,18 @@ Du modtager ikke notifikationer om uventede hændelser."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Skjul knappen \'Underret mig\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Knappen er skjult</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Knappen er vist</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Skjul etiketter for videoanbefalinger</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Etiketterne \"Folk så også\" og \"Du kan måske også lide\" er skjulte</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Etiketterne \"Folk så også\" og \"Du kan måske også lide\" vises</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Skjul knappen \'Vis mere\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Knappen er skjult</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Knappen er vist</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Skjul billetreolen</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Billetreolen er skjult</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Billetreolen vises</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Skjul tidsreaktioner</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Tidsreaktioner skjules</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Tidsreaktioner vises</string>
|
||||
@ -223,6 +236,9 @@ Du modtager ikke notifikationer om uventede hændelser."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Skjul \"AI-genereret videooversigt\"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Videooversigtssektionen er skjult</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Videooversigtssektionen vises</string>
|
||||
<string name="revanced_hide_ask_section_title">Skjul Spørg</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Spørgsmål sektionen er skjult</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Spørgsmål sektionen vises</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">Kapitler sektion er skjult</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">Kapitel afsnit er vist</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_on">Info-kort sektion er skjult</string>
|
||||
@ -757,6 +773,11 @@ Automatisk afspilning kan ændres i YouTube-indstillinger:
|
||||
Indstillinger → Afspilning → Afspil næste video automatisk"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Foreslået video på slutskærmen vises</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Skjul relateret video-overlay i fuldskærm</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Relateret video-overlay er skjult</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Relateret video-overlay vises</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Skjul tidsstempel på video</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Tidsstempel er skjult</string>
|
||||
@ -793,8 +814,8 @@ Indstillinger → Afspilning → Afspil næste video automatisk"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Genindlæs video for at stemme ved hjælp af Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Skjult af ejer</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Dislikationer vises</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Dislikationer vises ikke</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Dislikationer vises</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Dislikationer vises ikke</string>
|
||||
<string name="revanced_ryd_shorts_title">Vis ikke på Shorts</string>
|
||||
<string name="revanced_ryd_dislike_percentage_title">Synes ikke som procent</string>
|
||||
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
|
||||
@ -807,7 +828,6 @@ Indstillinger → Afspilning → Afspil næste video automatisk"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Vis en toast hvis API ikke er tilgængelig</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Toast vises, hvis Return YouTube Dislike ikke er tilgængelig</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Toast vises ikke, hvis Return YouTube Dislike ikke er tilgængelig</string>
|
||||
<string name="revanced_ryd_about">Om</string>
|
||||
<string name="revanced_ryd_attribution_summary">Data leveres af Return YouTube Dislike API. Tryk her for at få mere at vide</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statistikker for denne enhed</string>
|
||||
@ -1005,7 +1025,7 @@ Er du klar til at indsende?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Rediger timing af segment manuelt</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Vil du redigere timingen for start eller afslutning af segmentet?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Ugyldig tid givet</string>
|
||||
<string name="revanced_sb_stats">Statistik</string>
|
||||
<string name="revanced_sb_stats_title">Statistik</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_loading">Indlæser...</string>
|
||||
<string name="revanced_sb_stats_sb_disabled">SponsorBloker er deaktiveret</string>
|
||||
@ -1033,8 +1053,8 @@ Er du klar til at indsende?"</string>
|
||||
<string name="revanced_sb_color_invalid">Ugyldig farvekode</string>
|
||||
<string name="revanced_sb_reset_color">Nulstil farve</string>
|
||||
<string name="revanced_sb_reset">Nulstil</string>
|
||||
<string name="revanced_sb_about">Om</string>
|
||||
<string name="revanced_sb_about_api_sum">Data leveres af SponsorBlock API. Tryk her for at få flere oplysninger og se downloads til andre platforme</string>
|
||||
<string name="revanced_sb_about_title">Om</string>
|
||||
<string name="revanced_sb_about_api_summary">Data leveres af SponsorBlock API. Tryk her for at få flere oplysninger og se downloads til andre platforme</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Layout-formfaktor</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced-Einstellungen auf Standardwerte zurückgesetzt</string>
|
||||
<string name="revanced_settings_import_success">%d Einstellungen importiert</string>
|
||||
<string name="revanced_settings_import_failure_parse">Import fehlgeschlagen: %s</string>
|
||||
<string name="revanced_settings_search_hint">Sucheinstellungen</string>
|
||||
<string name="revanced_settings_search_no_results_title">Keine Ergebnisse für „%s“ gefunden</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Versuchen Sie ein anderes Schlüsselwort</string>
|
||||
<string name="revanced_settings_search_remove_message">Aus Suchverlauf entfernen?</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced-Einstellungssymbole anzeigen</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Einstellungssymbole werden angezeigt</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Einstellungssymbole werden nicht angezeigt</string>
|
||||
@ -89,6 +93,9 @@ Tippen Sie auf die Schaltfläche \"Fortfahren\" und erlauben Sie die Optimierung
|
||||
<string name="revanced_restore_old_settings_menus_title">Alte Einstellungsmenüs wiederherstellen</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Alte Einstellungsmenüs werden angezeigt</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Alte Einstellungsmenüs werden nicht angezeigt</string>
|
||||
<string name="revanced_settings_search_history_title">Suchverlauf der Einstellungen anzeigen</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Suchverlauf der Einstellungen wird angezeigt</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Der Suchverlauf der Einstellungen wird nicht angezeigt</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Shorts-Hintergrundwiedergabe deaktivieren</string>
|
||||
@ -149,15 +156,18 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">\'Benachrichtigungen\' Button ausblenden</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Button wird angezeigt</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">\'Leute haben auch angeschaut\'-Label ausblenden</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Label ist ausgeblendet</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Label wird angezeigt</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Videovorschlag-Labels ausblenden</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Die Labels „Nutzer haben sich auch angesehen“ und „Ihnen könnte auch gefallen“ sind ausgeblendet</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Die Labels „Nutzer haben sich auch angesehen“ und „Ihnen könnte auch gefallen“ werden angezeigt</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">\'Mehr anzeigen\' Button ausblenden</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Button wird angezeigt</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Ticket-Reihe ausblenden</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Ticket-Reihe ist ausgeblendet</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Ticket-Reihe wird angezeigt</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Zeitliche Reaktionen ausblenden</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Zeitgesteuerte Reaktionen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Zeitgesteuerte Reaktionen werden angezeigt</string>
|
||||
@ -227,6 +237,9 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">\'KI-generierte Videozusammenfassung\' ausblenden</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Videozusammenfassungsbereich ist ausgeblendet</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Videozusammenfassungsbereich wird angezeigt</string>
|
||||
<string name="revanced_hide_ask_section_title">Ask ausblenden</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Ask Abschnitt ist ausgeblendet</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Ask Abschnitt wird angezeigt</string>
|
||||
<string name="revanced_hide_attributes_section_title">Attribute ausblenden</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen werden angezeigt</string>
|
||||
@ -787,6 +800,11 @@ Die automatische Wiedergabe kann in den YouTube-Einstellungen geändert werden:
|
||||
Einstellungen → Wiedergabe → Nächstes Video automatisch abspielen"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Das vorgeschlagene Video auf dem Endbildschirm wird angezeigt</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Zugehöriges Video-Overlay im Vollbildmodus ausblenden</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Zugehöriges Video-Overlay ist ausgeblendet</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Zugehöriges Video-Overlay wird angezeigt</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Verstecke Video-Zeitstempel</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Zeitstempel ist ausgeblendet</string>
|
||||
@ -824,10 +842,10 @@ Einstellungen → Wiedergabe → Nächstes Video automatisch abspielen"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Video neu laden, um mit Return YouTube Dislike abzustimmen</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Vom Eigentümer verborgen</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Dislikes werden angezeigt</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Dislikes werden nicht angezeigt</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Dislikes werden angezeigt</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Dislikes werden nicht angezeigt</string>
|
||||
<string name="revanced_ryd_shorts_title">Dislikes auf Shorts anzeigen</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Dislikes für Shorts werden angezeigt
|
||||
<string name="revanced_ryd_shorts_summary_on">"Dislikes für Shorts werden angezeigt
|
||||
|
||||
Einschränkung: Dislikes werden möglicherweise nicht im Inkognito-Modus angezeigt"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Dislikes für Shorts werden nicht angezeigt</string>
|
||||
@ -844,7 +862,6 @@ Einschränkung: Dislikes werden möglicherweise nicht im Inkognito-Modus angezei
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Einen Toast anzeigen, wenn die API nicht verfügbar ist</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Toast wird angezeigt, wenn YouTube-Ablehnung nicht verfügbar ist</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Toast wird nicht angezeigt, wenn YouTube-Dislike nicht verfügbar ist</string>
|
||||
<string name="revanced_ryd_about">Über</string>
|
||||
<string name="revanced_ryd_attribution_summary">Daten werden von der YouTube Dislike API zurückgegeben. Tippe hier, um mehr zu erfahren</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Gibt die API-Statistiken dieses Geräts zurück</string>
|
||||
@ -1051,7 +1068,7 @@ Bereit zum Einreichen?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Timing des Segments manuell bearbeiten</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Möchtest du den Zeitpunkt für den Anfang oder das Ende des Segments bearbeiten?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Ungültige Zeit angegeben</string>
|
||||
<string name="revanced_sb_stats">Statistiken</string>
|
||||
<string name="revanced_sb_stats_title">Statistiken</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Statistiken sind vorübergehend nicht verfügbar (API ist ausgefallen)</string>
|
||||
<string name="revanced_sb_stats_loading">Lädt...</string>
|
||||
@ -1080,8 +1097,8 @@ Bereit zum Einreichen?"</string>
|
||||
<string name="revanced_sb_color_invalid">Ungültiger Farbcode</string>
|
||||
<string name="revanced_sb_reset_color">Farbe zurücksetzen</string>
|
||||
<string name="revanced_sb_reset">Zurücksetzen</string>
|
||||
<string name="revanced_sb_about">Über</string>
|
||||
<string name="revanced_sb_about_api_sum">Daten werden von der SponsorBlock API bereitgestellt. Tippe hier, um mehr zu erfahren und Downloads für andere Plattformen zu sehen</string>
|
||||
<string name="revanced_sb_about_title">Über</string>
|
||||
<string name="revanced_sb_about_api_summary">Daten werden von der SponsorBlock API bereitgestellt. Tippe hier, um mehr zu erfahren und Downloads für andere Plattformen zu sehen</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Anordnungsformfactor</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Επαναφέρθηκαν οι προεπιλεγμένες ρυθμίσεις ReVanced</string>
|
||||
<string name="revanced_settings_import_success">Έγινε εισαγωγή %d ρυθμίσεων</string>
|
||||
<string name="revanced_settings_import_failure_parse">Η εισαγωγή απέτυχε: %s</string>
|
||||
<string name="revanced_settings_search_hint">Αναζήτηση ρυθμίσεων</string>
|
||||
<string name="revanced_settings_search_no_results_title">Δεν βρέθηκαν αποτελέσματα για το \'%s\'</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Δοκιμάστε μια άλλη λέξη-κλειδί</string>
|
||||
<string name="revanced_settings_search_remove_message">Κατάργηση από το ιστορικό αναζήτησης;</string>
|
||||
<string name="revanced_show_menu_icons_title">Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Τα εικονίδια ρυθμίσεων εμφανίζονται</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Τα εικονίδια ρυθμίσεων δεν εμφανίζονται</string>
|
||||
@ -93,6 +97,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Επαναφορά παλιών μενού ρυθμίσεων</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Τα παλιά μενού ρυθμίσεων εμφανίζονται</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Τα νέα μενού ρυθμίσεων εμφανίζονται</string>
|
||||
<string name="revanced_settings_search_history_title">Εμφάνιση ιστορικού αναζήτησης ρυθμίσεων</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Το ιστορικό αναζήτησης ρυθμίσεων εμφανίζεται</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Το ιστορικό αναζήτησης ρυθμίσεων δεν εμφανίζεται</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Απενεργοποίηση αναπαραγωγής παρασκηνίου για τα Shorts</string>
|
||||
@ -155,15 +162,18 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Κουμπί «Να λαμβάνω ειδοποιήσεις»</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Εμφανίζεται</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Ετικέτα «Άλλοι χρήστες παρακολούθησαν επίσης»</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Εμφανίζεται</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Ετικέτες προτάσεων βίντεο</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Κρυμμένες\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει»</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Εμφανίζονται\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει»</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Κουμπί «Εμφάνιση περισσότερων»</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Ενότητα εισιτηρίων</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Συγχρονισμένες αντιδράσεις</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Εμφανίζονται</string>
|
||||
@ -233,6 +243,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Σύνοψη βίντεο που δημιουργήθηκε από AI</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_ask_section_title">Ενότητα «Ερώτηση»</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_attributes_section_title">Ενότητα ιδιοτήτων</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Κρυμμένη.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν»</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Εμφανίζεται.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν»</string>
|
||||
@ -796,6 +809,11 @@ Second \"item\" text"</string>
|
||||
Ρυθμίσεις → Αναπαραγωγή→ Αυτόματη αναπαραγωγή επόμενου βίντεο"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Εμφανίζεται</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Σχετιζόμενο βίντεο σε πλήρη οθόνη</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Εμφανίζεται</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Χρονική πρόοδος βίντεο</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Κρυμμένη</string>
|
||||
@ -833,10 +851,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Επαναφορτώστε το βίντεο για να ψηφίσετε χρησιμοποιώντας το Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Κρυμμένα από τον ιδιοκτήτη</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Τα «Δεν μου αρέσει» εμφανίζονται</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Τα «Δεν μου αρέσει» δεν εμφανίζονται</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Τα «Δεν μου αρέσει» εμφανίζονται</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Τα «Δεν μου αρέσει» δεν εμφανίζονται</string>
|
||||
<string name="revanced_ryd_shorts_title">Εμφάνιση στα Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Τα «Δεν μου αρέσει» εμφανίζονται στα Shorts
|
||||
<string name="revanced_ryd_shorts_summary_on">"Τα «Δεν μου αρέσει» εμφανίζονται στα Shorts
|
||||
|
||||
Περιορισμός: Ενδέχεται να μην εμφανίζονται σε ανώνυμη λειτουργία"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Τα «Δεν μου αρέσει» δεν εμφανίζονται στα Shorts</string>
|
||||
@ -851,9 +869,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_on">Τα βίντεο με απενεργοποιημένα «Μου αρέσει» εμφανίζουν έναν εκτιμώμενο αριθμό «Μου αρέσει»</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_off">Τα εκτιμώμενα «Μου αρέσει» δεν εμφανίζονται</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_ryd_about">Σχετικά με</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_ryd_attribution_summary">Τα δεδομένα Dislike παρέχονται από το API του Return YouTube Dislike. Πατήστε εδώ για να μάθετε περισσότερα</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Στατιστικά ReturnYouTubeDislike API αυτής της συσκευής</string>
|
||||
@ -911,8 +928,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Το κουμπί παράλειψης κρύβεται μετά από μερικά δευτερόλεπτα</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Το κουμπί παράλειψης εμφανίζεται σε όλο το τμήμα</string>
|
||||
<string name="revanced_sb_general_skiptoast">Εμφάνιση μηνύματος κατά την παράλειψη</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε για να δείτε ένα παράδειγμα</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης. Πατήστε για να δείτε ένα παράδειγμα</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε για να δείτε ένα παράδειγμα</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης. Πατήστε για να δείτε ένα παράδειγμα</string>
|
||||
<string name="revanced_sb_general_time_without">Εμφάνιση μήκους βίντεο χωρίς τα τμήματα</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">Εμφανίζεται το μήκος βίντεο μείον όλα τα τμήματα, σε παρένθεση δίπλα στο πλήρες μήκος βίντεο</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">Εμφανίζεται το πλήρες μήκος του βίντεο</string>
|
||||
@ -931,8 +948,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_guidelines_popup_open">Δείξτε μου</string>
|
||||
<string name="revanced_sb_general">Γενικά</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_title">Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_summary_on">Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_summary_off">Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_summary_on">Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_summary_off">Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_sb_general_skipcount">Mετρητής παραλείψεων τμημάτων</string>
|
||||
<string name="revanced_sb_general_skipcount_sum_on">Επιτρέπει στον πίνακα κατάταξης SponsorBlock να γνωρίζει πόσος χρόνος εξοικονομήθηκε. Αποστέλλεται ένα μήνυμα στον πίνακα κατάταξης κάθε φορά που παραλείπεται ένα τμήμα</string>
|
||||
<string name="revanced_sb_general_skipcount_sum_off">Ο μετρητής παραλείψεων δεν είναι ενεργός</string>
|
||||
@ -1059,7 +1076,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Επεξεργασία χρονισμού του τμήματος χειροκίνητα</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Θέλετε να επεξεργαστείτε τον χρονισμό του τμήματος από την αρχή ή από το τέλος του τμήματος;</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Δόθηκε μη έγκυρος χρόνος</string>
|
||||
<string name="revanced_sb_stats">Στατιστικά</string>
|
||||
<string name="revanced_sb_stats_title">Στατιστικά</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Τα στατιστικά είναι προσωρινά μη διαθέσιμα (το API είναι εκτός λειτουργίας)</string>
|
||||
<string name="revanced_sb_stats_loading">Φόρτωση...</string>
|
||||
@ -1088,8 +1105,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_color_invalid">Μη έγκυρος κωδικός χρώματος</string>
|
||||
<string name="revanced_sb_reset_color">Επαναφορά χρώματος</string>
|
||||
<string name="revanced_sb_reset">Επαναφορά</string>
|
||||
<string name="revanced_sb_about">Σχετικά με</string>
|
||||
<string name="revanced_sb_about_api_sum">Τα δεδομένα παρέχονται από το SponsorBlock API. Πατήστε για να μάθετε περισσότερα και να δείτε λήψεις για άλλες πλατφόρμες</string>
|
||||
<string name="revanced_sb_about_title">Σχετικά με</string>
|
||||
<string name="revanced_sb_about_api_summary">Τα δεδομένα παρέχονται από το SponsorBlock API. Πατήστε για να μάθετε περισσότερα και να δείτε λήψεις για άλλες πλατφόρμες</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Αλλαγή μορφής διάταξης</string>
|
||||
@ -1261,8 +1278,8 @@ Second \"item\" text"</string>
|
||||
|
||||
Πατήστε για να μάθετε περισσότερα για το DeArrow"</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">Να εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Να μην εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_title">Διεύθυνση API του DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">Η διεύθυνση URL του τελικού σημείου αποθήκευσης μικρογραφιών DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_title">Λήψεις ακίνητων καρέ</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Configuración ReVanced restablecida por defecto</string>
|
||||
<string name="revanced_settings_import_success">Configuración importada de %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Error de importación: %s</string>
|
||||
<string name="revanced_settings_search_hint">Ajustes de búsqueda</string>
|
||||
<string name="revanced_settings_search_no_results_title">No se encontraron resultados para «%s»</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Prueba con otra palabra clave</string>
|
||||
<string name="revanced_settings_search_remove_message">¿Quitar del historial de búsqueda?</string>
|
||||
<string name="revanced_show_menu_icons_title">Mostrar iconos de configuración de ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Se muestran los iconos de configuración</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">No se muestran los iconos de configuración</string>
|
||||
@ -92,6 +96,9 @@ Desactivar las optimizaciones de batería para MicroG no afectará negativamente
|
||||
<string name="revanced_restore_old_settings_menus_title">Restaurar los menús de configuración antiguos</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Se muestran los menús de configuración antiguos</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">No se muestran los menús de configuración antiguos</string>
|
||||
<string name="revanced_settings_search_history_title">Mostrar el historial de búsqueda de ajustes</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Se muestra el historial de búsqueda de ajustes</string>
|
||||
<string name="revanced_settings_search_history_summary_off">El historial de búsqueda de ajustes no se muestra</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Desactivar la reproducción en segundo plano de Shorts</string>
|
||||
@ -150,15 +157,18 @@ Desactivar las optimizaciones de batería para MicroG no afectará negativamente
|
||||
<string name="revanced_hide_notify_me_button_title">Ocultar el botón \'Notificarme\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Botón oculto</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Se muestra el botón</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Ocultar la etiqueta \"También vieron\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">La etiqueta está oculta</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Se muestra la etiqueta</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Ocultar etiquetas de recomendaciones de video</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Las etiquetas \"También vieron\" y \"También te puede gustar\" están ocultas</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Las etiquetas \"También vieron\" y \"También te puede gustar\" se muestran</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Ocultar botón \'Mostrar más\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Botón oculto</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Se muestra el botón</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Ocultar estante de boletos</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">El estante de boletos está oculto</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">El estante de boletos está visible</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Ocultar reacciones temporizadas</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Las reacciones temporizadas están ocultas</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Se muestran reacciones temporizadas</string>
|
||||
@ -228,6 +238,9 @@ Desactivar las optimizaciones de batería para MicroG no afectará negativamente
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Ocultar \"Resumen de video generado por IA\"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">La sección de resumen del video está oculta</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">La sección de resumen del video se muestra</string>
|
||||
<string name="revanced_hide_ask_section_title">Ocultar pregunta</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">La sección de preguntas está oculta</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Se muestra la sección de preguntas</string>
|
||||
<string name="revanced_hide_attributes_section_title">Ocultar atributos</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Las secciones Lugares destacados, Juegos, Música y Personas mencionadas están ocultas</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Las secciones Lugares destacados, Juegos, Música y Personas mencionadas se muestran</string>
|
||||
@ -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"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Se muestra el vídeo sugerido de la pantalla final</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Ocultar la superposición de videos relacionados en pantalla completa</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Se oculta la superposición de videos relacionados</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Se muestra la superposición de videos relacionados</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Ocultar fecha y hora de vídeo</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Marca de tiempo oculta</string>
|
||||
@ -828,10 +846,10 @@ Configuración → Reproducción → Reproducir el siguiente vídeo automáticam
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Recargar vídeo para votar usando Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Oculto por el propietario</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Dislikes son mostrados</string>
|
||||
<string name="revanced_ryd_enable_summary_off">No se muestran Dislikes</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Dislikes son mostrados</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">No se muestran Dislikes</string>
|
||||
<string name="revanced_ryd_shorts_title">Mostrar no me gusta en Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Los Dislikes en los Shorts se muestran
|
||||
<string name="revanced_ryd_shorts_summary_on">"Los Dislikes en los Shorts se muestran
|
||||
|
||||
Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">No se muestran los Dislikes en los Shorts</string>
|
||||
@ -848,7 +866,6 @@ Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito"<
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Mostrar un brindis si la API no está disponible</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Toast se muestra si Devolución de YouTube Dislike no está disponible</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Toast no se muestra si Devolución de YouTube Dislike no está disponible</string>
|
||||
<string name="revanced_ryd_about">Acerca de</string>
|
||||
<string name="revanced_ryd_attribution_summary">Los datos son proporcionados por la API de Retorno de YouTube. Pulse aquí para aprender más</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Devuelve las estadísticas de la API de este dispositivo</string>
|
||||
@ -1046,7 +1063,7 @@ Ya existe"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Modificar el tiempo del segmento manualmente</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">¿Quieres modificar el tiempo de inicio o final del segmento?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Tiempo dado no válido</string>
|
||||
<string name="revanced_sb_stats">Estadísticas</string>
|
||||
<string name="revanced_sb_stats_title">Estadísticas</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Las estadísticas no están disponibles temporalmente (la API está inactiva)</string>
|
||||
<string name="revanced_sb_stats_loading">Cargando...</string>
|
||||
@ -1075,8 +1092,8 @@ Ya existe"</string>
|
||||
<string name="revanced_sb_color_invalid">Código de color inválido</string>
|
||||
<string name="revanced_sb_reset_color">Reiniciar color</string>
|
||||
<string name="revanced_sb_reset">Restablecer</string>
|
||||
<string name="revanced_sb_about">Acerca de</string>
|
||||
<string name="revanced_sb_about_api_sum">Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas</string>
|
||||
<string name="revanced_sb_about_title">Acerca de</string>
|
||||
<string name="revanced_sb_about_api_summary">Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Diseño del diseño factor</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVancedi seaded on lähtestatud</string>
|
||||
<string name="revanced_settings_import_success">Imporditi %d seadet</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importimine ebaõnnestus: %s</string>
|
||||
<string name="revanced_settings_search_hint">Otsi seadetest</string>
|
||||
<string name="revanced_settings_search_no_results_title">Otsingule „%s” ei leitud tulemusi</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Proovi mõnda muud märksõna</string>
|
||||
<string name="revanced_settings_search_remove_message">Kas eemaldada otsinguajaloost?</string>
|
||||
<string name="revanced_show_menu_icons_title">Näita ReVancedi seadete ikoone</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Seadete ikoonid on näidatud</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Seadete ikoonid ei ole nähtavad</string>
|
||||
@ -93,6 +97,9 @@ Vajutage jätkamise nuppu ja lubage optimeerimismuutused."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Taasta vanad seadete menüüd</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Vanad seadete menüüd on kuvatud</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Vanad seadete menüüd ei ole kuvatud</string>
|
||||
<string name="revanced_settings_search_history_title">Kuva seadete otsinguajalugu</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Seadete otsinguajalugu on näidatud</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Seadete otsingu ajalugu ei kuvata</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Shorts taustavideo esitamine lülitada</string>
|
||||
@ -153,15 +160,18 @@ Teid ei teavitata ühestki ootamatust sündmusest."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Peida nupu \"Teata mulle\"</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Nupp on peidetud</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Nupp on kuvatud</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Peida silt \"Inimesed vaatasid ka\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Silt on peidetud</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Silt on kuvatud</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Peida video soovitusmärgised</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Märgised „Inimesed vaatasid ka“ ja „Sulle võib samuti meeldida“ on peidetud</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Märgised „Inimesed vaatasid ka“ ja „Sulle võib samuti meeldida“ on näidatud</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Peida nupp \"Kuva rohkem\"</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Nupp on peidetud</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Nupp on nähtav</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Peida pääsmeriiul</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Pääsmeriiul on peidetud</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Pääsmeriiul on nähtav</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Peida ajastatud reaktsioonid</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Ajastatud reaktsioonid on peidetud</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Ajastatud reaktsioonid on nähtavad</string>
|
||||
@ -231,6 +241,9 @@ Teid ei teavitata ühestki ootamatust sündmusest."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Peida „AI-ga loodud video kokkuvõte”</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Video kokkuvõtte osa on peidetud</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Video kokkuvõtte osa on näidatud</string>
|
||||
<string name="revanced_hide_ask_section_title">Peida küsi</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Küsi osa on peidetud</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Küsi osa on nähtav</string>
|
||||
<string name="revanced_hide_attributes_section_title">Peida atribuudid</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on peidetud</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on kuvatud</string>
|
||||
@ -794,6 +807,11 @@ Automaatesitust saab muuta YouTube'i seadetes:
|
||||
Seaded → Taasesitus → Esita järgmine video automaatselt"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Lõpuekraani soovitatud video on näidatud</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Peida seotud video ülekatte täisekraanil</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Seotud video ülekatte on peidetud</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Seotud video ülekatte on näidatud</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Peida video ajamärk</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Ajamärk on peidetud</string>
|
||||
@ -831,10 +849,10 @@ Seaded → Taasesitus → Esita järgmine video automaatselt"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Laadi video uuesti, et hääletada Return YouTube Dislike\'i abil</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Peidetud omaniku poolt</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Mittemeeldimised on nähtavad</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Mittemeeldimised pole nähtavad</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Mittemeeldimised on nähtavad</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Mittemeeldimised pole nähtavad</string>
|
||||
<string name="revanced_ryd_shorts_title">Näita mittemeeldimisi Shorts\'il</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Ei meeldimised on kuvatud teenuses Shorts
|
||||
<string name="revanced_ryd_shorts_summary_on">"Ei meeldimised on kuvatud teenuses Shorts
|
||||
|
||||
Piirang: Ei meeldimised ei pruugi inkognito režiimis kuvada"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Ei meeldimised pole kuvatud teenuses Shorts</string>
|
||||
@ -851,7 +869,6 @@ Piirang: Ei meeldimised ei pruugi inkognito režiimis kuvada"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Näita teadet, kui API pole saadaval</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Teade näidatakse, kui Return YouTube Dislike pole saadaval</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Teadet ei näidata, kui Return YouTube Dislike pole saadaval</string>
|
||||
<string name="revanced_ryd_about">Teave</string>
|
||||
<string name="revanced_ryd_attribution_summary">Andmed on pakutud Return YouTube Dislike API poolt. Puuduta siia, et saada lisateavet</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statistika sellel seadmel</string>
|
||||
@ -1058,7 +1075,7 @@ Kas olete esitamiseks valmis?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Muuda segmendi ajastust käsitsi</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Kas soovite muuta segmendi algus- või lõpppunkti ajastust?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Sisestatud aega ei ole võimalik analüüsida</string>
|
||||
<string name="revanced_sb_stats">Statistika</string>
|
||||
<string name="revanced_sb_stats_title">Statistika</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Statistika pole ajutiselt saadaval (API on maas)</string>
|
||||
<string name="revanced_sb_stats_loading">Laen...</string>
|
||||
@ -1087,8 +1104,8 @@ Kas olete esitamiseks valmis?"</string>
|
||||
<string name="revanced_sb_color_invalid">Vigane värvikood</string>
|
||||
<string name="revanced_sb_reset_color">Lähtesta värv</string>
|
||||
<string name="revanced_sb_reset">Lähtesta</string>
|
||||
<string name="revanced_sb_about">Teave</string>
|
||||
<string name="revanced_sb_about_api_sum">Andmed on pärit SponsorBlock API-st. Puudutage siia, et saada lisateavet ja vaadata allalaadimisi teistele platvormidele</string>
|
||||
<string name="revanced_sb_about_title">Teave</string>
|
||||
<string name="revanced_sb_about_api_summary">Andmed on pärit SponsorBlock API-st. Puudutage siia, et saada lisateavet ja vaadata allalaadimisi teistele platvormidele</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Paigutuse vormitegur</string>
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -64,7 +64,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -154,6 +154,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Revanced-asetukset nollattiin</string>
|
||||
<string name="revanced_settings_import_success">%d asetusta tuotiin</string>
|
||||
<string name="revanced_settings_import_failure_parse">Tuonti epäonnistui: %s</string>
|
||||
<string name="revanced_settings_search_hint">Hakuasetukset</string>
|
||||
<string name="revanced_settings_search_no_results_title">Tuloksia ei löytynyt haulle \"%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Kokeile toista avainsanaa</string>
|
||||
<string name="revanced_settings_search_remove_message">Poistetaanko hakuhistoriasta?</string>
|
||||
<string name="revanced_show_menu_icons_title">Näytä ReVanced-asetuskuvakkeet</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Asetuskuvakkeet näytetään</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Asetuskuvakkeita ei näytetä</string>
|
||||
@ -93,6 +97,9 @@ Napauta jatka-painiketta ja salli optimoinnin muutokset."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Palauta vanhat asetusvalikot</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Vanhat asetusvalikot näytetään</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Vanhoja asetusvalikoita ei näytetä</string>
|
||||
<string name="revanced_settings_search_history_title">Näytä asetusten hakuhistoria</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Asetusten hakuhistoria näytetään</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Asetusten hakuhistoriaa ei näytetä</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Poista Shortsien taustatoisto käytöstä</string>
|
||||
@ -153,15 +160,16 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Piilota \"Ilmoita minulle\" -painike</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Painike on piilotettu</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Painike näytetään</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Piilota \'\"Ihmiset katselivat myös\" -tunniste</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Tunniste on piilotettu</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Tunniste näytetään</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Piilota videosuositusten otsikot</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Piilota \"Näytä lisää\" -painike</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Painike on piilotettu</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Painike näytetään</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Piilota lippuhylly</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Lippuhylly on piilotettu</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Lippuhylly näytetään</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Piilota ajoitetut reaktiot</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Ajoitetut reaktiot on piilotettu</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Ajoitetut reaktiot näytetään</string>
|
||||
@ -791,6 +799,11 @@ Automaattista toistoa voidaan muuttaa YouTube-asetuksissa:
|
||||
Asetukset → Toisto → Toista seuraava video automaattisesti"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Loppunäytön ehdotettu video näytetään</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Piilota liittyvien videoiden peittokuva kokoruututilassa</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Liittyvien videoiden peittokuva on piilotettu</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Liittyvien videoiden peittokuva näytetään</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Piilota videon aikaleima</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Aikaleima on piilotettu</string>
|
||||
@ -828,10 +841,10 @@ Asetukset → Toisto → Toista seuraava video automaattisesti"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Lataa video uudelleen äänestääksesi Return YouTube Dislikellä</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Omistajan piilottama</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Ei-tykkäykset näytetään</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Ei-tykkäyksiä ei näytetä</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Ei-tykkäykset näytetään</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Ei-tykkäyksiä ei näytetä</string>
|
||||
<string name="revanced_ryd_shorts_title">Näytä ei-tykkykset Shortseissa</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Ei-tykkäykset näytetään Shortseissa
|
||||
<string name="revanced_ryd_shorts_summary_on">"Ei-tykkäykset näytetään Shortseissa
|
||||
|
||||
Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Ei-tykkäyksiä ei näytetä Shortseissa</string>
|
||||
@ -848,7 +861,6 @@ Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Näytä ponnahdusilmoitus, jos API ei ole käytettävissä</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Ponnahdusilmoitus näytetään, jos Return YouTube Dislike ei ole käytettävissä</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Ponnahdusilmoitusta ei näytetä, jos Return YouTube Dislike ei ole käytettävissä</string>
|
||||
<string name="revanced_ryd_about">Tietoja</string>
|
||||
<string name="revanced_ryd_attribution_summary">Tiedot ovat peräisin Return YouTube Disliken API:sta. Napauta tästä lukeaksesi lisää</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Tämän laitteen ReturnYouTubeDislike API -tilastot</string>
|
||||
@ -1055,7 +1067,7 @@ Oletko valmis lähettämään?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Muokkaa osion ajoitusta manuaalisesti</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Haluatko muokata osion alku- vai loppuaikaa?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Annettu aika on virheellinen</string>
|
||||
<string name="revanced_sb_stats">Tilastot</string>
|
||||
<string name="revanced_sb_stats_title">Tilastot</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Tilastot eivät tilapäisesti saatavilla (API ei ole käytettävissä)</string>
|
||||
<string name="revanced_sb_stats_loading">Ladataan...</string>
|
||||
@ -1084,8 +1096,8 @@ Oletko valmis lähettämään?"</string>
|
||||
<string name="revanced_sb_color_invalid">Virheellinen värikoodi</string>
|
||||
<string name="revanced_sb_reset_color">Nollaa väri</string>
|
||||
<string name="revanced_sb_reset">Nollaa</string>
|
||||
<string name="revanced_sb_about">Tietoja</string>
|
||||
<string name="revanced_sb_about_api_sum">Tiedot tarjoaa SponsorBlock API. Napauta tätä saadaksesi lisätietoja ja nähdäksesi lataukset muille alustoille</string>
|
||||
<string name="revanced_sb_about_title">Tietoja</string>
|
||||
<string name="revanced_sb_about_api_summary">Tiedot tarjoaa SponsorBlock API. Napauta tätä saadaksesi lisätietoja ja nähdäksesi lataukset muille alustoille</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Ulkoasun asettelu</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">I-reset ang mga ReVanced na setting sa default</string>
|
||||
<string name="revanced_settings_import_success">Na-import ang %d na mga setting</string>
|
||||
<string name="revanced_settings_import_failure_parse">Nabigo ang pag-import: %s</string>
|
||||
<string name="revanced_settings_search_hint">Maghanap ng mga setting</string>
|
||||
<string name="revanced_settings_search_no_results_title">Walang nakitang resulta para sa \'%s\'</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Subukan ang ibang keyword</string>
|
||||
<string name="revanced_settings_search_remove_message">Alisin sa history ng paghahanap?</string>
|
||||
<string name="revanced_show_menu_icons_title">Ipakita ang mga icon ng setting ng ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ipinapakita ang mga icon ng setting</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Hindi ipinapakita ang mga icon ng setting</string>
|
||||
@ -93,6 +97,9 @@ Tapikin ang pindutan ng pagpapatuloy at payagan ang mga pagbabago sa pag-optimiz
|
||||
<string name="revanced_restore_old_settings_menus_title">Ibalik ang dating mga menu ng setting</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Ipinapakita ang mga lumang menu ng setting</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Hindi ipinapakita ang mga lumang menu ng setting</string>
|
||||
<string name="revanced_settings_search_history_title">Ipakita ang history ng paghahanap sa mga setting</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Ipinapakita ang history ng paghahanap sa mga setting</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Hindi ipinapakita ang kasaysayan ng paghahanap sa Mga Setting</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">I-disable ang pag-playback ng Shorts sa background</string>
|
||||
@ -153,15 +160,18 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Itago ang button na \"Abisuhan ako\"</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Nakatago ang button</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Ang pindutan ay ipinapakita</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Itago ang label na \'Napanood din ng mga tao\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Nakatago ang label</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Ipinapakita ang label</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Itago ang mga label ng rekomendasyon sa video</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Nakatago ang mga label na \"\'People also watched\'\" at \"\'You might also like\'\"</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Ipinapakita ang mga label na \"\'People also watched\'\" at \"\'You might also like\'\"</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Itago ang button na \"Ipakita ang higit pa\"</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Nakatago ang button</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Ang pindutan ay ipinapakita</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Itago ang shelf ng ticket</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Nakatago ang ticket shelf</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Ipinapakita ang ticket shelf</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Itago ang mga naka-time na reaksyon</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Nakatago ang mga naka-time na reaksyon</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Ang mga naka-time na reaksyon ay ipinapakita</string>
|
||||
@ -231,6 +241,9 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Itago ang \'Buod ng video na binuo ng AI\'</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Nakatago ang seksyon ng buod ng video</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Ipinapakita ang seksyon ng buod ng video</string>
|
||||
<string name="revanced_hide_ask_section_title">Itago ang Magtanong</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Nakatago ang seksyon ng Magtanong</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Ipinapakita ang seksyon ng Magtanong</string>
|
||||
<string name="revanced_hide_attributes_section_title">Itago ang Mga Katangian</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Nakatago ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Ipinapakita ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit</string>
|
||||
@ -792,6 +805,11 @@ Maaaring baguhin ang Autoplay sa mga setting ng YouTube:
|
||||
Mga Setting → Pag-playback → I-autoplay ang susunod na video"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Ipinapakita ang iminungkahing video sa dulo ng screen</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Itago ang kaugnay na video overlay sa fullscreen</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Nakatago ang kaugnay na video overlay</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Ipinapakita ang kaugnay na video overlay</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Itago ang timestamp ng video</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Nakatago ang timestamp</string>
|
||||
@ -829,10 +847,10 @@ Mga Setting → Pag-playback → I-autoplay ang susunod na video"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">I-reload ang video para bumoto gamit ang Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Nakatago ng may-ari</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Ang mga hindi gusto ay ipinapakita</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Hindi ipinapakita ang mga hindi gusto</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Ang mga hindi gusto ay ipinapakita</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Hindi ipinapakita ang mga hindi gusto</string>
|
||||
<string name="revanced_ryd_shorts_title">Ipakita ang mga hindi gusto sa Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Ipinapakita ang mga Dislike sa Shorts
|
||||
<string name="revanced_ryd_shorts_summary_on">"Ipinapakita ang mga Dislike sa Shorts
|
||||
|
||||
Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Hindi ipinapakita ang mga Dislike sa Shorts</string>
|
||||
@ -849,7 +867,6 @@ Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Magpakita ng toast kung hindi available ang API</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Ipapakita ang toast kung hindi available ang Return YouTube Dislike</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Hindi ipinapakita ang toast kung hindi available ang Return YouTube Dislike</string>
|
||||
<string name="revanced_ryd_about">Tungkol</string>
|
||||
<string name="revanced_ryd_attribution_summary">Ang data ay ibinibigay ng Return YouTube Dislike API. Mag-tap dito para matuto pa</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statistics ng device na ito</string>
|
||||
@ -1056,7 +1073,7 @@ Isumite na ba?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Manu-manong i-edit ang timing ng segment</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Gusto mo bang i-edit ang timing para sa pagsisimula o pagtatapos ng segment?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Hindi wastong oras ang ibinigay</string>
|
||||
<string name="revanced_sb_stats">Istatistika</string>
|
||||
<string name="revanced_sb_stats_title">Istatistika</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Pansamantalang hindi available ang mga Stats (down ang API)</string>
|
||||
<string name="revanced_sb_stats_loading">Naglo-load...</string>
|
||||
@ -1085,8 +1102,8 @@ Isumite na ba?"</string>
|
||||
<string name="revanced_sb_color_invalid">Di-wastong code ng kulay</string>
|
||||
<string name="revanced_sb_reset_color">I-reset ang kulay</string>
|
||||
<string name="revanced_sb_reset">I-reset</string>
|
||||
<string name="revanced_sb_about">Tungkol</string>
|
||||
<string name="revanced_sb_about_api_sum">Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform</string>
|
||||
<string name="revanced_sb_about_title">Tungkol</string>
|
||||
<string name="revanced_sb_about_api_summary">Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Layout form factor</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Paramètres ReVanced réinitialisés aux valeurs par défaut</string>
|
||||
<string name="revanced_settings_import_success">%d paramètres importés</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importation échouée : %s</string>
|
||||
<string name="revanced_settings_search_hint">Rechercher dans les paramètres</string>
|
||||
<string name="revanced_settings_search_no_results_title">Aucun résultat trouvé pour \"%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Essayez un autre mot-clé</string>
|
||||
<string name="revanced_settings_search_remove_message">Supprimer de l\'historique des recherches ?</string>
|
||||
<string name="revanced_show_menu_icons_title">Afficher les icônes des paramètres ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Les icônes des paramètres sont affichées</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Les icônes des paramètres ne sont pas affichées</string>
|
||||
@ -93,6 +97,9 @@ Appuyez sur le bouton Continuer et autorisez les modifications."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Restaurer les anciens menus des paramètres</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Les anciens menus des paramètres sont affichés</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Les anciens menus des paramètres ne sont pas affichés</string>
|
||||
<string name="revanced_settings_search_history_title">Afficher l\'historique de recherche des paramètres</string>
|
||||
<string name="revanced_settings_search_history_summary_on">L\'historique de recherche des paramètres est affiché</string>
|
||||
<string name="revanced_settings_search_history_summary_off">L\'historique de recherche des paramètres n\'est pas affiché</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Désactiver la lecture en arrière-plan des Shorts</string>
|
||||
@ -153,15 +160,18 @@ Vous ne serez pas informé des événements inattendus."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Masquer le bouton M\'avertir</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Le bouton est masqué</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Le bouton est affiché</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Masquer le libellé \"Découvrez également cette vidéo\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Le libellé est masqué</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Le libellé est affiché</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Masquer les libellés de recommandation de vidéos</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Les libellés \"Les internautes ont aussi regardé\" et \"Découvrez également\" sont masqués</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Les libellés \"Les internautes ont aussi regardé\" et \"Découvrez également\" sont affichés</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Masquer le bouton Afficher plus</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Le bouton est masqué</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Le bouton est affiché</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Masquer l\'étagère des billets</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">L\'étagère des billets est masquée</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">L\'étagère des billets est affichée</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Masquer les réactions minutées</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Les réactions minutées sont masquées</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Les réactions minutées sont affichées</string>
|
||||
@ -231,6 +241,9 @@ Vous ne serez pas informé des événements inattendus."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Masquer \"Résumé de la vidéo généré par IA\"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">La section du résumé de la vidéo est masquée</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">La section du résumé de la vidéo est affichée</string>
|
||||
<string name="revanced_hide_ask_section_title">Masquer \"Demander\"</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">La section Demander est masquée</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">La section Demander est affichée</string>
|
||||
<string name="revanced_hide_attributes_section_title">Masquer les attributions</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont masquées</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont affichées</string>
|
||||
@ -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"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">L\'écran de fin suggérant une vidéo est affiché</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Masquer l\'overlay de vidéos similaires en plein écran</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">L\'overlay de vidéos similaires est masqué</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">L\'overlay de vidéos similaires est affiché</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Masquer le temps écoulé et la durée totale</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Le temps écoulé et la durée totale sont masqués</string>
|
||||
@ -831,10 +849,10 @@ Paramètres → Lecture → Lecture automatique de la vidéo suivante"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Rechargez la vidéo pour voter avec Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Masqué par le propriétaire</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Les \"Je n\'aime pas\" sont affichés</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Les \"Je n\'aime pas\" ne sont pas affichés</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Les \"Je n\'aime pas\" sont affichés</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Les \"Je n\'aime pas\" ne sont pas affichés</string>
|
||||
<string name="revanced_ryd_shorts_title">Afficher les \"Je n\'aime pas\" sur les Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Les \"Je n'aime pas\" sont affichés sur les Shorts
|
||||
<string name="revanced_ryd_shorts_summary_on">"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"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Les \"Je n\'aime pas\" ne sont pas affichés sur les Shorts</string>
|
||||
@ -851,7 +869,6 @@ Limitation : Il se peut que les \"Je n'aime pas\" n'apparaissent pas en mode na
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Afficher un message toast si l\'API n\'est pas disponible</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Un message toast est affiché si Return YouTube Dislike n\'est pas disponible</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Aucun message toast affiché si Return YouTube Dislike n\'est pas disponible</string>
|
||||
<string name="revanced_ryd_about">À propos</string>
|
||||
<string name="revanced_ryd_attribution_summary">Les données sont fournies par l\'API Return YouTube Dislike. Appuyez ici pour en savoir plus.</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Statistiques de l\'API Return Youtube Dislike pour cet appareil</string>
|
||||
@ -1057,7 +1074,7 @@ Prêt à soumettre ?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Modifier la durée du segment manuellement</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Voulez-vous modifier le début ou la fin du segment ?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Temps fourni invalide</string>
|
||||
<string name="revanced_sb_stats">Statistiques</string>
|
||||
<string name="revanced_sb_stats_title">Statistiques</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Les statistiques sont temporairement indisponibles (API injoignable)</string>
|
||||
<string name="revanced_sb_stats_loading">Chargement...</string>
|
||||
@ -1086,8 +1103,8 @@ Prêt à soumettre ?"</string>
|
||||
<string name="revanced_sb_color_invalid">Code couleur invalide</string>
|
||||
<string name="revanced_sb_reset_color">Réinitialiser la couleur</string>
|
||||
<string name="revanced_sb_reset">Réinitialiser</string>
|
||||
<string name="revanced_sb_about">À propos</string>
|
||||
<string name="revanced_sb_about_api_sum">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.</string>
|
||||
<string name="revanced_sb_about_title">À propos</string>
|
||||
<string name="revanced_sb_about_api_summary">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.</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Format de mise en page</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Athshocraigh socruithe ReVanced go réamhshocrú</string>
|
||||
<string name="revanced_settings_import_success">Iompórtáladh %d socruithe</string>
|
||||
<string name="revanced_settings_import_failure_parse">Theip ar allmhairiú: %s</string>
|
||||
<string name="revanced_settings_search_hint">Cuardaigh socruithe</string>
|
||||
<string name="revanced_settings_search_no_results_title">Ní bhfuarthas aon toradh ar \'%s\'</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Bain triail as eochairfhocal eile</string>
|
||||
<string name="revanced_settings_search_remove_message">Bain as stair an chuardaigh?</string>
|
||||
<string name="revanced_show_menu_icons_title">Taispeáin deilbhíní socruithe ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Taispeántar deilbhíní socruithe</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ní thaispeántar deilbhíní socraithe</string>
|
||||
@ -93,6 +97,9 @@ Brúigh an cnaipe leanúnaí agus ligean athruithe optúimíochta."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Athshocraigh roghanna seanghléasanna</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Taispeántar sean-roghchláir socruithe</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Ní thaispeántar sean-roghchláir socruithe</string>
|
||||
<string name="revanced_settings_search_history_title">Taispeáin stair cuardaigh na socruithe</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Taispeántar stair cuardaigh na socruithe</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Ní thaispeántar stair cuardaigh na socruithe</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Díchumasaigh seinnte Cúlra Shorts</string>
|
||||
@ -153,15 +160,18 @@ Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Folaigh cnaipe \'Cuir in iúl dom\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Tá an cnaipe i bhfolach</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Taispeántar an cnaipe</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Folaigh an lipéad \'D\'amharc daoine eile freisin\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Tá an lipéad i bhfolach</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Taispeántar an lipéad</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Folaigh lipéid moltaí físeáin</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Tá lipéid \",,D’fhéach daoine eile air freisin\",, agus \",,B’fhéidir gur mhaith leat é seo freisin\",, folaithe</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Tá lipéid \",,D’fhéach daoine eile air freisin\",, agus \",,B’fhéidir gur mhaith leat é seo freisin\",, ar taispeáint</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Folaigh cnaipe \'Taispeáin tuilleadh\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Tá an cnaipe i bhfolach</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Taispeántar an cnaipe</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Folaigh an seilf ticéad</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Tá an seilf ticéad i bhfolach</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Taispeántar an seilf ticéad</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Folaigh frithghníomhartha ama</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Tá frithghníomhartha ama i bhfolach</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Taispeántar frithghníomhartha ama</string>
|
||||
@ -231,6 +241,9 @@ Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Folaigh \'Achoimre físeáin arna giniúint ag AI\'</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Tá an chuid achoimre físeáin i bhfolach</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Taispeántar an chuid achoimre físeáin</string>
|
||||
<string name="revanced_hide_ask_section_title">Folaigh Fiafraigh</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Tá rannóg na Fiafraí i bhfolach</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Taispeántar rannóg na Fiafraí</string>
|
||||
<string name="revanced_hide_attributes_section_title">Folaigh Tréithe</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Tá ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear i bhfolach</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Taispeántar ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear</string>
|
||||
@ -794,6 +807,11 @@ Is féidir an uathshein a athrú i socruithe YouTube:
|
||||
Socruithe → Athsheinm → Uathshein físeán eile"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Taispeántar físeán molta deireadh scáileáin</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Folaigh forleagan físeáin ghaolmhair i mód lánscáileáin</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Tá forleagan físeáin ghaolmhair i bhfolach</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Taispeántar forleagan físeáin ghaolmhair</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Folaigh stampa ama an fhíseáin</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Tá stampa ama i bhfolach</string>
|
||||
@ -831,10 +849,10 @@ Socruithe → Athsheinm → Uathshein físeán eile"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Athlódáil físeán chun vótáil ag baint úsáide as Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">I bhfolach ag úinéir</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Taispeántar rudaí nach dtaitníonn leo</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Ní thaispeántar nach dtaitníonn leat</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Taispeántar rudaí nach dtaitníonn leo</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Ní thaispeántar nach dtaitníonn leat</string>
|
||||
<string name="revanced_ryd_shorts_title">Taispeáin neamhthaitníonn ar Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Taispeántar easaontais ar Shorts
|
||||
<string name="revanced_ryd_shorts_summary_on">"Taispeántar easaontais ar Shorts
|
||||
|
||||
Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Ní thaispeántar easaontais ar Shorts</string>
|
||||
@ -851,7 +869,6 @@ Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito"</strin
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Taispeáin tósta mura bhfuil API ar fáil</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Ní thaispeántar tóst mura bhfuil Return YouTube Dislike ar fáil</string>
|
||||
<string name="revanced_ryd_about">Maidir</string>
|
||||
<string name="revanced_ryd_attribution_summary">Soláthraíonn an API Return YouTube Dislike sonraí. Tapáil anseo chun tuilleadh a fhoghlaim</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Staitisticí API returnieYouTubeDislike den fheiste seo</string>
|
||||
@ -1058,7 +1075,7 @@ Maithe chun cur isteach?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Cuir uainiú deighleog in eagar</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Am neamhbhailí tugtha</string>
|
||||
<string name="revanced_sb_stats">Staitisticí</string>
|
||||
<string name="revanced_sb_stats_title">Staitisticí</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Níl stats ar fáil go sealadach (tá API síos)</string>
|
||||
<string name="revanced_sb_stats_loading">Á lódáil...</string>
|
||||
@ -1087,8 +1104,8 @@ Maithe chun cur isteach?"</string>
|
||||
<string name="revanced_sb_color_invalid">Cód dath neamhbhailí</string>
|
||||
<string name="revanced_sb_reset_color">Athshocraigh dath</string>
|
||||
<string name="revanced_sb_reset">Athshocraigh</string>
|
||||
<string name="revanced_sb_about">Maidir</string>
|
||||
<string name="revanced_sb_about_api_sum">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</string>
|
||||
<string name="revanced_sb_about_title">Maidir</string>
|
||||
<string name="revanced_sb_about_api_summary">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</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Fábos fóirmeanna foirmiúin</string>
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">A ReVanced beállítások visszaállnak az alapértelmezettre</string>
|
||||
<string name="revanced_settings_import_success">%d beállítás importálva</string>
|
||||
<string name="revanced_settings_import_failure_parse">Sikertelen importálás: %s</string>
|
||||
<string name="revanced_settings_search_hint">Beállítások keresése</string>
|
||||
<string name="revanced_settings_search_no_results_title">Nincs találat erre: „%s”</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Próbáljon ki egy másik kulcsszót</string>
|
||||
<string name="revanced_settings_search_remove_message">Eltávolítja a keresési előzményekből?</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced beállításikonok megjelenítése</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">A beállításikonok láthatók</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">A beállítások ikonjai nem jelennek meg</string>
|
||||
@ -93,6 +97,9 @@ Kattintson a folytatás gombra, és engedélyezze az optimalizálási módosít
|
||||
<string name="revanced_restore_old_settings_menus_title">Régi beállítási menük visszaállítása</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">A régi beállítások menüpontok megjelennek</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">A régi beállítások menüpontok nem jelennek meg</string>
|
||||
<string name="revanced_settings_search_history_title">Beállítások keresési előzményeinek megjelenítése</string>
|
||||
<string name="revanced_settings_search_history_summary_on">A beállítások keresési előzményei láthatók</string>
|
||||
<string name="revanced_settings_search_history_summary_off">A beállítások keresési előzményei nincsenek megjelenítve</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">A Shorts háttérben történő lejátszásának letiltása</string>
|
||||
@ -153,15 +160,18 @@ Nem fog értesülni semmilyen váratlan eseményről."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">\"Értesítést kérek\" gomb elrejtése</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">A gomb el van rejtve</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">A gomb megjelenik</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">A(z) „Mások is megnézték” felirat elrejtése</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">A címke rejtett</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">A címke látható</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Videóajánló címkék elrejtése</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">A „Nézők emellett ezt is megnézték” és a „Neked is tetszhet” címkék rejtve vannak</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">A „Nézők emellett ezt is megnézték” és a „Neked is tetszhet” címkék láthatók</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">\'Továbbiak megjelenítése\' gomb elrejtése</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">A gomb el van rejtve</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">A gomb megjelenik</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Jegyek polcának elrejtése</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">A jegyek polca el van rejtve</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">A jegyek polca látható</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Időzített reakciók elrejtése</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Az időzített reakciók elrejtve</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Az időzített reakciók megjelenítve</string>
|
||||
@ -231,6 +241,9 @@ Nem fog értesülni semmilyen váratlan eseményről."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">„AI-generált videó összefoglaló” elrejtése</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">A videó összefoglaló szekció rejtve</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">A videó összefoglaló szekció látható</string>
|
||||
<string name="revanced_hide_ask_section_title">Kérdezés elrejtése</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">A kérdezés szakasz el van rejtve</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">A kérdezés szakasz megjelenik</string>
|
||||
<string name="revanced_hide_attributes_section_title">Attribútumok elrejtése</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">A kiemelt helyek, játékok, zene és említett személyek szakaszai rejtettek</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">A kiemelt helyek, játékok, zene és említett személyek szakaszai láthatók</string>
|
||||
@ -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"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">A befejező képernyőn lévő javasolt videó látható</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Kapcsolódó videó fedőréteg elrejtése teljes képernyőn</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">A kapcsolódó videó fedőréteg rejtve van</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">A kapcsolódó videó fedőréteg látható</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Videó időbélyegzőjének elrejtése</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Az időbélyegző elrejtve</string>
|
||||
@ -831,10 +849,10 @@ Beállítások → Lejátszás → Következő videó automatikus lejátszása"<
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Töltse újra a videót a Return YouTube Dislike-hoz</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">A tulajdonos elrejtette</string>
|
||||
<string name="revanced_ryd_enable_summary_on">A nem tetszések megjelennek</string>
|
||||
<string name="revanced_ryd_enable_summary_off">A nem tetszések nem jelennek meg</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">A nem tetszések megjelennek</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">A nem tetszések nem jelennek meg</string>
|
||||
<string name="revanced_ryd_shorts_title">A nem tetszések megjelenítése a Shorts videóknál</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"A nem tetszések a Shorts-on láthatók
|
||||
<string name="revanced_ryd_shorts_summary_on">"A nem tetszések a Shorts-on láthatók
|
||||
|
||||
Korlátozás: A nem tetszések inkognitómódban nem jelenhetnek meg"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">A nem tetszések a Shorts-on nem láthatók</string>
|
||||
@ -851,7 +869,6 @@ Korlátozás: A nem tetszések inkognitómódban nem jelenhetnek meg"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Üzenet megjelenítése, ha az API nem elérhető</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Üzenet megjelenítése, ha a Return YouTube Dislike nem elérhető</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Nem jelenik meg üzenet, ha a Return YouTube Dislike nem elérhető</string>
|
||||
<string name="revanced_ryd_about">Rólunk</string>
|
||||
<string name="revanced_ryd_attribution_summary">Az adatokat a Return YouTube Dislike API biztosítja. További információért koppintson ide</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statisztika az eszközön</string>
|
||||
@ -1057,7 +1074,7 @@ Készen állsz a beküldésre?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">A szakasz időzítésének kézi beállítása</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Akarja szerkeszteni a rész kezdetének vagy végének időzítését?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Érvénytelen idő van megadva</string>
|
||||
<string name="revanced_sb_stats">Statisztikák</string>
|
||||
<string name="revanced_sb_stats_title">Statisztikák</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">A statisztikák átmenetileg nem érhetők el (az API nem működik)</string>
|
||||
<string name="revanced_sb_stats_loading">Betöltés...</string>
|
||||
@ -1086,8 +1103,8 @@ Készen állsz a beküldésre?"</string>
|
||||
<string name="revanced_sb_color_invalid">Érvénytelen színkód</string>
|
||||
<string name="revanced_sb_reset_color">Színek visszaállítása</string>
|
||||
<string name="revanced_sb_reset">Visszaállítás</string>
|
||||
<string name="revanced_sb_about">Rólunk</string>
|
||||
<string name="revanced_sb_about_api_sum">Az adatokat a SponsorBlock API biztosítja. Koppintson ide, ha többet szeretne megtudni és megtekintené a letöltéseket más platformokra</string>
|
||||
<string name="revanced_sb_about_title">Rólunk</string>
|
||||
<string name="revanced_sb_about_api_summary">Az adatokat a SponsorBlock API biztosítja. Koppintson ide, ha többet szeretne megtudni és megtekintené a letöltéseket más platformokra</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Elrendezési űrlap faktor</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced կարգավորումները վերադրվել են դեֆոլտային</string>
|
||||
<string name="revanced_settings_import_success">Import %d կարգավորում</string>
|
||||
<string name="revanced_settings_import_failure_parse">Import-ը ձախողվել է։ %s</string>
|
||||
<string name="revanced_settings_search_hint">Որոնման կարգավորումներ</string>
|
||||
<string name="revanced_settings_search_no_results_title">«%s»-ի համար արդյունքներ չեն գտնվել</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Փորձեք այլ հիմնաբառ</string>
|
||||
<string name="revanced_settings_search_remove_message">Հեռացնե՞լ որոնման պատմությունից:</string>
|
||||
<string name="revanced_show_menu_icons_title">Ցուցադրել ReVanced-ի կարգավորումների պատկերակները</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Կարգավորումների պատկերակները ցուցադրվում են</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Կարգավորումների պատկերակները ցուցադրված չեն</string>
|
||||
@ -93,6 +97,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_restore_old_settings_menus_title">Վերականգնել հին սահմանումների մենյուները</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Նախկին կարգավորումների մենյուները ցուցադրվում են</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Նախկին կարգավորումների մենյուները չեն ցուցադրվում</string>
|
||||
<string name="revanced_settings_search_history_title">Ցույց տալ կարգավորումների որոնման պատմությունը</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Կարգավորումների որոնման պատմությունը ցուցադրվում է</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Կարգավորումների որոնման պատմությունը ցույց չի տրվում</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Անջատել Shorts-ի ֆոնային վերարտադրությունը</string>
|
||||
@ -153,15 +160,18 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_notify_me_button_title">Թաքցնել \'Notify me\' կոճակը</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Կոճակը ցույց է տրվում</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Թաքցնել \"Դիտողները նաև դիտել են\" պիտակը</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Պիտակը թաքցված է</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Պիտակը ցուցադրվում է</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Թաքցնել տեսանյութի առաջարկությունների պիտակները</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">«Դիտել են նաև» և «Ձեզ նույնպես կարող է դուր գալ» պիտակները թաքցված են</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">«Դիտել են նաև» և «Ձեզ նույնպես կարող է դուր գալ» պիտակները ցուցադրվում են</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Թաքցնել \'Show more\' կոճակը</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Կոճակը ցույց է տրվում</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Թաքցնել տոմսարկղի մարզը</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Տոմսարկղի մարզը թաքցված է</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Տոմսարկղի մարզը ցուցադրվում է</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Թաքցնել ժամանակավոր ռեակցիաները</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Ժամանակավոր ռեակցիաները թաքցված են</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Ժամանակավոր ռեակցիաները ցույց են տրվում</string>
|
||||
@ -231,6 +241,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Թաքցնել «AI-ով ստեղծված տեսանյութի ամփոփումը»</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Տեսանյութի ամփոփման բաժինը թաքցված է</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Տեսանյութի ամփոփման բաժինը ցուցադրվում է</string>
|
||||
<string name="revanced_hide_ask_section_title">Թաքցնել հարցումը</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Հարցումների բաժինը թաքցված է</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Հարցումների բաժինը ցուցադրվում է</string>
|
||||
<string name="revanced_hide_attributes_section_title">Թաքցնել հատկանիշները</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները թաքցված են</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները ցուցադրվում են</string>
|
||||
@ -794,6 +807,11 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
Կարգավորումներ → Վերարտադրում → Ավտոմատ նվագարկել հաջորդ տեսանյութը"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Վերջնական էկրանին առաջարկվող տեսանյութը ցուցադրվում է</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Թաքցնել կապակցված տեսանյութի վահանակը լիաէկրան ռեժիմում</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Կապակցված տեսանյութի վահանակը թաքցված է</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Կապակցված տեսանյութի վահանակը ցուցադրվում է</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Թաքցնել տեսանյութի ժամանակային կետը</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Ժամանակային կետը թաքցված է</string>
|
||||
@ -831,10 +849,10 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Վերբեռնել տեսանյութը՝ քվեարկելու համար Return YouTube Dislike-ի միջոցով</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Թաքցված է սեփականատիրոջ կողմից</string>
|
||||
<string name="revanced_ryd_enable_summary_on">\"Dislike\"-երը ցուցադրվում են</string>
|
||||
<string name="revanced_ryd_enable_summary_off">\"Dislike\"-երը չեն ցուցադրվում</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">\"Dislike\"-երը ցուցադրվում են</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">\"Dislike\"-երը չեն ցուցադրվում</string>
|
||||
<string name="revanced_ryd_shorts_title">Ցուցադրել \"Dislike\"-երը Shorts-ում</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"\"Dislike\"-երը Shorts-ում ցուցադրվում են
|
||||
<string name="revanced_ryd_shorts_summary_on">"\"Dislike\"-երը Shorts-ում ցուցադրվում են
|
||||
|
||||
Սահմանափակում. \"Dislike\"-երը կարող են չերևալ անհայտ ռեժիմում"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">\"Dislike\"-երը Shorts-ում չեն ցուցադրվում</string>
|
||||
@ -851,7 +869,6 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Ցուցադրել \"toast\", եթե API-ն հասանելի չէ</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">\"Toast\"-ը ցուցադրվում է, եթե Return YouTube Dislike-ը հասանելի չէ</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">\"Toast\"-ը չի ցուցադրվում, եթե Return YouTube Dislike-ը հասանելի չէ</string>
|
||||
<string name="revanced_ryd_about">Ծրագրի մասին</string>
|
||||
<string name="revanced_ryd_attribution_summary">Տվյալները տրամադրվում են Return YouTube Dislike API-ի միջոցով. Սեղմեք այստեղ՝ ավելին իմանալու համար</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Return YouTube Dislike API-ի կարգավիճակը այս հարմարանքի համար</string>
|
||||
@ -1058,7 +1075,7 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Խմբագրեք հատվածի ժամանակը ձեռքով</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Մի՞թե ցանկանում եք խմբագրել հատվածի սկիզբը կամ ավարտը։</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Նշված ժամանակը անվավեր է</string>
|
||||
<string name="revanced_sb_stats">Վիճակագրություն</string>
|
||||
<string name="revanced_sb_stats_title">Վիճակագրություն</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Վիճակագրությունը ժամանակավորապես հասանելի չէ (API-ն անջատված է)</string>
|
||||
<string name="revanced_sb_stats_loading">Բեռնվում է...</string>
|
||||
@ -1087,8 +1104,8 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
|
||||
<string name="revanced_sb_color_invalid">Անվավեր գույնի կոդ</string>
|
||||
<string name="revanced_sb_reset_color">Վերագործարկել գույնը</string>
|
||||
<string name="revanced_sb_reset">Վերագործարկել</string>
|
||||
<string name="revanced_sb_about">Ծրագրի մասին</string>
|
||||
<string name="revanced_sb_about_api_sum">Տվյալները մատուցվում են SponsorBlock API-ի կողմից։ Սեղմեք այստեղ՝ ավելի շատ իմանալու և այլ հարթակների համար ներբեռնումները տեսնելու</string>
|
||||
<string name="revanced_sb_about_title">Ծրագրի մասին</string>
|
||||
<string name="revanced_sb_about_api_summary">Տվյալները մատուցվում են SponsorBlock API-ի կողմից։ Սեղմեք այստեղ՝ ավելի շատ իմանալու և այլ հարթակների համար ներբեռնումները տեսնելու</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Ձևաչափի փոփոխություն</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Pengaturan ReVanced diatur ke setelan awal</string>
|
||||
<string name="revanced_settings_import_success">Mengimpor setelan %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Impor gagal: %s</string>
|
||||
<string name="revanced_settings_search_hint">Pengaturan pencarian</string>
|
||||
<string name="revanced_settings_search_no_results_title">Tidak ada hasil yang ditemukan untuk \'%s\'</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Coba kata kunci lain</string>
|
||||
<string name="revanced_settings_search_remove_message">Hapus dari riwayat pencarian?</string>
|
||||
<string name="revanced_show_menu_icons_title">Tampilkan ikon pengaturan ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikon pengaturan ditampilkan</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikon pengaturan tidak ditampilkan</string>
|
||||
@ -93,6 +97,9 @@ Ketuk tombol lanjutkan dan izinkan perubahan pengoptimalan."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Pulihkan menu pengaturan lama</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Menu pengaturan lama ditampilkan</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Menu pengaturan lama tidak ditampilkan</string>
|
||||
<string name="revanced_settings_search_history_title">Tampilkan pengaturan riwayat pencarian</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Pengaturan riwayat pencarian ditampilkan</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Pengaturan riwayat pencarian tidak ditampilkan</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Nonaktifkan pemutaran Shorts di latar belakang</string>
|
||||
@ -153,15 +160,18 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Sembunyikan \'Beri tahu saya\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Tombol disembunyikan</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Tombol ditampilkan</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Sembunyikan label \'Orang juga menonton\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Label disembunyikan</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Label ditampilkan</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Sembunyikan label rekomendasi video</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Label \'Orang lain juga menonton\' dan \'Anda mungkin juga suka\' disembunyikan</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Label \'Orang lain juga menonton\' dan \'Anda mungkin juga suka\' ditampilkan</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Sembunyikan tombol \'Tampilkan selengkapnya\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Tombol disembunyikan</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Tombol ditampilkan</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Sembunyikan rak tiket</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Rak tiket disembunyikan</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">Rak tiket ditampilkan</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Sembunyikan reaksi terjadwal</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Reaksi terjadwal disembunyikan</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Reaksi terjadwal ditampilkan</string>
|
||||
@ -231,6 +241,9 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Sembunyikan \'Ringkasan video yang dibuat AI\'</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Bagian ringkasan video disembunyikan</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Bagian ringkasan video ditampilkan</string>
|
||||
<string name="revanced_hide_ask_section_title">Sembunyikan Tanya</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">Bagian Tanya disembunyikan</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">Bagian Tanya ditampilkan</string>
|
||||
<string name="revanced_hide_attributes_section_title">Sembunyikan Atribut</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang disembunyikan</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang ditampilkan</string>
|
||||
@ -794,6 +807,11 @@ Pemutaran otomatis dapat diubah di pengaturan YouTube:
|
||||
Pengaturan → Pemutaran → Putar otomatis video berikutnya"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Video yang disarankan di layar akhir ditampilkan</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Sembunyikan hamparan video terkait dalam layar penuh</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">Hamparan video terkait disembunyikan</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">Hamparan video terkait ditampilkan</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Sembunyikan timestamp video</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Timestamp disembunyikan</string>
|
||||
@ -831,10 +849,10 @@ Pengaturan → Pemutaran → Putar otomatis video berikutnya"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Muat ulang video untuk memilih Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Disembunyikan oleh pemilik</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Dislike ditampilkan</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Dislike tidak ditampilkan</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">Dislike ditampilkan</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">Dislike tidak ditampilkan</string>
|
||||
<string name="revanced_ryd_shorts_title">Tampilkan dislike di Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Dislike pada Shorts ditampilkan
|
||||
<string name="revanced_ryd_shorts_summary_on">"Dislike pada Shorts ditampilkan
|
||||
|
||||
Batasan: Dislike mungkin tidak muncul dalam mode penyamaran"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Dislike pada Shorts tidak ditampilkan</string>
|
||||
@ -851,7 +869,6 @@ Batasan: Dislike mungkin tidak muncul dalam mode penyamaran"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Tampilkan pesan timbul jika API tidak tersedia</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia</string>
|
||||
<string name="revanced_ryd_about">Tentang</string>
|
||||
<string name="revanced_ryd_attribution_summary">Data disediakan oleh API Return YouTube Dislike. Tekan di sini untuk mempelajari lebih lanjut</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Statistik API ReturnYoutubeDislike dari perangkat ini</string>
|
||||
@ -1057,7 +1074,7 @@ Siap mengirim?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Ubah waktu segmen secara manual</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Apakah Anda ingin menubah waktu awal atau akhir segmen?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Waktu yang diberikan tidak sah</string>
|
||||
<string name="revanced_sb_stats">Statistik</string>
|
||||
<string name="revanced_sb_stats_title">Statistik</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Statistik sementara tidak tersedia (API tidak aktif)</string>
|
||||
<string name="revanced_sb_stats_loading">Memuat...</string>
|
||||
@ -1086,8 +1103,8 @@ Siap mengirim?"</string>
|
||||
<string name="revanced_sb_color_invalid">Kode warna tidak sah</string>
|
||||
<string name="revanced_sb_reset_color">Atur ulang warna</string>
|
||||
<string name="revanced_sb_reset">Setel ulang</string>
|
||||
<string name="revanced_sb_about">Tentang</string>
|
||||
<string name="revanced_sb_about_api_sum">Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain</string>
|
||||
<string name="revanced_sb_about_title">Tentang</string>
|
||||
<string name="revanced_sb_about_api_summary">Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Faktor bentuk tata letak</string>
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Reimposta le impostazioni di ReVanced a quelle predefinite</string>
|
||||
<string name="revanced_settings_import_success">Importate %d impostazioni</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importazione non riuscita: %s</string>
|
||||
<string name="revanced_settings_search_hint">Cerca impostazioni</string>
|
||||
<string name="revanced_settings_search_no_results_title">Nessun risultato trovato per \".%s\"</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Prova un\'altra parola chiave</string>
|
||||
<string name="revanced_settings_search_remove_message">Rimuovere dalla cronologia di ricerca?</string>
|
||||
<string name="revanced_show_menu_icons_title">Mostra le icone delle impostazioni di ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Le icone delle impostazioni vengono mostrate</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Le icone delle impostazioni non vengono mostrate</string>
|
||||
@ -93,6 +97,9 @@ Tocca il pulsante Continua e consenti le modifiche di ottimizzazione."</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Ripristina i vecchi menu delle impostazioni</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">I vecchi menu delle impostazioni vengono mostrati</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">I vecchi menu delle impostazioni non vengono mostrati</string>
|
||||
<string name="revanced_settings_search_history_title">Mostra la cronologia di ricerca delle impostazioni</string>
|
||||
<string name="revanced_settings_search_history_summary_on">La cronologia di ricerca delle impostazioni è visualizzata</string>
|
||||
<string name="revanced_settings_search_history_summary_off">La cronologia di ricerca delle impostazioni non viene mostrata</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Disattiva la riproduzione degli Shorts in background</string>
|
||||
@ -153,15 +160,18 @@ Non sarai notificato di eventi imprevisti."</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Nascondi il pulsante \'Avvisami\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Il pulsante è nascosto</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Il pulsante è visibile</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Nascondi l\'etichetta \"Altri utenti hanno guardato\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">L\'etichetta è nascosta</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">L\'etichetta è visibile</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">Nascondi le etichette dei video consigliati</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">Le etichette \"Altri video guardati\" e \"Potrebbe piacerti anche\" sono nascoste</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">Le etichette \"Altri video guardati\" e \"Potrebbe piacerti anche\" sono mostrate</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Nascondi il pulsante \'Mostra di più\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Il pulsante è nascosto</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Il pulsante è visibile</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Nascondi la sezione dei biglietti</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">La sezione dei biglietti è nascosta</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">La sezione dei biglietti è visibile</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Nascondi le reazioni a tempo</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Le reazioni a tempo sono nascoste</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Le reazioni a tempo sono visibili</string>
|
||||
@ -231,6 +241,9 @@ Non sarai notificato di eventi imprevisti."</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Nascondi \"Riepilogo video generato dall\'AI\"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">La sezione del riepilogo video è nascosta</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">La sezione del riepilogo video è visibile</string>
|
||||
<string name="revanced_hide_ask_section_title">Nascondi \"Chiedi\"</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">La sezione \"Chiedi\" è nascosta</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">La sezione \"Chiedi\" è visibile</string>
|
||||
<string name="revanced_hide_attributes_section_title">Nascondi Attributi</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono nascoste</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono visibili</string>
|
||||
@ -794,6 +807,11 @@ L'autoplay può essere modificato nelle impostazioni di YouTube:
|
||||
Impostazioni → Riproduzione → Riproduzione automatica video successivo"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">Il video suggerito nella schermata finale è mostrato</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">Nascondi la sovrapposizione dei video correlati a schermo intero</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">La sovrapposizione dei video correlati è nascosta</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">La sovrapposizione dei video correlati è visualizzata</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">Nascondi timestamp video</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">Il timestamp è nascosto</string>
|
||||
@ -831,10 +849,10 @@ Impostazioni → Riproduzione → Riproduzione automatica video successivo"</str
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Ricarica il video per votare usando Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Nascosto dal proprietario</string>
|
||||
<string name="revanced_ryd_enable_summary_on">I Non Mi Piace sono visibili</string>
|
||||
<string name="revanced_ryd_enable_summary_off">I Non Mi Piace non sono visibili</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">I Non Mi Piace sono visibili</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">I Non Mi Piace non sono visibili</string>
|
||||
<string name="revanced_ryd_shorts_title">Mostra i Non Mi Piace degli Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"I \"Non mi piace\" sugli Shorts sono visualizzati
|
||||
<string name="revanced_ryd_shorts_summary_on">"I \"Non mi piace\" sugli Shorts sono visualizzati
|
||||
|
||||
Limitazione: i \"Non mi piace\" potrebbero non apparire in modalità incognito"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">I \"Non mi piace\" sugli Shorts non sono visualizzati</string>
|
||||
@ -851,7 +869,6 @@ Limitazione: i \"Non mi piace\" potrebbero non apparire in modalità incognito"<
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Mostra un toast se l\'API non è disponibile</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Una notifica è mostrata se Return YouTube Dislike non è disponibile</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Nessuna notifica viene mostrata se Return YouTube Dislike non è disponibile</string>
|
||||
<string name="revanced_ryd_about">Informazioni</string>
|
||||
<string name="revanced_ryd_attribution_summary">I dati vengono forniti dall\'API Return YouTube Dislike. Tocca qui per saperne di più</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">Statistiche dell\'API di ReturnYouTubeDislike per questo dispositivo</string>
|
||||
@ -1057,7 +1074,7 @@ Pronto per l'invio?"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Modifica manualmente i tempi del segmento</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Vuoi modificare il tempo di l\'inizio o la fine del segmento?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Minutaggio fornito non valido</string>
|
||||
<string name="revanced_sb_stats">Statistiche</string>
|
||||
<string name="revanced_sb_stats_title">Statistiche</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">Le statistiche non sono temporaneamente disponibili (l\'API non è attiva)</string>
|
||||
<string name="revanced_sb_stats_loading">Caricamento...</string>
|
||||
@ -1086,8 +1103,8 @@ Pronto per l'invio?"</string>
|
||||
<string name="revanced_sb_color_invalid">Codice colore non valido</string>
|
||||
<string name="revanced_sb_reset_color">Ripristina colore</string>
|
||||
<string name="revanced_sb_reset">Reimposta</string>
|
||||
<string name="revanced_sb_about">Informazioni</string>
|
||||
<string name="revanced_sb_about_api_sum">I dati sono forniti dall\'API di SponsorBlock. Tocca qui per saperne di più e vedere i download per altre piattaforme</string>
|
||||
<string name="revanced_sb_about_title">Informazioni</string>
|
||||
<string name="revanced_sb_about_api_summary">I dati sono forniti dall\'API di SponsorBlock. Tocca qui per saperne di più e vedere i download per altre piattaforme</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Fattore di forma del layout</string>
|
||||
|
@ -153,10 +153,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_notify_me_button_title">הסתר לחצן \'אני רוצה לקבל התראה\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">הלחצן מוסתר</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">הלחצן מוצג</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">הסתר תווית \'אנשים צפו גם\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">התווית מוסתרת</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">התווית מוצגת</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">הסתר לחצן \'הצג עוד\'</string>
|
||||
@ -778,6 +775,8 @@ Second \"item\" text"</string>
|
||||
הגדרות ← הפעלה ← הפעלה אוטומטית של הסרטון הבא"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">סרטון מוצע של מסך סיום מוצג</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">הסתר חותמת זמן של סרטון</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">חותמת זמן מוסתרת</string>
|
||||
@ -815,10 +814,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">רענן סרטון כדי להצביע באמצעות Return YouTube Dislike</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">מוסתר על ידי הבעלים</string>
|
||||
<string name="revanced_ryd_enable_summary_on">דיסלייקים מוצגים</string>
|
||||
<string name="revanced_ryd_enable_summary_off">דיסלייקים אינם מוצגים</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">דיסלייקים מוצגים</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">דיסלייקים אינם מוצגים</string>
|
||||
<string name="revanced_ryd_shorts_title">הצג דיסלייקים ב-Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"דיסלייקים ב-Shorts מוצגים
|
||||
<string name="revanced_ryd_shorts_summary_on">"דיסלייקים ב-Shorts מוצגים
|
||||
|
||||
מגבלה: ייתכן שלא יופיעו דיסלייקים במצב פרטי"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">דיסלייקים ב-Shorts אינם מוצגים</string>
|
||||
@ -835,7 +834,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">הצג הודעה קופצת אם ה-API אינו זמין</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">הודעה קופצת מוצגת אם Return YouTube Dislike אינו זמין</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">הודעה קופצת אינה מוצגת אם Return YouTube Dislike אינו זמין</string>
|
||||
<string name="revanced_ryd_about">אודות</string>
|
||||
<string name="revanced_ryd_attribution_summary">הנתונים מסופקים על ידי Return YouTube Dislike API. הקש כאן כדי ללמוד עוד</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">סטטיסטיקת ReturnYouTubeDislike API של מכשיר זה</string>
|
||||
@ -1041,7 +1039,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">ערוך את תזמון המקטע באופן ידני</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">האם ברצונך לערוך את התזמון עבור ההתחלה או הסיום של המקטע?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">ניתן זמן לא חוקי</string>
|
||||
<string name="revanced_sb_stats">סטטיסטיקה</string>
|
||||
<string name="revanced_sb_stats_title">סטטיסטיקה</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">סטטיסטיקה אינה זמינה באופן זמני (API מושבת)</string>
|
||||
<string name="revanced_sb_stats_loading">טוען...</string>
|
||||
@ -1070,8 +1068,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_color_invalid">קוד צבע לא חוקי</string>
|
||||
<string name="revanced_sb_reset_color">אפס צבע</string>
|
||||
<string name="revanced_sb_reset">איפוס</string>
|
||||
<string name="revanced_sb_about">אודות</string>
|
||||
<string name="revanced_sb_about_api_sum">הנתונים מסופקים על ידי SponsorBlock API. הקש כאן כדי ללמוד עוד ולראות הורדות עבור פלטפורמות אחרות</string>
|
||||
<string name="revanced_sb_about_title">אודות</string>
|
||||
<string name="revanced_sb_about_api_summary">הנתונים מסופקים על ידי SponsorBlock API. הקש כאן כדי ללמוד עוד ולראות הורדות עבור פלטפורמות אחרות</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">גורם צורת הפריסה</string>
|
||||
|
@ -42,6 +42,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced 設定をデフォルトにリセット</string>
|
||||
<string name="revanced_settings_import_success">%d 個の設定をインポートしました</string>
|
||||
<string name="revanced_settings_import_failure_parse">インポート失敗: %s</string>
|
||||
<string name="revanced_settings_search_hint">設定を検索</string>
|
||||
<string name="revanced_settings_search_no_results_title">\'%s\' に一致する設定は見つかりませんでした</string>
|
||||
<string name="revanced_settings_search_no_results_summary">別のキーワードを試してください</string>
|
||||
<string name="revanced_settings_search_remove_message">検索履歴から削除しますか?</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced 設定にアイコンを表示する</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">ReVanced 設定にアイコンが表示されます</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">ReVanced 設定にアイコンは表示されません</string>
|
||||
@ -94,6 +98,9 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_restore_old_settings_menus_title">設定メニューを旧バージョンに戻す</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">旧バージョンの設定メニューが表示されます</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">通常の設定メニューが表示されます</string>
|
||||
<string name="revanced_settings_search_history_title">設定の検索履歴を表示する</string>
|
||||
<string name="revanced_settings_search_history_summary_on">設定の検索履歴は表示されます</string>
|
||||
<string name="revanced_settings_search_history_summary_off">設定の検索履歴は表示されません</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">ショート動画のバックグラウンド再生を無効にする</string>
|
||||
@ -156,15 +163,18 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_hide_notify_me_button_title">「通知を受け取る」ボタンを非表示</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">「通知を受け取る」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">「通知を受け取る」ボタンは表示されます</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">「他の人はこの動画も視聴しています」ラベルを非表示</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">「他の人はこの動画も視聴しています」ラベルは表示されません</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">「他の人はこの動画も視聴しています」ラベルは表示されます</string>
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendation_labels_title">おすすめラベルを非表示</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_on">サムネイル下の「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは表示されません</string>
|
||||
<string name="revanced_hide_search_result_recommendation_labels_summary_off">サムネイル下の「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは表示されます</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">「もっと見る」ボタンを非表示</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">「もっと見る」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">「もっと見る」ボタンは表示されます</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">チケット欄を非表示</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">チケット欄は表示されません</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_off">チケット欄は表示されます</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Timed Reaction を非表示</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Timed Reaction とチャット欄のハートマーク アイコンは表示されません</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Timed Reaction とチャット欄のハートマー ク アイコンは表示されます</string>
|
||||
@ -234,6 +244,9 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">「AI 生成による動画の要約」を非表示</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">動画の要約セクションは表示されません</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">動画の要約セクションは表示されます</string>
|
||||
<string name="revanced_hide_ask_section_title">質問セクションを非表示</string>
|
||||
<string name="revanced_hide_ask_section_summary_on">質問セクションは表示されません</string>
|
||||
<string name="revanced_hide_ask_section_summary_off">質問セクションは表示されます</string>
|
||||
<string name="revanced_hide_attributes_section_title">関連情報を非表示</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">注目の場所 / ゲーム / 音楽 / 言及された人物セクションは表示されません</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">注目の場所 / ゲーム / 音楽 / 言及された人物セクションは表示されます</string>
|
||||
@ -790,12 +803,17 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_hide_shorts_navigation_bar_summary_off">ナビゲーション バーは表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
<string name="revanced_end_screen_suggested_video_title">再生終了時の「関連動画」を非表示</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_on">"「関連動画」は、再生終了時にプレーヤー画面に表示されませんが、自動再生がオンの場合は自動で再生されます
|
||||
<string name="revanced_end_screen_suggested_video_title">再生終了時の「関連動画」オーバーレイを非表示</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_on">"再生終了時に、「関連動画」オーバーレイはプレーヤー画面に表示されませんが、自動再生がオンの場合は次の動画が自動で再生されます
|
||||
|
||||
自動再生の設定は YouTube の設定で変更できます:
|
||||
設定 → 再生 → 次の動画を自動再生"</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">「関連動画」は、再生終了時にプレーヤー画面に表示されます</string>
|
||||
<string name="revanced_end_screen_suggested_video_summary_off">再生終了時に、「関連動画」オーバーレイがプレーヤー画面に表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
<string name="revanced_hide_related_video_overlay_title">全画面表示の「次の動画」オーバーレイを非表示</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_on">「次の動画」オーバーレイは表示されません</string>
|
||||
<string name="revanced_hide_related_video_overlay_summary_off">「次の動画」オーバーレイは表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">タイムスタンプを非表示</string>
|
||||
@ -834,10 +852,10 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Return YouTube Dislike を使用するには動画を再読み込みしてください</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">所有者によって非表示</string>
|
||||
<string name="revanced_ryd_enable_summary_on">低評価数が表示されます</string>
|
||||
<string name="revanced_ryd_enable_summary_off">低評価数は表示されません</string>
|
||||
<string name="revanced_ryd_enabled_summary_on">低評価数が表示されます</string>
|
||||
<string name="revanced_ryd_enabled_summary_off">低評価数は表示されません</string>
|
||||
<string name="revanced_ryd_shorts_title">Shortsで低評価数を表示する</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Shortsの低評価が表示されます
|
||||
<string name="revanced_ryd_shorts_summary_on">"Shortsの低評価が表示されます
|
||||
|
||||
制限事項: シークレット モードでは低評価が表示されない場合があります"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Shortsの低評価は表示されません</string>
|
||||
@ -854,7 +872,6 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">API 利用不可時にトーストを表示</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Return YouTube Dislike が利用できない場合、トースト ポップアップが表示されます</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Return YouTube Dislike が利用できない場合でもトースト ポップアップは表示されません</string>
|
||||
<string name="revanced_ryd_about">Return YouTube Dislike について</string>
|
||||
<string name="revanced_ryd_attribution_summary">このデータはReturn YouTube Dislike APIによって提供されています。詳細はここをタップしてください</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">このデバイスでのReturnYouTubeDislike API 統計情報</string>
|
||||
@ -1058,7 +1075,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">セグメントのタイミングを手動で編集</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">セグメントの開始または終了のタイミングを編集しますか?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">時間の値が無効です</string>
|
||||
<string name="revanced_sb_stats">統計</string>
|
||||
<string name="revanced_sb_stats_title">統計</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">統計情報は一時的に利用できません (API がダウンしています)</string>
|
||||
<string name="revanced_sb_stats_loading">読み込み中...</string>
|
||||
@ -1087,8 +1104,8 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_sb_color_invalid">色の値が無効です</string>
|
||||
<string name="revanced_sb_reset_color">色をリセット</string>
|
||||
<string name="revanced_sb_reset">リセット</string>
|
||||
<string name="revanced_sb_about">SponsorBlock について</string>
|
||||
<string name="revanced_sb_about_api_sum">SponsorBlock APIによって提供されるデータです。詳細はこちらをタップしてください。</string>
|
||||
<string name="revanced_sb_about_title">SponsorBlock について</string>
|
||||
<string name="revanced_sb_about_api_summary">SponsorBlock APIによって提供されるデータです。詳細はこちらをタップしてください。</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">レイアウト</string>
|
||||
@ -1231,9 +1248,9 @@ Automotive レイアウト
|
||||
<string name="revanced_seekbar_custom_color_summary_on">編集したシークバーの色が表示されます</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_off">デフォルトのシークバーの色が表示されます</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_title">シークバーの色</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_summary">シークバーの色を編集します</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_summary">シークバーの色の値を編集します</string>
|
||||
<string name="revanced_seekbar_custom_color_accent_title">シークバーのアクセント カラー</string>
|
||||
<string name="revanced_seekbar_custom_color_accent_summary">シークバーのアクセントカラーを編集します</string>
|
||||
<string name="revanced_seekbar_custom_color_accent_summary">シークバーのアクセントカラーの値を編集します</string>
|
||||
<string name="revanced_seekbar_custom_color_invalid">シークバーの色の値が無効です</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
@ -44,7 +44,7 @@ Second \"item\" text"</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
|
||||
@ -134,6 +134,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.time.hideTimestampPatch">
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.playerPopupPanelsPatch">
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user