mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-16 06:02:27 +01:00
Compare commits
41 Commits
v5.19.0-de
...
v5.19.1-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9ff7092fe | ||
|
|
d451bc6d6d | ||
|
|
741fd36872 | ||
|
|
517f8cf59a | ||
|
|
b78fb24435 | ||
|
|
a3faccb21b | ||
|
|
5f0fddc122 | ||
|
|
854a18ff72 | ||
|
|
b994a16bdc | ||
|
|
f68d06dbf3 | ||
|
|
04c6a2e5f4 | ||
|
|
e6ae55fa99 | ||
|
|
fb62474ff4 | ||
|
|
e084f01fd0 | ||
|
|
d573386e0f | ||
|
|
0f3aeb35e5 | ||
|
|
e30f593af0 | ||
|
|
df965b8a9b | ||
|
|
654587a75e | ||
|
|
9956833781 | ||
|
|
c585b26188 | ||
|
|
de0d11fcfb | ||
|
|
d321504fcf | ||
|
|
6005c97bf5 | ||
|
|
e404d84c83 | ||
|
|
1abed31968 | ||
|
|
a75a88d3c6 | ||
|
|
3d67d90473 | ||
|
|
fa1e137a43 | ||
|
|
ac71a53c73 | ||
|
|
0bff207efc | ||
|
|
e1a8b388a5 | ||
|
|
628d18489c | ||
|
|
36772b8b2e | ||
|
|
49c849979f | ||
|
|
0bdb8cdf2b | ||
|
|
2035c9e2e9 | ||
|
|
7cb38fd3fc | ||
|
|
8ed9d5bf08 | ||
|
|
cd467d6244 | ||
|
|
fdefb67d02 |
157
CHANGELOG.md
157
CHANGELOG.md
@@ -1,3 +1,160 @@
|
||||
## [5.19.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.19.1-dev.1...v5.19.1-dev.2) (2025-04-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Google Photos:** Restore patching with ReVanced Manager ([#4773](https://github.com/ReVanced/revanced-patches/issues/4773)) ([3e18e86](https://github.com/ReVanced/revanced-patches/commit/3e18e868bbd9fd0600fe81a7fe8767b4bd89a00e))
|
||||
|
||||
## [5.19.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.19.0...v5.19.1-dev.1) (2025-04-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify:** Restore patching with ReVanced Manager ([#4769](https://github.com/ReVanced/revanced-patches/issues/4769)) ([89d44da](https://github.com/ReVanced/revanced-patches/commit/89d44da171c3f56f13112d1d82bc4ea4a56c7c06))
|
||||
|
||||
# [5.19.0](https://github.com/ReVanced/revanced-patches/compare/v5.18.0...v5.19.0) (2025-04-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Google Photos - Restore hidden 'Back up while charging' toggle:** Constrain to last working app target ([#4761](https://github.com/ReVanced/revanced-patches/issues/4761)) ([152bb7c](https://github.com/ReVanced/revanced-patches/commit/152bb7c3ee7cf36bc07460e7a3444631ec540441))
|
||||
* **Google Photos:** Remove obsolete non functional patch `Restore hidden 'Back up while charging' toggle` ([#4764](https://github.com/ReVanced/revanced-patches/issues/4764)) ([56e48f4](https://github.com/ReVanced/revanced-patches/commit/56e48f4c89da51f81ff11a79a164eaa5b440690e))
|
||||
* **Spotify - Custom theme:** Override more color resources ([#4690](https://github.com/ReVanced/revanced-patches/issues/4690)) ([d7a7a0b](https://github.com/ReVanced/revanced-patches/commit/d7a7a0b982dbafa181b04f984a5f7618fb067c2a))
|
||||
* **Spotify - Unlock Spotify Premium:** Remove restrictions for Google voice assistant ([#4702](https://github.com/ReVanced/revanced-patches/issues/4702)) ([106202f](https://github.com/ReVanced/revanced-patches/commit/106202f9ebb7699c4ba4ae46b82133e35f1ac6b9))
|
||||
* **Spotify:** Remove ads sections from home ([#4722](https://github.com/ReVanced/revanced-patches/issues/4722)) ([0b9a5e7](https://github.com/ReVanced/revanced-patches/commit/0b9a5e7f89a89d971762b3539166d4f145111481))
|
||||
* **Twitter - Hide recommended users:** Make hiding work again by filtering for new entryId prefix ([#4456](https://github.com/ReVanced/revanced-patches/issues/4456)) ([ff846b0](https://github.com/ReVanced/revanced-patches/commit/ff846b0b7ef5060caaffedb08c1f901172f5b2d1))
|
||||
* **YouTube - Hide layout components:** Do not hide video description music/game links if hide horizontal shelves is enabled ([3864f35](https://github.com/ReVanced/revanced-patches/commit/3864f3550153617e23ad9979fb543d8a7fb4dc0a))
|
||||
* **YouTube - Hide player flyout menu items:** Show more detailed summary text for 'Hide Audio track' if using Android spoof client ([#4756](https://github.com/ReVanced/revanced-patches/issues/4756)) ([b67bbb2](https://github.com/ReVanced/revanced-patches/commit/b67bbb299669336addb68cf52a8ce5b39c68cec0))
|
||||
* **YouTube - Remove background playback restrictions:** Do not show media controls when playing Shorts from the feed ([2ed675c](https://github.com/ReVanced/revanced-patches/commit/2ed675cdd058fb5876381a9d30dee5263f6b2e26))
|
||||
* **YouTube - Return YouTube Dislike:** Correctly update label after disliking a Short with 20.07 ([0bb3e32](https://github.com/ReVanced/revanced-patches/commit/0bb3e32244fa10809aee5c4e549f77ed4054537e))
|
||||
* **YouTube - Return YouTube Dislike:** Fix inconsistent label after disliking a Short ([ea92a2e](https://github.com/ReVanced/revanced-patches/commit/ea92a2e36c7aab3bd115f7d0ec40467179485b32))
|
||||
* **YouTube - Seekbar:** Correctly hide the feed seekbar with target 20.07 ([ddc6e4c](https://github.com/ReVanced/revanced-patches/commit/ddc6e4c34fe35fa34bd859bf34e25645a23dbdc9))
|
||||
* **YouTube:** Combine multiple seekbar patches into a single patch ([#4705](https://github.com/ReVanced/revanced-patches/issues/4705)) ([503b7eb](https://github.com/ReVanced/revanced-patches/commit/503b7eb8d413ef7f248394f128f3b2a6f3192ba6))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Angulus:** Add `Hide ads` patch ([#4604](https://github.com/ReVanced/revanced-patches/issues/4604)) ([87c86b5](https://github.com/ReVanced/revanced-patches/commit/87c86b53a91b0054ac892a3f02bbe7bf83bbf813))
|
||||
* **Messenger:** Add `Remove Meta AI tab` patch ([#4726](https://github.com/ReVanced/revanced-patches/issues/4726)) ([e3fad97](https://github.com/ReVanced/revanced-patches/commit/e3fad97484d7eb962aeb53d44a0047b34a881071))
|
||||
* **Photomath:** Support latest version ([#4672](https://github.com/ReVanced/revanced-patches/issues/4672)) ([8e16483](https://github.com/ReVanced/revanced-patches/commit/8e1648322948151e4565fb0d86e0f37d0a02d73f))
|
||||
* **Proton Mail:** Add `Remove 'Sent from' signature` patch ([#4514](https://github.com/ReVanced/revanced-patches/issues/4514)) ([34c14c9](https://github.com/ReVanced/revanced-patches/commit/34c14c9b443092824d035afd77adb678c6f89e3e))
|
||||
* **Spotify:** Add `Check environment` patch ([#4765](https://github.com/ReVanced/revanced-patches/issues/4765)) ([6d7101c](https://github.com/ReVanced/revanced-patches/commit/6d7101cb2e546e01a934eff9cad1264367aeafe3))
|
||||
* **Spotify:** Add limited support for version `8.6.98.900` (last version that supports Kenwood and Pioneer car stereos) ([#4750](https://github.com/ReVanced/revanced-patches/issues/4750)) ([a3fde87](https://github.com/ReVanced/revanced-patches/commit/a3fde874af993125ba7a741820e7bd48e3641b84))
|
||||
* **Strava - Disable subscription suggestions:** Make compatible with latest version ([#4739](https://github.com/ReVanced/revanced-patches/issues/4739)) ([649a2c0](https://github.com/ReVanced/revanced-patches/commit/649a2c06161c72a2040b179dbed5b415847d7527))
|
||||
* **YouTube - Settings:** Add icons to the ReVanced settings ([#4496](https://github.com/ReVanced/revanced-patches/issues/4496)) ([d0c85f0](https://github.com/ReVanced/revanced-patches/commit/d0c85f044083d720c63a8ea4ff15d42eefeb9db7))
|
||||
|
||||
# [5.19.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.16...v5.19.0-dev.17) (2025-04-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Spotify:** Add `Check environment` patch ([#4765](https://github.com/ReVanced/revanced-patches/issues/4765)) ([6d7101c](https://github.com/ReVanced/revanced-patches/commit/6d7101cb2e546e01a934eff9cad1264367aeafe3))
|
||||
|
||||
# [5.19.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.15...v5.19.0-dev.16) (2025-04-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Google Photos:** Remove obsolete non functional patch `Restore hidden 'Back up while charging' toggle` ([#4764](https://github.com/ReVanced/revanced-patches/issues/4764)) ([56e48f4](https://github.com/ReVanced/revanced-patches/commit/56e48f4c89da51f81ff11a79a164eaa5b440690e))
|
||||
|
||||
# [5.19.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.14...v5.19.0-dev.15) (2025-04-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Google Photos - Restore hidden 'Back up while charging' toggle:** Constrain to last working app target ([#4761](https://github.com/ReVanced/revanced-patches/issues/4761)) ([152bb7c](https://github.com/ReVanced/revanced-patches/commit/152bb7c3ee7cf36bc07460e7a3444631ec540441))
|
||||
|
||||
# [5.19.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.13...v5.19.0-dev.14) (2025-04-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Unlock Spotify Premium:** Remove restrictions for Google voice assistant ([#4702](https://github.com/ReVanced/revanced-patches/issues/4702)) ([106202f](https://github.com/ReVanced/revanced-patches/commit/106202f9ebb7699c4ba4ae46b82133e35f1ac6b9))
|
||||
|
||||
# [5.19.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.12...v5.19.0-dev.13) (2025-04-11)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Spotify:** Add limited support for version `8.6.98.900` (last version that supports Kenwood and Pioneer car stereos) ([#4750](https://github.com/ReVanced/revanced-patches/issues/4750)) ([a3fde87](https://github.com/ReVanced/revanced-patches/commit/a3fde874af993125ba7a741820e7bd48e3641b84))
|
||||
|
||||
# [5.19.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.11...v5.19.0-dev.12) (2025-04-11)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Strava - Disable subscription suggestions:** Make compatible with latest version ([#4739](https://github.com/ReVanced/revanced-patches/issues/4739)) ([649a2c0](https://github.com/ReVanced/revanced-patches/commit/649a2c06161c72a2040b179dbed5b415847d7527))
|
||||
|
||||
# [5.19.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.10...v5.19.0-dev.11) (2025-04-10)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Messenger:** Add `Remove Meta AI tab` patch ([#4726](https://github.com/ReVanced/revanced-patches/issues/4726)) ([e3fad97](https://github.com/ReVanced/revanced-patches/commit/e3fad97484d7eb962aeb53d44a0047b34a881071))
|
||||
|
||||
# [5.19.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.9...v5.19.0-dev.10) (2025-04-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide layout components:** Do not hide video description music/game links if hide horizontal shelves is enabled ([3864f35](https://github.com/ReVanced/revanced-patches/commit/3864f3550153617e23ad9979fb543d8a7fb4dc0a))
|
||||
|
||||
# [5.19.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.8...v5.19.0-dev.9) (2025-04-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide player flyout menu items:** Show more detailed summary text for 'Hide Audio track' if using Android spoof client ([#4756](https://github.com/ReVanced/revanced-patches/issues/4756)) ([b67bbb2](https://github.com/ReVanced/revanced-patches/commit/b67bbb299669336addb68cf52a8ce5b39c68cec0))
|
||||
|
||||
# [5.19.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.7...v5.19.0-dev.8) (2025-04-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Return YouTube Dislike:** Fix inconsistent label after disliking a Short ([ea92a2e](https://github.com/ReVanced/revanced-patches/commit/ea92a2e36c7aab3bd115f7d0ec40467179485b32))
|
||||
|
||||
# [5.19.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.6...v5.19.0-dev.7) (2025-04-07)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Return YouTube Dislike:** Correctly update label after disliking a Short with 20.07 ([0bb3e32](https://github.com/ReVanced/revanced-patches/commit/0bb3e32244fa10809aee5c4e549f77ed4054537e))
|
||||
|
||||
# [5.19.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.5...v5.19.0-dev.6) (2025-04-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify:** Remove ads sections from home ([#4722](https://github.com/ReVanced/revanced-patches/issues/4722)) ([0b9a5e7](https://github.com/ReVanced/revanced-patches/commit/0b9a5e7f89a89d971762b3539166d4f145111481))
|
||||
|
||||
# [5.19.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.4...v5.19.0-dev.5) (2025-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spotify - Custom theme:** Override more color resources ([#4690](https://github.com/ReVanced/revanced-patches/issues/4690)) ([d7a7a0b](https://github.com/ReVanced/revanced-patches/commit/d7a7a0b982dbafa181b04f984a5f7618fb067c2a))
|
||||
|
||||
# [5.19.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.3...v5.19.0-dev.4) (2025-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Seekbar:** Correctly hide the feed seekbar with target 20.07 ([ddc6e4c](https://github.com/ReVanced/revanced-patches/commit/ddc6e4c34fe35fa34bd859bf34e25645a23dbdc9))
|
||||
|
||||
# [5.19.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.2...v5.19.0-dev.3) (2025-04-02)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Proton Mail:** Add `Remove 'Sent from' signature` patch ([#4514](https://github.com/ReVanced/revanced-patches/issues/4514)) ([34c14c9](https://github.com/ReVanced/revanced-patches/commit/34c14c9b443092824d035afd77adb678c6f89e3e))
|
||||
|
||||
# [5.19.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.1...v5.19.0-dev.2) (2025-04-02)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Settings:** Add icons to the ReVanced settings ([#4496](https://github.com/ReVanced/revanced-patches/issues/4496)) ([d0c85f0](https://github.com/ReVanced/revanced-patches/commit/d0c85f044083d720c63a8ea4ff15d42eefeb9db7))
|
||||
|
||||
# [5.19.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.18.1-dev.2...v5.19.0-dev.1) (2025-04-01)
|
||||
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -799,4 +800,14 @@ public class Utils {
|
||||
builder.getContext().setTheme(editTextDialogStyle);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a color resource or hex code to an int representation of the color.
|
||||
*/
|
||||
public static int getColorFromString(String colorString) throws IllegalArgumentException, Resources.NotFoundException {
|
||||
if (colorString.startsWith("#")) {
|
||||
return Color.parseColor(colorString);
|
||||
}
|
||||
return getResourceColor(colorString);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,11 @@ public class BaseSettings {
|
||||
|
||||
public static final EnumSetting<AppLanguage> REVANCED_LANGUAGE = new EnumSetting<>("revanced_language", AppLanguage.DEFAULT, true, "revanced_language_user_dialog_message");
|
||||
|
||||
/**
|
||||
* Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing.
|
||||
*/
|
||||
public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true);
|
||||
|
||||
public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
|
||||
public static final EnumSetting<AppLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AppLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
|
||||
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));
|
||||
|
||||
@@ -86,7 +86,6 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Initialize this instance, and do any custom behavior.
|
||||
* <p>
|
||||
@@ -95,7 +94,10 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
||||
* so all app specific {@link Setting} instances are loaded before this method returns.
|
||||
*/
|
||||
protected void initialize() {
|
||||
final var identifier = Utils.getResourceIdentifier("revanced_prefs", "xml");
|
||||
String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get()
|
||||
? "revanced_prefs_icons"
|
||||
: "revanced_prefs";
|
||||
final var identifier = Utils.getResourceIdentifier(preferenceResourceName, "xml");
|
||||
if (identifier == 0) return;
|
||||
addPreferencesFromResource(identifier);
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package app.revanced.extension.spotify.layout.theme;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class CustomThemePatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static long getThemeColor(String colorString) {
|
||||
try {
|
||||
return Utils.getColorFromString(colorString);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "Invalid custom color: " + colorString, ex);
|
||||
return Color.BLACK;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.spotify.home.evopage.homeapi.proto;
|
||||
|
||||
public final class Section {
|
||||
public static final int VIDEO_BRAND_AD_FIELD_NUMBER = 20;
|
||||
public static final int IMAGE_BRAND_AD_FIELD_NUMBER = 21;
|
||||
public int featureTypeCase_;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.spotify.useraccount.v1;
|
||||
|
||||
/**
|
||||
* Used for target 8.6.98.900. Class is still present in newer app targets.
|
||||
*/
|
||||
public class AccountAttribute {
|
||||
public Object value_;
|
||||
}
|
||||
@@ -9,7 +9,6 @@ import app.revanced.extension.tiktok.settings.preference.categories.DownloadsPre
|
||||
import app.revanced.extension.tiktok.settings.preference.categories.FeedFilterPreferenceCategory;
|
||||
import app.revanced.extension.tiktok.settings.preference.categories.ExtensionPreferenceCategory;
|
||||
import app.revanced.extension.tiktok.settings.preference.categories.SimSpoofPreferenceCategory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Preference fragment for ReVanced settings
|
||||
|
||||
@@ -45,13 +45,24 @@ public class ThemeHelper {
|
||||
return "@color/yt_black3";
|
||||
}
|
||||
|
||||
private static int getThemeColor(String resourceName, int defaultColor) {
|
||||
try {
|
||||
return Utils.getColorFromString(resourceName);
|
||||
} catch (Exception ex) {
|
||||
// User entered an invalid custom theme color.
|
||||
// Normally this should never be reached, and no localized strings are needed.
|
||||
Utils.showToastLong("Invalid custom theme color: " + resourceName);
|
||||
return defaultColor;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The dark theme color as specified by the Theme patch (if included),
|
||||
* or the dark mode background color unpatched YT uses.
|
||||
*/
|
||||
public static int getDarkThemeColor() {
|
||||
if (darkThemeColor == null) {
|
||||
darkThemeColor = getColorInt(darkThemeResourceName());
|
||||
darkThemeColor = getThemeColor(darkThemeResourceName(), Color.BLACK);
|
||||
}
|
||||
return darkThemeColor;
|
||||
}
|
||||
@@ -71,18 +82,11 @@ public class ThemeHelper {
|
||||
*/
|
||||
public static int getLightThemeColor() {
|
||||
if (lightThemeColor == null) {
|
||||
lightThemeColor = getColorInt(lightThemeResourceName());
|
||||
lightThemeColor = getThemeColor(lightThemeResourceName(), Color.WHITE);
|
||||
}
|
||||
return lightThemeColor;
|
||||
}
|
||||
|
||||
private static int getColorInt(String colorString) {
|
||||
if (colorString.startsWith("#")) {
|
||||
return Color.parseColor(colorString);
|
||||
}
|
||||
return Utils.getResourceColor(colorString);
|
||||
}
|
||||
|
||||
public static int getBackgroundColor() {
|
||||
return isDarkTheme() ? getDarkThemeColor() : getLightThemeColor();
|
||||
}
|
||||
@@ -96,6 +100,6 @@ public class ThemeHelper {
|
||||
? "yt_black3"
|
||||
: "yt_white1";
|
||||
|
||||
return getColorInt(colorName);
|
||||
return Utils.getColorFromString(colorName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,20 +2,16 @@ package app.revanced.extension.youtube.patches;
|
||||
|
||||
import static app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike.Vote;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.ShapeDrawable;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.GuardedBy;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
@@ -60,12 +56,12 @@ public class ReturnYouTubeDislikePatch {
|
||||
private static volatile ReturnYouTubeDislike lastLithoShortsVideoData;
|
||||
|
||||
/**
|
||||
* Because the litho Shorts spans are created after {@link ReturnYouTubeDislikeFilterPatch}
|
||||
* detects the video ids, after the user votes the litho will update
|
||||
* but {@link #lastLithoShortsVideoData} is not the correct data to use.
|
||||
* If this is true, then instead use {@link #currentVideoData}.
|
||||
* Because litho Shorts spans are created offscreen after {@link ReturnYouTubeDislikeFilterPatch}
|
||||
* detects the video ids, but the current Short can arbitrarily reload the same span,
|
||||
* then use the {@link #lastLithoShortsVideoData} if this value is greater than zero.
|
||||
*/
|
||||
private static volatile boolean lithoShortsShouldUseCurrentData;
|
||||
@GuardedBy("ReturnYouTubeDislikePatch.class")
|
||||
private static int useLithoShortsVideoDataCount;
|
||||
|
||||
/**
|
||||
* Last video id prefetched. Field is to prevent prefetching the same video id multiple times in a row.
|
||||
@@ -83,12 +79,28 @@ public class ReturnYouTubeDislikePatch {
|
||||
private static void clearData() {
|
||||
currentVideoData = null;
|
||||
lastLithoShortsVideoData = null;
|
||||
lithoShortsShouldUseCurrentData = false;
|
||||
synchronized (ReturnYouTubeDislike.class) {
|
||||
useLithoShortsVideoDataCount = 0;
|
||||
}
|
||||
|
||||
// Rolling number text should not be cleared,
|
||||
// as it's used if incognito Short is opened/closed
|
||||
// while a regular video is on screen.
|
||||
}
|
||||
|
||||
/**
|
||||
* @return If {@link #useLithoShortsVideoDataCount} was greater than zero.
|
||||
*/
|
||||
private static boolean decrementUseLithoDataIfNeeded() {
|
||||
synchronized (ReturnYouTubeDislikePatch.class) {
|
||||
if (useLithoShortsVideoDataCount > 0) {
|
||||
useLithoShortsVideoDataCount--;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Litho player for both regular videos and Shorts.
|
||||
@@ -152,10 +164,13 @@ public class ReturnYouTubeDislikePatch {
|
||||
return getShortsSpan(original, true);
|
||||
}
|
||||
|
||||
if (conversionContextString.contains("|shorts_like_button.eml")
|
||||
&& !Utils.containsNumber(original)) {
|
||||
Logger.printDebug(() -> "Replacing hidden likes count");
|
||||
return getShortsSpan(original, false);
|
||||
if (conversionContextString.contains("|shorts_like_button.eml")) {
|
||||
if (!Utils.containsNumber(original)) {
|
||||
Logger.printDebug(() -> "Replacing hidden likes count");
|
||||
return getShortsSpan(original, false);
|
||||
} else {
|
||||
decrementUseLithoDataIfNeeded();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "onLithoTextLoaded failure", ex);
|
||||
@@ -170,7 +185,14 @@ public class ReturnYouTubeDislikePatch {
|
||||
return original;
|
||||
}
|
||||
|
||||
ReturnYouTubeDislike videoData = lastLithoShortsVideoData;
|
||||
final ReturnYouTubeDislike videoData;
|
||||
if (decrementUseLithoDataIfNeeded()) {
|
||||
// New Short is loading off screen.
|
||||
videoData = lastLithoShortsVideoData;
|
||||
} else {
|
||||
videoData = currentVideoData;
|
||||
}
|
||||
|
||||
if (videoData == null) {
|
||||
// The Shorts litho video id filter did not detect the video id.
|
||||
// This is normal in incognito mode, but otherwise is abnormal.
|
||||
@@ -178,19 +200,6 @@ public class ReturnYouTubeDislikePatch {
|
||||
return original;
|
||||
}
|
||||
|
||||
// Use the correct dislikes data after voting.
|
||||
if (lithoShortsShouldUseCurrentData) {
|
||||
if (isDislikesSpan) {
|
||||
lithoShortsShouldUseCurrentData = false;
|
||||
}
|
||||
videoData = currentVideoData;
|
||||
if (videoData == null) {
|
||||
Logger.printException(() -> "currentVideoData is null"); // Should never happen
|
||||
return original;
|
||||
}
|
||||
Logger.printDebug(() -> "Using current video data for litho span");
|
||||
}
|
||||
|
||||
return isDislikesSpan
|
||||
? videoData.getDislikeSpanForShort((Spanned) original)
|
||||
: videoData.getLikeSpanForShort((Spanned) original);
|
||||
@@ -445,7 +454,10 @@ public class ReturnYouTubeDislikePatch {
|
||||
ReturnYouTubeDislike videoData = ReturnYouTubeDislike.getFetchForVideoId(videoId);
|
||||
videoData.setVideoIdIsShort(true);
|
||||
lastLithoShortsVideoData = videoData;
|
||||
lithoShortsShouldUseCurrentData = false;
|
||||
synchronized (ReturnYouTubeDislikePatch.class) {
|
||||
// Use litho Shorts data for the next like and dislike spans.
|
||||
useLithoShortsVideoDataCount = 2;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean videoIdIsSame(@Nullable ReturnYouTubeDislike fetch, @Nullable String videoId) {
|
||||
@@ -480,13 +492,6 @@ public class ReturnYouTubeDislikePatch {
|
||||
for (Vote v : Vote.values()) {
|
||||
if (v.value == vote) {
|
||||
videoData.sendVote(v);
|
||||
|
||||
if (isNoneHiddenOrMinimized) {
|
||||
if (lastLithoShortsVideoData != null) {
|
||||
lithoShortsShouldUseCurrentData = true;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -454,16 +454,20 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
}
|
||||
|
||||
private static boolean hideShelves() {
|
||||
// If the player is opened while library is selected,
|
||||
// then filter any recommendations below the player.
|
||||
if (PlayerType.getCurrent().isMaximizedOrFullscreen()
|
||||
// Or if the search is active while library is selected, then also filter.
|
||||
|| NavigationBar.isSearchBarActive()) {
|
||||
// Horizontal shelves are used for music/game links in video descriptions,
|
||||
// such as https://youtube.com/watch?v=W8kI1na3S2M
|
||||
if (PlayerType.getCurrent().isMaximizedOrFullscreen()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Must check search bar after player type, since search results
|
||||
// can be in the background behind an open player.
|
||||
if (NavigationBar.isSearchBarActive()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Do not hide if the navigation back button is visible,
|
||||
// otherwise the content shelves in the YouTube Movie/Courses pages is hidden.
|
||||
// otherwise the content shelves in the explore/music/courses pages are hidde.
|
||||
if (NavigationBar.isBackButtonVisible()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2,12 +2,25 @@ package app.revanced.extension.youtube.patches.components;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.revanced.extension.shared.settings.Setting;
|
||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class PlayerFlyoutMenuItemsFilter extends Filter {
|
||||
|
||||
public static final class HideAudioFlyoutMenuAvailability implements Setting.Availability {
|
||||
private static final boolean AVAILABLE_ON_LAUNCH = SpoofVideoStreamsPatch.notSpoofingToAndroid();
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
// Check conditions of launch and now. Otherwise if spoofing is changed
|
||||
// without a restart the setting will show as available when it's not.
|
||||
return AVAILABLE_ON_LAUNCH && SpoofVideoStreamsPatch.notSpoofingToAndroid();
|
||||
}
|
||||
}
|
||||
|
||||
private final ByteArrayFilterGroupList flyoutFilterGroupList = new ByteArrayFilterGroupList();
|
||||
|
||||
private final ByteArrayFilterGroup exception;
|
||||
|
||||
@@ -226,6 +226,7 @@ public final class SeekbarColorPatch {
|
||||
}
|
||||
|
||||
private static String loadRawResourceAsString(int resourceId) {
|
||||
//noinspection CharsetObjectCanBeUsed
|
||||
try (InputStream inputStream = Utils.getContext().getResources().openRawResource(resourceId);
|
||||
Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name()).useDelimiter("\\A")) {
|
||||
return scanner.next();
|
||||
@@ -281,6 +282,20 @@ public final class SeekbarColorPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* 19.49+
|
||||
*/
|
||||
public static int[] getPlayerLinearGradient(int[] original, int x0, int y1) {
|
||||
// This hook is used for both the player and the feed.
|
||||
// Feed usage always has x0 and y1 value of zero, and the player is always non zero.
|
||||
if (HIDE_SEEKBAR_THUMBNAIL_ENABLED && x0 == 0 && y1 == 0) {
|
||||
return HIDDEN_SEEKBAR_GRADIENT_COLORS;
|
||||
}
|
||||
return getPlayerLinearGradient(original);
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* Pre 19.49
|
||||
*/
|
||||
public static int[] getPlayerLinearGradient(int[] original) {
|
||||
return SEEKBAR_CUSTOM_COLOR_ENABLED
|
||||
|
||||
@@ -19,6 +19,7 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerT
|
||||
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MODERN_4;
|
||||
import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType;
|
||||
import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability;
|
||||
import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.IGNORE;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.MANUAL_SKIP;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY;
|
||||
@@ -198,7 +199,7 @@ public class Settings extends BaseSettings {
|
||||
// Player flyout menu items
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_ADDITIONAL_SETTINGS = new BooleanSetting("revanced_hide_player_flyout_additional_settings", FALSE);
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_AMBIENT_MODE = new BooleanSetting("revanced_hide_player_flyout_ambient_mode", FALSE);
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_AUDIO_TRACK = new BooleanSetting("revanced_hide_player_flyout_audio_track", FALSE);
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_AUDIO_TRACK = new BooleanSetting("revanced_hide_player_flyout_audio_track", FALSE, new HideAudioFlyoutMenuAvailability());
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_CAPTIONS = new BooleanSetting("revanced_hide_player_flyout_captions", FALSE);
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_HELP = new BooleanSetting("revanced_hide_player_flyout_help", TRUE);
|
||||
public static final BooleanSetting HIDE_PLAYER_FLYOUT_LOCK_SCREEN = new BooleanSetting("revanced_hide_player_flyout_lock_screen", FALSE);
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package app.revanced.extension.youtube.settings.preference;
|
||||
|
||||
import static app.revanced.extension.shared.StringRef.str;
|
||||
|
||||
import android.content.Context;
|
||||
import android.preference.SwitchPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
||||
|
||||
@SuppressWarnings({"deprecation", "unused"})
|
||||
public class HideAudioFlyoutMenuPreference extends SwitchPreference {
|
||||
|
||||
{
|
||||
// Audio menu is not available if spoofing to Android client type.
|
||||
if (!SpoofVideoStreamsPatch.notSpoofingToAndroid()) {
|
||||
String summary = str("revanced_hide_player_flyout_audio_track_not_available");
|
||||
setSummary(summary);
|
||||
setSummaryOn(summary);
|
||||
setSummaryOff(summary);
|
||||
}
|
||||
}
|
||||
|
||||
public HideAudioFlyoutMenuPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
}
|
||||
public HideAudioFlyoutMenuPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
}
|
||||
public HideAudioFlyoutMenuPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
public HideAudioFlyoutMenuPreference(Context context) {
|
||||
super(context);
|
||||
}
|
||||
}
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.19.0-dev.1
|
||||
version = 5.19.1-dev.2
|
||||
|
||||
@@ -272,6 +272,10 @@ public final class app/revanced/patches/messenger/inputfield/DisableTypingIndica
|
||||
public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt {
|
||||
public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt {
|
||||
public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -400,6 +404,10 @@ public final class app/revanced/patches/pixiv/ads/HideAdsPatchKt {
|
||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatchKt {
|
||||
public static final fun getRemoveSentFromSignaturePatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatchKt {
|
||||
public static final fun getHidePurchaseReminderPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -560,7 +568,9 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook {
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt {
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
|
||||
@@ -27,4 +27,5 @@ private fun gmsCoreSupportResourcePatch(
|
||||
toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME,
|
||||
spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a666",
|
||||
gmsCoreVendorGroupIdOption = gmsCoreVendorGroupIdOption,
|
||||
addStringResources = false,
|
||||
)
|
||||
|
||||
@@ -22,6 +22,7 @@ private fun gmsCoreSupportResourcePatch(
|
||||
) = app.revanced.patches.shared.misc.gms.gmsCoreSupportResourcePatch(
|
||||
fromPackageName = PHOTOS_PACKAGE_NAME,
|
||||
toPackageName = REVANCED_PHOTOS_PACKAGE_NAME,
|
||||
addStringResources = false,
|
||||
spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a600",
|
||||
gmsCoreVendorGroupIdOption = gmsCoreVendorGroupIdOption,
|
||||
)
|
||||
|
||||
@@ -3,23 +3,28 @@ package app.revanced.patches.googlephotos.misc.preferences
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Deprecated("This patch no longer works and this code will soon be deleted")
|
||||
@Suppress("unused")
|
||||
val restoreHiddenBackUpWhileChargingTogglePatch = bytecodePatch(
|
||||
name = "Restore hidden 'Back up while charging' toggle",
|
||||
description = "Restores a hidden toggle to only run backups when the device is charging.",
|
||||
description = "Restores a hidden toggle to only run backups when the device is charging."
|
||||
) {
|
||||
compatibleWith("com.google.android.apps.photos")
|
||||
compatibleWith("com.google.android.apps.photos"("7.11.0.705590205"))
|
||||
|
||||
execute {
|
||||
// Patches 'backup_prefs_had_backup_only_when_charging_enabled' to always be true.
|
||||
val chargingPrefStringIndex = backupPreferencesFingerprint.stringMatches!!.first().index
|
||||
backupPreferencesFingerprint.method.apply {
|
||||
// Get the register of move-result.
|
||||
val resultRegister = getInstruction<OneRegisterInstruction>(chargingPrefStringIndex + 2).registerA
|
||||
// Insert const after move-result to override register as true.
|
||||
addInstruction(chargingPrefStringIndex + 3, "const/4 v$resultRegister, 0x1")
|
||||
backupPreferencesFingerprint.let {
|
||||
it.method.apply {
|
||||
val index = indexOfFirstInstructionOrThrow(
|
||||
it.stringMatches!!.first().index,
|
||||
Opcode.MOVE_RESULT
|
||||
)
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
addInstruction(index + 1, "const/4 v$register, 0x1")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package app.revanced.patches.messenger.navbar
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val createTabConfigurationFingerprint = fingerprint {
|
||||
strings("MessengerTabConfigurationCreator.createTabConfiguration")
|
||||
opcodes(
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_EQZ,
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package app.revanced.patches.messenger.navbar
|
||||
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Suppress("unused")
|
||||
val removeMetaAITabPatch = bytecodePatch(
|
||||
name = "Remove Meta AI tab",
|
||||
description = "Removes the 'Meta AI' tab from the navbar.",
|
||||
) {
|
||||
compatibleWith("com.facebook.orca")
|
||||
|
||||
execute {
|
||||
createTabConfigurationFingerprint.let {
|
||||
val moveResultIndex = it.patternMatch!!.startIndex + 1
|
||||
val enabledRegister = it.method.getInstruction<OneRegisterInstruction>(moveResultIndex).registerA
|
||||
it.method.replaceInstruction(
|
||||
moveResultIndex,
|
||||
"const/4 v$enabledRegister, 0x0"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package app.revanced.patches.protonmail.signature
|
||||
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
import app.revanced.util.findElementByAttributeValue
|
||||
import java.io.File
|
||||
|
||||
@Suppress("unused")
|
||||
val removeSentFromSignaturePatch = resourcePatch(
|
||||
name = "Remove 'Sent from' signature",
|
||||
description = "Removes the 'Sent from Proton Mail mobile' signature from emails.",
|
||||
) {
|
||||
compatibleWith("ch.protonmail.android")
|
||||
|
||||
execute {
|
||||
val stringResourceFiles = mutableListOf<File>()
|
||||
|
||||
get("res").walk().forEach { file ->
|
||||
if (file.isFile && file.name.equals("strings.xml", ignoreCase = true)) {
|
||||
stringResourceFiles.add(file)
|
||||
}
|
||||
}
|
||||
|
||||
var foundString = false
|
||||
stringResourceFiles.forEach { filePath ->
|
||||
document(filePath.absolutePath).use { document ->
|
||||
var node = document.documentElement.childNodes.findElementByAttributeValue(
|
||||
"name",
|
||||
"mail_settings_identity_mobile_footer_default_free"
|
||||
)
|
||||
|
||||
// String is not localized in all languages.
|
||||
if (node != null) {
|
||||
node.textContent = ""
|
||||
foundString = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!foundString) throw PatchException("Could not find 'sent from' string in resources")
|
||||
}
|
||||
}
|
||||
@@ -41,11 +41,12 @@ fun sharedExtensionPatch(
|
||||
|
||||
execute {
|
||||
if (classes.none { EXTENSION_CLASS_DESCRIPTOR == it.type }) {
|
||||
throw PatchException(
|
||||
"Shared extension has not been merged yet. This patch can not succeed without merging it.",
|
||||
)
|
||||
throw PatchException("Shared extension is not available. This patch can not succeed without it.")
|
||||
}
|
||||
}
|
||||
|
||||
finalize {
|
||||
// The hooks are made in finalize to ensure that the context is hooked before any other patches.
|
||||
hooks.forEach { hook -> hook(EXTENSION_CLASS_DESCRIPTOR) }
|
||||
|
||||
// Modify Utils method to include the patches release version.
|
||||
@@ -92,7 +93,7 @@ fun sharedExtensionPatch(
|
||||
}
|
||||
|
||||
class ExtensionHook internal constructor(
|
||||
private val fingerprint: Fingerprint,
|
||||
internal val fingerprint: Fingerprint,
|
||||
private val insertIndexResolver: ((Method) -> Int),
|
||||
private val contextRegisterResolver: (Method) -> String,
|
||||
) {
|
||||
@@ -109,8 +110,14 @@ class ExtensionHook internal constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun extensionHook(
|
||||
insertIndexResolver: ((Method) -> Int) = { 0 },
|
||||
contextRegisterResolver: (Method) -> String = { "p0" },
|
||||
fingerprint: Fingerprint,
|
||||
) = ExtensionHook(fingerprint, insertIndexResolver, contextRegisterResolver)
|
||||
|
||||
fun extensionHook(
|
||||
insertIndexResolver: ((Method) -> Int) = { 0 },
|
||||
contextRegisterResolver: (Method) -> String = { "p0" },
|
||||
fingerprintBuilderBlock: FingerprintBuilder.() -> Unit,
|
||||
) = ExtensionHook(fingerprint(block = fingerprintBuilderBlock), insertIndexResolver, contextRegisterResolver)
|
||||
) = extensionHook(insertIndexResolver, contextRegisterResolver, fingerprint(block = fingerprintBuilderBlock))
|
||||
|
||||
@@ -17,7 +17,6 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||
import com.android.tools.smali.dexlib2.immutable.reference.ImmutableStringReference
|
||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||
@@ -110,19 +109,18 @@ fun gmsCoreSupportPatch(
|
||||
|
||||
// region Collection of transformations that are applied to all strings.
|
||||
|
||||
fun commonTransform(referencedString: String): String? =
|
||||
when (referencedString) {
|
||||
"com.google",
|
||||
"com.google.android.gms",
|
||||
in PERMISSIONS,
|
||||
in ACTIONS,
|
||||
in AUTHORITIES,
|
||||
-> referencedString.replace("com.google", gmsCoreVendorGroupId!!)
|
||||
fun commonTransform(referencedString: String): String? = when (referencedString) {
|
||||
"com.google",
|
||||
"com.google.android.gms",
|
||||
in PERMISSIONS,
|
||||
in ACTIONS,
|
||||
in AUTHORITIES,
|
||||
-> referencedString.replace("com.google", gmsCoreVendorGroupId!!)
|
||||
|
||||
// No vendor prefix for whatever reason...
|
||||
"subscribedfeeds" -> "$gmsCoreVendorGroupId.subscribedfeeds"
|
||||
else -> null
|
||||
}
|
||||
// No vendor prefix for whatever reason...
|
||||
"subscribedfeeds" -> "$gmsCoreVendorGroupId.subscribedfeeds"
|
||||
else -> null
|
||||
}
|
||||
|
||||
fun contentUrisTransform(str: String): String? {
|
||||
// only when content:// uri
|
||||
@@ -205,16 +203,8 @@ fun gmsCoreSupportPatch(
|
||||
|
||||
// Verify GmsCore is installed and whitelisted for power optimizations and background usage.
|
||||
mainActivityOnCreateFingerprint.method.apply {
|
||||
// Temporary fix for patches with an extension patch that hook the onCreate method as well.
|
||||
val setContextIndex = indexOfFirstInstruction {
|
||||
val reference = getReference<MethodReference>() ?: return@indexOfFirstInstruction false
|
||||
|
||||
reference.toString() == "Lapp/revanced/extension/shared/Utils;->setContext(Landroid/content/Context;)V"
|
||||
}
|
||||
|
||||
// Add after setContext call, because this patch needs the context.
|
||||
addInstructions(
|
||||
if (setContextIndex < 0) 0 else setContextIndex + 1,
|
||||
0,
|
||||
"invoke-static/range { p0 .. p0 }, Lapp/revanced/extension/shared/GmsCoreSupport;->" +
|
||||
"checkGmsCore(Landroid/app/Activity;)V",
|
||||
)
|
||||
@@ -510,13 +500,44 @@ private object Constants {
|
||||
* @param executeBlock The additional execution block of the patch.
|
||||
* @param block The additional block to build the patch.
|
||||
*/
|
||||
fun gmsCoreSupportResourcePatch(
|
||||
fun gmsCoreSupportResourcePatch( // This is here only for binary compatibility.
|
||||
fromPackageName: String,
|
||||
toPackageName: String,
|
||||
spoofedPackageSignature: String,
|
||||
gmsCoreVendorGroupIdOption: Option<String>,
|
||||
executeBlock: ResourcePatchContext.() -> Unit = {},
|
||||
block: ResourcePatchBuilder.() -> Unit = {},
|
||||
) = gmsCoreSupportResourcePatch(
|
||||
fromPackageName,
|
||||
toPackageName,
|
||||
spoofedPackageSignature,
|
||||
gmsCoreVendorGroupIdOption,
|
||||
true,
|
||||
executeBlock,
|
||||
block
|
||||
)
|
||||
|
||||
/**
|
||||
* Abstract resource patch that allows Google apps to run without root and under a different package name
|
||||
* by using GmsCore instead of Google Play Services.
|
||||
*
|
||||
* @param fromPackageName The package name of the original app.
|
||||
* @param toPackageName The package name to fall back to if no custom package name is specified in patch options.
|
||||
* @param spoofedPackageSignature The signature of the package to spoof to.
|
||||
* @param gmsCoreVendorGroupIdOption The option to get the vendor group ID of GmsCore.
|
||||
* @param addStringResources If the GmsCore shared strings should be added to the patched app.
|
||||
* @param executeBlock The additional execution block of the patch.
|
||||
* @param block The additional block to build the patch.
|
||||
*/
|
||||
// TODO: On the next major release make this public and delete the public overloaded constructor.
|
||||
internal fun gmsCoreSupportResourcePatch(
|
||||
fromPackageName: String,
|
||||
toPackageName: String,
|
||||
spoofedPackageSignature: String,
|
||||
gmsCoreVendorGroupIdOption: Option<String>,
|
||||
addStringResources: Boolean = true,
|
||||
executeBlock: ResourcePatchContext.() -> Unit = {},
|
||||
block: ResourcePatchBuilder.() -> Unit = {},
|
||||
) = resourcePatch {
|
||||
dependsOn(
|
||||
changePackageNamePatch,
|
||||
@@ -526,7 +547,10 @@ fun gmsCoreSupportResourcePatch(
|
||||
val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
|
||||
|
||||
execute {
|
||||
addResources("shared", "misc.gms.gmsCoreSupportResourcePatch")
|
||||
// Some patches don't use shared String resources so there's no need to add them.
|
||||
if (addStringResources) {
|
||||
addResources("shared", "misc.gms.gmsCoreSupportResourcePatch")
|
||||
}
|
||||
|
||||
/**
|
||||
* Add metadata to manifest to support spoofing the package name and signature of GmsCore.
|
||||
|
||||
@@ -7,6 +7,8 @@ import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.BasePreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory
|
||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.copyResources
|
||||
import app.revanced.util.getNode
|
||||
@@ -36,14 +38,14 @@ fun settingsPatch (
|
||||
execute {
|
||||
copyResources(
|
||||
"settings",
|
||||
ResourceGroup("xml", "revanced_prefs.xml"),
|
||||
ResourceGroup("xml", "revanced_prefs.xml", "revanced_prefs_icons.xml"),
|
||||
)
|
||||
|
||||
addResources("shared", "misc.settings.settingsResourcePatch")
|
||||
}
|
||||
|
||||
finalize {
|
||||
fun Node.addPreference(preference: BasePreference, prepend: Boolean = false) {
|
||||
fun Node.addPreference(preference: BasePreference) {
|
||||
preference.serialize(ownerDocument) { resource ->
|
||||
// TODO: Currently, resources can only be added to "values", which may not be the correct place.
|
||||
// It may be necessary to ask for the desired resourceValue in the future.
|
||||
@@ -61,7 +63,7 @@ fun settingsPatch (
|
||||
val preferenceFileName = "res/xml/$fileName.xml"
|
||||
if (get(preferenceFileName).exists()) {
|
||||
document(preferenceFileName).use { document ->
|
||||
document.getNode("PreferenceScreen").addPreference(intent, true)
|
||||
document.getNode("PreferenceScreen").addPreference(intent)
|
||||
}
|
||||
modified = true
|
||||
}
|
||||
@@ -71,6 +73,30 @@ fun settingsPatch (
|
||||
}
|
||||
|
||||
// Add all preferences to the ReVanced fragment.
|
||||
document("res/xml/revanced_prefs_icons.xml").use { document ->
|
||||
val revancedPreferenceScreenNode = document.getNode("PreferenceScreen")
|
||||
preferences.forEach { revancedPreferenceScreenNode.addPreference(it) }
|
||||
}
|
||||
|
||||
// Because the icon preferences require declaring a layout resource,
|
||||
// there is no easy way to change to the Android default preference layout
|
||||
// after the preference is inflated.
|
||||
// Using two different preference files is the simplest and most robust solution.
|
||||
fun removeIconsAndLayout(preferences: Collection<BasePreference>) {
|
||||
preferences.forEach { preference ->
|
||||
preference.icon = null
|
||||
preference.layout = null
|
||||
|
||||
if (preference is PreferenceCategory) {
|
||||
removeIconsAndLayout(preference.preferences)
|
||||
}
|
||||
if (preference is PreferenceScreenPreference) {
|
||||
removeIconsAndLayout(preference.preferences)
|
||||
}
|
||||
}
|
||||
}
|
||||
removeIconsAndLayout(preferences)
|
||||
|
||||
document("res/xml/revanced_prefs.xml").use { document ->
|
||||
val revancedPreferenceScreenNode = document.getNode("PreferenceScreen")
|
||||
preferences.forEach { revancedPreferenceScreenNode.addPreference(it) }
|
||||
|
||||
@@ -19,10 +19,17 @@ abstract class BasePreference(
|
||||
val key: String? = null,
|
||||
val titleKey: String? = "${key}_title",
|
||||
val summaryKey: String? = "${key}_summary",
|
||||
val icon: String? = null,
|
||||
val layout: String? = null,
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
val tag: String
|
||||
) {
|
||||
|
||||
var icon: String? = icon
|
||||
internal set
|
||||
|
||||
var layout: String? = layout
|
||||
internal set
|
||||
|
||||
/**
|
||||
* Serialize preference element to XML.
|
||||
* Overriding methods should invoke super and operate on its return value.
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package app.revanced.patches.spotify.layout.theme
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.spotify.misc.extension.IS_SPOTIFY_LEGACY_APP_TARGET
|
||||
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.util.*
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/layout/theme/CustomThemePatch;"
|
||||
|
||||
internal val customThemeByteCodePatch = bytecodePatch {
|
||||
dependsOn(sharedExtensionPatch)
|
||||
|
||||
val backgroundColor by spotifyBackgroundColor
|
||||
val backgroundColorSecondary by spotifyBackgroundColorSecondary
|
||||
|
||||
execute {
|
||||
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
|
||||
// Bytecode changes are not needed for legacy app target.
|
||||
// Player background color is changed with existing resource patch.
|
||||
return@execute
|
||||
}
|
||||
|
||||
fun MutableMethod.addColorChangeInstructions(literal: Long, colorString: String) {
|
||||
val index = indexOfFirstLiteralInstructionOrThrow(literal)
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
|
||||
addInstructions(
|
||||
index + 1,
|
||||
"""
|
||||
const-string v$register, "$colorString"
|
||||
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getThemeColor(Ljava/lang/String;)J
|
||||
move-result-wide v$register
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
val encoreColorsClassName = with(encoreThemeFingerprint) {
|
||||
// Find index of the first static get found after the string constant.
|
||||
val encoreColorsFieldReferenceIndex = originalMethod.indexOfFirstInstructionOrThrow(
|
||||
stringMatches!!.first().index,
|
||||
Opcode.SGET_OBJECT
|
||||
)
|
||||
|
||||
originalMethod.getInstruction(encoreColorsFieldReferenceIndex)
|
||||
.getReference<FieldReference>()!!.definingClass
|
||||
}
|
||||
|
||||
val encoreColorsConstructorFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR)
|
||||
custom { method, classDef ->
|
||||
classDef.type == encoreColorsClassName &&
|
||||
method.containsLiteralInstruction(PLAYLIST_BACKGROUND_COLOR_LITERAL)
|
||||
}
|
||||
}
|
||||
|
||||
encoreColorsConstructorFingerprint.method.apply {
|
||||
// Playlist song list background color.
|
||||
addColorChangeInstructions(PLAYLIST_BACKGROUND_COLOR_LITERAL, backgroundColor!!)
|
||||
|
||||
// Share menu background color.
|
||||
addColorChangeInstructions(SHARE_MENU_BACKGROUND_COLOR_LITERAL, backgroundColorSecondary!!)
|
||||
}
|
||||
|
||||
homeCategoryPillColorsFingerprint.method.apply {
|
||||
// Home category pills background color.
|
||||
addColorChangeInstructions(HOME_CATEGORY_PILL_COLOR_LITERAL, backgroundColorSecondary!!)
|
||||
}
|
||||
|
||||
settingsHeaderColorFingerprint.method.apply {
|
||||
// Settings header background color.
|
||||
addColorChangeInstructions(SETTINGS_HEADER_COLOR_LITERAL, backgroundColorSecondary!!)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +1,24 @@
|
||||
@file:Suppress("NAME_SHADOWING")
|
||||
|
||||
package app.revanced.patches.spotify.layout.theme
|
||||
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
import app.revanced.patcher.patch.stringOption
|
||||
import org.w3c.dom.Element
|
||||
|
||||
@Suppress("unused")
|
||||
val customThemePatch = resourcePatch(
|
||||
name = "Custom theme",
|
||||
description = "Applies a custom theme.",
|
||||
description = "Applies a custom theme (defaults to amoled black)",
|
||||
use = false,
|
||||
) {
|
||||
compatibleWith("com.spotify.music")
|
||||
|
||||
val backgroundColor by stringOption(
|
||||
key = "backgroundColor",
|
||||
default = "@android:color/black",
|
||||
title = "Primary background color",
|
||||
description = "The background color. Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
dependsOn(customThemeByteCodePatch)
|
||||
|
||||
val backgroundColorSecondary by stringOption(
|
||||
key = "backgroundColorSecondary",
|
||||
default = "#ff282828",
|
||||
title = "Secondary background color",
|
||||
description = "The secondary background color. (e.g. search box, artist & podcast). Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
val accentColor by stringOption(
|
||||
key = "accentColor",
|
||||
default = "#ff1ed760",
|
||||
title = "Accent color",
|
||||
description = "The accent color ('Spotify green' by default). Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
val accentColorPressed by stringOption(
|
||||
key = "accentColorPressed",
|
||||
default = "#ff169c46",
|
||||
title = "Pressed dark theme accent color",
|
||||
description =
|
||||
"The color when accented buttons are pressed, by default slightly darker than accent. " +
|
||||
"Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
val backgroundColor by spotifyBackgroundColor()
|
||||
val backgroundColorSecondary by spotifyBackgroundColorSecondary()
|
||||
val accentColor by spotifyAccentColor()
|
||||
val accentColorPressed by spotifyAccentColorPressed()
|
||||
|
||||
execute {
|
||||
val backgroundColor = backgroundColor!!
|
||||
val backgroundColorSecondary = backgroundColorSecondary!!
|
||||
val accentColor = accentColor!!
|
||||
val accentColorPressed = accentColorPressed!!
|
||||
|
||||
document("res/values/colors.xml").use { document ->
|
||||
val resourcesNode = document.getElementsByTagName("resources").item(0) as Element
|
||||
|
||||
@@ -61,20 +26,37 @@ val customThemePatch = resourcePatch(
|
||||
for (i in 0 until childNodes.length) {
|
||||
val node = childNodes.item(i) as? Element ?: continue
|
||||
|
||||
node.textContent =
|
||||
when (node.getAttribute("name")) {
|
||||
"dark_base_background_elevated_base", "design_dark_default_color_background",
|
||||
"design_dark_default_color_surface", "gray_7", "gray_background", "gray_layer",
|
||||
"sthlm_blk",
|
||||
node.textContent = when (node.getAttribute("name")) {
|
||||
// Gradient next to user photo and "All" in home page
|
||||
"dark_base_background_base",
|
||||
// Main background
|
||||
"gray_7",
|
||||
// Left sidebar background in tablet mode
|
||||
"gray_10",
|
||||
// Add account, Settings and privacy, View Profile left sidebar background
|
||||
"dark_base_background_elevated_base",
|
||||
// Song/player background
|
||||
"bg_gradient_start_color", "bg_gradient_end_color",
|
||||
// Login screen
|
||||
"sthlm_blk", "sthlm_blk_grad_start", "stockholm_black",
|
||||
// Misc
|
||||
"image_placeholder_color",
|
||||
-> backgroundColor
|
||||
|
||||
"gray_15" -> backgroundColorSecondary
|
||||
// Track credits, merch in song player
|
||||
"track_credits_card_bg", "benefit_list_default_color", "merch_card_background",
|
||||
// Playlist list background in home page
|
||||
"opacity_white_10",
|
||||
// About artist background in song player
|
||||
"gray_15",
|
||||
// What's New pills background
|
||||
"dark_base_background_tinted_highlight"
|
||||
-> backgroundColorSecondary
|
||||
|
||||
"dark_brightaccent_background_base", "dark_base_text_brightaccent", "green_light" -> accentColor
|
||||
|
||||
"dark_brightaccent_background_press" -> accentColorPressed
|
||||
else -> continue
|
||||
}
|
||||
"dark_brightaccent_background_base", "dark_base_text_brightaccent", "green_light" -> accentColor
|
||||
"dark_brightaccent_background_press" -> accentColorPressed
|
||||
else -> continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package app.revanced.patches.spotify.layout.theme
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.containsLiteralInstruction
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal val encoreThemeFingerprint = fingerprint {
|
||||
strings("Encore theme was not provided.") // Partial string match.
|
||||
}
|
||||
|
||||
internal const val SETTINGS_HEADER_COLOR_LITERAL = 0xFF282828
|
||||
internal const val HOME_CATEGORY_PILL_COLOR_LITERAL = 0xFF333333
|
||||
internal const val PLAYLIST_BACKGROUND_COLOR_LITERAL = 0xFF121212
|
||||
internal const val SHARE_MENU_BACKGROUND_COLOR_LITERAL = 0xFF1F1F1F
|
||||
|
||||
internal val homeCategoryPillColorsFingerprint = fingerprint{
|
||||
accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR)
|
||||
custom { method, _ ->
|
||||
method.containsLiteralInstruction(HOME_CATEGORY_PILL_COLOR_LITERAL) &&
|
||||
method.containsLiteralInstruction(0x33000000)
|
||||
}
|
||||
}
|
||||
|
||||
internal val settingsHeaderColorFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR)
|
||||
custom { method, _ ->
|
||||
method.containsLiteralInstruction(SETTINGS_HEADER_COLOR_LITERAL) &&
|
||||
method.containsLiteralInstruction(0)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package app.revanced.patches.spotify.layout.theme
|
||||
|
||||
import app.revanced.patcher.patch.stringOption
|
||||
|
||||
internal val spotifyBackgroundColor = stringOption(
|
||||
key = "backgroundColor",
|
||||
default = "@android:color/black",
|
||||
title = "Primary background color",
|
||||
description = "The background color. Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
internal val spotifyBackgroundColorSecondary = stringOption(
|
||||
key = "backgroundColorSecondary",
|
||||
default = "#FF121212",
|
||||
title = "Secondary background color",
|
||||
description = "The secondary background color. (e.g. playlist list, player arist, credits). Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
internal val spotifyAccentColor = stringOption(
|
||||
key = "accentColor",
|
||||
default = "#FF1ED760",
|
||||
title = "Accent color",
|
||||
description = "The accent color ('Spotify green' by default). Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
internal val spotifyAccentColorPressed = stringOption(
|
||||
key = "accentColorPressed",
|
||||
default = "#FF169C46",
|
||||
title = "Pressed dark theme accent color",
|
||||
description =
|
||||
"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.",
|
||||
required = true,
|
||||
)
|
||||
@@ -1,15 +1,28 @@
|
||||
package app.revanced.patches.spotify.misc
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patches.spotify.misc.extension.IS_SPOTIFY_LEGACY_APP_TARGET
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val accountAttributeFingerprint = fingerprint {
|
||||
custom { _, c -> c.endsWith("internal/AccountAttribute;") }
|
||||
custom { _, classDef ->
|
||||
classDef.type == if (IS_SPOTIFY_LEGACY_APP_TARGET) {
|
||||
"Lcom/spotify/useraccount/v1/AccountAttribute;"
|
||||
} else {
|
||||
"Lcom/spotify/remoteconfig/internal/AccountAttribute;"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal val productStateProtoFingerprint = fingerprint {
|
||||
returns("Ljava/util/Map;")
|
||||
custom { _, classDef ->
|
||||
classDef.endsWith("ProductStateProto;")
|
||||
classDef.type == if (IS_SPOTIFY_LEGACY_APP_TARGET) {
|
||||
"Lcom/spotify/ucs/proto/v0/UcsResponseWrapper${'$'}AccountAttributesResponse;"
|
||||
} else {
|
||||
"Lcom/spotify/remoteconfig/internal/ProductStateProto;"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,3 +34,38 @@ internal val contextMenuExperimentsFingerprint = fingerprint {
|
||||
parameters("L")
|
||||
strings("remove_ads_upsell_enabled")
|
||||
}
|
||||
|
||||
internal val contextFromJsonFingerprint = fingerprint {
|
||||
opcodes(
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_STATIC
|
||||
)
|
||||
custom { methodDef, classDef ->
|
||||
methodDef.name == "fromJson" &&
|
||||
classDef.endsWith("voiceassistants/playermodels/ContextJsonAdapter;")
|
||||
}
|
||||
}
|
||||
|
||||
internal val readPlayerOptionOverridesFingerprint = fingerprint {
|
||||
custom { methodDef, classDef ->
|
||||
methodDef.name == "readPlayerOptionOverrides" &&
|
||||
classDef.endsWith("voiceassistants/playermodels/PreparePlayOptionsJsonAdapter;")
|
||||
}
|
||||
}
|
||||
|
||||
internal val homeSectionFingerprint = fingerprint {
|
||||
custom { _, classDef -> classDef.endsWith("homeapi/proto/Section;") }
|
||||
}
|
||||
|
||||
internal val protobufListsFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
custom { method, _ -> method.name == "emptyProtobufList" }
|
||||
}
|
||||
|
||||
internal val homeStructureFingerprint = fingerprint {
|
||||
opcodes(Opcode.IGET_OBJECT, Opcode.RETURN_OBJECT)
|
||||
custom { _, classDef -> classDef.endsWith("homeapi/proto/HomeStructure;") }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.spotify.misc.check
|
||||
|
||||
import app.revanced.patches.shared.misc.checks.checkEnvironmentPatch
|
||||
import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint
|
||||
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
|
||||
|
||||
internal val checkEnvironmentPatch = checkEnvironmentPatch(
|
||||
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
|
||||
extensionPatch = sharedExtensionPatch,
|
||||
"com.spotify.music",
|
||||
)
|
||||
@@ -1,5 +1,21 @@
|
||||
package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.spotify.shared.SPOTIFY_MAIN_ACTIVITY_LEGACY
|
||||
|
||||
val sharedExtensionPatch = sharedExtensionPatch("spotify", spotifyMainActivityOnCreate)
|
||||
/**
|
||||
* If patching a legacy 8.x target. This may also be set if patching slightly older/newer app targets,
|
||||
* but the only legacy target of interest is 8.6.98.900 as it's the last version that
|
||||
* supports Spotify integration on Kenwood/Pioneer car stereos.
|
||||
*/
|
||||
internal var IS_SPOTIFY_LEGACY_APP_TARGET = false
|
||||
|
||||
val sharedExtensionPatch = bytecodePatch {
|
||||
dependsOn(sharedExtensionPatch("spotify", mainActivityOnCreateHook))
|
||||
|
||||
execute {
|
||||
IS_SPOTIFY_LEGACY_APP_TARGET = mainActivityOnCreateHook.fingerprint
|
||||
.originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patches.shared.misc.extension.extensionHook
|
||||
import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint
|
||||
|
||||
internal val spotifyMainActivityOnCreate = extensionHook {
|
||||
custom { method, classDef ->
|
||||
classDef.type == "Lcom/spotify/music/SpotifyMainActivity;" &&
|
||||
method.name == "onCreate"
|
||||
}
|
||||
}
|
||||
internal val mainActivityOnCreateHook = extensionHook(fingerprint = mainActivityOnCreateFingerprint)
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package app.revanced.patches.spotify.shared
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;"
|
||||
|
||||
/**
|
||||
* Main activity of target 8.6.98.900.
|
||||
*/
|
||||
internal const val SPOTIFY_MAIN_ACTIVITY_LEGACY = "Lcom/spotify/music/MainActivity;"
|
||||
|
||||
internal val mainActivityOnCreateFingerprint = fingerprint {
|
||||
custom { method, classDef ->
|
||||
method.name == "onCreate" && (classDef.type == SPOTIFY_MAIN_ACTIVITY
|
||||
|| classDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY)
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
val disableSubscriptionSuggestionsPatch = bytecodePatch(
|
||||
name = "Disable subscription suggestions",
|
||||
) {
|
||||
compatibleWith("com.strava"("320.12"))
|
||||
compatibleWith("com.strava")
|
||||
|
||||
execute {
|
||||
val helperMethodName = "getModulesIfNotUpselling"
|
||||
|
||||
@@ -130,8 +130,6 @@ val hideLayoutComponentsPatch = bytecodePatch(
|
||||
"19.25.37",
|
||||
"19.34.42",
|
||||
"19.43.41",
|
||||
"19.45.38",
|
||||
"19.46.42",
|
||||
"19.47.53",
|
||||
"20.07.39",
|
||||
),
|
||||
|
||||
@@ -51,7 +51,10 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch(
|
||||
SwitchPreference("revanced_hide_player_flyout_speed"),
|
||||
SwitchPreference("revanced_hide_player_flyout_lock_screen"),
|
||||
SwitchPreference("revanced_hide_player_flyout_more_info"),
|
||||
SwitchPreference("revanced_hide_player_flyout_audio_track"),
|
||||
SwitchPreference(
|
||||
key = "revanced_hide_player_flyout_audio_track",
|
||||
tag = "app.revanced.extension.youtube.settings.preference.HideAudioFlyoutMenuPreference"
|
||||
),
|
||||
SwitchPreference("revanced_hide_player_flyout_watch_in_vr"),
|
||||
SwitchPreference("revanced_hide_player_flyout_sleep_timer"),
|
||||
SwitchPreference("revanced_hide_player_flyout_video_quality_footer"),
|
||||
|
||||
@@ -168,11 +168,8 @@ val miniplayerPatch = bytecodePatch(
|
||||
// 19.30.39 // Modern 3 is less broken when double tap expand is enabled, but cannot swipe to expand when double tap is off.
|
||||
// 19.31.36 // All Modern 1 buttons are missing. Unusable.
|
||||
// 19.32.36 // 19.32+ and beyond all work without issues.
|
||||
// 19.33.35
|
||||
"19.34.42",
|
||||
"19.43.41",
|
||||
"19.45.38",
|
||||
"19.46.42",
|
||||
"19.47.53",
|
||||
"20.07.39",
|
||||
),
|
||||
|
||||
@@ -25,7 +25,6 @@ val openVideosFullscreenPatch = bytecodePatch(
|
||||
|
||||
compatibleWith(
|
||||
"com.google.android.youtube"(
|
||||
"19.46.42",
|
||||
"19.47.53",
|
||||
"20.07.39",
|
||||
)
|
||||
|
||||
@@ -70,6 +70,8 @@ val returnYouTubeDislikePatch = bytecodePatch(
|
||||
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"),
|
||||
),
|
||||
)
|
||||
|
||||
@@ -84,31 +84,14 @@ internal val playerLinearGradientFingerprint = fingerprint {
|
||||
}
|
||||
|
||||
/**
|
||||
* 19.46 - 19.47
|
||||
* 19.25 - 19.47
|
||||
*/
|
||||
internal val playerLinearGradientLegacy1946Fingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
parameters("I", "I", "I", "I")
|
||||
internal val playerLinearGradientLegacyFingerprint = fingerprint {
|
||||
returns("V")
|
||||
opcodes(
|
||||
Opcode.FILLED_NEW_ARRAY,
|
||||
Opcode.MOVE_RESULT_OBJECT
|
||||
)
|
||||
custom { method, _ ->
|
||||
method.name == "setBounds" && method.containsLiteralInstruction(ytYoutubeMagentaColorId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 19.25 - 19.45
|
||||
*/
|
||||
internal val playerLinearGradientLegacy1925Fingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||
parameters("Landroid/content/Context;")
|
||||
opcodes(
|
||||
Opcode.FILLED_NEW_ARRAY,
|
||||
Opcode.MOVE_RESULT_OBJECT
|
||||
)
|
||||
literal { ytYoutubeMagentaColorId }
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.patches.youtube.layout.seekbar
|
||||
|
||||
import app.revanced.patcher.Fingerprint
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
@@ -310,14 +311,15 @@ val seekbarColorPatch = bytecodePatch(
|
||||
"""
|
||||
)
|
||||
|
||||
val playerFingerprint =
|
||||
if (is_19_49_or_greater) {
|
||||
playerLinearGradientFingerprint
|
||||
} else if (is_19_46_or_greater) {
|
||||
playerLinearGradientLegacy1946Fingerprint
|
||||
} else {
|
||||
playerLinearGradientLegacy1925Fingerprint
|
||||
}
|
||||
val playerFingerprint: Fingerprint
|
||||
val checkGradientCoordinates: Boolean
|
||||
if (is_19_49_or_greater) {
|
||||
playerFingerprint = playerLinearGradientFingerprint
|
||||
checkGradientCoordinates = true
|
||||
} else {
|
||||
playerFingerprint = playerLinearGradientLegacyFingerprint
|
||||
checkGradientCoordinates = false
|
||||
}
|
||||
|
||||
playerFingerprint.let {
|
||||
it.method.apply {
|
||||
@@ -326,10 +328,17 @@ val seekbarColorPatch = bytecodePatch(
|
||||
|
||||
addInstructions(
|
||||
index + 1,
|
||||
"""
|
||||
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getPlayerLinearGradient([I)[I
|
||||
move-result-object v$register
|
||||
"""
|
||||
if (checkGradientCoordinates) {
|
||||
"""
|
||||
invoke-static { v$register, p0, p1 }, $EXTENSION_CLASS_DESCRIPTOR->getPlayerLinearGradient([III)[I
|
||||
move-result-object v$register
|
||||
"""
|
||||
} else {
|
||||
"""
|
||||
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getPlayerLinearGradient([I)[I
|
||||
move-result-object v$register
|
||||
"""
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,8 @@ private val sponsorBlockResourcePatch = resourcePatch {
|
||||
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"),
|
||||
),
|
||||
)
|
||||
|
||||
@@ -38,8 +38,6 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
|
||||
"19.25.37",
|
||||
"19.34.42",
|
||||
"19.43.41",
|
||||
"19.45.38",
|
||||
"19.46.42",
|
||||
"19.47.53",
|
||||
"20.07.39",
|
||||
),
|
||||
|
||||
@@ -36,8 +36,6 @@ val bypassURLRedirectsPatch = bytecodePatch(
|
||||
"19.25.37",
|
||||
"19.34.42",
|
||||
"19.43.41",
|
||||
"19.45.38",
|
||||
"19.46.42",
|
||||
"19.47.53",
|
||||
"20.07.39",
|
||||
),
|
||||
|
||||
@@ -73,7 +73,22 @@ private val settingsResourcePatch = resourcePatch {
|
||||
appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"]
|
||||
|
||||
arrayOf(
|
||||
ResourceGroup("drawable", "revanced_settings_icon.xml"),
|
||||
ResourceGroup("drawable",
|
||||
"revanced_settings_icon.xml",
|
||||
"revanced_settings_screen_00_about.xml",
|
||||
"revanced_settings_screen_01_ads.xml",
|
||||
"revanced_settings_screen_02_alt_thumbnails.xml",
|
||||
"revanced_settings_screen_03_feed.xml",
|
||||
"revanced_settings_screen_04_general.xml",
|
||||
"revanced_settings_screen_05_player.xml",
|
||||
"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_11_misc.xml",
|
||||
"revanced_settings_screen_12_video.xml",
|
||||
),
|
||||
ResourceGroup("layout", "revanced_settings_with_toolbar.xml"),
|
||||
).forEach { resourceGroup ->
|
||||
copyResources("settings", resourceGroup)
|
||||
@@ -159,6 +174,8 @@ val settingsPatch = bytecodePatch(
|
||||
// Add an "about" preference to the top.
|
||||
preferences += NonInteractivePreference(
|
||||
key = "revanced_settings_screen_00_about",
|
||||
icon = "@drawable/revanced_settings_screen_00_about",
|
||||
layout = "@layout/preference_with_icon",
|
||||
summaryKey = null,
|
||||
tag = "app.revanced.extension.youtube.settings.preference.ReVancedYouTubeAboutPreference",
|
||||
selectable = true,
|
||||
@@ -170,6 +187,10 @@ val settingsPatch = bytecodePatch(
|
||||
)
|
||||
}
|
||||
|
||||
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||
SwitchPreference("revanced_show_menu_icons")
|
||||
)
|
||||
|
||||
PreferenceScreen.MISC.addPreferences(
|
||||
TextPreference(
|
||||
key = null,
|
||||
@@ -277,37 +298,53 @@ object PreferenceScreen : BasePreferenceScreen() {
|
||||
val ADS = Screen(
|
||||
key = "revanced_settings_screen_01_ads",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_01_ads",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
val ALTERNATIVE_THUMBNAILS = Screen(
|
||||
key = "revanced_settings_screen_02_alt_thumbnails",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_02_alt_thumbnails",
|
||||
layout = "@layout/preference_with_icon",
|
||||
sorting = Sorting.UNSORTED,
|
||||
)
|
||||
val FEED = Screen(
|
||||
key = "revanced_settings_screen_03_feed",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_03_feed",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
val GENERAL_LAYOUT = Screen(
|
||||
key = "revanced_settings_screen_04_general",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_04_general",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
val PLAYER = Screen(
|
||||
key = "revanced_settings_screen_05_player",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_05_player",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
|
||||
val SHORTS = Screen(
|
||||
key = "revanced_settings_screen_06_shorts",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_06_shorts",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
|
||||
val SEEKBAR = Screen(
|
||||
key = "revanced_settings_screen_07_seekbar",
|
||||
summaryKey = null,
|
||||
)
|
||||
icon = "@drawable/revanced_settings_screen_07_seekbar",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
val SWIPE_CONTROLS = Screen(
|
||||
key = "revanced_settings_screen_08_swipe_controls",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_08_swipe_controls",
|
||||
layout = "@layout/preference_with_icon",
|
||||
sorting = Sorting.UNSORTED,
|
||||
)
|
||||
|
||||
@@ -317,10 +354,14 @@ object PreferenceScreen : BasePreferenceScreen() {
|
||||
val MISC = Screen(
|
||||
key = "revanced_settings_screen_11_misc",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_11_misc",
|
||||
layout = "@layout/preference_with_icon",
|
||||
)
|
||||
val VIDEO = Screen(
|
||||
key = "revanced_settings_screen_12_video",
|
||||
summaryKey = null,
|
||||
icon = "@drawable/revanced_settings_screen_12_video",
|
||||
layout = "@layout/preference_with_icon",
|
||||
sorting = Sorting.BY_KEY,
|
||||
)
|
||||
|
||||
|
||||
@@ -53,7 +53,15 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
|
||||
|
||||
// All registers used by an instruction.
|
||||
fun Instruction.getRegistersUsed() = when (this) {
|
||||
is FiveRegisterInstruction -> listOf(registerC, registerD, registerE, registerF, registerG)
|
||||
is FiveRegisterInstruction -> {
|
||||
when (registerCount) {
|
||||
1 -> listOf(registerC)
|
||||
2 -> listOf(registerC, registerD)
|
||||
3 -> listOf(registerC, registerD, registerE)
|
||||
4 -> listOf(registerC, registerD, registerE, registerF)
|
||||
else -> listOf(registerC, registerD, registerE, registerF, registerG)
|
||||
}
|
||||
}
|
||||
is ThreeRegisterInstruction -> listOf(registerA, registerB, registerC)
|
||||
is TwoRegisterInstruction -> listOf(registerA, registerB)
|
||||
is OneRegisterInstruction -> listOf(registerA)
|
||||
@@ -62,15 +70,15 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
|
||||
}
|
||||
|
||||
// Register that is written to by an instruction.
|
||||
fun Instruction.getRegisterWritten() = when (this) {
|
||||
is ThreeRegisterInstruction -> registerA
|
||||
is TwoRegisterInstruction -> registerA
|
||||
is OneRegisterInstruction -> registerA
|
||||
else -> throw IllegalStateException("Not a write instruction: $this")
|
||||
fun Instruction.getWriteRegister() : Int {
|
||||
// Two and three register instructions extend OneRegisterInstruction.
|
||||
if (this is OneRegisterInstruction) return registerA
|
||||
throw IllegalStateException("Not a write instruction: $this")
|
||||
}
|
||||
|
||||
val writeOpcodes = EnumSet.of(
|
||||
ARRAY_LENGTH,
|
||||
INSTANCE_OF,
|
||||
NEW_INSTANCE, NEW_ARRAY,
|
||||
MOVE, MOVE_FROM16, MOVE_16, MOVE_WIDE, MOVE_WIDE_FROM16, MOVE_WIDE_16, MOVE_OBJECT,
|
||||
MOVE_OBJECT_FROM16, MOVE_OBJECT_16, MOVE_RESULT, MOVE_RESULT_WIDE, MOVE_RESULT_OBJECT, MOVE_EXCEPTION,
|
||||
@@ -140,7 +148,7 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
|
||||
return freeRegister
|
||||
}
|
||||
if (bestFreeRegisterFound != null) {
|
||||
return bestFreeRegisterFound;
|
||||
return bestFreeRegisterFound
|
||||
}
|
||||
|
||||
// Somehow every method register was read from before any register was wrote to.
|
||||
@@ -151,14 +159,14 @@ internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude:
|
||||
|
||||
if (instruction.opcode in branchOpcodes) {
|
||||
if (bestFreeRegisterFound != null) {
|
||||
return bestFreeRegisterFound;
|
||||
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.opcode in writeOpcodes) {
|
||||
val writeRegister = instruction.getRegisterWritten()
|
||||
val writeRegister = instruction.getWriteRegister()
|
||||
|
||||
if (writeRegister !in usedRegisters) {
|
||||
// Verify the register is only used for write and not also as a parameter.
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">عرض أيقونات إعدادات ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">يتم عرض أيقونات الإعدادات</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">لا يتم عرض أيقونات الإعدادات</string>
|
||||
<string name="revanced_language_title">لغة ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"قد تكون الترجمات لبعض اللغات مفقودة أو غير مكتملة.
|
||||
|
||||
@@ -610,6 +612,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">إخفاء المقطع الصوتي</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">تم إخفاء قائمة المقطع الصوتي</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">يتم عرض قائمة المقطع الصوتي</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"تم إخفاء قائمة المقطع الصوتي
|
||||
|
||||
لعرض قائمة المقطع الصوتي، غيّر 'Spoof Video Streams' إلى iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">إخفاء المشاهدة في VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">تم إخفاء قائمة المشاهدة في الوضع الافتراضي</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">ReVanced dili</string>
|
||||
<string name="revanced_language_user_dialog_message">"Bəzi dillər üçün tərcümələr əskik və ya səhv ola bilər.
|
||||
|
||||
@@ -610,6 +612,7 @@ Bu seçimi dəyişdirmə işə düşmürsə, Gizli rejimə keçməyə çalışı
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Səs trekini gizlət</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Səs axını menyusu gizlidir</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Səs axını menyusu göstərilir</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">\"VR-da İzləni\" gizlət</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">VR menyusunda izləmə gizlidir</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">Паказваць значкі налад ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Значкі налад паказваюцца</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Значкі налад не паказваюцца</string>
|
||||
<string name="revanced_language_title">Мова ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Пераклады для некаторых моў могуць быць адсутнымі або няпоўнымі.
|
||||
|
||||
@@ -610,6 +612,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Схаваць гукавую дарожку</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Меню гукавой дарожкі схавана</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Адлюструецца меню гукавой дарожкі</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Меню аўдыядарожкі схавана
|
||||
|
||||
Каб паказаць меню аўдыядарожкі, змяніце \"Падробка відэаструменяў\" на iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Схаваць гадзіннік у VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Меню прагляду ў VR схавана</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">Показване на иконите на настройките на ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Иконите на настройките се показват</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Иконите на настройките не се показват</string>
|
||||
<string name="revanced_language_title">Език на ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Преводите на някои езици може да липсват или да са непълни.
|
||||
|
||||
@@ -610,6 +612,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Избор на Аудио</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Менюто за избор на Аудио е скрито</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Менюто за избор на Аудио се показва</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Менюто за аудио тракове е скрито
|
||||
|
||||
За да покажете менюто за аудио тракове, променете \"Подмяна на видео потоци\" на iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Гледайте във VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Менюто за гледане в VR е скрито</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">ReVanced সেটিং আইকন দেখান</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">সেটিং আইকন দেখানো হয়েছে</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">সেটিং আইকন দেখানো হচ্ছে না</string>
|
||||
<string name="revanced_language_title">ReVanced ভাষা</string>
|
||||
<string name="revanced_language_user_dialog_message">"কিছু ভাষার জন্য অনুবাদ অনুপস্থিত বা অসম্পূর্ণ হতে পারে।
|
||||
|
||||
@@ -610,6 +612,10 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">অডিও ট্র্যাক লুকান</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">অডিও ট্র্যাক মেনু লুকানো আছে</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">অডিও ট্র্যাক মেনু দেখানো হয়</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"অডিও ট্র্যাক মেনু লুকানো আছে
|
||||
|
||||
অডিও ট্র্যাক মেনু দেখাতে, 'স্পুফ ভিডিও স্ট্রিম' পরিবর্তন করে iOS TV করুন"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">ভিআর-এ ঘড়ি লুকান</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">ভিআর মেনুতে দেখুন লুকানো আছে</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Llenguatge de ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Les traduccions per a algunes llengües poden faltar o ser incompletes.
|
||||
|
||||
@@ -610,6 +612,10 @@ Si canviar aquesta opció no té cap efecte, prova a canviar al mode d'incògnit
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Amaga la pista d\'àudio</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">El menú de la pista d\'àudio s\'amaga</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Es mostra el menú de la pista d\'àudio</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"El menú de la pista d'àudio està amagat
|
||||
|
||||
Per mostrar el menú de la pista d'àudio, canvieu \"Suplanta els fluxos de vídeo\" a iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Amaga Mira en VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">El menú Mira en VR s\'amaga</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Jazyk ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Překlady pro některé jazyky mohou chybět nebo být neúplné.
|
||||
|
||||
@@ -610,6 +612,10 @@ Pokud změna tohoto nastavení nemá žádný účinek, zkuste přepnout do rež
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Skrýt Zvuková stopa</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Menu Zvuková stopa je skryto</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Menu Zvuková stopa je zobrazeno</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Nabídka zvukové stopy je skrytá.
|
||||
|
||||
Chcete-li zobrazit nabídku zvukové stopy, změňte možnost „Zfalšovat streamy videa“ na iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Skrýt Sledovat ve VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Menu Sledovat ve VR je skryto</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">ReVanced-sprog</string>
|
||||
<string name="revanced_language_user_dialog_message">"Oversættelser for nogle sprog mangler muligvis eller er ufuldstændige.
|
||||
|
||||
@@ -573,6 +575,10 @@ Hvis ændring af denne indstilling ikke træder i kraft, kan du prøve at skifte
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Skjul lydspor</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Menuen for lydspor er skjult</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Menuen Lydspor vises</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Lydspormenuen er skjult
|
||||
|
||||
For at vise lydspormenuen skal du ændre \"Spoof videostream\" til iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Skjul vagt i VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Se i VR-menuen er skjult</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">ReVanced-Sprache</string>
|
||||
<string name="revanced_language_user_dialog_message">"Übersetzungen für einige Sprachen fehlen möglicherweise oder sind unvollständig.
|
||||
|
||||
@@ -603,6 +605,10 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Audiospur ausblenden</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Audiospur-Menü ist ausgeblendet</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Audiospurmenü wird angezeigt</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Das Audiotrack-Menü ist ausgeblendet.
|
||||
|
||||
Um das Audiotrack-Menü anzuzeigen, ändere \"Video-Streams fälschen\" zu iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Überwachung in VR ausblenden</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Im VR-Menü beobachten ist ausgeblendet</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Τα εικονίδια ρυθμίσεων εμφανίζονται</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Τα εικονίδια ρυθμίσεων δεν εμφανίζονται</string>
|
||||
<string name="revanced_language_title">Γλώσσα ρυθμίσεων ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Οι μεταφράσεις για κάποιες γλώσσες ενδέχεται να λείπουν ή να είναι ελλιπείς.
|
||||
|
||||
@@ -612,6 +614,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Μενού «Κομμάτι ήχου»</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Εμφανίζεται</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Το μενού «Κομμάτι ήχου» είναι κρυμμένο
|
||||
|
||||
Για να εμφανίζεται το μενού κομματιού ήχου, αλλάξτε την «Παραποίηση ροών βίντεο» σε iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Μενού «Προβολή σε VR»</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Κρυμμένο</string>
|
||||
@@ -1180,7 +1186,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Κουμπιά επέκτασης και κλεισίματος</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Τα κουμπιά δεν εμφανίζονται
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Κρυμμένα
|
||||
|
||||
Σύρετε για να αναπτύξετε ή να κλείσετε"</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Εμφανίζονται</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Idioma de ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Las traducciones para algunos idiomas pueden faltar o estar incompletas.
|
||||
|
||||
@@ -607,6 +609,10 @@ Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito."</st
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Ocultar pista de audio</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">El menú de pista de audio está oculto</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">El menú de pista de audio se muestra</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"El menú de la pista de audio está oculto.
|
||||
|
||||
Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de video\" a iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Ocultar reloj en VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Ver en el menú VR está oculto</string>
|
||||
@@ -699,7 +705,7 @@ Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito."</st
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Etiqueta de ubicación oculta</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Etiqueta de ubicación mostrada</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Ocultar el botón Guardar música</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Guardar botón de música está oculto</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">El botón Guardar música está oculto</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Mostrar el botón de guardar música</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_title">Ocultar el botón Usar plantilla</string>
|
||||
<string name="revanced_hide_shorts_use_template_button_summary_on">Botón de plantilla de uso está oculto</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Revancedi keel</string>
|
||||
<string name="revanced_language_user_dialog_message">"Mõnede keelte tõlked võivad olla puudulikud või ebatäielikud.
|
||||
|
||||
@@ -610,6 +612,10 @@ Kui selle sätte muutmine ei avalda mõju, proovige lülituda Inkognito režiimi
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Peida Helitraek</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Helitraekide menüü on peidetud</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Helitraekide menüü on nähtav</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Heliriba menüü on peidetud
|
||||
|
||||
Heliriba menüü kuvamiseks muutke valikut „Võltsitud videovoogedastus“ väärtuseks iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Peida Vaata VR-is</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Vaata VR-is menüü on peidetud</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -127,6 +126,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">ReVancedin kieli</string>
|
||||
<string name="revanced_language_user_dialog_message">"Joidenkin kielten käännökset saattavat puuttua tai olla puutteellisia.
|
||||
|
||||
@@ -226,6 +228,7 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_artist_cards_title">Piilota artistikortit</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Artistikortit on piilotettu</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Artistikortit näytetään</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Piilota \"tekoälyn luoma videoyhteenveto\"</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Videon yhteenveto-osio on piilotettu</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Videon yhteenveto-osio näytetään</string>
|
||||
<string name="revanced_hide_attributes_section_title">Piilota Määritteet</string>
|
||||
@@ -264,8 +267,10 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Näytetään liittyvissä videoissa</string>
|
||||
<string name="revanced_comments_screen_title">Kommentit</string>
|
||||
<string name="revanced_comments_screen_summary">Piilota tai näytä kommenttiosion osia</string>
|
||||
<string name="revanced_hide_comments_ai_chat_summary_title">Piilota tekoälyn luoma chat-yhteenveto</string>
|
||||
<string name="revanced_hide_comments_ai_chat_summary_summary_on">Chat-yhteenveto on piilotettu</string>
|
||||
<string name="revanced_hide_comments_ai_chat_summary_summary_off">Chat-yhteenveto näytetään</string>
|
||||
<string name="revanced_hide_comments_ai_summary_title">Piilota tekoälyn luoma kommenttiyhteenveto</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_on">Kommenttien yhteenveto on piilotettu</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_off">Kommenttien yhteenveto näytetään</string>
|
||||
<string name="revanced_hide_comments_by_members_header_title">Piilota \"Jäsenten kommentit\" -ylätunniste</string>
|
||||
@@ -607,6 +612,7 @@ Jos tämän asetuksen muuttaminen ei tule voimaan, kokeile vaihtaa Incognito-til
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Piilota Ääniraita</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Ääniraitavalikko on piilotettu</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Ääniraitavalikko näytetään</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Piilota Katso VR-tilassa</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Katso VR-tilassa -valinta on piilotettu</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Wika ng ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Ang mga pagsasalin para sa ilang mga wika ay maaaring nawawala o hindi kumpleto.
|
||||
|
||||
@@ -608,6 +610,10 @@ Tandaan: Ang pagpapagana nito ay nagtatago rin ng mga ad ng video"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Itago ang Audio track</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Nakatago ang menu ng audio track</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Ipinapakita ang menu ng audio track</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Nakatago ang menu ng audio track
|
||||
|
||||
Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Itago ang Panoorin sa VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Nakatago ang panonood sa VR menu</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Langue de ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Il se peut que les traductions dans certaines langues soient manquantes ou incomplètes.
|
||||
|
||||
@@ -610,6 +612,10 @@ Si la modification de ce paramètre ne prend pas effet, essayez de passer en mod
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Masquer \"Piste audio\"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Le menu Piste audio est masqué</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Le menu Piste audio est affiché</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Le menu Piste audio est masqué
|
||||
|
||||
Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Masquer \"Regarder en RV\"</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Le menu Regarder en RV est masqué</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Teanga ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"D'fhéadfadh aistriúcháin do roinnt teangacha a bheith ar iarraidh nó mí-iomlán.
|
||||
|
||||
@@ -610,6 +612,10 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Folaigh Rian Fuaime</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Tá roghchlár rian fuaime i bhfolach</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Taispeántar roghchlár rian fuaime</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Tá roghchlár na rian fuaime i bhfolach
|
||||
|
||||
Chun roghchlár na rian fuaime a thaispeáint, athraigh 'Srutháin físeáin bhréige' go iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Folaigh Watch i VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Tá faire i roghchlár VR i bhfolach</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">ReVanced nyelve</string>
|
||||
<string name="revanced_language_user_dialog_message">"A fordítások hiányozhatnak vagy hiányosak lehetnek néhány nyelven.
|
||||
|
||||
@@ -610,6 +612,10 @@ Ha a beállítás módosítása nem lép életbe, próbáljon meg Inkognitó mó
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Hangsáv elrejtése</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">A hangsáv menü el van rejtve</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">A hangsáv menü megjelenik</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Az audiosáv menü rejtett
|
||||
|
||||
Az audiosáv menü megjelenítéséhez módosítsa a \"Videófolyamok hamisítása\" beállítást iOS TV-re"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">\"Megtekintés VR-módban\" elrejtése</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">A megtekintés VR-módban menü el van rejtve</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">Ցուցադրել ReVanced-ի կարգավորումների պատկերակները</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Կարգավորումների պատկերակները ցուցադրվում են</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Կարգավորումների պատկերակները ցուցադրված չեն</string>
|
||||
<string name="revanced_language_title">ReVanced լեզվի</string>
|
||||
<string name="revanced_language_user_dialog_message">"Որոշ լեզուների թարգմանությունները կարող են լինել բացակայուն կամ անավարտ:
|
||||
|
||||
@@ -610,6 +612,10 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Աուդիո ձայնագրությունը թաքցնել</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Աուդիո ձայնագրման մենյուը թաքցված է</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Աուդիո ձայնագրման մենյուը երևում է</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Աուդիո ուղու ընտրացանկը թաքնված է:
|
||||
|
||||
Աուդիո ուղու ընտրացանկը ցուցադրելու համար փոխեք «Կեղծել տեսահոսքերը»-ը iOS TV-ի"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Դիտել VR-ով թաքցնել</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">VR-ով դիտել մենյուը թաքցված է</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Bahasa ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Terjemahan untuk beberapa bahasa mungkin hilang atau tidak lengkap.
|
||||
|
||||
@@ -610,6 +612,10 @@ Jika mengubah setelan ini tidak berpengaruh, coba beralih ke mode Penyamaran."</
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Sembunyikan trek Audio</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Menu trek audio disembunyikan</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Menu trek audio ditampilkan</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Menu trek audio disembunyikan
|
||||
|
||||
Untuk menampilkan menu trek Audio, ubah 'Spoof aliran video' ke iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Sembunyikan Tonton di VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Menu tonton di VR disembunyikan</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_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>
|
||||
<string name="revanced_language_title">Lingua di ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Le traduzioni per alcune lingue potrebbero essere mancanti o incomplete.
|
||||
|
||||
@@ -610,6 +612,10 @@ Se la modifica di questa impostazione non ha effetto, prova a passare alla modal
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Nascondi Traccia audio</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Il menu Traccia audio è nascosto</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Il menu Traccia audio è visibile</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Il menu della traccia audio è nascosto
|
||||
|
||||
Per mostrare il menu della traccia audio, cambia \"Spoof video streams\" in iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Nascondi Guarda in VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Il menu Guarda in VR è nascosto</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -596,6 +595,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">הסתר טראק אודיו</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">תפריט טראק אודיו מוסתר</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">תפריט טראק אודיו מוצג</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">הסתר \'צפה ב-VR\'</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">תפריט \'צפה ב-VR\' מוסתר</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -25,7 +24,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_check_environment_failed_title">チェックに失敗しました</string>
|
||||
<string name="revanced_check_environment_dialog_open_official_source_button">公式サイトを開く</string>
|
||||
<string name="revanced_check_environment_dialog_ignore_button">無視する</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>このアプリは、あなたによってパッチが適用されていないようです。</h5><br>このアプリは正しく動作しない可能性があり、<b>有害または危険なものである可能性があります</b>。<br><br>以下の検査結果は、このアプリがパッチ済みAPKであるか、または他のユーザーから取得したものであることを示唆しています。<br><br><small>%1$s</small><br>検証済みで安全なアプリを確実に使用するために、<b>このアプリをアンインストールして、自分でパッチを適用する</b>ことを強くお勧めします。<p><br>無視した場合、この警告は2回のみ表示されます。</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>このアプリは、あなたによってパッチが適用されていないようです。</h5><br>このアプリは正しく動作しない可能性があり、<b>有害または危険なものである可能性があります</b>。<br><br>以下の検査結果は、このアプリがパッチ済みAPKであるか、または他のユーザーから取得したものであることを示唆しています。<br><br><small>%1$s</small><br>検証済みで安全なアプリを確実に使用するために、<b>このアプリをアンインストールして、自分でパッチを適用する</b>ことを強くお勧めします。<p><br>無視した場合、この警告は2回だけ表示されます。</string>
|
||||
<string name="revanced_check_environment_not_same_patching_device">別のデバイス上でパッチが適用されている</string>
|
||||
<string name="revanced_check_environment_manager_not_expected_installer">ReVanced Manager によってインストールされていない</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time">10 分以上前にパッチが適用されている</string>
|
||||
@@ -43,7 +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_language_title">ReVancedの言語</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>
|
||||
<string name="revanced_language_title">ReVanced の言語</string>
|
||||
<string name="revanced_language_user_dialog_message">"一部の言語の翻訳が不足しているか、不完全である可能性があります。
|
||||
|
||||
新しい言語を翻訳するには、 translate.revanced.app にアクセスしてください"</string>
|
||||
@@ -66,7 +68,7 @@ Second \"item\" text"</string>
|
||||
|
||||
下記ウェブサイト「Don't kill my app」の携帯電話メーカー別のガイドに従い、MicroG GmsCore に対するデバイスの設定を変更してください。
|
||||
|
||||
この操作はアプリが動作するために必要です。"</string>
|
||||
この操作はアプリが正常に動作するために必要です。"</string>
|
||||
<string name="gms_core_dialog_open_website_text">ウェブサイトを開く</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">"問題を防ぐために、MicroG GmsCore に対する電池の最適化を必ず無効にしてください。
|
||||
|
||||
@@ -612,6 +614,10 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">「音声トラック」を非表示</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">「音声トラック」は表示されません</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">「音声トラック」は表示されます</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"「音声トラック」は表示されません
|
||||
|
||||
「音声トラック」を表示するには、「動画ストリームを偽装する」の「デフォルトのクライアント」を iOS TV に変更してください"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">「VR で見る」を非表示</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">「VR で見る」は表示されません</string>
|
||||
@@ -846,7 +852,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_title">API fetch votes, number of timeout</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary">ネットワーク通話がタイムアウトされていません</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary">%d ネットワーク呼び出しがタイムアウトしました</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">APIクライアントのレート制限</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">API クライアントのレート制限</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary">クライアント レート制限は発生していません</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary">クライアント レート制限が %d 回発生しました</string>
|
||||
<string name="revanced_ryd_statistics_millisecond_text">%d ミリ秒前</string>
|
||||
@@ -872,29 +878,29 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">シーク位置のサムネイルがプレーヤー画面全体に表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">SponsorBlock を有効にする</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock は、YouTube 動画の不要な部分をスキップするためのクラウドソーシングシステムです</string>
|
||||
<string name="revanced_sb_enable_sb">SponsorBlock を有効化</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock はユーザーからの情報提供により YouTube 動画のわずらわしい部分をスキップする機能です</string>
|
||||
<string name="revanced_sb_appearance_category">外観</string>
|
||||
<string name="revanced_sb_enable_voting">投票ボタンを表示</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">セグメント投票ボタンが表示されます</string>
|
||||
<string name="revanced_sb_enable_voting_sum_off">セグメント投票ボタンは表示されません</string>
|
||||
<string name="revanced_sb_square_layout">正方形のレイアウトを使用</string>
|
||||
<string name="revanced_sb_square_layout_sum_on">ボタンとコントロールが正方形になります</string>
|
||||
<string name="revanced_sb_square_layout_sum_off">ボタンとコントロールは丸みを帯びています</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">プレーヤー オーバーレイにセグメントへの投票ボタンが表示されます</string>
|
||||
<string name="revanced_sb_enable_voting_sum_off">プレーヤー オーバーレイにセグメントへの投票ボタンは表示されません</string>
|
||||
<string name="revanced_sb_square_layout">四角ボタンを使用する</string>
|
||||
<string name="revanced_sb_square_layout_sum_on">ボタンとコントロールの角は直角です</string>
|
||||
<string name="revanced_sb_square_layout_sum_off">ボタンとコントロールの角は丸角です</string>
|
||||
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
|
||||
<string name="revanced_sb_enable_compact_skip_button">コンパクトな「スキップ」ボタンを使用</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">スキップボタンはコンパクトに表示されます</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">スキップボタンは最適なサイズで表示されます</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">「スキップ」ボタンを自動的に非表示</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">スキップボタンは数秒後に非表示になります</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">セグメント全体に「スキップ」ボタンが表示されます</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button">コンパクトなスキップボタンを使用する</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">ボタンに「スキップ」とだけ表示されます</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">ボタンにカテゴリー名が表示されます</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">スキップボタンを自動的に非表示にする</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">スキップボタンは表示された数秒後に自動的に非表示になります</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_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_on">セグメントが自動的にスキップされたときにトースト ポップアップが表示されます。ここをタップするとサンプルが表示されます</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">トースト ポップアップは表示されません。例を見るにはここをタップしてください</string>
|
||||
<string name="revanced_sb_general_time_without">セグメントを除いた再生時間を表示</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">セグメントを除いた再生時間が、動画全体の再生時間の横に括弧付きで表示されます</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">動画全体の再生時間のみが表示されます</string>
|
||||
<string name="revanced_sb_create_segment_category">新しいセグメントを作成する</string>
|
||||
<string name="revanced_sb_create_segment_category">セグメントの作成</string>
|
||||
<string name="revanced_sb_enable_create_segment">新しいセグメント作成ボタンを表示</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_on">新しいセグメントを作成するボタンが表示されます</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_off">新しいセグメントを作成するボタンは表示されません</string>
|
||||
@@ -936,59 +942,59 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
|
||||
ユーザー ID はパスワードのようなものであり、共有しないでください。"</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">今後表示しない</string>
|
||||
<string name="revanced_sb_diff_segments">セグメントの動作を変更する</string>
|
||||
<string name="revanced_sb_diff_segments">セグメントのスキップ</string>
|
||||
<string name="revanced_sb_segments_sponsor">スポンサー</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">有料プロモーション, 有料紹介と直接広告. ない原因/原因/クリエイター/ウェブサイト/製品への自己宣伝または無料シャウトアウト 彼らが好きなもの</string>
|
||||
<string name="revanced_sb_segments_selfpromo">無報酬/セルフプロモーション</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">スポンサーと同様に、無給または自己宣伝の場合。商品、寄付、またはコラボレーション相手に関する情報を記載したセクションが含まれます</string>
|
||||
<string name="revanced_sb_segments_interaction">インタラクション リマインダー (チャンネル登録)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">コンテンツの途中で、購読したりフォローしたりするための短いリマインダーです。 それが長いまたは特定の何かについてである場合、それは代わりに自己宣伝の下にあるべきである。</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">有料の宣伝 、紹介、直接広告。自己宣伝や好みのクリエーター、ウェブサイト、製品、慈善活動などの無報酬の宣伝は含まれません</string>
|
||||
<string name="revanced_sb_segments_selfpromo">無報酬の宣伝 / 自己宣伝</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">無報酬または自己宣伝である、という点以外は「スポンサー」と同様です。商品、寄付、コラボ相手に関する宣伝を含みます</string>
|
||||
<string name="revanced_sb_segments_interaction">視聴者への催促 (登録)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">動画中に差し込まれる視聴者への高評価、チャンネル登録、フォローなどの短時間の催促。時間的に長い、または何か具体的なものに関する催促は「視聴者への催促」ではなく「自己宣伝」に分類すべきです</string>
|
||||
<string name="revanced_sb_segments_highlight">ハイライト</string>
|
||||
<string name="revanced_sb_segments_highlight_sum">動画の中で最も興味を引く場面</string>
|
||||
<string name="revanced_sb_segments_intro">休憩/イントロ アニメーション</string>
|
||||
<string name="revanced_sb_segments_intro">幕間 / オープニング (イントロ)</string>
|
||||
<string name="revanced_sb_segments_intro_sum">実際のコンテンツを含まない間隔。一時停止、固定フレーム、繰り返しアニメーションを使用できます。情報を含むトランジションは含まれません。</string>
|
||||
<string name="revanced_sb_segments_outro">エンドカード/クレジット</string>
|
||||
<string name="revanced_sb_segments_outro">終了画面 / クレジット (アウトロ)</string>
|
||||
<string name="revanced_sb_segments_outro_sum">クレジットまたはYouTubeのエンドカードが表示される場合、情報を持つ結論にはなりません</string>
|
||||
<string name="revanced_sb_segments_preview">プレビュー/再読み込み/フック</string>
|
||||
<string name="revanced_sb_segments_preview">予告編 / 総集編 / フック</string>
|
||||
<string name="revanced_sb_segments_preview_sum">ビデオやシリーズの他のビデオで何が起こったのかを示すクリップのコレクション 全ての情報が他の場所で繰り返されます</string>
|
||||
<string name="revanced_sb_segments_filler">無駄な脱線/冗談</string>
|
||||
<string name="revanced_sb_segments_filler_sum">Tangential シーンは、ビデオの主な内容を理解する必要がないフィラーやユーモアにのみ追加されました。 コンテキストや背景の詳細を提供するセグメントが含まれていません</string>
|
||||
<string name="revanced_sb_segments_filler">尺稼ぎの余談 / 冗談</string>
|
||||
<string name="revanced_sb_segments_filler_sum">動画の本筋を理解するのに必要のない、尺稼ぎやユーモアのみを目的として追加された脱線的な場面。コンテキストや背景情報を提供するセグメントは含まれません</string>
|
||||
<string name="revanced_sb_segments_nomusic">音楽: 楽曲以外の区間</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">ミュージックビデオ専用。ミュージックビデオの中の楽曲以外の区間、公式の音源やミュージックビデオに含まれていない区間</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間。他のカテゴリーのセグメントと重なる場合があります</string>
|
||||
<string name="revanced_sb_skip_button_compact">スキップ</string>
|
||||
<string name="revanced_sb_skip_button_compact_highlight">ハイライト</string>
|
||||
<string name="revanced_sb_skip_button_sponsor">スポンサーをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_selfpromo">プロモーションをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_interaction">対話をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_highlight">ハイライトまでスキップ</string>
|
||||
<string name="revanced_sb_skip_button_intro_beginning">イントロをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_intro_middle">間隔をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_intro_end">間隔をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_outro">アウトロをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_preview_beginning">プレビューをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_preview_middle">プレビューをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_preview_end">要約をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_filler">フィラーをスキップ</string>
|
||||
<string name="revanced_sb_skip_button_nomusic">楽曲以外をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_sponsor">「 スポンサー」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_selfpromo">「自己宣伝」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_interaction">「催促」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_highlight">「ハイライト」までスキップ</string>
|
||||
<string name="revanced_sb_skip_button_intro_beginning">「イントロ」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_intro_middle">「幕間」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_intro_end">「幕間」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_outro">「アウトロ」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_preview_beginning">「予告編」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_preview_middle">「予告編」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_preview_end">「総集編」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_filler">「余談」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_nomusic">「楽曲以外」をスキップ</string>
|
||||
<string name="revanced_sb_skip_button_unsubmitted">セグメントをスキップ</string>
|
||||
<string name="revanced_sb_skipped_sponsor">スキップしたスポンサー</string>
|
||||
<string name="revanced_sb_skipped_selfpromo">スキップしたセルフプロモーション</string>
|
||||
<string name="revanced_sb_skipped_interaction">スキップした迷惑なリマインダー</string>
|
||||
<string name="revanced_sb_skipped_highlight">ハイライトまでスキップしました</string>
|
||||
<string name="revanced_sb_skipped_intro_beginning">スキップしたイントロ</string>
|
||||
<string name="revanced_sb_skipped_intro_middle">スキップされた休憩時間</string>
|
||||
<string name="revanced_sb_skipped_intro_end">スキップされた休憩時間</string>
|
||||
<string name="revanced_sb_skipped_outro">スキップしたアウトロ</string>
|
||||
<string name="revanced_sb_skipped_preview_beginning">スキップしたプレビュー</string>
|
||||
<string name="revanced_sb_skipped_preview_middle">スキップしたプレビュー</string>
|
||||
<string name="revanced_sb_skipped_preview_end">スキップされた要約</string>
|
||||
<string name="revanced_sb_skipped_filler">つなぎシーンをスキップしました</string>
|
||||
<string name="revanced_sb_skipped_nomusic">楽曲以外の区間をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_sponsor">「スポンサー」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_selfpromo">「自己宣伝」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_interaction">「視聴者への催促」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_highlight">「ハイライト」までスキップしました</string>
|
||||
<string name="revanced_sb_skipped_intro_beginning">「イントロ」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_intro_middle">「幕間」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_intro_end">「幕間」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_outro">「アウトロ」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_preview_beginning">「予告編」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_preview_middle">「予告編」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_preview_end">「総集編」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_filler">「余談」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_nomusic">「楽曲以外の区間」をスキップしました</string>
|
||||
<string name="revanced_sb_skipped_unsubmitted">未送信のセグメントをスキップしました</string>
|
||||
<string name="revanced_sb_skipped_multiple_segments">複数のセグメントをスキップ</string>
|
||||
<string name="revanced_sb_skipped_multiple_segments">複数のセグメントをスキップしました</string>
|
||||
<string name="revanced_sb_skip_automatically">自動的にスキップ</string>
|
||||
<string name="revanced_sb_skip_automatically_once">一度自動的にスキップ</string>
|
||||
<string name="revanced_sb_skip_showbutton">「スキップ」ボタンを表示</string>
|
||||
<string name="revanced_sb_skip_automatically_once">1 回だけ自動的にスキップ</string>
|
||||
<string name="revanced_sb_skip_showbutton">スキップ ボタンを表示</string>
|
||||
<string name="revanced_sb_skip_seekbaronly">シークバーに表示</string>
|
||||
<string name="revanced_sb_skip_ignore">無効</string>
|
||||
<string name="revanced_sb_submit_failed_invalid">セグメントを送信できません: %s</string>
|
||||
@@ -1048,15 +1054,15 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_sb_stats_username_changed">ユーザー名は正常に変更されました</string>
|
||||
<string name="revanced_sb_stats_reputation">あなたの評判は <b>%.2f</b></string>
|
||||
<string name="revanced_sb_stats_submissions"><b>%s</b> 個のセグメントを作成しました</string>
|
||||
<string name="revanced_sb_stats_submissions_sum">セグメントを見るにはここをタップしてください</string>
|
||||
<string name="revanced_sb_stats_saved_zero">SponsorBlockリーダーボード</string>
|
||||
<string name="revanced_sb_stats_saved"><b>%s</b> 個のセグメントから人々を救いました</string>
|
||||
<string name="revanced_sb_stats_saved_sum_zero">ここをタップすると、世界的な統計とトップの貢献者を見ることができます</string>
|
||||
<string name="revanced_sb_stats_saved_sum">それは <b>%s</b> の生活です。<br>ここをタップしてリーダーボードを見る</string>
|
||||
<string name="revanced_sb_stats_self_saved"><b>%s</b> セグメントをスキップしました</string>
|
||||
<string name="revanced_sb_stats_self_saved_sum"><b>%s</b></string>
|
||||
<string name="revanced_sb_stats_self_saved_reset_title">スキップされたセグメントカウンターをリセットしますか?</string>
|
||||
<string name="revanced_sb_stats_saved_hour_format">%1$s時間%2$s分</string>
|
||||
<string name="revanced_sb_stats_submissions_sum">作成したセグメントを表示するには、ここをタップしてください</string>
|
||||
<string name="revanced_sb_stats_saved_zero">SponsorBlock リーダーボード</string>
|
||||
<string name="revanced_sb_stats_saved">合計で <b>%s</b> 個のセグメントから人々を救いました</string>
|
||||
<string name="revanced_sb_stats_saved_sum_zero">グローバルの統計と上位の貢献者を表示するには、ここをタップしてください</string>
|
||||
<string name="revanced_sb_stats_saved_sum">時間にして <b>%s</b> です。<br>ここをタップすると、リーダーボードが表示されます</string>
|
||||
<string name="revanced_sb_stats_self_saved">合計で <b>%s</b> 個のセグメントをスキップしました</string>
|
||||
<string name="revanced_sb_stats_self_saved_sum">時間にして <b>%s</b> です</string>
|
||||
<string name="revanced_sb_stats_self_saved_reset_title">スキップしたセグメントの合計をリセットしますか?</string>
|
||||
<string name="revanced_sb_stats_saved_hour_format">%1$s 時間 %2$s 分</string>
|
||||
<string name="revanced_sb_stats_saved_minute_format">%1$s 分 %2$s 秒</string>
|
||||
<string name="revanced_sb_stats_saved_second_format">%s 秒</string>
|
||||
<string name="revanced_sb_color_opacity_label">透明度:</string>
|
||||
@@ -1187,7 +1193,7 @@ Automotive レイアウト
|
||||
<string name="revanced_miniplayer_hide_subtext_title">サブテキストを非表示</string>
|
||||
<string name="revanced_miniplayer_hide_subtext_summary_on">サブテキストは表示されません</string>
|
||||
<string name="revanced_miniplayer_hide_subtext_summary_off">サブテキストは表示されます</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_title">早送り / 巻き戻しボタンを非表示</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_title">早送りボタンと巻き戻しボタンを非表示</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_summary_on">早送りボタンと巻き戻しボタンは表示されません</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_summary_off">早送りボタンと巻き戻しボタンは表示されます</string>
|
||||
<string name="revanced_miniplayer_width_dip_title">デフォルトのサイズ</string>
|
||||
@@ -1232,7 +1238,7 @@ Automotive レイアウト
|
||||
<string name="revanced_alt_thumbnail_options_entry_4">静止画サムネイル</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow は、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。これを有効にすると、動画の URL が API サーバーに送信されますが、他のデータは送信されません。動画に DeArrow サムネイルがない場合は、オリジナルのサムネイルまたは静止画サムネイルが表示されます
|
||||
|
||||
DeArrow の詳細については、ここをタップしてください"</string>
|
||||
詳細については、ここをタップしてください"</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>
|
||||
@@ -1281,8 +1287,8 @@ DeArrow の詳細については、ここをタップしてください"</string
|
||||
<string name="revanced_spoof_device_dimensions_user_dialog_message">この機能を有効にすると、動画のカクつき、バッテリー寿命の悪化、および予期せぬ副作用を引き起こす可能性があります。</string>
|
||||
</patch>
|
||||
<patch id="misc.gms.gmsCoreSupportResourcePatch">
|
||||
<string name="microg_settings_title">GmsCore設定</string>
|
||||
<string name="microg_settings_summary">GmsCoreの設定</string>
|
||||
<string name="microg_settings_title">GmsCore 設定</string>
|
||||
<string name="microg_settings_summary">GmsCore の設定</string>
|
||||
</patch>
|
||||
<patch id="misc.links.bypassURLRedirectsPatch">
|
||||
<string name="revanced_bypass_url_redirects_title">URL リダイレクトを回避する</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ 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_show_menu_icons_title">ReVanced 설정 아이콘 표시하기</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">설정 아이콘을 표시합니다</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">설정 아이콘을 표시하지 않습니다</string>
|
||||
<string name="revanced_language_title">ReVanced 언어</string>
|
||||
<string name="revanced_language_user_dialog_message">"일부 언어의 번역이 누락되었거나 완료되지 않았을 수 있습니다
|
||||
|
||||
@@ -409,8 +411,8 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
|
||||
</patch>
|
||||
<patch id="interaction.dialog.removeViewerDiscretionDialogPatch">
|
||||
<string name="revanced_remove_viewer_discretion_dialog_title">시청 경고 다이얼로그 제거하기</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary_on">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상\n• 일부 사용자에게 부적절한 동영상, etc.</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary_off">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상\n• 일부 사용자에게 부적절한 동영상, etc.</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary_on">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상, etc.</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary_off">다음 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다:\n• 연령 제한 동영상\n• 자살 또는 자해와 관련된 동영상, etc.</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_user_dialog_message">이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다</string>
|
||||
</patch>
|
||||
<patch id="interaction.downloads.downloadsResourcePatch">
|
||||
@@ -610,6 +612,10 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">오디오 트랙 메뉴 숨기기</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">오디오 트랙 메뉴가 숨겨집니다</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">오디오 트랙 메뉴가 표시됩니다</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"오디오 트랙 메뉴가 숨겨집니다
|
||||
|
||||
오디오 트랙 메뉴를 표시하려면 '스트리밍 데이터 변경하기'에서 기본 클라이언트를 iOS TV로 변경하세요"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">VR로 보기 메뉴 숨기기</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">VR로 보기 메뉴가 숨겨집니다</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced nustatymai atstatyti į numatytuosius</string>
|
||||
<string name="revanced_settings_import_success">Importuota %d nustatymų</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importavimas nepavyko: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Rodyti „ReVanced“ nustatymų piktogramas</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Nustatymų piktogramos yra rodomos</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Nenurodomos nustatymų piktogramos</string>
|
||||
<string name="revanced_language_title">ReVanced kalba</string>
|
||||
<string name="revanced_language_user_dialog_message">"Kai kurių kalbų vertimai gali būti neišsamūs ar trūkti.
|
||||
|
||||
@@ -610,6 +612,8 @@ Jei pakeitus šį nustatymą neįsigalioja, pabandykite perjungti į inkognito r
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Slėpti Garso takelius</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Garso takelių meniu yra paslėptas</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Garso takelių meniu yra rodomas</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Garso takelio meniu yra paslėptas.\n\nNorėdami parodyti garso takelio meniu, pakeiskite „Apsimesti vaizdo srautais“ į „iOS TV“"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Slėpti Žiūrėti VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Žiūrėti VR meniu yra paslėptas</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced iestatījumi atiestatīti uz noklusējuma vērtībām</string>
|
||||
<string name="revanced_settings_import_success">Importēti %d iestatījumi</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importēšana neizdevās: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Rādīt ReVanced iestatījumu ikonas</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Iestatījumu ikonas tiek rādītas</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikonas iestatījumos netiek rādītas</string>
|
||||
<string name="revanced_language_title">ReVanced valoda</string>
|
||||
<string name="revanced_language_user_dialog_message">"Tulkojuma dažām valodām var būt nepilnīgs vai nebūt vispār.
|
||||
|
||||
@@ -610,6 +612,10 @@ Ja šī iestatījuma maiņa nestājas spēkā, mēģiniet pārslēgties uz inkog
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Paslēpt Audio ceļu</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Audio ceļa izvēlne ir paslēpta</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Audio ceļa izvēlne ir redzama</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Audio celiņu izvēlne ir paslēpta.
|
||||
|
||||
Lai parādītu audio celiņu izvēlni, mainiet \"Video straumju viltošana\" uz iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Paslēpt Skatīties VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Skatīties VR izvēlne ir paslēpta</string>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -107,6 +106,7 @@ Second \"item\" text"</string>
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
All strings must have a unique path, even if the same string is declared in two different apps.
|
||||
This is because Crowdin requires temporarily flattening this file and removing the <app> and <patch> elements.
|
||||
|
||||
|
||||
Strings with new lines must be raw strings where they're wrapped in quotes and new lines are not encoded.
|
||||
Raw strings still requires escaping embedded double quotes but escaping embedded single quotes is optional.
|
||||
|
||||
@@ -43,6 +42,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced-instellingen zijn teruggezet naar de standaardinstellingen</string>
|
||||
<string name="revanced_settings_import_success">%d instellingen geïmporteerd</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importeren mislukt: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Pictogrammen voor ReVanced-instellingen weergeven</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Instellingspictogrammen worden weergegeven</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Pictogrammen voor instellingen worden niet weergegeven</string>
|
||||
<string name="revanced_language_title">ReVanced-taal</string>
|
||||
<string name="revanced_language_user_dialog_message">"Vertalingen voor sommige talen kunnen ontbreken of onvolledig zijn.
|
||||
|
||||
@@ -610,6 +612,10 @@ Als het wijzigen van deze instelling geen effect heeft, probeer dan over te scha
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Verberg Audiotrack</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Menu Audiotrack is verborgen</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Menu Audiotrack wordt weergegeven</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Audiotrackmenu is verborgen
|
||||
|
||||
Om het audiotrackmenu weer te geven, wijzigt u 'Videostreams vervalsen' in iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Verberg Bekijk in VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Menu Bekijk in VR is verborgen</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user