mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-25 18:34:07 +01:00
Compare commits
22 Commits
v5.19.0-de
...
v5.19.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f3aeb35e5 | ||
|
|
e30f593af0 | ||
|
|
df965b8a9b | ||
|
|
654587a75e | ||
|
|
9956833781 | ||
|
|
c585b26188 | ||
|
|
de0d11fcfb | ||
|
|
d321504fcf | ||
|
|
6005c97bf5 | ||
|
|
e404d84c83 | ||
|
|
1abed31968 | ||
|
|
a75a88d3c6 | ||
|
|
3d67d90473 | ||
|
|
fa1e137a43 | ||
|
|
ac71a53c73 | ||
|
|
0bff207efc | ||
|
|
e1a8b388a5 | ||
|
|
628d18489c | ||
|
|
36772b8b2e | ||
|
|
49c849979f | ||
|
|
0bdb8cdf2b | ||
|
|
2035c9e2e9 |
70
CHANGELOG.md
70
CHANGELOG.md
@@ -1,3 +1,73 @@
|
||||
# [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)
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
}
|
||||
@@ -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.3
|
||||
version = 5.19.0-dev.13
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -92,7 +92,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,
|
||||
) {
|
||||
|
||||
@@ -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,17 @@ internal val contextMenuExperimentsFingerprint = fingerprint {
|
||||
parameters("L")
|
||||
strings("remove_ads_upsell_enabled")
|
||||
}
|
||||
|
||||
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;") }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
|
||||
|
||||
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", spotifyMainActivityOnCreate))
|
||||
|
||||
execute {
|
||||
IS_SPOTIFY_LEGACY_APP_TARGET = spotifyMainActivityOnCreate.fingerprint
|
||||
.originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,16 @@ package app.revanced.patches.spotify.misc.extension
|
||||
|
||||
import app.revanced.patches.shared.misc.extension.extensionHook
|
||||
|
||||
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 spotifyMainActivityOnCreate = extensionHook {
|
||||
custom { method, classDef ->
|
||||
classDef.type == "Lcom/spotify/music/SpotifyMainActivity;" &&
|
||||
method.name == "onCreate"
|
||||
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",
|
||||
)
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
),
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -43,6 +43,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">"قد تكون الترجمات لبعض اللغات مفقودة أو غير مكتملة.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"Пераклады для некаторых моў могуць быць адсутнымі або няпоўнымі.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"Преводите на някои езици може да липсват или да са непълни.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"কিছু ভাষার জন্য অনুবাদ অনুপস্থিত বা অসম্পূর্ণ হতে পারে।
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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é.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"Οι μεταφράσεις για κάποιες γλώσσες ενδέχεται να λείπουν ή να είναι ελλιπείς.
|
||||
|
||||
@@ -1180,7 +1183,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>
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
@@ -699,7 +702,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>
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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 +229,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 +268,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>
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"Որոշ լեզուների թարգմանությունները կարող են լինել բացակայուն կամ անավարտ:
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,7 +43,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 +69,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 に対する電池の最適化を必ず無効にしてください。
|
||||
|
||||
@@ -872,29 +875,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 +939,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>
|
||||
@@ -1053,9 +1056,9 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<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">合計で <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_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>
|
||||
@@ -1187,7 +1190,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>
|
||||
@@ -1281,8 +1284,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>
|
||||
|
||||
@@ -43,6 +43,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 +412,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">
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,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.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Przywrócono domyślne ustawienia ReVanced</string>
|
||||
<string name="revanced_settings_import_success">Zaimportowano %d ustawień</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importowanie nie powiodło się: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Pokaż ikony ustawień ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikony ustawień są widoczne</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikony ustawień nie są wyświetlane</string>
|
||||
<string name="revanced_language_title">Język ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Tłumaczenia dla niektórych języków mogą być niepełne lub nieaktualne.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Configurações do ReVanced redefinidas para o padrão</string>
|
||||
<string name="revanced_settings_import_success">Configurações %d importadas</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importação falhou: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Mostrar ícones de configuração do ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ícones de configuração são mostrados</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Os ícones de configuração não são mostrados</string>
|
||||
<string name="revanced_language_title">Idioma do ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"As traduções para alguns idiomas podem estar ausentes ou incompletas.\n\nPara traduzir novos idiomas, acesse translate.revanced.app"</string>
|
||||
<string name="revanced_language_DEFAULT">Idioma do aplicativo</string>
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">As definições do ReVanced foram redefinidas para a predefinição</string>
|
||||
<string name="revanced_settings_import_success">Configurações importadas: %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">A importação falhou: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Mostrar ícones de configuração do ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Os ícones de configuração são mostrados</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Os ícones de configuração não são mostrados</string>
|
||||
<string name="revanced_language_title">Idioma do ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"As traduções para algumas línguas podem estar em falta ou incompletas.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Setările ReVanced au fost resetate la valorile implicite</string>
|
||||
<string name="revanced_settings_import_success">Au fost importate %d setări</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importare eșuată: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Afișați pictogramele de setări ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Pictogramele de setări sunt afișate</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Pictogramele setărilor nu sunt afișate</string>
|
||||
<string name="revanced_language_title">Limba ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Traducerile pentru unele limbi pot lipsi sau pot fi incomplete.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">Иконки в настройках 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">"Переводы для некоторых языков могут отсутствовать или быть неполными.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Nastavenia ReVanced sa obnovia na predvolené</string>
|
||||
<string name="revanced_settings_import_success">Počet importovaných nastavení: %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Import zlyhal: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Zobraziť ikony nastavení ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikony nastavení sa zobrazujú</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikony nastavení sa nezobrazujú</string>
|
||||
<string name="revanced_language_title">Jazyk reVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Pre niektoré jazyky môžu chýbať preklady alebo môžu byť neúplné.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced nastavitve ponastavljene na privzeto</string>
|
||||
<string name="revanced_settings_import_success">Uvoženih %d nastavitev</string>
|
||||
<string name="revanced_settings_import_failure_parse">Uvoz ni uspel: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Pokaži ikone nastavitev ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikone nastavitev so prikazane</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikone nastavitev niso prikazane</string>
|
||||
<string name="revanced_language_title">ReVanced jezik</string>
|
||||
<string name="revanced_language_user_dialog_message">"Prevodi za nekatere jezike morda manjkajo ali so nepopolni.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Cilësimet e ReVanced u rivendosën në cilësimet e parazgjedhura</string>
|
||||
<string name="revanced_settings_import_success">Importuan %d cilësime</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importimi dështoi: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Shfaq ikonat e cilësimeve të ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikonat e cilësimeve shfaqen</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikonat e cilësimeve nuk shfaqen</string>
|
||||
<string name="revanced_language_title">Gjuha e ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Përkthimet për disa gjuhë mund të jenë të humbura ose të paplota.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Podešavanja ReVanceda su vraćena na podrazumevane vrednosti</string>
|
||||
<string name="revanced_settings_import_success">Uvezeno %d podešavanja</string>
|
||||
<string name="revanced_settings_import_failure_parse">Neuspešan uvoz: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Prikaži ikonice podešavanja ReVanceda</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ikonice podešavanja su prikazane</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikonice podešavanja nisu prikazane</string>
|
||||
<string name="revanced_language_title">Jezik ReVanceda</string>
|
||||
<string name="revanced_language_user_dialog_message">"Prevodi za neke jezike mogu nedostajati ili biti nepotpuni.
|
||||
|
||||
|
||||
@@ -43,6 +43,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-a</string>
|
||||
<string name="revanced_language_user_dialog_message">"Преводи за неке језике могу недостајати или бити непотпуни.
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced-inställningarna återställda till standard</string>
|
||||
<string name="revanced_settings_import_success">Importerade %d inställningar</string>
|
||||
<string name="revanced_settings_import_failure_parse">Importen misslyckades: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Visa ikoner för ReVanced-inställningar</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Inställningsikoner visas</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ikoner för inställningar visas inte</string>
|
||||
<string name="revanced_language_title">Språket för ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Översättningar till vissa språk kan vara ofullständiga eller saknas.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"การแปลบางภาษาอาจหายไปหรือไม่สมบูรณ์
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced ayarları varsayılanlara sıfırlandı</string>
|
||||
<string name="revanced_settings_import_success">%d ayar içe aktarıldı</string>
|
||||
<string name="revanced_settings_import_failure_parse">İçe aktarılamadı: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced ayar simgelerini göster</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Ayar simgeleri gösteriliyor</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Ayar simgeleri gösterilmiyor</string>
|
||||
<string name="revanced_language_title">ReVanced dili</string>
|
||||
<string name="revanced_language_user_dialog_message">"Bazı diller için çeviriler eksik veya tamamlanmamış olabilir.
|
||||
|
||||
|
||||
@@ -43,6 +43,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">"Переклади для деяких мов можуть бути відсутні або неповні.
|
||||
|
||||
@@ -810,12 +813,12 @@ Second \"item\" text"</string>
|
||||
<!-- Video likes have been set to hidden by the video uploader. -->
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Приховано власником</string>
|
||||
<string name="revanced_ryd_enable_summary_on">Відмітки \"Не подобається\" показуються</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Відмітки \"Не подобається\" приховано</string>
|
||||
<string name="revanced_ryd_enable_summary_off">Відмітки \"Не подобається\" не показуються</string>
|
||||
<string name="revanced_ryd_shorts_title">Відмітки \"Не подобається\" в Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"Відмітки \"Не подобається\" в Shorts показуються
|
||||
|
||||
Обмеження: Відмітки \"Не подобається\" не можуть показуватися в анонімному режимі"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Відмітки \"Не подобається\" в Shorts приховано</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">Відмітки \"Не подобається\" в Shorts не показуються</string>
|
||||
<string name="revanced_ryd_dislike_percentage_title">Відмітки \"Не подобається\" у відсотках</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_on">Відмітки \"Не подобається\" показуються у відсотках</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_off">Відмітки \"Не подобається\" показуються як число</string>
|
||||
|
||||
@@ -43,6 +43,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Khôi phục mặc định cài đặt ReVanced</string>
|
||||
<string name="revanced_settings_import_success">Đã nhập cài đặt %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Nhập thất bại: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Hiện biểu tượng cài đặt ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Các biểu tượng cài đặt được hiện</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Các biểu tượng cài đặt không được hiện</string>
|
||||
<string name="revanced_language_title">Ngôn ngữ ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Dịch cho một số ngôn ngữ có thể bị thiếu hoặc không đầy đủ.
|
||||
|
||||
@@ -227,8 +230,8 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n
|
||||
<string name="revanced_hide_artist_cards_summary_on">Thẻ nghệ sĩ được ẩn</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Thẻ nghệ sĩ được hiện</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Ẩn \'Tóm tắt video do AI tạo\'</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Phần tóm tắt video bị ẩn</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Phần tóm tắt video đang hiển thị</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Phần tóm tắt video được ẩn</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Phần tóm tắt video được hiện</string>
|
||||
<string name="revanced_hide_attributes_section_title">Ẩn Thuộc tính</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập bị ẩn</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiện</string>
|
||||
@@ -269,8 +272,8 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n
|
||||
<string name="revanced_hide_comments_ai_chat_summary_summary_on">Tóm tắt trò chuyện được ẩn</string>
|
||||
<string name="revanced_hide_comments_ai_chat_summary_summary_off">Tóm tắt trò chuyện được hiện</string>
|
||||
<string name="revanced_hide_comments_ai_summary_title">Ẩn tóm tắt Bình luận AI</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_on">Tóm tắt bình luận đã ẩn</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_off">Tóm tắt bình luận được hiển thị</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_on">Tóm tắt bình luận được ẩn</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_off">Tóm tắt bình luận được hiện</string>
|
||||
<string name="revanced_hide_comments_by_members_header_title">Ẩn tiêu đề \'Bình luận bởi hội viên\'</string>
|
||||
<string name="revanced_hide_comments_by_members_header_summary_on">Tiêu đề Bình luận bởi hội viên được ẩn</string>
|
||||
<string name="revanced_hide_comments_by_members_header_summary_off">Tiêu đề Bình luận bởi hội viên được hiện</string>
|
||||
@@ -432,7 +435,7 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn"</string>
|
||||
<patch id="interaction.seekbar.enableSeekbarTappingPatch">
|
||||
<string name="revanced_seekbar_tapping_title">Bật nhấn để tua</string>
|
||||
<string name="revanced_seekbar_tapping_summary_on">Nhấn để tua được bật</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">Nhấn để tua bị tắt</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">Nhấn để tua được tắt</string>
|
||||
</patch>
|
||||
<patch id="interaction.swipecontrols.swipeControlsResourcePatch">
|
||||
<string name="revanced_swipe_brightness_title">Bật cử chỉ độ sáng</string>
|
||||
@@ -446,8 +449,8 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn"</string>
|
||||
Điều chỉnh âm lượng bằng cách vuốt dọc ở bên phải màn hình"</string>
|
||||
<string name="revanced_swipe_volume_summary_off">Vuốt âm lượng được tắt</string>
|
||||
<string name="revanced_swipe_press_to_engage_title">Bật cử chỉ nhấn-để-vuốt</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_on">Nhấn-để-vuốt đã bật</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_off">Nhấn-để-vuốt đã tắt</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_on">Nhấn-để-vuốt được bật</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_off">Nhấn-để-vuốt được tắt</string>
|
||||
<string name="revanced_swipe_haptic_feedback_title">Bật phản hồi xúc giác</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_on">Phản hồi xúc giác đã bật</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_off">Phản hồi xúc giác đã tắt</string>
|
||||
@@ -622,7 +625,7 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch
|
||||
<string name="revanced_hide_player_previous_next_buttons_title">Ẩn các nút Trước & Tiếp theo</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Các nút được ẩn</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Các nút được hiện</string>
|
||||
<string name="revanced_hide_cast_button_title">Ẩn nút Phát sóng</string>
|
||||
<string name="revanced_hide_cast_button_title">Ẩn nút truyền</string>
|
||||
<string name="revanced_hide_cast_button_summary_on">Nút Truyền được ẩn</string>
|
||||
<string name="revanced_hide_cast_button_summary_off">Nút Truyền được hiện</string>
|
||||
<!-- This button does not display any text, but 'captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title' -->
|
||||
@@ -1095,7 +1098,7 @@ Nếu sau này tắt đi, bạn nên xóa dữ liệu ứng dụng để tránh
|
||||
This is because the 'General layout' menu uses alphabetic sorting, and it functionally works better if the spoof target selector appears below the 'Spoof app version' UI switch -->
|
||||
<string name="revanced_spoof_app_version_target_title">Phiên bản giả mạo mục tiêu</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Khôi phục biểu tượng trình phát Shorts cũ</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Cập nhật lại biểu tượng điều hướng cũ</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Khôi phục biểu tượng điều hướng cũ</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Đặt trang bắt đầu</string>
|
||||
@@ -1175,10 +1178,10 @@ Trình phát nhỏ có thể được kéo đến bất kỳ góc nào của mà
|
||||
Trình phát nhỏ có thể được kéo ra khỏi màn hình sang trái hoặc phải"</string>
|
||||
<string name="revanced_miniplayer_horizontal_drag_summary_off">Cử chỉ kéo ngang được tắt</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_title">Ẩn các nút lớp phủ</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Các nút lớp phủ bị ẩn</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Các nút lớp phủ được hiển thị</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Các nút lớp phủ được ẩn</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Các nút lớp phủ được hiện</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Ẩn các nút mở rộng và đóng</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Nút bị ẩn
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Nút được ẩn
|
||||
|
||||
Vuốt để mở rộng hoặc đóng"</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Các nút mở rộng và đóng được hiện</string>
|
||||
|
||||
@@ -43,6 +43,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">"某些语言的翻译可能缺失或不完整。
|
||||
|
||||
@@ -362,9 +365,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_products_banner_title">隐藏“查看商品”横幅</string>
|
||||
<string name="revanced_hide_products_banner_summary_on">横幅已隐藏</string>
|
||||
<string name="revanced_hide_products_banner_summary_off">横幅已显示</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">隐藏片尾画面商店横幅</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">商店横幅已隐藏</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">隐藏商店横幅</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">显示商店横幅</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">商店横幅已显示</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">隐藏播放器购物栏</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">购物展示栏已隐藏</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">购物展示栏已显示</string>
|
||||
@@ -877,8 +880,8 @@ Second \"item\" text"</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_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>
|
||||
@@ -939,7 +942,7 @@ Second \"item\" text"</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">与 Sponsor 类似,但排除未付款或自我宣传。包括关于商品、捐款或他们与谁合作的信息的部分</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>
|
||||
@@ -1100,6 +1103,7 @@ Second \"item\" text"</string>
|
||||
This is because the 'General layout' menu uses alphabetic sorting, and it functionally works better if the spoof target selector appears below the 'Spoof app version' UI switch -->
|
||||
<string name="revanced_spoof_app_version_target_title">伪装应用程序版本为</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - 恢复旧的 Shorts 播放器图标</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - 还原旧的导航图标</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">设置起始页</string>
|
||||
|
||||
@@ -43,6 +43,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">"部分語言的翻譯可能缺少或不完整。
|
||||
|
||||
@@ -430,6 +433,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_disable_precise_seeking_gesture_summary_off">已啟用手勢</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSeekbarTappingPatch">
|
||||
<string name="revanced_seekbar_tapping_title">啟用輕觸以跳轉</string>
|
||||
<string name="revanced_seekbar_tapping_summary_on">已啟用輕觸以跳轉</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">已停用輕觸以跳轉</string>
|
||||
</patch>
|
||||
<patch id="interaction.swipecontrols.swipeControlsResourcePatch">
|
||||
<string name="revanced_swipe_brightness_title">啟用亮度手勢</string>
|
||||
@@ -549,6 +555,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_disable_translucent_status_bar_title">停用半透明狀態列</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_on">狀態列為不透明</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_off">狀態列為不透明或半透明</string>
|
||||
<string name="revanced_disable_translucent_status_bar_user_dialog_message">在部分裝置上,啟用這項功能可能會使系統導覽列變成透明。</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_title">停用淺色半透明狀態列</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">淺色模式導覽列為不透明</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">淺色模式導覽列為不透明或半透明</string>
|
||||
|
||||
@@ -3,7 +3,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.
|
||||
|
||||
@@ -674,6 +673,10 @@ If changing this setting does not take effect, try switching to Incognito mode."
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">Hide Audio track</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Audio track menu is hidden</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Audio track menu is shown</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 track menu is hidden
|
||||
|
||||
To show the Audio track menu, change \'Spoof video streams\' to 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">Hide Watch in VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Watch in VR menu is hidden</string>
|
||||
|
||||
Reference in New Issue
Block a user