feat: Align with RVX [[v5.12.1-dev.4](https://github.com/inotia00/revanced-patches/releases/tag/v5.12.1-dev.4)]
This commit is contained in:
parent
4a5bb78ca7
commit
cffeb04471
67 changed files with 884 additions and 511 deletions
|
|
@ -27,9 +27,9 @@ public class YouTubeMusicHostActivity extends BaseHostActivity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void finish() {
|
||||
if (!handleFinish()) {
|
||||
super.finish();
|
||||
public void onBackPressed() {
|
||||
if (handleBackPress()) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -106,14 +106,10 @@ public class YouTubeMusicHostActivity extends BaseHostActivity {
|
|||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <p>
|
||||
* Overrides {@link Activity#finish()} of the injection Activity.
|
||||
*
|
||||
* @return if the original activity finish method should be allowed to run.
|
||||
* @return Whether pressing the back button should be allowed.
|
||||
*/
|
||||
@Override
|
||||
protected boolean handleFinish() {
|
||||
return YouTubeMusicSearchViewController.handleFinish(searchViewController);
|
||||
protected boolean handleBackPress() {
|
||||
return YouTubeMusicSearchViewController.handleBackPress(searchViewController);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,13 +41,12 @@ public class YouTubeMusicSearchViewController extends BaseSearchViewController {
|
|||
// This method can be empty or handle music-specific preferences if any.
|
||||
}
|
||||
|
||||
// Static method for handling Activity finish
|
||||
public static boolean handleFinish(YouTubeMusicSearchViewController searchViewController) {
|
||||
public static boolean handleBackPress(YouTubeMusicSearchViewController searchViewController) {
|
||||
if (searchViewController != null && searchViewController.isSearchActive()) {
|
||||
searchViewController.closeSearch();
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Adapter to wrap YouTubeMusicPreferenceFragment to BasePreferenceFragment interface.
|
||||
|
|
|
|||
|
|
@ -203,6 +203,11 @@ object YouTubeClient {
|
|||
* 2. Over the past few months, BotGuard PoToken has not been used on WEB_SAFARI (iPadOS).
|
||||
*
|
||||
* It may still not work for some users.
|
||||
*
|
||||
* Update:
|
||||
* Playback issue occurs when the value of 'iosPlayerConfig.requestIosguardDataAfterPlaybackStarts' in the player response is 'true'.
|
||||
* It appears that blocking the '/att/get' endpoint can prevent this, but I'm not sure.
|
||||
* (More samples are needed)
|
||||
*/
|
||||
private const val PACKAGE_NAME_IPADOS = "com.google.ios.youtube"
|
||||
|
||||
|
|
@ -252,16 +257,6 @@ object YouTubeClient {
|
|||
*/
|
||||
private const val CLIENT_VERSION_TVHTML5 = "7.20250917.13.00"
|
||||
private const val USER_AGENT_TVHTML5 =
|
||||
"Mozilla/5.0(SMART-TV; Linux; Tizen 4.0.0.2) AppleWebkit/605.1.15 (KHTML, like Gecko) SamsungBrowser/9.2 TV Safari/605.1.15"
|
||||
|
||||
|
||||
// TVHTML5 SIMPLY
|
||||
/**
|
||||
* Video not playable: None.
|
||||
* Note: Only 'Authorization' is supported.
|
||||
*/
|
||||
private const val CLIENT_VERSION_TVHTML5_SIMPLY = "1.0"
|
||||
private const val USER_AGENT_TVHTML5_SIMPLY =
|
||||
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)"
|
||||
|
||||
|
||||
|
|
@ -512,34 +507,13 @@ object YouTubeClient {
|
|||
TV(
|
||||
id = 7,
|
||||
clientVersion = CLIENT_VERSION_TVHTML5,
|
||||
clientPlatform = CLIENT_PLATFORM_TV,
|
||||
clientPlatform = CLIENT_PLATFORM_GAME_CONSOLE,
|
||||
userAgent = USER_AGENT_TVHTML5,
|
||||
requireJS = true,
|
||||
refererFormat = CLIENT_REFERER_FORMAT_TV,
|
||||
clientName = "TVHTML5",
|
||||
friendlyName = "TV"
|
||||
),
|
||||
TV_SIMPLY(
|
||||
id = 75,
|
||||
clientVersion = CLIENT_VERSION_TVHTML5_SIMPLY,
|
||||
clientPlatform = CLIENT_PLATFORM_GAME_CONSOLE,
|
||||
userAgent = USER_AGENT_TVHTML5_SIMPLY,
|
||||
requireJS = true,
|
||||
clientName = "TVHTML5_SIMPLY",
|
||||
refererFormat = CLIENT_REFERER_FORMAT_TV,
|
||||
friendlyName = "TV Simply"
|
||||
),
|
||||
TV_SIMPLY_NO_AUTH(
|
||||
id = 75,
|
||||
clientVersion = CLIENT_VERSION_TVHTML5_SIMPLY,
|
||||
clientPlatform = CLIENT_PLATFORM_GAME_CONSOLE,
|
||||
userAgent = USER_AGENT_TVHTML5_SIMPLY,
|
||||
requireJS = true,
|
||||
clientName = "TVHTML5_SIMPLY",
|
||||
refererFormat = CLIENT_REFERER_FORMAT_TV,
|
||||
supportsCookies = false,
|
||||
friendlyName = "TV Simply No Auth"
|
||||
),
|
||||
|
||||
// Unused client.
|
||||
TV_EMBEDDED(
|
||||
|
|
@ -580,17 +554,15 @@ object YouTubeClient {
|
|||
ANDROID_CREATOR,
|
||||
IPADOS,
|
||||
TV,
|
||||
TV_SIMPLY,
|
||||
MWEB,
|
||||
IOS_DEPRECATED,
|
||||
)
|
||||
val CLIENT_ORDER_TO_USE_JS_PREFER_TV: Array<ClientType> = arrayOf(
|
||||
TV_SIMPLY,
|
||||
TV,
|
||||
ANDROID_VR,
|
||||
VISIONOS,
|
||||
ANDROID_CREATOR,
|
||||
IPADOS,
|
||||
TV,
|
||||
MWEB,
|
||||
IOS_DEPRECATED,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -62,11 +62,11 @@ public class ThrottlingParameterUtils {
|
|||
/**
|
||||
* Hardcoded javascript url path (Mobile Web).
|
||||
*/
|
||||
private static final String PLAYER_JS_HARDCODED_URL_PATH_MOBILE_WEB = "b66835e2";
|
||||
private static final String PLAYER_JS_HARDCODED_URL_PATH_MOBILE_WEB = "0004de42";
|
||||
/**
|
||||
* Hardcoded javascript url path (TV).
|
||||
*/
|
||||
private static final String PLAYER_JS_HARDCODED_URL_PATH_TV = "b66835e2";
|
||||
private static final String PLAYER_JS_HARDCODED_URL_PATH_TV = "0004de42";
|
||||
/**
|
||||
* Regular expression pattern to find variables used in JavaScript url.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -332,7 +332,7 @@ public class SpoofStreamingDataPatch {
|
|||
* <p>
|
||||
* It takes about 3-5 seconds to download the JavaScript and initialize the Cipher class.
|
||||
* Initialize it before the video starts.
|
||||
* Used for {@link ClientType#TV}, {@link ClientType#TV_SIMPLY} and {@link ClientType#TV_EMBEDDED}.
|
||||
* Used for {@link ClientType#TV} and {@link ClientType#TV_EMBEDDED}.
|
||||
*/
|
||||
public static void initializeJavascript() {
|
||||
if (SPOOF_STREAMING_DATA_USE_JS) {
|
||||
|
|
|
|||
|
|
@ -358,100 +358,96 @@ class StreamingDataRequest private constructor(
|
|||
private fun setAudioTrackLanguage(
|
||||
videoId: String,
|
||||
requestHeader: Map<String, String>,
|
||||
isMobileWeb: Boolean,
|
||||
) {
|
||||
for (clientType in arrayOf(ClientType.ANDROID, ClientType.TV_SIMPLY_NO_AUTH, ClientType.ANDROID_VR)) {
|
||||
val startTime = System.currentTimeMillis()
|
||||
Logger.printDebug { "Fetching audio track for: $videoId using client: $clientType" }
|
||||
// On Mobile Web, if an invalid language code is used, it will fall back to English.
|
||||
// Only use the YouTube API to fetch the default audio track language code when the client is Mobile Web.
|
||||
if (isMobileWeb) {
|
||||
for (clientType in arrayOf(ClientType.ANDROID, ClientType.ANDROID_VR)) {
|
||||
val startTime = System.currentTimeMillis()
|
||||
Logger.printDebug { "Fetching audio track for: $videoId using client: $clientType" }
|
||||
|
||||
try {
|
||||
val requestBody = if (clientType.requireJS) {
|
||||
createJSRequestBody(
|
||||
clientType = clientType,
|
||||
videoId = videoId,
|
||||
language = "en",
|
||||
isGVS = false,
|
||||
)
|
||||
} else {
|
||||
createApplicationRequestBody(
|
||||
try {
|
||||
val requestBody = createApplicationRequestBody(
|
||||
clientType = clientType,
|
||||
videoId = videoId,
|
||||
language = "en"
|
||||
)
|
||||
}
|
||||
|
||||
val connection =
|
||||
getInnerTubeResponseConnectionFromRoute(
|
||||
GET_AUDIO_TRACK,
|
||||
clientType,
|
||||
requestHeader
|
||||
)
|
||||
val connection =
|
||||
getInnerTubeResponseConnectionFromRoute(
|
||||
GET_AUDIO_TRACK,
|
||||
clientType,
|
||||
requestHeader
|
||||
)
|
||||
|
||||
connection.setFixedLengthStreamingMode(requestBody.size)
|
||||
connection.outputStream.write(requestBody)
|
||||
connection.setFixedLengthStreamingMode(requestBody.size)
|
||||
connection.outputStream.write(requestBody)
|
||||
|
||||
val responseCode = connection.responseCode
|
||||
if (responseCode != 200) {
|
||||
connection.disconnect()
|
||||
continue
|
||||
}
|
||||
val json = Requester.parseJSONObjectAndDisconnect(connection)
|
||||
val responseCode = connection.responseCode
|
||||
if (responseCode != 200) {
|
||||
connection.disconnect()
|
||||
continue
|
||||
}
|
||||
val json = Requester.parseJSONObjectAndDisconnect(connection)
|
||||
|
||||
if (!json.has("captions")) {
|
||||
continue
|
||||
}
|
||||
val captions =
|
||||
json.getJSONObject("captions")
|
||||
if (!captions.has("playerCaptionsTracklistRenderer")) {
|
||||
continue
|
||||
}
|
||||
val playerCaptionsTracklistRenderer =
|
||||
captions.getJSONObject("playerCaptionsTracklistRenderer")
|
||||
if (!playerCaptionsTracklistRenderer.has("audioTracks")) {
|
||||
continue
|
||||
}
|
||||
val audioTracks =
|
||||
playerCaptionsTracklistRenderer.getJSONArray("audioTracks")
|
||||
if (audioTracks.length() < 2) {
|
||||
continue
|
||||
}
|
||||
if (!json.has("streamingData")) {
|
||||
continue
|
||||
}
|
||||
val streamingData =
|
||||
json.getJSONObject("streamingData")
|
||||
if (!streamingData.has("adaptiveFormats")) {
|
||||
continue
|
||||
}
|
||||
val adaptiveFormats =
|
||||
streamingData.getJSONArray("adaptiveFormats")
|
||||
if (adaptiveFormats.length() < 2) {
|
||||
continue
|
||||
}
|
||||
for (i in adaptiveFormats.length() - 1 downTo 0) {
|
||||
val adaptiveFormat = adaptiveFormats.getJSONObject(i)
|
||||
if (!json.has("captions")) {
|
||||
continue
|
||||
}
|
||||
val captions =
|
||||
json.getJSONObject("captions")
|
||||
if (!captions.has("playerCaptionsTracklistRenderer")) {
|
||||
continue
|
||||
}
|
||||
val playerCaptionsTracklistRenderer =
|
||||
captions.getJSONObject("playerCaptionsTracklistRenderer")
|
||||
if (!playerCaptionsTracklistRenderer.has("audioTracks")) {
|
||||
continue
|
||||
}
|
||||
val audioTracks =
|
||||
playerCaptionsTracklistRenderer.getJSONArray("audioTracks")
|
||||
if (audioTracks.length() < 2) {
|
||||
continue
|
||||
}
|
||||
if (!json.has("streamingData")) {
|
||||
continue
|
||||
}
|
||||
val streamingData =
|
||||
json.getJSONObject("streamingData")
|
||||
if (!streamingData.has("adaptiveFormats")) {
|
||||
continue
|
||||
}
|
||||
val adaptiveFormats =
|
||||
streamingData.getJSONArray("adaptiveFormats")
|
||||
if (adaptiveFormats.length() < 2) {
|
||||
continue
|
||||
}
|
||||
for (i in adaptiveFormats.length() - 1 downTo 0) {
|
||||
val adaptiveFormat = adaptiveFormats.getJSONObject(i)
|
||||
|
||||
if (adaptiveFormat.has("audioTrack")) {
|
||||
val audioTrack = adaptiveFormat.getJSONObject("audioTrack")
|
||||
val displayName = audioTrack.getString("displayName")
|
||||
if (StringUtils.contains(displayName, "original")) {
|
||||
val id = audioTrack.getString("id")
|
||||
val dotIndex = StringUtils.indexOf(id, ".")
|
||||
if (dotIndex > -1) {
|
||||
val languageCode = id.substring(0, dotIndex)
|
||||
overrideLanguage = languageCode
|
||||
return
|
||||
if (adaptiveFormat.has("audioTrack")) {
|
||||
val audioTrack = adaptiveFormat.getJSONObject("audioTrack")
|
||||
val displayName = audioTrack.getString("displayName")
|
||||
if (StringUtils.contains(displayName, "original")) {
|
||||
val id = audioTrack.getString("id")
|
||||
val dotIndex = StringUtils.indexOf(id, ".")
|
||||
if (dotIndex > -1) {
|
||||
val languageCode = id.substring(0, dotIndex)
|
||||
overrideLanguage = languageCode
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ex: SocketTimeoutException) {
|
||||
handleConnectionError("Connection timeout", ex)
|
||||
} catch (ex: IOException) {
|
||||
handleConnectionError("Network error", ex)
|
||||
} catch (ex: Exception) {
|
||||
Logger.printException({ "send failed" }, ex)
|
||||
} finally {
|
||||
Logger.printDebug { "Fetching audio track request end (videoId: $videoId, took: ${(System.currentTimeMillis() - startTime)} ms)" }
|
||||
}
|
||||
} catch (ex: SocketTimeoutException) {
|
||||
handleConnectionError("Connection timeout", ex)
|
||||
} catch (ex: IOException) {
|
||||
handleConnectionError("Network error", ex)
|
||||
} catch (ex: Exception) {
|
||||
Logger.printException({ "send failed" }, ex)
|
||||
} finally {
|
||||
Logger.printDebug { "Fetching audio track request end (videoId: $videoId, took: ${(System.currentTimeMillis() - startTime)} ms)" }
|
||||
}
|
||||
}
|
||||
if (overrideLanguage.isEmpty()) {
|
||||
|
|
@ -551,7 +547,11 @@ class StreamingDataRequest private constructor(
|
|||
if (!clientType.supportsCookies
|
||||
&& BaseSettings.DISABLE_AUTO_AUDIO_TRACKS.get()
|
||||
&& overrideLanguage.isEmpty()) {
|
||||
setAudioTrackLanguage(videoId, requestHeader)
|
||||
setAudioTrackLanguage(
|
||||
videoId,
|
||||
requestHeader,
|
||||
clientType == ClientType.MWEB
|
||||
)
|
||||
}
|
||||
|
||||
val connection = send(
|
||||
|
|
|
|||
|
|
@ -178,5 +178,5 @@ public abstract class BaseHostActivity extends Activity {
|
|||
*/
|
||||
protected void onPostToolbarSetup(Activity activity, Toolbar toolbar, PreferenceFragment fragment) {}
|
||||
|
||||
protected abstract boolean handleFinish();
|
||||
protected abstract boolean handleBackPress();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import android.content.Context;
|
|||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewStub;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
|
|
@ -646,6 +647,13 @@ public class PlayerPatch {
|
|||
return Settings.HIDE_SEEK_MESSAGE.get();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static ViewStub hideSeekMessage(ViewStub viewStub) {
|
||||
return Settings.HIDE_SEEK_MESSAGE.get()
|
||||
? null
|
||||
: viewStub;
|
||||
}
|
||||
|
||||
public static boolean hideSeekUndoMessage() {
|
||||
return Settings.HIDE_SEEK_UNDO_MESSAGE.get();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,6 +74,11 @@ public class SwipeControlsPatch {
|
|||
return Settings.SWIPE_SPEED.get() &&
|
||||
!Settings.SWIPE_OVERLAY_STYLE.get().isLegacy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Setting<?>> getParentSettings() {
|
||||
return List.of(Settings.SWIPE_SPEED, Settings.SWIPE_OVERLAY_STYLE);
|
||||
}
|
||||
}
|
||||
|
||||
public static final class SwipeOverlaySeekColorAvailability implements Setting.Availability {
|
||||
|
|
@ -82,5 +87,10 @@ public class SwipeControlsPatch {
|
|||
return Settings.SWIPE_SEEK.get() &&
|
||||
!Settings.SWIPE_OVERLAY_STYLE.get().isLegacy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Setting<?>> getParentSettings() {
|
||||
return List.of(Settings.SWIPE_SEEK, Settings.SWIPE_OVERLAY_STYLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -741,6 +741,18 @@ public class Settings extends BaseSettings {
|
|||
public static final BooleanSetting SB_HIDE_EXPORT_WARNING = new BooleanSetting("sb_hide_export_warning", FALSE, false, false);
|
||||
public static final BooleanSetting SB_SEEN_GUIDELINES = new BooleanSetting("sb_seen_guidelines", FALSE, false, false);
|
||||
|
||||
// Deprecated migrations
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_SPONSOR_OPACITY = new FloatSetting("sb_sponsor_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_SELF_PROMO_OPACITY = new FloatSetting("sb_selfpromo_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_INTERACTION_OPACITY = new FloatSetting("sb_interaction_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_HIGHLIGHT_OPACITY = new FloatSetting("sb_highlight_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_HOOK_OPACITY = new FloatSetting("sb_hook_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_INTRO_OPACITY = new FloatSetting("sb_intro_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_OUTRO_OPACITY = new FloatSetting("sb_outro_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_PREVIEW_OPACITY = new FloatSetting("sb_preview_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_FILLER_OPACITY = new FloatSetting("sb_filler_opacity", 0.8f, false, false);
|
||||
private static final FloatSetting DEPRECATED_SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY = new FloatSetting("sb_music_offtopic_opacity", 0.8f, false, false);
|
||||
|
||||
static {
|
||||
// region Migration initialized
|
||||
|
||||
|
|
@ -798,6 +810,19 @@ public class Settings extends BaseSettings {
|
|||
migrateFromOldPreferences(ytPrefs, setting, key);
|
||||
}
|
||||
}
|
||||
|
||||
// Migrate old saved data. Must be done here before the settings can be used by any other code.
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_SPONSOR_COLOR, DEPRECATED_SB_CATEGORY_SPONSOR_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_SELF_PROMO_COLOR, DEPRECATED_SB_CATEGORY_SELF_PROMO_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_INTERACTION_COLOR, DEPRECATED_SB_CATEGORY_INTERACTION_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_HIGHLIGHT_COLOR, DEPRECATED_SB_CATEGORY_HIGHLIGHT_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_HOOK_COLOR, DEPRECATED_SB_CATEGORY_HOOK_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_INTRO_COLOR, DEPRECATED_SB_CATEGORY_INTRO_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_OUTRO_COLOR, DEPRECATED_SB_CATEGORY_OUTRO_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_PREVIEW_COLOR, DEPRECATED_SB_CATEGORY_PREVIEW_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_FILLER_COLOR, DEPRECATED_SB_CATEGORY_FILLER_OPACITY);
|
||||
applyOldSbOpacityToColor(SB_CATEGORY_MUSIC_OFFTOPIC_COLOR, DEPRECATED_SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY);
|
||||
|
||||
// endregion
|
||||
|
||||
// region SB import/export callbacks
|
||||
|
|
@ -806,4 +831,13 @@ public class Settings extends BaseSettings {
|
|||
|
||||
// endregion
|
||||
}
|
||||
|
||||
private static void applyOldSbOpacityToColor(StringSetting colorSetting, FloatSetting opacitySetting) {
|
||||
String colorString = colorSetting.get();
|
||||
if (colorString.length() >= 8) {
|
||||
return; // Color is already #ARGB
|
||||
}
|
||||
|
||||
colorSetting.save(SponsorBlockSettings.migrateOldColorString(colorString, opacitySetting.get()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ import android.widget.ImageButton;
|
|||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toolbar;
|
||||
import android.window.OnBackInvokedDispatcher;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
|
@ -141,7 +142,12 @@ public class WebViewHostActivity extends Activity {
|
|||
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (isSDKAbove(33)) {
|
||||
getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
|
||||
OnBackInvokedDispatcher.PRIORITY_DEFAULT,
|
||||
this::finish
|
||||
);
|
||||
}
|
||||
webView = findViewById(getIdIdentifier("revanced_webview"));
|
||||
|
||||
|
|
@ -207,7 +213,7 @@ public class WebViewHostActivity extends Activity {
|
|||
toolbar = new Toolbar(toolBarParent.getContext());
|
||||
toolbar.setBackgroundColor(Color.WHITE);
|
||||
toolbar.setNavigationIcon(ThemeUtils.getBackButtonDrawable(false));
|
||||
toolbar.setNavigationOnClickListener(view -> this.onBackPressed());
|
||||
toolbar.setNavigationOnClickListener(view -> this.finish());
|
||||
toolbar.setTitle(toolbarLabel);
|
||||
final int margin = Utils.dipToPixels(16);
|
||||
toolbar.setTitleMarginStart(margin);
|
||||
|
|
|
|||
|
|
@ -144,14 +144,10 @@ public class YouTubeActivityHook extends BaseActivityHook {
|
|||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <p>
|
||||
* Overrides {@link Activity#finish()} of the injection Activity.
|
||||
*
|
||||
* @return if the original activity finish method should be allowed to run.
|
||||
* @return Whether pressing the back button should be allowed.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public static boolean handleFinish() {
|
||||
return YouTubeSearchViewController.handleFinish(searchViewController);
|
||||
public static boolean handleBackPress() {
|
||||
return YouTubeSearchViewController.handleBackPress(searchViewController);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ public class YouTubeHostActivity extends BaseHostActivity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void finish() {
|
||||
if (!handleFinish()) {
|
||||
super.finish();
|
||||
public void onBackPressed() {
|
||||
if (handleBackPress()) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -98,14 +98,10 @@ public class YouTubeHostActivity extends BaseHostActivity {
|
|||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <p>
|
||||
* Overrides {@link Activity#finish()} of the injection Activity.
|
||||
*
|
||||
* @return if the original activity finish method should be allowed to run.
|
||||
* @return Whether pressing the back button should be allowed.
|
||||
*/
|
||||
@Override
|
||||
protected boolean handleFinish() {
|
||||
return YouTubeSearchViewController.handleFinish(searchViewController);
|
||||
protected boolean handleBackPress() {
|
||||
return YouTubeSearchViewController.handleBackPress(searchViewController);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,13 +41,12 @@ public class YouTubeSearchViewController extends BaseSearchViewController {
|
|||
protected void setupSpecialPreferenceListeners(BaseSearchResultItem item) {
|
||||
}
|
||||
|
||||
// Static method for Activity finish.
|
||||
public static boolean handleFinish(YouTubeSearchViewController searchViewController) {
|
||||
public static boolean handleBackPress(YouTubeSearchViewController searchViewController) {
|
||||
if (searchViewController != null && searchViewController.isSearchActive()) {
|
||||
searchViewController.closeSearch();
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Adapter to wrap YouTubePreferenceFragment to BasePreferenceFragment interface.
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import androidx.annotation.Nullable;
|
|||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.UUID;
|
||||
|
||||
import app.revanced.extension.shared.settings.Setting;
|
||||
|
|
@ -261,6 +262,22 @@ public class SponsorBlockSettings {
|
|||
return uuid;
|
||||
}
|
||||
|
||||
public static String migrateOldColorString(String colorString, float opacity) {
|
||||
if (colorString.length() >= 8) {
|
||||
return colorString;
|
||||
}
|
||||
|
||||
// Change color string from #RGB to #ARGB using default alpha.
|
||||
if (colorString.startsWith("#")) {
|
||||
colorString = colorString.substring(1);
|
||||
}
|
||||
|
||||
String alphaHex = String.format(Locale.US, "%02X", (int)(opacity * 255));
|
||||
String argbColorString = '#' + alphaHex + colorString.substring(0, 6);
|
||||
Logger.printDebug(() -> "Migrating old color string with default opacity: " + argbColorString);
|
||||
return argbColorString;
|
||||
}
|
||||
|
||||
private static boolean initialized;
|
||||
|
||||
public static void initialize() {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package app.revanced.extension.youtube.sponsorblock.objects;
|
|||
|
||||
import static app.revanced.extension.shared.utils.StringRef.str;
|
||||
import static app.revanced.extension.shared.utils.Utils.dipToPixels;
|
||||
import static app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings.migrateOldColorString;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
|
|
@ -54,6 +55,10 @@ public class SegmentCategoryPreference extends ColorPickerPreference {
|
|||
@Override
|
||||
public final void setText(String colorString) {
|
||||
try {
|
||||
// Migrate old data imported in the settings UI.
|
||||
// This migration is needed here because pasting into the settings
|
||||
// immediately syncs the data with the preferences.
|
||||
colorString = migrateOldColorString(colorString, SegmentCategory.CATEGORY_DEFAULT_OPACITY);
|
||||
super.setText(colorString);
|
||||
|
||||
// Save to category.
|
||||
|
|
@ -68,7 +73,8 @@ public class SegmentCategoryPreference extends ColorPickerPreference {
|
|||
Utils.showToastShort(str("revanced_settings_color_invalid"));
|
||||
setText(category.colorSetting.defaultValue);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "setText failure: " + colorString, ex);
|
||||
String colorStringFinal = colorString;
|
||||
Logger.printException(() -> "setText failure: " + colorStringFinal, ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
package app.revanced.extension.youtube.swipecontrols.controller.gesture
|
||||
|
||||
import android.view.MotionEvent
|
||||
import app.revanced.extension.youtube.shared.PlayerControlsVisibilityObserver
|
||||
import app.revanced.extension.youtube.shared.PlayerControlsVisibilityObserverImpl
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsHostActivity
|
||||
import app.revanced.extension.youtube.swipecontrols.controller.gesture.core.BaseGestureController
|
||||
|
|
@ -18,8 +16,7 @@ import app.revanced.extension.youtube.swipecontrols.misc.toPoint
|
|||
class ClassicSwipeController(
|
||||
private val controller: SwipeControlsHostActivity,
|
||||
private val config: SwipeControlsConfigurationProvider,
|
||||
) : BaseGestureController(controller),
|
||||
PlayerControlsVisibilityObserver by PlayerControlsVisibilityObserverImpl(controller) {
|
||||
) : BaseGestureController(controller) {
|
||||
/**
|
||||
* the last event captured in [onDown]
|
||||
*/
|
||||
|
|
@ -29,10 +26,6 @@ class ClassicSwipeController(
|
|||
get() = currentSwipe == SwipeDetector.SwipeDirection.VERTICAL
|
||||
|
||||
override fun isInSwipeZone(motionEvent: MotionEvent): Boolean {
|
||||
// Fix https://github.com/inotia00/ReVanced_Extended/issues/3052
|
||||
if (!isFullscreenEngagementPanelVisible) {
|
||||
return false
|
||||
}
|
||||
val inVolumeZone = if (controller.config.enableVolumeControls) {
|
||||
(motionEvent.toPoint() in controller.zones.volume)
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ package app.revanced.extension.youtube.swipecontrols.controller.gesture.core
|
|||
|
||||
import android.view.GestureDetector
|
||||
import android.view.MotionEvent
|
||||
import app.revanced.extension.youtube.shared.PlayerControlsVisibilityObserver
|
||||
import app.revanced.extension.youtube.shared.PlayerControlsVisibilityObserverImpl
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsHostActivity
|
||||
|
||||
/**
|
||||
|
|
@ -17,6 +19,7 @@ abstract class BaseGestureController(
|
|||
SwipeDetector by SwipeDetectorImpl(
|
||||
controller.config.swipeMagnitudeThreshold.toDouble(),
|
||||
),
|
||||
PlayerControlsVisibilityObserver by PlayerControlsVisibilityObserverImpl(controller),
|
||||
VolumeAndBrightnessScroller by VolumeAndBrightnessScrollerImpl(
|
||||
controller.audio,
|
||||
controller.screen,
|
||||
|
|
@ -44,6 +47,10 @@ abstract class BaseGestureController(
|
|||
if (!controller.config.enableSwipeControls) {
|
||||
return false
|
||||
}
|
||||
// Fix https://github.com/inotia00/ReVanced_Extended/issues/3052
|
||||
if (isFullscreenEngagementPanelVisible) {
|
||||
return false
|
||||
}
|
||||
|
||||
// create a copy of the event so we can modify it
|
||||
// without causing any issues downstream
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
package com.liskovsoft.youtubeapi.app.nsigsolver.common
|
||||
|
||||
internal class Cache {
|
||||
fun load(section: String, key: String): String? {
|
||||
return null
|
||||
}
|
||||
|
||||
fun store(section: String, key: String, content: String) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -2,17 +2,19 @@ package com.liskovsoft.youtubeapi.app.nsigsolver.common
|
|||
|
||||
import com.liskovsoft.googlecommon.common.api.FileApi
|
||||
import com.liskovsoft.googlecommon.common.helpers.RetrofitHelper
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.IEContentProviderError
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
internal abstract class InfoExtractor {
|
||||
private val fileApi = RetrofitHelper.create(FileApi::class.java)
|
||||
|
||||
protected suspend fun downloadWebpage(url: String, tries: Int = 1, timeoutMs: Long = 1_000): String? {
|
||||
|
||||
protected suspend fun downloadWebpage(url: String, tries: Int = 1, timeoutMs: Long = 1_000, errorMsg: String? = null): String {
|
||||
var tryCount = 0
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
return RetrofitHelper.get(fileApi.getContent(url))?.content
|
||||
val content = RetrofitHelper.get(fileApi.getContent(url))?.content
|
||||
return content ?: throw IEContentProviderError(errorMsg ?: "Empty content received for the $url")
|
||||
} catch (e: Exception) {
|
||||
tryCount++
|
||||
if (tryCount >= tries)
|
||||
|
|
|
|||
|
|
@ -3,12 +3,14 @@ package com.liskovsoft.youtubeapi.app.nsigsolver.common
|
|||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
internal object YTInfoExtractor: InfoExtractor() {
|
||||
// TODO: implement caching to the file
|
||||
fun loadPlayer(playerUrl: String): String? = runBlocking {
|
||||
val cache: Cache = Cache()
|
||||
|
||||
// TODO: implement caching to the local storage
|
||||
fun loadPlayer(playerUrl: String): String = runBlocking {
|
||||
return@runBlocking downloadWebpage(playerUrl)
|
||||
}
|
||||
|
||||
fun downloadWebpageWithRetries(url: String) = runBlocking {
|
||||
return@runBlocking downloadWebpage(url, tries = 3)
|
||||
fun downloadWebpageWithRetries(url: String, errorMsg: String? = null): String = runBlocking {
|
||||
return@runBlocking downloadWebpage(url, tries = 3, errorMsg = errorMsg)
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.liskovsoft.youtubeapi.app.nsigsolver.provider
|
|||
import com.liskovsoft.youtubeapi.app.nsigsolver.common.YTInfoExtractor
|
||||
|
||||
internal abstract class JsChallengeProvider {
|
||||
protected val ie = YTInfoExtractor
|
||||
protected abstract val supportedTypes: List<JsChallengeType>
|
||||
|
||||
private fun validateRequest(request: JsChallengeRequest) {
|
||||
|
|
@ -31,11 +32,11 @@ internal abstract class JsChallengeProvider {
|
|||
/**
|
||||
* Subclasses can override this method to handle bulk solving
|
||||
*/
|
||||
protected abstract fun realBulkSolve(validatedRequests: List<JsChallengeRequest>): Sequence<JsChallengeProviderResponse>
|
||||
protected abstract fun realBulkSolve(requests: List<JsChallengeRequest>): Sequence<JsChallengeProviderResponse>
|
||||
|
||||
protected fun getPlayer(videoId: String, playerUrl: String): String? {
|
||||
protected fun getPlayer(videoId: String?, playerUrl: String): String {
|
||||
return try {
|
||||
YTInfoExtractor.loadPlayer(playerUrl)
|
||||
ie.loadPlayer(playerUrl)
|
||||
} catch (e: Exception) {
|
||||
throw JsChallengeProviderError("Failed to load player for JS challenge: $playerUrl", e)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,11 +13,11 @@ internal data class JsChallengeRequest(
|
|||
|
||||
internal data class ChallengeInput(
|
||||
val playerUrl: String,
|
||||
val challenges: MutableList<String> = mutableListOf()
|
||||
val challenges: List<String>
|
||||
)
|
||||
|
||||
internal data class ChallengeOutput(
|
||||
val results: MutableMap<String, String> = mutableMapOf()
|
||||
val results: Map<String, String>
|
||||
)
|
||||
|
||||
internal data class JsChallengeProviderResponse(
|
||||
|
|
|
|||
|
|
@ -1,12 +1,156 @@
|
|||
package com.liskovsoft.youtubeapi.app.nsigsolver.runtime
|
||||
|
||||
import app.revanced.extension.shared.utils.Logger
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.JsonSyntaxException
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.ChallengeOutput
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeProvider
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeProviderError
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeProviderRejectedRequest
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeProviderResponse
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeRequest
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeResponse
|
||||
import com.liskovsoft.youtubeapi.app.nsigsolver.provider.JsChallengeType
|
||||
|
||||
internal abstract class JsRuntimeChalBaseJCP: JsChallengeProvider() {
|
||||
private val tag = JsRuntimeChalBaseJCP::class.simpleName
|
||||
private val cacheSection = "challenge-solver"
|
||||
|
||||
private val jcpGuideUrl = "https://github.com/yt-dlp/yt-dlp/wiki/YouTube-JS-Challenges"
|
||||
private val repository = "yt-dlp/yt-dlp-jsc-deno"
|
||||
private val supportedVersion = "0.0.1"
|
||||
|
||||
override val supportedTypes = listOf(JsChallengeType.N, JsChallengeType.SIG)
|
||||
|
||||
|
||||
private val scriptFilenames = mapOf(
|
||||
ScriptType.LIB to "lib.js",
|
||||
ScriptType.CORE to "core.js"
|
||||
)
|
||||
|
||||
private val minScriptFilenames = mapOf(
|
||||
ScriptType.LIB to "lib.min.js",
|
||||
ScriptType.CORE to "core.min.js"
|
||||
)
|
||||
|
||||
abstract fun runJsRuntime(stdin: String): String
|
||||
|
||||
override fun realBulkSolve(requests: List<JsChallengeRequest>): Sequence<JsChallengeProviderResponse> = sequence {
|
||||
val grouped: Map<String, List<JsChallengeRequest>> = requests.groupBy { it.input.playerUrl }
|
||||
|
||||
for ((playerUrl, groupedRequests) in grouped) {
|
||||
var player = ie.cache.load(cacheSection, "player:$playerUrl")
|
||||
|
||||
val cached = if (player != null) {
|
||||
true
|
||||
} else {
|
||||
val videoId = groupedRequests.firstOrNull()?.videoId
|
||||
player = getPlayer(videoId, playerUrl)
|
||||
false
|
||||
}
|
||||
|
||||
val stdin = constructStdin(player, cached, groupedRequests)
|
||||
val stdout = runJsRuntime(stdin)
|
||||
|
||||
val gson = Gson()
|
||||
val output: SolverOutput = try {
|
||||
gson.fromJson(stdout, solverOutputType)
|
||||
} catch (e: JsonSyntaxException) {
|
||||
throw JsChallengeProviderError("Cannot parse solver output", e)
|
||||
}
|
||||
|
||||
if (output.type == "error")
|
||||
throw JsChallengeProviderError(output.error ?: "Unknown solver output error")
|
||||
|
||||
val preprocessed = output.preprocessed_player
|
||||
if (preprocessed != null)
|
||||
ie.cache.store(cacheSection, "player:$playerUrl", preprocessed)
|
||||
|
||||
for ((request, responseData) in groupedRequests.zip(output.responses)) {
|
||||
if (responseData.type == "error") {
|
||||
yield(JsChallengeProviderResponse(
|
||||
request, null, JsChallengeProviderError(responseData.error ?: "Unknown solver output error")))
|
||||
} else {
|
||||
yield(JsChallengeProviderResponse(
|
||||
request, JsChallengeResponse(request.type, ChallengeOutput(responseData.data))
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun constructStdin(player: String, preprocessed: Boolean, requests: List<JsChallengeRequest>): String {
|
||||
val jsonRequests = requests.map { request ->
|
||||
mapOf(
|
||||
// TODO: i despise nsig name
|
||||
"type" to if (request.type.value == "n") "nsig" else request.type.value,
|
||||
"challenges" to request.input.challenges
|
||||
)
|
||||
}
|
||||
val data = if (preprocessed) {
|
||||
mapOf(
|
||||
"type" to "preprocessed",
|
||||
"preprocessed_player" to player,
|
||||
"requests" to jsonRequests
|
||||
)
|
||||
} else {
|
||||
mapOf(
|
||||
"type" to "player",
|
||||
"player" to player,
|
||||
"requests" to jsonRequests,
|
||||
"output_preprocessed" to true
|
||||
)
|
||||
}
|
||||
val gson = Gson()
|
||||
val jsonData = gson.toJson(data)
|
||||
return """
|
||||
${libScript.code}
|
||||
const { astring, meriyah } = lib;
|
||||
${coreScript.code}
|
||||
console.log(JSON.stringify(jsc($jsonData)));
|
||||
"""
|
||||
}
|
||||
|
||||
// region: challenge solver script
|
||||
|
||||
private val libScript: Script by lazy {
|
||||
getScript(ScriptType.LIB)
|
||||
}
|
||||
|
||||
private val coreScript: Script by lazy {
|
||||
getScript(ScriptType.CORE)
|
||||
}
|
||||
|
||||
private fun getScript(scriptType: ScriptType): Script {
|
||||
for ((_, fromSource) in iterScriptSources()) {
|
||||
val script = fromSource(scriptType)
|
||||
if (script == null)
|
||||
continue
|
||||
if (script.version != supportedVersion)
|
||||
Logger.printDebug { "Challenge solver ${scriptType.value} script version ${script.version} " +
|
||||
"is not supported (source: ${script.source.value}, supported version: $supportedVersion)" }
|
||||
|
||||
Logger.printDebug { "Using challenge solver ${script.type.value} script v${script.version} " +
|
||||
"(source: ${script.source.value}, variant: ${script.variant.value})" }
|
||||
return script
|
||||
}
|
||||
throw JsChallengeProviderRejectedRequest("No usable challenge solver ${scriptType.value} script available")
|
||||
}
|
||||
|
||||
private fun iterScriptSources(): Sequence<Pair<ScriptSource, (scriptType: ScriptType) -> Script?>> = sequence {
|
||||
yieldAll(listOf(
|
||||
//Pair(ScriptSource.CACHE, cachedSource),
|
||||
//Pair(ScriptSource.BUILTIN, builtinSource),
|
||||
Pair(ScriptSource.WEB, ::webReleaseSource)
|
||||
))
|
||||
}
|
||||
|
||||
private fun webReleaseSource(scriptType: ScriptType): Script? {
|
||||
val url = "https://github.com/$repository/releases/download/$supportedVersion/${minScriptFilenames[scriptType]}"
|
||||
val code = ie.downloadWebpageWithRetries(url, "[${tag}] Failed to download challenge solver ${scriptType.value} script")
|
||||
Logger.printDebug { "[${tag}] Downloading challenge solver ${scriptType.value} script from $url" }
|
||||
ie.cache.store(cacheSection, scriptType.value, code)
|
||||
return Script(scriptType, ScriptVariant.MINIFIED, ScriptSource.WEB, supportedVersion, code)
|
||||
}
|
||||
|
||||
// endregion: challenge solver script
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
package com.liskovsoft.youtubeapi.app.nsigsolver.runtime
|
||||
|
||||
import com.google.gson.reflect.TypeToken
|
||||
|
||||
internal val solverOutputType = object : TypeToken<SolverOutput>() {}.type
|
||||
|
||||
internal data class SolverOutput(
|
||||
val type: String,
|
||||
val error: String?,
|
||||
val preprocessed_player: String?,
|
||||
val responses: List<ResponseData>
|
||||
)
|
||||
|
||||
internal data class ResponseData(
|
||||
val type: String,
|
||||
val error: String?,
|
||||
val data: Map<String, String>
|
||||
)
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
package com.liskovsoft.youtubeapi.app.nsigsolver.runtime
|
||||
|
||||
import java.security.MessageDigest
|
||||
|
||||
internal enum class ScriptType(val value: String) {
|
||||
LIB("lib"),
|
||||
CORE("core");
|
||||
}
|
||||
|
||||
internal enum class ScriptVariant(val value: String) {
|
||||
UNKNOWN("unknown"),
|
||||
MINIFIED("minified"),
|
||||
UNMINIFIED("unminified"),
|
||||
DENO_NPM("deno_npm"),
|
||||
BUN_NPM("bun_npm");
|
||||
}
|
||||
|
||||
internal enum class ScriptSource(val value: String) {
|
||||
PYPACKAGE("python package"),
|
||||
BINARY("binary"),
|
||||
CACHE("cache"),
|
||||
WEB("web"),
|
||||
BUILTIN("builtin");
|
||||
}
|
||||
|
||||
internal data class Script(
|
||||
val type: ScriptType,
|
||||
val variant: ScriptVariant,
|
||||
val source: ScriptSource,
|
||||
val version: String,
|
||||
val code: String,
|
||||
) {
|
||||
val hash: String by lazy {
|
||||
val digest = MessageDigest.getInstance("SHA3-512")
|
||||
val bytes = digest.digest(code.toByteArray(Charsets.UTF_8))
|
||||
bytes.joinToString("") { "%02x".format(it) }
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "<Script ${type.value} v${version} (source: ${source.value}) variant=${variant.value} size=${code.length} hash=${hash.take(7)}...>"
|
||||
}
|
||||
}
|
||||
|
|
@ -129,7 +129,7 @@ internal object NSigExtractor {
|
|||
*
|
||||
* yt-dlp\yt_dlp\extractor\youtube.py
|
||||
*/
|
||||
private fun extractNFunctionName1(jsCode: String): String? {
|
||||
private fun extractNFunctionName1(jsCode: String): String? { // NOTE: looong running code
|
||||
val nFuncMatcher = mNFuncPattern.matcher(jsCode)
|
||||
|
||||
if (nFuncMatcher.find() && nFuncMatcher.groupCount() >= 3) {
|
||||
|
|
|
|||
|
|
@ -1078,10 +1078,6 @@ public final class app/revanced/patches/youtube/utils/componentlist/LazilyConver
|
|||
public static final fun getLazilyConvertedElementHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/utils/controlsoverlay/ControlsOverlayConfigPatchKt {
|
||||
public static final fun getControlsOverlayConfigPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/utils/dismiss/DismissPlayerHookPatchKt {
|
||||
public static final fun getDismissPlayerHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
|
@ -1285,6 +1281,7 @@ public final class app/revanced/patches/youtube/utils/resourceid/SharedResourceI
|
|||
public static final fun getDrawerResults ()J
|
||||
public static final fun getEasySeekEduContainer ()J
|
||||
public static final fun getEditSettingsAction ()J
|
||||
public static final fun getEduOverlayStub ()J
|
||||
public static final fun getEmojiPickerIcon ()J
|
||||
public static final fun getEndScreenElementLayoutCircle ()J
|
||||
public static final fun getEndScreenElementLayoutIcon ()J
|
||||
|
|
|
|||
|
|
@ -334,6 +334,15 @@ internal val seekEduContainerFingerprint = legacyFingerprint(
|
|||
literals = listOf(easySeekEduContainer),
|
||||
)
|
||||
|
||||
/**
|
||||
* YouTube 18.39 - 20.02
|
||||
*/
|
||||
internal val playerEduOverlayFeatureFlagFingerprint = legacyFingerprint(
|
||||
name = "playerEduOverlayFeatureFlagFingerprint",
|
||||
returnType = "Z",
|
||||
literals = listOf(45427491L),
|
||||
)
|
||||
|
||||
internal val suggestedActionsFingerprint = legacyFingerprint(
|
||||
name = "suggestedActionsFingerprint",
|
||||
returnType = "V",
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ import app.revanced.patches.shared.textcomponent.textComponentPatch
|
|||
import app.revanced.patches.shared.startVideoInformerFingerprint
|
||||
import app.revanced.patches.youtube.utils.bottomsheet.bottomSheetHookPatch
|
||||
import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE
|
||||
import app.revanced.patches.youtube.utils.controlsoverlay.controlsOverlayConfigPatch
|
||||
import app.revanced.patches.youtube.utils.dismiss.dismissPlayerHookPatch
|
||||
import app.revanced.patches.youtube.utils.dismiss.hookDismissObserver
|
||||
import app.revanced.patches.youtube.utils.engagement.*
|
||||
|
|
@ -48,6 +47,7 @@ import com.android.tools.smali.dexlib2.iface.Method
|
|||
import com.android.tools.smali.dexlib2.iface.instruction.*
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
|
||||
|
||||
private val speedOverlayPatch = bytecodePatch(
|
||||
description = "speedOverlayPatch"
|
||||
|
|
@ -321,7 +321,6 @@ val playerComponentsPatch = bytecodePatch(
|
|||
dependsOn(
|
||||
settingsPatch,
|
||||
bottomSheetHookPatch,
|
||||
controlsOverlayConfigPatch,
|
||||
endScreenSuggestedVideoPatch,
|
||||
engagementPanelHookPatch,
|
||||
dismissPlayerHookPatch,
|
||||
|
|
@ -777,6 +776,34 @@ val playerComponentsPatch = bytecodePatch(
|
|||
}
|
||||
}
|
||||
|
||||
if (is_18_39_or_greater && !is_20_03_or_greater) {
|
||||
playerEduOverlayFeatureFlagFingerprint.methodOrThrow().apply {
|
||||
val targetIndex = implementation!!.instructions.size - 1
|
||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||
|
||||
addInstruction(
|
||||
targetIndex,
|
||||
"const/4 v$targetRegister, 0x0"
|
||||
)
|
||||
}
|
||||
} else if (is_20_03_or_greater && !is_20_09_or_greater) {
|
||||
youtubeControlsOverlayFingerprint.methodOrThrow().apply {
|
||||
val constIndex = indexOfFirstLiteralInstructionOrThrow(eduOverlayStub)
|
||||
val targetIndex = indexOfFirstInstructionOrThrow(constIndex) {
|
||||
opcode == Opcode.CHECK_CAST &&
|
||||
getReference<TypeReference>()?.type == "Landroid/view/ViewStub;"
|
||||
}
|
||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
targetIndex + 1, """
|
||||
invoke-static { v$targetRegister }, $PLAYER_CLASS_DESCRIPTOR->hideSeekMessage(Landroid/view/ViewStub;)Landroid/view/ViewStub;
|
||||
move-result-object v$targetRegister
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region patch for hide suggested actions
|
||||
|
|
|
|||
|
|
@ -306,6 +306,7 @@ internal val youtubeControlsOverlayFingerprint = legacyFingerprint(
|
|||
parameters = emptyList(),
|
||||
literals = listOf(
|
||||
// Removed in YouTube 20.09.40+
|
||||
// eduOverlayStub,
|
||||
// fadeDurationFast,
|
||||
insetOverlayViewLayout,
|
||||
scrimOverlay,
|
||||
|
|
|
|||
|
|
@ -1,33 +0,0 @@
|
|||
package app.revanced.patches.youtube.utils.controlsoverlay
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.util.fingerprint.methodOrThrow
|
||||
import app.revanced.util.fingerprint.resolvable
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
val controlsOverlayConfigPatch = bytecodePatch(
|
||||
description = "controlsOverlayConfigPatch"
|
||||
) {
|
||||
|
||||
execute {
|
||||
/**
|
||||
* Added in YouTube v18.39.41
|
||||
*
|
||||
* No exception even if fail to resolve fingerprints.
|
||||
* For compatibility with YouTube v18.25.40 ~ YouTube v18.38.44.
|
||||
*/
|
||||
if (controlsOverlayConfigFingerprint.resolvable()) {
|
||||
controlsOverlayConfigFingerprint.methodOrThrow().apply {
|
||||
val targetIndex = implementation!!.instructions.size - 1
|
||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||
|
||||
addInstruction(
|
||||
targetIndex,
|
||||
"const/4 v$targetRegister, 0x0"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
package app.revanced.patches.youtube.utils.controlsoverlay
|
||||
|
||||
import app.revanced.util.fingerprint.legacyFingerprint
|
||||
|
||||
/**
|
||||
* Added in YouTube v18.39.41
|
||||
*
|
||||
* When this value is TRUE, new control overlay is used.
|
||||
* In this case, the associated patches no longer work, so set this value to FALSE.
|
||||
*/
|
||||
internal val controlsOverlayConfigFingerprint = legacyFingerprint(
|
||||
name = "controlsOverlayConfigFingerprint",
|
||||
returnType = "Z",
|
||||
literals = listOf(45427491L),
|
||||
)
|
||||
|
|
@ -78,6 +78,8 @@ var easySeekEduContainer = -1L
|
|||
private set
|
||||
var editSettingsAction = -1L
|
||||
private set
|
||||
var eduOverlayStub = -1L
|
||||
private set
|
||||
var endScreenElementLayoutCircle = -1L
|
||||
private set
|
||||
var endScreenElementLayoutIcon = -1L
|
||||
|
|
@ -303,6 +305,7 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||
drawerResults = getResourceId(ID, "drawer_results")
|
||||
easySeekEduContainer = getResourceId(ID, "easy_seek_edu_container")
|
||||
editSettingsAction = getResourceId(STRING, "edit_settings_action")
|
||||
eduOverlayStub = getResourceId(ID, "edu_overlay_stub")
|
||||
endScreenElementLayoutCircle = getResourceId(LAYOUT, "endscreen_element_layout_circle")
|
||||
endScreenElementLayoutIcon = getResourceId(LAYOUT, "endscreen_element_layout_icon")
|
||||
endScreenElementLayoutVideo = getResourceId(LAYOUT, "endscreen_element_layout_video")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package app.revanced.patches.youtube.utils.settings
|
||||
|
||||
import app.revanced.patcher.patch.ResourcePatchContext
|
||||
import app.revanced.patches.music.utils.compatibility.Constants.YOUTUBE_MUSIC_PACKAGE_NAME
|
||||
import app.revanced.patches.youtube.utils.compatibility.Constants.YOUTUBE_PACKAGE_NAME
|
||||
import app.revanced.patches.youtube.utils.patch.PatchList
|
||||
import app.revanced.util.doRecursively
|
||||
|
|
@ -160,6 +159,10 @@ internal object ResourceUtils {
|
|||
// 2. Add android:configChanges="orientation|screenSize|keyboardHidden".
|
||||
// This prevents the activity from being recreated on configuration changes
|
||||
// (e.g., screen rotation), preserving its current state and fragment.
|
||||
// 3. In Android 16+, the default value for the 'android:enableOnBackInvokedCallback' flag is 'true'.
|
||||
// According to the 'Unsupported platform APIs, but unable to migrate' section of the Android documentation,
|
||||
// Projects that don't use AndroidX APIs are recommended to change the 'android:enableOnBackInvokedCallback' attribute in the <activity> tag to 'false':
|
||||
// https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture#update-custom
|
||||
document("AndroidManifest.xml").use { document ->
|
||||
val activityElement = document.childNodes.findElementByAttributeValueOrThrow(
|
||||
"android:name",
|
||||
|
|
@ -173,6 +176,11 @@ internal object ResourceUtils {
|
|||
)
|
||||
}
|
||||
|
||||
activityElement.setAttribute(
|
||||
"android:enableOnBackInvokedCallback",
|
||||
"false"
|
||||
)
|
||||
|
||||
val mimeType = document.createElement("data")
|
||||
mimeType.setAttribute("android:mimeType", "text/plain")
|
||||
|
||||
|
|
|
|||
|
|
@ -25,11 +25,9 @@ import app.revanced.patches.youtube.utils.totalTimeFingerprint
|
|||
import app.revanced.patches.youtube.utils.youtubeControlsOverlayFingerprint
|
||||
import app.revanced.patches.youtube.video.information.hookVideoInformation
|
||||
import app.revanced.patches.youtube.video.information.onCreateHook
|
||||
import app.revanced.patches.youtube.video.information.videoEndMethod
|
||||
import app.revanced.patches.youtube.video.information.videoInformationPatch
|
||||
import app.revanced.patches.youtube.video.information.videoTimeHook
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.addInstructionsAtControlFlowLabel
|
||||
import app.revanced.util.copyResources
|
||||
import app.revanced.util.*
|
||||
import app.revanced.util.fingerprint.matchOrThrow
|
||||
|
|
|
|||
|
|
@ -74,14 +74,12 @@
|
|||
<item>@string/revanced_spoof_streaming_data_client_entry_android_vr</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_mweb</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_tv</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_tv_simply</item>
|
||||
</string-array>
|
||||
<string-array name="revanced_spoof_streaming_data_default_client_entry_values">
|
||||
<item>ANDROID_CREATOR</item>
|
||||
<item>ANDROID_VR</item>
|
||||
<item>MWEB</item>
|
||||
<item>TV</item>
|
||||
<item>TV_SIMPLY</item>
|
||||
</string-array>
|
||||
<string-array name="revanced_watch_history_type_entries">
|
||||
<item>@string/revanced_watch_history_type_entry_1</item>
|
||||
|
|
|
|||
|
|
@ -548,12 +548,11 @@ Side effect:
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobile Web</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Defines a default client for spoofing.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Default client</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Could not fetch any client streams.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Try changing the default client to TV or TV Simply.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Try changing the default client to TV.</string>
|
||||
<string name="revanced_spoof_streaming_data_message">If you experience any playback issues, enable \"Spoof streaming data\" in <i><u>Settings > %s > Miscellaneous</u></i>.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary">Shows the client used to fetch streaming data in Stats for nerds.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Show in Stats for nerds</string>
|
||||
|
|
@ -561,7 +560,7 @@ Side effect:
|
|||
|
||||
If you are a YouTube Premium user, this setting may not be necessary."</string>
|
||||
<string name="revanced_spoof_streaming_data_title">Spoof streaming data</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary">"When enabled, the latest player JavaScript will be used to deobfuscate streaming Url on 'TV', 'TV Simply' and 'Mobile Web'.
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary">"When enabled, the latest player JavaScript will be used to deobfuscate streaming Url on 'TV' and 'Mobile Web'.
|
||||
|
||||
If you're having issues with your JavaScript client, try disabling this first."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_title">Use latest player JavaScript</string>
|
||||
|
|
|
|||
|
|
@ -545,7 +545,6 @@
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Web Κινητού</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Καθορισμός ενός προεπιλεγμένου πρόγραμμα πελάτη για παραποίηση.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Προεπιλεγμένο πρόγραμμα πελάτη</string>
|
||||
|
|
|
|||
|
|
@ -495,7 +495,6 @@ Efecto secundario:
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android RV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Web Móvil</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV simplemente</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Define un cliente predeterminado para falsificar.
|
||||
|
||||
|
|
|
|||
|
|
@ -540,7 +540,6 @@ Effetto collaterale:
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobile Web</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Definisce un client predefinito per la falsificazione.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Client predefinito</string>
|
||||
|
|
|
|||
|
|
@ -498,7 +498,6 @@ API キーの発行方法については、ここをタップしてください
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobile Web</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">偽装するデフォルトのクライアントを定義します。</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">デフォルトのクライアント</string>
|
||||
|
|
|
|||
|
|
@ -547,12 +547,11 @@ API Key를 발급받는 방법을 보려면 여기를 탭하세요."</string>
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobile Web</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">클라이언트를 변경하기 위한 기본 클라이언트를 정의할 수 있습니다.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">기본 클라이언트</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">클라이언트 스트림을 가져올 수 없습니다.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">기본 클라이언트를 TV 또는 TV Simply로 변경해 보세요.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">기본 클라이언트를 TV로 변경해 보세요.</string>
|
||||
<string name="revanced_spoof_streaming_data_message">재생 문제가 발생하는 경우에는 <i><u>설정 > %s > 기타 > 스트리밍 데이터 변경하기</u></i> 에서 \'스트리밍 데이터 변경하기\' 를 활성화하세요.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary">\'스트리밍 데이터를 가져오는 데 사용되는 클라이언트\'가 동영상 통계에서 표시됩니다.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">동영상 통계에서 표시</string>
|
||||
|
|
@ -560,7 +559,7 @@ API Key를 발급받는 방법을 보려면 여기를 탭하세요."</string>
|
|||
|
||||
YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니다."</string>
|
||||
<string name="revanced_spoof_streaming_data_title">스트리밍 데이터 변경</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary">"이 기능을 활성화하면, ‘TV’, ‘TV Simply’ 그리고 'Mobile Web'에서 최신 플레이어 JavaScript가 스트리밍 URL을 복호화하는 데 사용됩니다.
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary">"이 기능을 활성화하면, ‘TV’ 및 'Mobile Web'에서 최신 플레이어 JavaScript가 스트리밍 URL을 복호화하는 데 사용됩니다.
|
||||
|
||||
JavaScript 클라이언트에 문제가 발생할 경우에 먼저 이 기능을 비활성화해보세요."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_title">최신 플레이어 JavaScript 사용</string>
|
||||
|
|
|
|||
|
|
@ -547,7 +547,6 @@ Efekt uboczny:
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobilny przeglądarkowy</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Uproszczony TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Definiuje domyślnego klienta do oszukiwania.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Domyślny klient</string>
|
||||
|
|
|
|||
|
|
@ -544,7 +544,6 @@ Efeito lateral:
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobile Web</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simples</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Define um cliente padrão para falsificar.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Cliente padrão</string>
|
||||
|
|
|
|||
|
|
@ -132,11 +132,11 @@
|
|||
<string name="revanced_enable_mini_player_next_button_title">Включить кнопку следующего в миниплеере</string>
|
||||
<string name="revanced_enable_mini_player_previous_button_summary">Включает кнопку предыдущего трека в миниплеере.</string>
|
||||
<string name="revanced_enable_mini_player_previous_button_title">Включить кнопку предыдущего в миниплеере</string>
|
||||
<string name="revanced_enable_opus_codec_summary">"Включает аудио кодек opus вместо аудио кодека mp4a.
|
||||
<string name="revanced_enable_opus_codec_summary">"Включает кодек OPUS, если он присутствует в ответе проигрывателя.
|
||||
|
||||
Информация:
|
||||
• Последние Android клиенты используют аудио кодек opus по умолчанию.
|
||||
• Эта функция подходит только для очень старых клиентов."</string>
|
||||
• Последние версии клиентов YouTube Music по умолчанию используют аудиокодек OPUS.
|
||||
• Это может потребоваться, если клиент или видеопоток изменены."</string>
|
||||
<string name="revanced_enable_opus_codec_title">Кодек Opus</string>
|
||||
<string name="revanced_enable_smooth_transition_animation_summary">"Включает плавную анимацию при разворачивании миниплеера из свернутого состояния."</string>
|
||||
<string name="revanced_enable_smooth_transition_animation_title">Включить плавную анимацию перехода</string>
|
||||
|
|
@ -436,7 +436,7 @@
|
|||
<string name="revanced_sb_enabled">Включить SponsorBlock</string>
|
||||
<string name="revanced_sb_enabled_sum">SponsorBlock - это реализованная с помощью участия сообщества система для пропуска раздражающих частей видео в YouTube.</string>
|
||||
<string name="revanced_sb_reset_color">Сбросить цвет</string>
|
||||
<string name="revanced_sb_segments_filler">Отвлечённые темы / Шутки</string>
|
||||
<string name="revanced_sb_segments_filler">Касательные / шутки</string>
|
||||
<string name="revanced_sb_segments_filler_sum">Второстепенные сцены или шутки, которые не требуются для понимания основного содержания видео. Не включает разделы с контекстом или подробностями истории.</string>
|
||||
<string name="revanced_sb_segments_hook">Хук / Приветствие</string>
|
||||
<string name="revanced_sb_segments_hook_sum">Озвученные трейлеры к предстоящему видео, приветствия и прощания. Не включает разделы с дополнительным контентом.</string>
|
||||
|
|
@ -448,7 +448,7 @@
|
|||
<string name="revanced_sb_segments_nomusic_sum">Только для использования в музыкальных роликах. Разделы музыкальных видео без музыки, которые ещё не охвачены другой категорией.</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_selfpromo">Безвозмездная реклама / Самореклама</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Похоже на спонсорскую рекламу, за исключением безвозмездной рекламы или саморекламы. Включает разделы о товарах, пожертвованиях или информации о том, с кем они сотрудничали.</string>
|
||||
|
|
@ -456,7 +456,7 @@
|
|||
<string name="revanced_sb_segments_sponsor_sum">Платные промоакции, платные рефералы и прямая реклама. Не для саморекламы или бесплатных рекомендаций о делах / создателях / веб-сайтах / продуктах, которые им нравятся.</string>
|
||||
<string name="revanced_sb_skip_automatically">Автоматически пропускать</string>
|
||||
<string name="revanced_sb_skip_ignore">Отключить</string>
|
||||
<string name="revanced_sb_skipped_filler">Пропущен наполнитель.</string>
|
||||
<string name="revanced_sb_skipped_filler">Пропущена касательная.</string>
|
||||
<string name="revanced_sb_skipped_hook">Пропущен хук.</string>
|
||||
<string name="revanced_sb_skipped_interaction">Пропущено назойливое напоминание.</string>
|
||||
<string name="revanced_sb_skipped_intro_beginning">Пропущено интро.</string>
|
||||
|
|
@ -490,6 +490,24 @@
|
|||
<string name="revanced_settings_import_reset">Настройки сброшены до начальных.</string>
|
||||
<string name="revanced_settings_import_success">Импортировано %d настроек.</string>
|
||||
<string name="revanced_settings_reset">Сбросить</string>
|
||||
<string name="revanced_settings_search_clear_history">Очистить историю поиска</string>
|
||||
<string name="revanced_settings_search_clear_history_message">Вы уверены, что хотите очистить всю историю поиска?</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">Чтобы сохранить историю поиска, введите поисковый запрос и нажмите Enter.</string>
|
||||
<string name="revanced_settings_search_empty_history_title">Нет истории поиска</string>
|
||||
<string name="revanced_settings_search_history_summary_off">История поиска в настройках не отображается.</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Отображается история поиска настроек.</string>
|
||||
<string name="revanced_settings_search_history_title">Показывать историю поиска настроек</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Попробуйте другое ключевое слово.</string>
|
||||
<string name="revanced_settings_search_no_results_title">По запросу \'%s\' ничего не найдено.</string>
|
||||
<string name="revanced_settings_search_recent_searches">Недавние запросы</string>
|
||||
<string name="revanced_settings_search_remove_message">Удалить из истории поиска?</string>
|
||||
<string name="revanced_settings_search_tips_summary">"• Нажмите на путь, чтобы перейти к нему.
|
||||
• Нажмите и удерживайте настройку, чтобы перейти к ней.
|
||||
• Нажмите Enter, чтобы сохранить поисковый запрос в истории.
|
||||
• При поиске игнорируются регистр и знаки препинания.
|
||||
• Родительские настройки отображаются над отключенными дочерними настройками."</string>
|
||||
<string name="revanced_settings_search_tips_title">Советы по поиску</string>
|
||||
<string name="revanced_settings_search_title">Поиск %s</string>
|
||||
<string name="revanced_settings_title">RVX</string>
|
||||
<string name="revanced_share_copy_settings_success">Настройки скопированы в буфер.</string>
|
||||
<string name="revanced_spoof_app_version_summary">"Подменяет версию клиента на более старую.
|
||||
|
|
@ -507,12 +525,7 @@
|
|||
<string name="revanced_spoof_app_version_target_summary">Выберите целевую версию приложения для подмены.</string>
|
||||
<string name="revanced_spoof_app_version_target_title">Целевая версия приложения при подмене</string>
|
||||
<string name="revanced_spoof_app_version_title">Подмена версии приложения</string>
|
||||
<string name="revanced_spoof_client_summary">Подменяет клиент для предотвращения проблем с воспроизведением.
|
||||
|
||||
Побочный эффект:
|
||||
• Кнопки действий могут быть всегда скрыты в YouTube Music 7.17+.
|
||||
• Всплывающее меню плеера может отображаться некорректно.
|
||||
• Эти побочные эффекты можно устранить, очистив данные приложения и повторно войдя в систему.</string>
|
||||
<string name="revanced_spoof_client_summary">Измените клиент, чтобы предотвратить проблемы с воспроизведением.</string>
|
||||
<string name="revanced_spoof_client_title">Подмена клиента</string>
|
||||
<string name="revanced_spoof_client_type_summary">"Определяет клиент по умолчанию для подмены."</string>
|
||||
<string name="revanced_spoof_client_type_title">Клиент по умолчанию</string>
|
||||
|
|
@ -526,17 +539,22 @@
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Мобильный веб</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">ТВ</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Простой ТВ</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Определяет клиент по умолчанию для подмены.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Клиент по умолчанию</string>
|
||||
<string name="revanced_spoof_streaming_data_message">Если у вас возникли какие-либо проблемы с воспроизведением, включите один из следующих параметров в зависимости от того, какой из них вам больше подходит: \"Spoof video streams\" или \"Spoof client\" в <i><u>Настройках > %s > Разное;/u></i>.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Не удалось получить потоки клиента.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Попробуйте изменить клиент по умолчанию на TV или TV Simply.</string>
|
||||
<string name="revanced_spoof_streaming_data_message">Если у вас возникли какие-либо проблемы с воспроизведением, включите функцию \"Подмена потоковых данных\" в <i><u>Настройки > %s > Разное </u></i>.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary">Показывает клиент, используемый для получения потоковых данных в Статистике для сисадминов.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Показывать в \"Статистике для сисадминов\"</string>
|
||||
<string name="revanced_spoof_streaming_data_summary">"Подменяет клиентские видеопотоки для предотвращения проблем с воспроизведением.
|
||||
|
||||
Если вы являетесь пользователем YouTube Premium, эта настройка может быть не нужна."</string>
|
||||
<string name="revanced_spoof_streaming_data_title">Подмена потоковых данных</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary">"При включении плеера будет использоваться последняя версия JavaScript для деобфускации URL-адресов потоковой передачи на 'TV', 'TV Simply' и 'Mobile Web'.
|
||||
|
||||
Если у вас возникли проблемы с JavaScript-клиентом, попробуйте сначала отключить эту функцию."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_title">Используйте последнюю версию JavaScript для проигрывателя</string>
|
||||
<string name="revanced_spoof_video_streams_default_client_entry_ios_music_6_21">Музыка для iOS 6.21</string>
|
||||
<string name="revanced_spoof_video_streams_default_client_entry_ios_music_7_04">Музыка для iOS 7.04</string>
|
||||
<string name="revanced_spoof_video_streams_default_client_entry_ios_music_8_12">Музыка для iOS 8.12</string>
|
||||
|
|
|
|||
|
|
@ -503,7 +503,6 @@ APl anahtarının nasıl verileceğini görmek için tıklayın."</string>
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobil İnternet</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Basitçe TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">vizyon işletim sistemi</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Kimlik sahtekarlığı için varsayılan bir istemci tanımlar.
|
||||
|
||||
|
|
|
|||
|
|
@ -522,7 +522,6 @@
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Мобільний веб</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">ТБ</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Просте ТБ</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Визначає клієнт за замовчуванням для підробки.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Клієнт за замовчуванням</string>
|
||||
|
|
|
|||
|
|
@ -491,6 +491,24 @@ Nhấp vào đây để xem các bước phát hành khóa API."</string>
|
|||
<string name="revanced_settings_import_reset">Đã đặt lại cài đặt về mặc định.</string>
|
||||
<string name="revanced_settings_import_success">Đã nhập %d cài đặt.</string>
|
||||
<string name="revanced_settings_reset">Đặt lại</string>
|
||||
<string name="revanced_settings_search_clear_history">Xóa lịch sử tìm kiếm</string>
|
||||
<string name="revanced_settings_search_clear_history_message">Bạn chắc chắn muốn xóa toàn bộ lịch sử tìm kiếm không?</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">Để lưu lịch sử tìm kiếm, hãy nhập từ khoá và ấn Enter.</string>
|
||||
<string name="revanced_settings_search_empty_history_title">Trống</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Lịch sử tìm kiếm cài đặt không được hiển thị.</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Lịch sử tìm kiếm cài đặt đã được hiển thị.</string>
|
||||
<string name="revanced_settings_search_history_title">Lịch sử tìm kiếm cài đặt</string>
|
||||
<string name="revanced_settings_search_no_results_summary">Hãy thử từ khóa khác.</string>
|
||||
<string name="revanced_settings_search_no_results_title">Không tìm thấy kết quả nào cho \'%s\'.</string>
|
||||
<string name="revanced_settings_search_recent_searches">Tìm kiếm gần đây</string>
|
||||
<string name="revanced_settings_search_remove_message">Xoá khỏi lịch sử tìm kiếm?</string>
|
||||
<string name="revanced_settings_search_tips_summary">"• Nhấn vào đường dẫn để đi tới đó.
|
||||
• Nhấn và giữ một cài đặt để đi tới đó.
|
||||
• Nhấn Enter để lưu từ khoá vào lịch sử tìm kiếm.
|
||||
• Tìm kiếm không phân biệt viết hoa và dấu câu.
|
||||
• Các cài đặt lớn sẽ xuất hiện trên các cài đặt nhỏ bị vô hiệu hoá."</string>
|
||||
<string name="revanced_settings_search_tips_title">Mẹo tìm kiếm</string>
|
||||
<string name="revanced_settings_search_title">Tìm kiếm trong %s</string>
|
||||
<string name="revanced_settings_title">RVX</string>
|
||||
<string name="revanced_share_copy_settings_success">Đã sao chép cài đặt sang bảng nhớ tạm.</string>
|
||||
<string name="revanced_spoof_app_version_summary">"Giả mạo phiên bản YouTube Music thành phiên bản cũ.
|
||||
|
|
@ -525,10 +543,11 @@ Hạn chế:
|
|||
<string name="revanced_spoof_streaming_data_client_entry_android_vr">Android VR</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_mweb">Mobile Web</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">visionOS</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_summary">Chọn client mặc định để giả mạo.</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Client mặc định</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Không truy xuất được luồng phát từ bất kỳ client nào.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Hãy thử chuyển client mặc định sang TV hoặc TV Simply.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary">Hiển thị ứng dụng khách được sử dụng để nạp luồng dữ liệu trực tuyến trong Thống kê chi tiết.</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Hiển thị trong Thống kê chi tiết</string>
|
||||
<string name="revanced_spoof_streaming_data_summary">"Giả mạo client phát video để tránh lỗi khi phát.
|
||||
|
|
|
|||
|
|
@ -459,7 +459,6 @@
|
|||
<item>@string/revanced_spoof_streaming_data_client_entry_ipados</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_mweb</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_tv</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_tv_simply</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_visionos</item>
|
||||
<item>@string/revanced_spoof_streaming_data_client_entry_ios_deprecated</item>
|
||||
</string-array>
|
||||
|
|
@ -469,7 +468,6 @@
|
|||
<item>IPADOS</item>
|
||||
<item>MWEB</item>
|
||||
<item>TV</item>
|
||||
<item>TV_SIMPLY</item>
|
||||
<item>VISIONOS</item>
|
||||
<item>IOS_DEPRECATED</item>
|
||||
</string-array>
|
||||
|
|
|
|||
|
|
@ -239,7 +239,7 @@ Limitation: Back button on the toolbar may not work."</string>
|
|||
|
||||
This may not work for some users, if it doesn't work for you:
|
||||
1. Go to Settings - RVX - Miscellaneous - Spoof streaming data, and turn on 'Use JavaScript client'.
|
||||
2. Go to Settings - RVX - Miscellaneous - Spoof streaming data, and change 'Default client' to 'TV' or 'TV Simply'."</string>
|
||||
2. Go to Settings - RVX - Miscellaneous - Spoof streaming data, and change 'Default client' to 'TV'."</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_title">Disable forced auto audio tracks</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">Forced auto captions are enabled.</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">Forced auto captions are disabled.</string>
|
||||
|
|
@ -926,7 +926,7 @@ Words with uppercase letters in the middle must be entered with the casing (ie:
|
|||
|
||||
To show the Audio track menu:
|
||||
1. Go to Settings - RVX - Miscellaneous - Spoof streaming data, and turn on 'Use JavaScript client'.
|
||||
2. Go to Settings - RVX - Miscellaneous - Spoof streaming data, and change 'Default client' to 'TV' or 'TV Simply'."</string>
|
||||
2. Go to Settings - RVX - Miscellaneous - Spoof streaming data, and change 'Default client' to 'TV'."</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_off">Audio track menu is shown.</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_on">Audio track menu is hidden.</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_title">Hide Audio track menu</string>
|
||||
|
|
@ -2364,12 +2364,11 @@ This feature is still in development, so it may break at any time due to server-
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobile Web
|
||||
<small>(WIP, No Auth)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Unreleased, No Auth)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Default client</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Could not fetch any client streams.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Try changing the default client to TV or TV Simply.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Try changing the default client to TV.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_off">Video codec is determined automatically.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_on">Video codec is forced to AVC (H.264).</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_title">Force iOS AVC (H.264)</string>
|
||||
|
|
@ -2502,7 +2501,7 @@ This can be easily resolved by clicking the 'Reload video button' in the player
|
|||
|
||||
(Prerequisites: Both 'Show reload video button' and 'Always show reload video button' are enabled)
|
||||
|
||||
Among JavaScript clients, the recommended client is TV Simply."</string>
|
||||
Among JavaScript clients, the recommended client is TV."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_off">"JavaScript for deobfuscation is not kept up to date.
|
||||
|
||||
• JavaScript that succeeds in deobfuscation is used, but it is still somewhat server-dependent."</string>
|
||||
|
|
|
|||
|
|
@ -2,5 +2,4 @@
|
|||
<resources>
|
||||
<!-- Translation Exception -->
|
||||
<string name="revanced_spoof_streaming_data_side_effects_tv_embedded">@string/revanced_spoof_streaming_data_side_effects_tv</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_tv_simply">@string/revanced_spoof_streaming_data_side_effects_tv</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -549,10 +549,10 @@
|
|||
<SwitchPreference android:title="@string/revanced_replace_time_stamp_action_title" android:key="revanced_replace_time_stamp_action" android:summaryOn="@string/revanced_replace_time_stamp_action_summary_on" android:summaryOff="@string/revanced_replace_time_stamp_action_summary_off" />
|
||||
<SwitchPreference android:title="@string/revanced_disable_seekbar_chapters_title" android:key="revanced_disable_seekbar_chapters" android:summaryOn="@string/revanced_disable_seekbar_chapters_summary_on" android:summaryOff="@string/revanced_disable_seekbar_chapters_summary_off" />
|
||||
<SwitchPreference android:title="@string/revanced_enable_custom_seekbar_color_title" android:key="revanced_enable_custom_seekbar_color" android:summaryOn="@string/revanced_enable_custom_seekbar_color_summary_on" android:summaryOff="@string/revanced_enable_custom_seekbar_color_summary_off" />
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerPreference android:title="@string/revanced_custom_seekbar_color_primary_title" android:key="revanced_custom_seekbar_color_primary" android:summary="@string/revanced_custom_seekbar_color_primary_summary" android:hint="#FF0033" android:inputType="text" />SETTINGS: SEEKBAR_COMPONENTS -->
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerPreference android:title="@string/revanced_custom_seekbar_color_primary_title" android:key="revanced_custom_seekbar_color_primary" android:summary="@string/revanced_custom_seekbar_color_primary_summary" android:hint="#FF0033" android:inputType="textCapCharacters" />SETTINGS: SEEKBAR_COMPONENTS -->
|
||||
|
||||
<!-- SETTINGS: CUSTOM_SEEKBAR_COLOR_ACCENT
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerPreference android:title="@string/revanced_custom_seekbar_color_accent_title" android:key="revanced_custom_seekbar_color_accent" android:summary="@string/revanced_custom_seekbar_color_accent_summary" android:hint="#FF2791" android:inputType="text" />
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerPreference android:title="@string/revanced_custom_seekbar_color_accent_title" android:key="revanced_custom_seekbar_color_accent" android:summary="@string/revanced_custom_seekbar_color_accent_summary" android:hint="#FF2791" android:inputType="textCapCharacters" />
|
||||
<app.revanced.extension.shared.settings.preference.ResettableEditTextPreference android:title="@string/revanced_gradient_seekbar_positions_title" android:key="revanced_gradient_seekbar_positions" android:summary="@string/revanced_gradient_seekbar_positions_summary" android:inputType="text" />SETTINGS: CUSTOM_SEEKBAR_COLOR_ACCENT -->
|
||||
|
||||
<!-- SETTINGS: SEEKBAR_COMPONENTS
|
||||
|
|
@ -759,14 +759,14 @@
|
|||
<app.revanced.extension.shared.settings.preference.CustomDialogListPreference android:entries="@array/revanced_swipe_overlay_style_entries" android:title="@string/revanced_swipe_overlay_style_title" android:key="revanced_swipe_overlay_style" android:entryValues="@array/revanced_swipe_overlay_style_entry_values" />
|
||||
|
||||
<SwitchPreference android:title="@string/revanced_swipe_brightness_title" android:key="revanced_swipe_brightness" android:summaryOn="@string/revanced_swipe_brightness_summary_on" android:summaryOff="@string/revanced_swipe_brightness_summary_off" />
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerPreference android:title="@string/revanced_swipe_overlay_progress_brightness_color_title" android:key="revanced_swipe_overlay_progress_brightness_color" android:summary="@string/revanced_swipe_overlay_progress_brightness_color_summary" android:inputType="textCapCharacters" />
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference android:title="@string/revanced_swipe_overlay_progress_brightness_color_title" android:key="revanced_swipe_overlay_progress_brightness_color" android:summary="@string/revanced_swipe_overlay_progress_brightness_color_summary" android:inputType="textCapCharacters" />
|
||||
<app.revanced.extension.shared.settings.preference.ResettableEditTextPreference android:title="@string/revanced_swipe_brightness_distance_title" android:key="revanced_swipe_brightness_distance" android:summary="@string/revanced_swipe_brightness_distance_summary" android:inputType="number" />
|
||||
|
||||
<SwitchPreference android:title="@string/revanced_swipe_lowest_value_enable_auto_brightness_title" android:key="revanced_swipe_lowest_value_enable_auto_brightness" android:summaryOn="@string/revanced_swipe_lowest_value_enable_auto_brightness_summary_on" android:summaryOff="@string/revanced_swipe_lowest_value_enable_auto_brightness_summary_off" />
|
||||
<SwitchPreference android:title="@string/revanced_swipe_save_and_restore_brightness_title" android:key="revanced_swipe_save_and_restore_brightness" android:summaryOn="@string/revanced_swipe_save_and_restore_brightness_summary_on" android:summaryOff="@string/revanced_swipe_save_and_restore_brightness_summary_off" />
|
||||
|
||||
<SwitchPreference android:title="@string/revanced_swipe_volume_title" android:key="revanced_swipe_volume" android:summaryOn="@string/revanced_swipe_volume_summary_on" android:summaryOff="@string/revanced_swipe_volume_summary_off" />
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerPreference android:title="@string/revanced_swipe_overlay_progress_volume_color_title" android:key="revanced_swipe_overlay_progress_volume_color" android:summary="@string/revanced_swipe_overlay_progress_volume_color_summary" android:inputType="textCapCharacters" />
|
||||
<app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference android:title="@string/revanced_swipe_overlay_progress_volume_color_title" android:key="revanced_swipe_overlay_progress_volume_color" android:summary="@string/revanced_swipe_overlay_progress_volume_color_summary" android:inputType="textCapCharacters" />
|
||||
<app.revanced.extension.shared.settings.preference.ResettableEditTextPreference android:title="@string/revanced_swipe_volume_distance_title" android:key="revanced_swipe_volume_distance" android:summary="@string/revanced_swipe_volume_distance_summary" android:inputType="number" />
|
||||
<app.revanced.extension.shared.settings.preference.ResettableEditTextPreference android:title="@string/revanced_swipe_volume_sensitivity_title" android:key="revanced_swipe_volumes_sensitivity" android:summary="@string/revanced_swipe_volume_sensitivity_summary" android:inputType="number" />
|
||||
|
||||
|
|
|
|||
|
|
@ -439,6 +439,9 @@
|
|||
<string name="revanced_enable_translucent_navigation_bar_summary_off">شريط التنقل غير شفاف.</string>
|
||||
<string name="revanced_enable_translucent_navigation_bar_summary_on">شريط التنقل شفاف.</string>
|
||||
<string name="revanced_enable_translucent_navigation_bar_title">تمكين شريط التنقل الشفاف</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_user_dialog_message">"يفرض هذا الإعداد تأخيرًا قبل تحميل واجهة المستخدم.
|
||||
|
||||
يمكن استخدامه عند اختبار شيء ما على MainThread."</string>
|
||||
<string name="revanced_enable_wide_search_bar_in_you_tab_summary">"سيؤدي تمكين هذا الإعداد إلى تعطيل زر الإعدادات في علامة التبويب أنت.
|
||||
|
||||
في هذه الحالة، يرجى استخدام المسار التالي للوصول إلى الإعدادات:
|
||||
|
|
@ -2268,7 +2271,6 @@
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobile Web
|
||||
<small>(WIP, بدون مصادقة)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(لم يصدر ، بدون مصادقة)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">العميل الافتراضي</string>
|
||||
|
|
@ -2411,6 +2413,14 @@ AVC لديه حد أقصى للدقة 1080p، لا يتوفر ترميز الص
|
|||
|
||||
• يعتمد بشكل كبير على الخادم، ويعتمد نجاح أو فشل إزالة التشويش على JavaScript المستخدم حاليًا على الخادم."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_title">استخدام أحدث JavaScript</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_off">"لا يتم تحديث مشغل JavaScript لإزالة التشويش.
|
||||
|
||||
• يستخدم JavaScript المشغل الذي ينجح في إزالة التشويش، ولكنه لا يزال يعتمد إلى حد ما على الخادم."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_on">"يتم تحديث مشغل JavaScript لإزالة التشويش باستمرار.
|
||||
|
||||
• يعتمد بشكل كبير على الخادم، ويعتمد نجاح أو فشل إزالة التشويش على JavaScript المشغل المُستخدم حاليًا على الخادم.
|
||||
• إذا كنت تواجه مشاكل مع عميل JavaScript، فحاول تعطيله أولًا."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_title">استخدام أحدث مشغل JavaScript</string>
|
||||
<string name="revanced_spoof_streaming_data_user_dialog_message">إيقاف تشغيل هذا الإعداد قد يسبب مشاكل في تشغيل الفيديو.</string>
|
||||
<string name="revanced_spoof_streaming_data_vr_disable_av1_summary_off">يتم تحديد ترميز الفيديو تلقائيًا.</string>
|
||||
<string name="revanced_spoof_streaming_data_vr_disable_av1_summary_on">ترميز الفيديو هو AVC (H.264) أو VP9.</string>
|
||||
|
|
|
|||
|
|
@ -2286,7 +2286,6 @@ Playlists
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Web Κινητού
|
||||
<small>(λειτουργία σε εξέλιξη, χωρίς σύνδεση χρήστη)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Ακυκλοφόρητο, χωρίς σύνδεση χρήστη)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Προεπιλεγμένο πρόγραμμα πελάτη</string>
|
||||
|
|
|
|||
|
|
@ -2270,9 +2270,6 @@ Esta función todavía está en desarrollo, por lo que puede fallar en cualquier
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Web móvil
|
||||
<small>(todavía en desarrollo)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV
|
||||
<small>(todavía en desarrollo)</small>
|
||||
</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV simple
|
||||
<small>(todavía en desarrollo)</small>
|
||||
</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
|
|
|
|||
|
|
@ -2267,7 +2267,6 @@ Ez a funkció még fejlesztés alatt áll, így a szerveroldali változások mia
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobil webböngésző
|
||||
<small>(fejlesztés alatt, nincs hitelesítés)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV egyszerű</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Kiadatlan, nincs hitelesítés)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Alapértelmezett kliens</string>
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ Nota: il pulsante Indietro della barra degli strumenti potrebbe non funzionare."
|
|||
<string name="revanced_disable_auto_audio_tracks_summary_on">La traccia audio automatica forzata è disattivata.</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_summary_on_disclaimer">"La traccia audio automatica forzata è disattivata.
|
||||
|
||||
Nota: questa impostazione potrebbe non funzionare per alcuni utenti. Se non funziona, vai alle impostazioni → RVX → Varie → Camuffa i dati in streaming → Mostra i client JavaScript tra i client disponibili e cambia il client predefinito in TV o TV Simply."</string>
|
||||
Nota: questa impostazione potrebbe non funzionare per alcuni utenti. Se non funziona, vai alle impostazioni → RVX → Varie → Camuffa i dati in streaming → Mostra i client JavaScript tra i client disponibili e cambia il client predefinito in TV."</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_title">Disattiva la traccia audio automatica forzata</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">I sottotitoli automatici forzati sono attivati.</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">I sottotitoli automatici forzati sono disattivati.</string>
|
||||
|
|
@ -917,7 +917,7 @@ Le parole con lettere maiuscole all'interno devono essere inserite con il maiusc
|
|||
<string name="revanced_hide_player_flyout_menu_ambient_mode_title">Nascondi il menù Modalità Ambient</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_not_available">"Il menù Traccia Audio è nascosto.
|
||||
|
||||
Nota: per mostrare il menù Traccia Audio, vai alle impostazioni → RVX → Varie → Camuffa i dati in streaming → Mostra i client JavaScript tra i client disponibili e cambia il client predefinito in TV o TV Simply."</string>
|
||||
Nota: per mostrare il menù Traccia Audio, vai alle impostazioni → RVX → Varie → Camuffa i dati in streaming → Mostra i client JavaScript tra i client disponibili e cambia il client predefinito in TV."</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_off">Il menù Traccia Audio è visibile.</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_on">Il menù Traccia Audio è nascosto.</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_title">Nascondi il menù Traccia Audio</string>
|
||||
|
|
@ -2345,12 +2345,11 @@ Questa funzionalità è ancora in fase di sviluppo, quindi potrebbe non funziona
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Web Mobile
|
||||
<small>(In fase di sviluppo e nessun accesso richiesto)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Non rilasciato e nessun accesso richiesto)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Client predefinito</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Non è stato possibile recuperare alcun flusso client</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Prova a cambiare il client predefinito in TV o TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Prova a cambiare il client predefinito in TV.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_off">Il codec video è determinato automaticamente.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_on">Il codec video è forzato ad AVC (H.264).</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_title">Forza iOS AVC (H.264)</string>
|
||||
|
|
@ -2464,7 +2463,7 @@ A volte, il pattern n-sig non viene decodificato, causando un avvio ritardato de
|
|||
Questo problema può essere facilmente risolto toccando il pulsante \"Ricarica Video\" nel riproduttore per ricaricare il video.
|
||||
Prerequisiti: sia \"Mostra il pulsante Ricarica Video\" che \"Mostra sempre il pulsante Ricarica Video\" sono attivati.
|
||||
|
||||
Tra i client JavaScript, il client consigliato è TV Simply."</string>
|
||||
Tra i client JavaScript, il client consigliato è TV."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_off">"La versione di JavaScript per il deoffuscamento non viene mantenuta aggiornata.
|
||||
|
||||
Nota: viene usato la versione di JavaScript che riesce nel deoffuscamento, ma l'operazione è comunque in qualche modo dipendente dal server."</string>
|
||||
|
|
|
|||
|
|
@ -437,8 +437,8 @@ DeArrow について詳しく知るには、ここをタップしてください
|
|||
<string name="revanced_enable_translucent_navigation_bar_summary_off">ナビゲーションバー ([ホーム]、[登録チャンネル] などのボタン) を半透明にします。</string>
|
||||
<string name="revanced_enable_translucent_navigation_bar_summary_on">ナビゲーションバー ([ホーム]、[登録チャンネル] などのボタン) を半透明にします。</string>
|
||||
<string name="revanced_enable_translucent_navigation_bar_title">半透明のナビゲーションバーを有効化</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_summary_off">自動再生時の事前読み込み処理の遅延を有効化します。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_summary_on">自動再生時の事前読み込み処理の遅延を有効化します。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_summary_off">自動再生する際の事前読み込み処理に遅延を追加します。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_summary_on">自動再生する際の事前読み込み処理に遅延を追加します。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_title">自動再生時の事前読み込み処理の遅延を有効化</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_user_dialog_message">"この設定により、プレーヤーの UI が読み込まれる前に遅延が強制されます。
|
||||
|
||||
|
|
@ -2369,7 +2369,6 @@ Cookie の使用は万能薬ではありません。
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobile Web
|
||||
<small>(開発途中、認証なし)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(未リリース、認証なし)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">偽装するクライアントを選択</string>
|
||||
|
|
@ -2668,7 +2667,7 @@ JavaScript クライアントの中では、「TV Simply」が推奨されます
|
|||
<string name="revanced_watch_history_type_entry_2">ドメインを置換</string>
|
||||
<string name="revanced_watch_history_type_entry_3">再生履歴をブロック</string>
|
||||
<string name="revanced_watch_history_type_title">再生履歴の種類</string>
|
||||
<string name="revanced_watch_next_processing_delay_summary">自動再生の準備を開始するまでの遅延時間(ミリ秒)。</string>
|
||||
<string name="revanced_watch_next_processing_delay_summary">自動再生の準備を開始するまでの遅延時間 (ミリ秒)。</string>
|
||||
<string name="revanced_watch_next_processing_delay_title">自動再生時の事前読み込み処理の遅延</string>
|
||||
<string name="revanced_webview_contextual_menu_get_cookies">Cookie を取得</string>
|
||||
<string name="revanced_webview_contextual_menu_get_data_sync_id">データ同期 ID を取得</string>
|
||||
|
|
|
|||
|
|
@ -241,13 +241,13 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요."</string>
|
|||
|
||||
일부 사용자에게는 작동하지 않을 수 있습니다. 작동하지 않는 경우에는:
|
||||
1. 설정 - RVX - 기타 - '스트리밍 데이터 변경하기'로 이동하여 'JavaScript 클라이언트 사용하기'를 활성화합니다.
|
||||
2. 설정 - RVX - 기타 - '스트리밍 데이터 변경하기'로 이동하여 ‘기본 클라이언트'를 'TV’ 또는 'TV Simply'로 변경합니다."</string>
|
||||
2. 설정 - RVX - 기타 - '스트리밍 데이터 변경하기'로 이동하여 ‘기본 클라이언트'를 'TV’로 변경합니다."</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_title">강제된 자동 오디오 트랙 비활성화하기</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">강제 사용이 설정된 자동 자막을 활성화합니다.</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">강제 사용이 설정된 자동 자막을 비활성화합니다.</string>
|
||||
<string name="revanced_disable_auto_captions_title">강제된 자동 자막 비활성화하기</string>
|
||||
<string name="revanced_disable_auto_player_popup_panels_summary_off">자동 플레이어 팝업 패널을 활성화합니다.\n실시간 채팅, 재생목록, 태그된 제품</string>
|
||||
<string name="revanced_disable_auto_player_popup_panels_summary_on">자동 플레이어 팝업 패널을 비활성화합니다.\n실시간 채팅, 재생목록, 태그된 제품</string>
|
||||
<string name="revanced_disable_auto_player_popup_panels_summary_off">자동 플레이어 팝업 패널을 활성화합니다:\n실시간 채팅, 재생목록, 태그된 제품, etc.</string>
|
||||
<string name="revanced_disable_auto_player_popup_panels_summary_on">자동 플레이어 팝업 패널을 비활성화합니다:\n실시간 채팅, 재생목록, 태그된 제품, etc.</string>
|
||||
<string name="revanced_disable_auto_player_popup_panels_title">플레이어 팝업 패널 비활성화하기</string>
|
||||
<string name="revanced_disable_auto_switch_mix_playlists_summary_off">"자동재생이 켜져 있으면, 믹스 재생목록 자동전환을 활성화합니다.
|
||||
|
||||
|
|
@ -939,7 +939,7 @@ MainThread에서 무언가를 테스트할 경우에 사용할 수 있습니다.
|
|||
|
||||
오디오 트랙 메뉴를 표시하려면:
|
||||
1. 설정 - RVX - 기타 - '스트리밍 데이터 변경하기'로 이동하여 'JavaScript 클라이언트 사용하기'를 활성화합니다.
|
||||
2. 설정 - RVX - 기타 - '스트리밍 데이터 변경하기'로 이동하여 ‘기본 클라이언트'를 'TV’ 또는 'TV Simply'로 변경합니다."</string>
|
||||
2. 설정 - RVX - 기타 - '스트리밍 데이터 변경하기'로 이동하여 ‘기본 클라이언트'를 'TV’로 변경합니다."</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_off">오디오 트랙 메뉴가 표시됩니다.</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_on">오디오 트랙 메뉴가 숨겨집니다.</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_title">오디오 트랙 메뉴 숨기기</string>
|
||||
|
|
@ -2384,12 +2384,11 @@ Cookies를 사용한다고 해서 문제가 해결되는 것은 아닙니다.
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobile Web
|
||||
<small>(개발 중, 인증 없음)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(미출시, 인증 없음)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">기본 클라이언트</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">클라이언트 스트림을 가져올 수 없습니다.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">기본 클라이언트를 TV 또는 TV Simply로 변경해 보세요.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">기본 클라이언트를 TV로 변경해 보세요.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_off">동영상 코덱이 자동으로 결정됩니다.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_on">동영상 코덱이 AVC (H.264)로 강제로 결정됩니다.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_title">iOS AVC (H.264) 강제로 활성화하기</string>
|
||||
|
|
@ -2522,7 +2521,7 @@ uBlock Origin은 이 문제에 대한 해결 방법을 찾아냈으며, ‘페
|
|||
|
||||
(전제 조건: '동영상 새로고침 버튼 표시하기'와 '동영상 새로고침 버튼 항상 표시하기'가 모두 활성화된 상태)
|
||||
|
||||
JavaScript 클라이언트 중에서 권장되는 클라이언트는 TV Simply입니다."</string>
|
||||
JavaScript 클라이언트 중에서 권장되는 클라이언트는 TV입니다."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_off">"복호화를 위한 JavaScript가 최신 상태로 유지되지 않습니다.
|
||||
|
||||
• 복호화에 성공한 JavaScript가 사용되지만 여전히 서버에 따라 다소 달라질 수 있습니다."</string>
|
||||
|
|
|
|||
|
|
@ -2374,12 +2374,11 @@ Funkcja jest nadal w fazie rozwoju, więc może przerwać się jej działanie w
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobilny przeglądarkowy
|
||||
<small>(W fazie rozwoju, bez autoryzacji)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Uproszczony TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Niewydany, bez autoryzacji)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Domyślny klient</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Nie można przechwycić żadnego ze strumieni klienta.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Spróbuj zmienić domyślnego klienta na TV lub TV Zwykły.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Spróbuj zmienić domyślnego klienta na TV lub Uproszczony TV.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_off">Określany automatycznie</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_on">Wymuszony</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_title">Wymuś kodek AVC (H.264)</string>
|
||||
|
|
|
|||
|
|
@ -780,7 +780,7 @@ Palavras com letras maiúsculas no meio devem ser inseridas com maiúsculas (ou
|
|||
<string name="revanced_hide_keyword_content_subscriptions_summary_off">Os vídeos no feed de inscrições não são filtrados.</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_on">Os vídeos no feed de inscrições são filtrados.</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_title">Ocultar vídeos no feed de inscrições por palavras-chave</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_off">Operador \'AND\' (\'&\') está desativado.<br><br>Quando <strong>\"Azul\" & \"vermelho\"</strong> é usado como uma palavra-chave, palavras-chave contendo <strong>\"Blue\" & \"vermelho\"</strong> serão filtradas.</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_off">Operador \'AND\' (\'&\') está desativado.<br><br>Quando <strong>\"Azul\" & \"Vermelho\"</strong> é usado como uma palavra-chave, palavras-chave contendo <strong>\"Azul\" & \"Vermelho\"</strong> serão filtradas.</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_on">Operador \'AND\' (\'&\') está ativado.<br><br>Quando <strong>\"Azul\" & \"Vermelho\"</strong> é usado como uma palavra-chave, palavras-chave contendo <strong>Azul</strong> e <strong>Vermelho</strong> serão filtrados.</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_title">Usar operador \'AND\' (\'&\')</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Palavra-chave \'%1$s\' irá ocultar todos os vídeos.</string>
|
||||
|
|
@ -1971,7 +1971,7 @@ Pronto para enviar?"</string>
|
|||
<string name="revanced_sb_segments_nomusic_sum">Apenas para uso em vídeos musicais. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria.</string>
|
||||
<string name="revanced_sb_segments_outro">Finalização / Créditos</string>
|
||||
<string name="revanced_sb_segments_outro_sum">Créditos ou quando os cartões finais do YouTube aparecem. Não deve ser usado para conclusões informativas.</string>
|
||||
<string name="revanced_sb_segments_preview">Pré-visualização / Recapitulação / Hook</string>
|
||||
<string name="revanced_sb_segments_preview">Pré-visualização / Recapitulação</string>
|
||||
<string name="revanced_sb_segments_preview_sum">Coleção de clipes que mostram o que está por vir ou o que aconteceu no vídeo ou em outros vídeos de uma série, onde todas as informações são repetidas em outro lugar.</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Não pago / Autopromoção</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Semelhante ao \'Patrocinador\' exceto pela promoção não paga ou autopromoção. Inclui seções sobre mercadorias, doações ou informações sobre com quem eles colaboraram.</string>
|
||||
|
|
@ -2247,7 +2247,6 @@ Esse recurso ainda está em desenvolvimento, portanto pode quebrar a qualquer mo
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobile Web
|
||||
<small>(WIP, Sem Autenticação)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simples</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Não lançado, Sem Autenticação)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Cliente padrão</string>
|
||||
|
|
|
|||
|
|
@ -498,11 +498,11 @@
|
|||
<string name="revanced_external_downloader_not_installed_warning">%s не установлен. Установите его.</string>
|
||||
<string name="revanced_external_downloader_other_item">Другой</string>
|
||||
<string name="revanced_external_downloader_other_item_hint">Введите имя пакета</string>
|
||||
<string name="revanced_external_downloader_package_name_playlist_summary">Например: NewPipe или YTDLnis, или др. (Для плейлиста).</string>
|
||||
<string name="revanced_external_downloader_package_name_playlist_summary">Название пакета установленного внешнего приложения для загрузки.</string>
|
||||
<string name="revanced_external_downloader_package_name_playlist_title">Внешний загрузчик для плейлиста, название пакета</string>
|
||||
<string name="revanced_external_downloader_package_name_video_long_press_summary">Имя пакета внешнего загрузчика видео, например NewPipe или YTDLnis, при долгом нажатии.</string>
|
||||
<string name="revanced_external_downloader_package_name_video_long_press_title">Приложение-загрузчик видео при долгом нажатии</string>
|
||||
<string name="revanced_external_downloader_package_name_video_summary">Например: NewPipe или YTDLnis, или др.</string>
|
||||
<string name="revanced_external_downloader_package_name_video_summary">Название пакета установленного внешнего приложения для загрузки.</string>
|
||||
<string name="revanced_external_downloader_package_name_video_title">Внешний загрузчик для видео, название пакета</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"Не удалось найти приложение с именем пакета: %s.
|
||||
|
||||
|
|
@ -795,8 +795,7 @@ Shorts
|
|||
• Некоторые компоненты интерфейса могут быть не скрыты.
|
||||
• Поиск по ключевому слову может не дать результатов."</string>
|
||||
<string name="revanced_hide_keyword_content_about_title">О фильтрах</string>
|
||||
<string name="revanced_hide_keyword_content_about_whole_words_summary">Ключевые слова/фразы с двойными кавычками, принудительно, используют набор символов между кавычками <br><br>, как слово.
|
||||
Например:<br><b>\"ai\"</b> скроет видео: <b>How does AI work?</b><br>но не будет скрывать: <b>What does fair use mean?</b></string>
|
||||
<string name="revanced_hide_keyword_content_about_whole_words_summary">Если заключить ключевое слово / фразу в двойные кавычки, это предотвратит частичное совпадение названий видео и имен каналов.<br><br>Например,<br><b>\"ai\"</b> скроет видео: <b>Как работает ИИ?</b><br>но не скроет: <b>Что означает добросовестное использование?</b></string>
|
||||
<string name="revanced_hide_keyword_content_about_whole_words_title">Ключевые слова обрабатываются целиком</string>
|
||||
<string name="revanced_hide_keyword_content_comments_summary_off">Фильтр комментариев отключен.</string>
|
||||
<string name="revanced_hide_keyword_content_comments_summary_on">Фильтр комментариев включен.</string>
|
||||
|
|
@ -1051,7 +1050,7 @@ Shorts
|
|||
<string name="revanced_hide_section_header_in_feed_title">Скрыть заголовок раздела "Подписки"</string>
|
||||
<string name="revanced_hide_seek_message_summary_off">"Сообщение при перемотке отображено."</string>
|
||||
<string name="revanced_hide_seek_message_summary_on">"Сообщение при перемотке скрыто."</string>
|
||||
<string name="revanced_hide_seek_message_title">Сообщение при перемотке</string>
|
||||
<string name="revanced_hide_seek_message_title">Скрыть сообщение (устарело)</string>
|
||||
<string name="revanced_hide_seek_undo_message_summary_off">Сообщение при отмотке назад отображено.</string>
|
||||
<string name="revanced_hide_seek_undo_message_summary_on">Сообщение при отмотке назад скрыто.</string>
|
||||
<string name="revanced_hide_seek_undo_message_title">Сообщение при отмотке назад</string>
|
||||
|
|
@ -2346,16 +2345,13 @@ Shorts
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Мобильный Интернет
|
||||
<small>(WIP, без авторизации)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">ТВ
|
||||
<small>(В разработке)</small>
|
||||
</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Простой ТВ
|
||||
<small>(В разработке)</small>
|
||||
</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Не релизный, Не авторизован)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Клиент по умолчанию</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">Не получены клиентские потоки.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Попробуйте изменить клиент по умолчанию на TV или TV Simply.</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">Возможно, Вы не вошли в систему.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_off">Принудительно AVC (H.264) отключено.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_on">Принудительно AVC (H.264) включен.</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_title">Принудительно iOS, AVC (H.264)</string>
|
||||
|
|
@ -2406,10 +2402,11 @@ VP9 более продвинутый кодек, чем AVC, но некото
|
|||
• Функция принудительного отключения автоматического выбора аудиодорожек недоступна.
|
||||
• Стабильная громкость недоступна.
|
||||
• Детские видеоролики могут не воспроизводиться при выходе из системы или в режиме инкогнито."</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_android_creator">"• Аудио меню пропадет.
|
||||
• Стабильная громкость не доступна.
|
||||
• Детские видео могут не проигрываться без логина или в режиме инкогнито.
|
||||
• 1080p+, AV1, HDR не поддерживаются."</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_android_creator">"• Отсутствует меню звуковых дорожек.
|
||||
• Функция отключения принудительного автоматического воспроизведения звуковых дорожек недоступна.
|
||||
• Стабильная громкость недоступна.
|
||||
• Детские видеоролики могут не воспроизводиться при выходе из системы или в режиме инкогнито.
|
||||
• Форматы 1080p+, AV1 и HDR не поддерживаются."</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_android_unplugged">• Отсутствует меню \"Аудио\".\n• Отсутствует меню \"Постоянный уровень громкости\".</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_android_vr">"• Аудио меню пропадет.
|
||||
• Стабильная громкость не доступна.
|
||||
|
|
@ -2489,6 +2486,13 @@ uBlock Origin обнаружил обход этой проблемы, вклю
|
|||
|
||||
• Очень зависит от сервера, а успех или сбой разобфускации зависит от используемого на сервере JavaScript."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_title">Использовать актуальный JavaScript</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_off">"JavaScript проигрывателя для деобфускации не поддерживается в актуальном состоянии.
|
||||
|
||||
• Используется JavaScript проигрывателя, который успешно проходит деобфускацию, используется, но он по-прежнему в некоторой степени зависит от сервера."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_on">"JavaScript проигрывателя для деобфускации поддерживается в актуальном состоянии.
|
||||
|
||||
• Он в значительной степени зависит от сервера, и успех или неудача деобфускации зависит от JavaScript проигрывателя, который в данный момент используется на сервере.
|
||||
• Если у вас возникли проблемы с JavaScript-клиентом, попробуйте сначала отключить его."</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_title">Использовать актуальный JavaScript проигрыватель</string>
|
||||
<string name="revanced_spoof_streaming_data_user_dialog_message">Отключение этой настройки вызовет проблемы с просмотром.</string>
|
||||
<string name="revanced_spoof_streaming_data_vr_disable_av1_summary_off">Видео кодек определяется автоматически.</string>
|
||||
|
|
|
|||
|
|
@ -2363,7 +2363,6 @@
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Web мобільний
|
||||
<small>(ще в розробці, Без авторизації)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">Простий TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Невипущений, Без авторизації)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Основний клієнт</string>
|
||||
|
|
|
|||
|
|
@ -2362,7 +2362,6 @@ Tính năng này vẫn đang trong quá trình phát triển, vì vậy nó có
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"Mobile Web
|
||||
<small>(Thử nghiệm, Không xác thực)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">TV</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">TV Simply</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(Chưa phát hành, Không xác thực)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">Client mặc định</string>
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@
|
|||
<string name="revanced_change_youtube_header_summary_off">默认标题已启用</string>
|
||||
<string name="revanced_change_youtube_header_summary_on">高级标题已启用</string>
|
||||
<string name="revanced_change_youtube_header_title">更改 YouTube 标题</string>
|
||||
<string name="revanced_confirm_user_dialog_title">您确定要继续吗?</string>
|
||||
<string name="revanced_copy">复制</string>
|
||||
<string name="revanced_copy_error">复制文本失败</string>
|
||||
<string name="revanced_custom_filter_strings_summary">按行分隔的名称筛选组件</string>
|
||||
|
|
@ -331,6 +332,7 @@
|
|||
• 视频播放将使用比 VP9 更多的网络数据
|
||||
要获取 HDR 播放,HDR 视频仍使用VP9 编解码器"</string>
|
||||
<string name="revanced_disable_vp9_codec_title">禁用 VP9 编解码器</string>
|
||||
<string name="revanced_dismiss_player_not_available_toast">视频 ID 不可用。请手动重新打开视频。</string>
|
||||
<string name="revanced_enable_cairo_seekbar_summary_off">Cairo 搜索栏已禁用</string>
|
||||
<string name="revanced_enable_cairo_seekbar_summary_on">"Cairo 搜索栏已启用
|
||||
|
||||
|
|
@ -427,7 +429,7 @@
|
|||
<string name="revanced_extended_settings_title">RVX</string>
|
||||
<string name="revanced_external_downloader_dialog_title">外部下载器</string>
|
||||
<string name="revanced_external_downloader_empty_warning">包名不能为空</string>
|
||||
<string name="revanced_external_downloader_not_found_title">应用未安装</string>
|
||||
<string name="revanced_external_downloader_not_found_title">应用未安装。</string>
|
||||
<string name="revanced_external_downloader_not_installed">未安装</string>
|
||||
<string name="revanced_external_downloader_not_installed_dialog_message">"%1$s 未安装
|
||||
请从网站下载 %2$s"</string>
|
||||
|
|
@ -441,9 +443,9 @@
|
|||
<string name="revanced_external_downloader_package_name_video_long_press_title">长按视频下载器包名</string>
|
||||
<string name="revanced_external_downloader_package_name_video_summary">已安装的外部下载器应用的包名,例如 NewPipe 或 YTDLnis</string>
|
||||
<string name="revanced_external_downloader_package_name_video_title">视频下载器应用包名</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"找不到包名为 %s 的已安装应用
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"找不到已安装的应用,包名为:%s。
|
||||
|
||||
请验证包名是否正确且应用已安装"</string>
|
||||
请验证包名是否正确以及应用是否已安装。"</string>
|
||||
<string name="revanced_fullscreen_ads_closed_toast">全屏广告已关闭。</string>
|
||||
<string name="revanced_gemini_cancelled">已取消</string>
|
||||
<string name="revanced_gemini_copy_success">摘要已复制到剪贴板。</string>
|
||||
|
|
@ -1271,70 +1273,119 @@
|
|||
<string name="revanced_keep_landscape_mode_timeout_summary">强制横屏模式的毫秒数</string>
|
||||
<string name="revanced_keep_landscape_mode_timeout_title">保持横屏模式超时</string>
|
||||
<string name="revanced_keep_landscape_mode_title">保持横屏模式</string>
|
||||
<string name="revanced_language_AM">阿姆哈拉语
|
||||
<small>አማርኛ</small>
|
||||
</string>
|
||||
<string name="revanced_language_AR">阿拉伯语</string>
|
||||
<string name="revanced_language_AZ">阿塞拜疆语</string>
|
||||
<string name="revanced_language_BE">白俄罗斯语
|
||||
<small>беларуская</small>
|
||||
</string>
|
||||
<string name="revanced_language_BG">保加利亚语</string>
|
||||
<string name="revanced_language_BN">孟加拉语</string>
|
||||
<string name="revanced_language_CA">加泰罗尼亚语</string>
|
||||
<string name="revanced_language_CS">捷克语</string>
|
||||
<string name="revanced_language_DA">丹麦语</string>
|
||||
<string name="revanced_language_DE">德语</string>
|
||||
<string name="revanced_language_AM">"阿姆哈拉语
|
||||
<small>አማርኛ</small>"</string>
|
||||
<string name="revanced_language_AR">"阿拉伯语
|
||||
<small>العربية</small>"</string>
|
||||
<string name="revanced_language_AZ">"阿塞拜疆语
|
||||
<small>Azərbaycan</small>"</string>
|
||||
<string name="revanced_language_BE">"白俄罗斯语
|
||||
<small>беларуская</small>"</string>
|
||||
<string name="revanced_language_BG">"保加利亚语
|
||||
<small>Български</small>"</string>
|
||||
<string name="revanced_language_BN">"孟加拉语
|
||||
<small>বাংলা</small>"</string>
|
||||
<string name="revanced_language_CA">"加泰罗尼亚语
|
||||
<small>Català</small>"</string>
|
||||
<string name="revanced_language_CS">"捷克语
|
||||
<small>Čeština</small>"</string>
|
||||
<string name="revanced_language_DA">"丹麦语
|
||||
<small>Dansk</small>"</string>
|
||||
<string name="revanced_language_DE">"德语
|
||||
<small>Deutsch</small>"</string>
|
||||
<string name="revanced_language_DEFAULT">应用程序语言</string>
|
||||
<string name="revanced_language_EL">希腊语</string>
|
||||
<string name="revanced_language_EN">英语</string>
|
||||
<string name="revanced_language_ES">西班牙语</string>
|
||||
<string name="revanced_language_ET">爱沙尼亚语</string>
|
||||
<string name="revanced_language_FA">波斯语</string>
|
||||
<string name="revanced_language_FI">芬兰语</string>
|
||||
<string name="revanced_language_FR">法语</string>
|
||||
<string name="revanced_language_GU">古吉拉特语</string>
|
||||
<string name="revanced_language_HE">希伯来语
|
||||
<small>עברי</small>
|
||||
</string>
|
||||
<string name="revanced_language_HI">印地语</string>
|
||||
<string name="revanced_language_HR">克罗地亚语</string>
|
||||
<string name="revanced_language_HU">匈牙利语</string>
|
||||
<string name="revanced_language_ID">印度尼西亚语</string>
|
||||
<string name="revanced_language_IT">意大利语</string>
|
||||
<string name="revanced_language_JA">日语</string>
|
||||
<string name="revanced_language_KK">哈萨克语</string>
|
||||
<string name="revanced_language_KO">韩语</string>
|
||||
<string name="revanced_language_LT">立陶宛语</string>
|
||||
<string name="revanced_language_LV">拉脱维亚语</string>
|
||||
<string name="revanced_language_MK">马其顿语</string>
|
||||
<string name="revanced_language_MN">蒙古语</string>
|
||||
<string name="revanced_language_MR">马拉提语</string>
|
||||
<string name="revanced_language_MS">马来西亚语</string>
|
||||
<string name="revanced_language_MY">缅甸语</string>
|
||||
<string name="revanced_language_NL">荷兰语</string>
|
||||
<string name="revanced_language_OR">奥迪亚语</string>
|
||||
<string name="revanced_language_PA">旁遮普语</string>
|
||||
<string name="revanced_language_PL">波兰语</string>
|
||||
<string name="revanced_language_PT">葡萄牙语</string>
|
||||
<string name="revanced_language_RO">罗马尼亚语</string>
|
||||
<string name="revanced_language_RU">俄语</string>
|
||||
<string name="revanced_language_SK">斯洛伐克文</string>
|
||||
<string name="revanced_language_SL">斯洛文尼亚语</string>
|
||||
<string name="revanced_language_SQ">阿尔巴尼亚语
|
||||
<small>Shqip</small>
|
||||
</string>
|
||||
<string name="revanced_language_SR">塞尔维亚语</string>
|
||||
<string name="revanced_language_SV">瑞典语</string>
|
||||
<string name="revanced_language_SW">斯瓦希里语</string>
|
||||
<string name="revanced_language_TA">泰米尔语</string>
|
||||
<string name="revanced_language_TE">泰卢固语</string>
|
||||
<string name="revanced_language_TH">泰语</string>
|
||||
<string name="revanced_language_TR">土耳其语</string>
|
||||
<string name="revanced_language_UK">乌克兰语</string>
|
||||
<string name="revanced_language_UR">乌尔都语</string>
|
||||
<string name="revanced_language_VI">越南语</string>
|
||||
<string name="revanced_language_ZH">中文</string>
|
||||
<string name="revanced_language_EL">"希腊语
|
||||
<small>Ελληνικά</small>"</string>
|
||||
<string name="revanced_language_EN">"英语
|
||||
<small>English</small>"</string>
|
||||
<string name="revanced_language_ES">"西班牙语
|
||||
<small>Español</small>"</string>
|
||||
<string name="revanced_language_ET">"爱沙尼亚语
|
||||
<small>Eesti</small>"</string>
|
||||
<string name="revanced_language_FA">"波斯语
|
||||
<small>فارسی</small>"</string>
|
||||
<string name="revanced_language_FI">"芬兰语
|
||||
<small>Suomi</small>"</string>
|
||||
<string name="revanced_language_FR">"法语
|
||||
<small>Français</small>"</string>
|
||||
<string name="revanced_language_GA">"爱尔兰语
|
||||
<small>Gaeilge</small>"</string>
|
||||
<string name="revanced_language_GU">"古吉拉特语
|
||||
<small>ગુજરાતી</small>"</string>
|
||||
<string name="revanced_language_HE">"希伯来语
|
||||
<small>עברי</small>"</string>
|
||||
<string name="revanced_language_HI">"印地语
|
||||
<small>हिन्दी</small>"</string>
|
||||
<string name="revanced_language_HR">"克罗地亚语
|
||||
<small>Hrvatski</small>"</string>
|
||||
<string name="revanced_language_HU">"匈牙利语
|
||||
<small>Magyar</small>"</string>
|
||||
<string name="revanced_language_ID">"印度尼西亚语
|
||||
<small>Indonesia</small>"</string>
|
||||
<string name="revanced_language_IT">"意大利语
|
||||
<small>Italiano</small>"</string>
|
||||
<string name="revanced_language_JA">"日语
|
||||
<small>日本語</small>"</string>
|
||||
<string name="revanced_language_KK">"哈萨克语
|
||||
<small>Қазақ тілі</small>"</string>
|
||||
<string name="revanced_language_KO">"韩语
|
||||
<small>한국어</small>"</string>
|
||||
<string name="revanced_language_LT">"立陶宛语
|
||||
<small>Lietuvių</small>"</string>
|
||||
<string name="revanced_language_LV">"拉脱维亚语
|
||||
<small>Latviešu</small>"</string>
|
||||
<string name="revanced_language_MK">"马其顿语
|
||||
<small>Македонски</small>"</string>
|
||||
<string name="revanced_language_MN">"蒙古语
|
||||
<small>Монгол</small>"</string>
|
||||
<string name="revanced_language_MR">"马拉地语
|
||||
<small>मराठी</small>"</string>
|
||||
<string name="revanced_language_MS">"马来语
|
||||
<small>Melayu</small>"</string>
|
||||
<string name="revanced_language_MY">"缅甸语
|
||||
<small>ဗမာ</small>"</string>
|
||||
<string name="revanced_language_NL">"荷兰语
|
||||
<small>Nederlands</small>"</string>
|
||||
<string name="revanced_language_OR">"奥里亚语
|
||||
<small>ଓଡ଼ିଆ</small>"</string>
|
||||
<string name="revanced_language_PA">"旁遮普语
|
||||
<small>ਪੰਜਾਬੀ</small>"</string>
|
||||
<string name="revanced_language_PL">"波兰语
|
||||
<small>Polski</small>"</string>
|
||||
<string name="revanced_language_PT">"葡萄牙语
|
||||
<small>Português</small>"</string>
|
||||
<string name="revanced_language_RO">"罗马尼亚语
|
||||
<small>Română</small>"</string>
|
||||
<string name="revanced_language_RU">"俄语
|
||||
<small>Русский</small>"</string>
|
||||
<string name="revanced_language_SK">"斯洛伐克语
|
||||
<small>Slovenčina</small>"</string>
|
||||
<string name="revanced_language_SL">"斯洛文尼亚语
|
||||
<small>Slovenščina</small>"</string>
|
||||
<string name="revanced_language_SQ">"阿尔巴尼亚语
|
||||
<small>Shqip</small>"</string>
|
||||
<string name="revanced_language_SR">"塞尔维亚语
|
||||
<small>Српски</small>"</string>
|
||||
<string name="revanced_language_SV">"瑞典语
|
||||
<small>Svenska</small>"</string>
|
||||
<string name="revanced_language_SW">"斯瓦希里语
|
||||
<small>Kiswahili</small>"</string>
|
||||
<string name="revanced_language_TA">"泰米尔语
|
||||
<small>தமிழ்</small>"</string>
|
||||
<string name="revanced_language_TE">"泰卢固语
|
||||
<small>తెలుగు</small>"</string>
|
||||
<string name="revanced_language_TH">"泰语
|
||||
<small>ไทย</small>"</string>
|
||||
<string name="revanced_language_TR">"土耳其语
|
||||
<small>Türkçe</small>"</string>
|
||||
<string name="revanced_language_UK">"乌克兰语
|
||||
<small>Українська</small>"</string>
|
||||
<string name="revanced_language_UR">"乌尔都语
|
||||
<small>اردو</small>"</string>
|
||||
<string name="revanced_language_VI">"越南语
|
||||
<small>Tiếng Việt</small>"</string>
|
||||
<string name="revanced_language_ZH">"中文
|
||||
<small>中文</small>"</string>
|
||||
<string name="revanced_language_title">RVX 语言</string>
|
||||
<string name="revanced_minimize">最小化</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_off">已禁用双击操作和捏合缩放</string>
|
||||
|
|
@ -1569,6 +1620,7 @@ AI生成的回复可能包含不准确的信息。
|
|||
<string name="revanced_queue_manager_fetch_failed_delete">删除队列失败</string>
|
||||
<string name="revanced_queue_manager_fetch_failed_remove">移除视频失败</string>
|
||||
<string name="revanced_queue_manager_fetch_failed_save">保存队列失败</string>
|
||||
<string name="revanced_queue_manager_fetch_failed_video_information">获取视频信息失败。</string>
|
||||
<string name="revanced_queue_manager_fetch_succeeded_add">视频添加成功</string>
|
||||
<string name="revanced_queue_manager_fetch_succeeded_create">队列创建成功</string>
|
||||
<string name="revanced_queue_manager_fetch_succeeded_delete">队列删除成功</string>
|
||||
|
|
@ -1581,6 +1633,7 @@ AI生成的回复可能包含不准确的信息。
|
|||
<string name="revanced_queue_manager_remove_from_queue_and_reload_video">从队列中移除并重新加载视频</string>
|
||||
<string name="revanced_queue_manager_remove_queue">移除队列</string>
|
||||
<string name="revanced_queue_manager_save_queue">保存队列</string>
|
||||
<string name="revanced_queue_manager_show_original_video_information">显示原始视频信息</string>
|
||||
<string name="revanced_queue_manager_user_dialog_message">"不是打开外部下载器,而是打开队列管理器对话框
|
||||
|
||||
你也可以通过按住导航栏上的返回按钮来打开队列管理器
|
||||
|
|
@ -1588,6 +1641,26 @@ AI生成的回复可能包含不准确的信息。
|
|||
此功能仍在开发中,因此大多数功能可能无法正常工作
|
||||
|
||||
请仅将其用于调试目的"</string>
|
||||
<string name="revanced_queue_manager_video_information">视频信息</string>
|
||||
<string name="revanced_queue_manager_video_information_copy">复制</string>
|
||||
<string name="revanced_queue_manager_video_information_no_description_user_dialog_message">"频道
|
||||
══════════════
|
||||
%1$s
|
||||
|
||||
标题
|
||||
══════════════
|
||||
%2$s"</string>
|
||||
<string name="revanced_queue_manager_video_information_user_dialog_message">"频道
|
||||
══════════════
|
||||
%1$s
|
||||
|
||||
标题
|
||||
══════════════
|
||||
%2$s
|
||||
|
||||
说明
|
||||
══════════════
|
||||
%3$s"</string>
|
||||
<string name="revanced_quick_actions_top_margin_invalid_toast">快速操作顶部边距必须在 0-32 之间 重置为默认值</string>
|
||||
<string name="revanced_quick_actions_top_margin_summary">配置从进度条到快速操作容器的间距,范围在0-32之间</string>
|
||||
<string name="revanced_quick_actions_top_margin_title">快速操作顶部边距</string>
|
||||
|
|
@ -1642,6 +1715,11 @@ AI生成的回复可能包含不准确的信息。
|
|||
<string name="revanced_replace_toolbar_create_button_type_summary_off">"点击打开 YouTube 设置长按打开 RVX 设置"</string>
|
||||
<string name="revanced_replace_toolbar_create_button_type_summary_on">"点击打开 RVX 设置长按打开 YouTube 设置"</string>
|
||||
<string name="revanced_replace_toolbar_create_button_type_title">分配给按钮的操作类型</string>
|
||||
<string name="revanced_reset_to_default_toast">重置为默认值。</string>
|
||||
<string name="revanced_restart">重启</string>
|
||||
<string name="revanced_restart_dialog_message">重启应用以使更改生效。</string>
|
||||
<string name="revanced_restart_first_run">重启即可正常加载布局</string>
|
||||
<string name="revanced_restart_title">需要重启</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">在全屏模式下显示进度条缩略图</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">将进度条缩略图显示在进度条上方</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_title">恢复旧的进度条缩略图</string>
|
||||
|
|
@ -1916,35 +1994,39 @@ AI生成的回复可能包含不准确的信息。
|
|||
<string name="revanced_search_settings_no_results_summary">尝试不同的搜索词。</string>
|
||||
<string name="revanced_search_settings_no_results_title">未找到"%1$s"的结果</string>
|
||||
<string name="revanced_search_title">搜索</string>
|
||||
<string name="revanced_settings_color_invalid">无效的颜色</string>
|
||||
<string name="revanced_settings_color_invalid">无效的颜色。</string>
|
||||
<string name="revanced_settings_color_picker">拾色器</string>
|
||||
<string name="revanced_settings_import">导入</string>
|
||||
<string name="revanced_settings_import_copy">复制</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced 设置重置为默认</string>
|
||||
<string name="revanced_settings_import_success">导入 %d 个设置</string>
|
||||
<string name="revanced_settings_reset">重置</string>
|
||||
<string name="revanced_settings_reset_color">重置颜色</string>
|
||||
<string name="revanced_settings_search_clear_history">清除搜索历史</string>
|
||||
<string name="revanced_settings_search_clear_history_message">您确定要清除所有搜索历史吗?</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">要保存搜索历史,请键入搜索查询并按回车键</string>
|
||||
<string name="revanced_settings_search_empty_history_title">搜索历史为空</string>
|
||||
<string name="revanced_settings_search_clear_history">清空搜索历史记录</string>
|
||||
<string name="revanced_settings_search_clear_history_message">您确定要清除所有搜索历史记录吗?</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">要保存搜索历史记录,请键入搜索查询并按 Enter 键。</string>
|
||||
<string name="revanced_settings_search_empty_history_title">搜索历史记录为空</string>
|
||||
<string name="revanced_settings_search_history_summary">保存最近的搜索查询,在搜索栏为空时显示它们。</string>
|
||||
<string name="revanced_settings_search_history_summary_off">不显示设置搜索历史记录</string>
|
||||
<string name="revanced_settings_search_history_summary_on">设置搜索历史记录已显示</string>
|
||||
<string name="revanced_settings_search_history_summary_off">不显示设置搜索历史记录。</string>
|
||||
<string name="revanced_settings_search_history_summary_on">已显示设置搜索历史记录。</string>
|
||||
<string name="revanced_settings_search_history_title">显示设置搜索历史记录</string>
|
||||
<string name="revanced_settings_search_no_results_summary">尝试其他关键字</string>
|
||||
<string name="revanced_settings_search_no_results_title">未找到“%s”的结果</string>
|
||||
<string name="revanced_settings_search_recent_searches">最近搜索</string>
|
||||
<string name="revanced_settings_search_no_results_summary">请尝试其他关键字。</string>
|
||||
<string name="revanced_settings_search_no_results_title">未找到“%s”的结果。</string>
|
||||
<string name="revanced_settings_search_recent_searches">近期搜索</string>
|
||||
<string name="revanced_settings_search_remove_message">从搜索历史记录中删除?</string>
|
||||
<string name="revanced_settings_search_tips_summary">"• 点击路径以导航到该位置
|
||||
• 长按设置以导航到该位置
|
||||
• 按回车键将搜索查询保存到历史记录
|
||||
• 搜索忽略大小写和标点符号
|
||||
• 父设置显示在禁用的子设置上方"</string>
|
||||
<string name="revanced_settings_search_tips_title">搜索技巧</string>
|
||||
<string name="revanced_settings_search_tips_summary">"• 点击路径即可导航至该路径。
|
||||
• 长按某设置即可导航至该设置。
|
||||
• 按 Enter 键可将搜索查询保存到历史记录。
|
||||
• 搜索会忽略大小写和标点符号。
|
||||
• 父级设置显示在已禁用的子级设置上方。"</string>
|
||||
<string name="revanced_settings_search_tips_title">搜索提示</string>
|
||||
<string name="revanced_settings_search_title">搜索 %s</string>
|
||||
<string name="revanced_settings_title">RVX</string>
|
||||
<string name="revanced_share_copy_settings_success">设置已复制到剪贴板</string>
|
||||
<string name="revanced_share_copy_timestamp_success">时间戳已复制到剪贴板 (%s)</string>
|
||||
<string name="revanced_share_copy_url_success">URL 已复制到剪贴板</string>
|
||||
<string name="revanced_share_copy_url_timestamp_success">带有时间戳的 URL 已复制到剪贴板</string>
|
||||
<string name="revanced_share_copy_video_information_success">视频信息已复制到剪贴板。</string>
|
||||
<string name="revanced_shorts_custom_actions_about_about_summary">"此功能仍处于实验阶段,因此无法保证其完美运行。
|
||||
|
||||
由于客户端限制,大部分 bug 无法修复,因此仅限用于测试。"</string>
|
||||
|
|
@ -2170,6 +2252,23 @@ AVC 最大分辨率为 1080p,Opus 音频编解码器不可用,并且视频
|
|||
<string name="revanced_watch_history_type_entry_2">替换域名</string>
|
||||
<string name="revanced_watch_history_type_entry_3">屏蔽历史记录</string>
|
||||
<string name="revanced_watch_history_type_title">历史记录类型</string>
|
||||
<string name="revanced_webview_contextual_menu_get_cookies">获取 Cookie</string>
|
||||
<string name="revanced_webview_contextual_menu_get_data_sync_id">获取数据同步 ID</string>
|
||||
<string name="revanced_webview_contextual_menu_get_visitor_data">获取访客数据</string>
|
||||
<string name="revanced_webview_contextual_menu_refresh">刷新</string>
|
||||
<string name="revanced_webview_cookies">Cookie</string>
|
||||
<string name="revanced_webview_copy">复制</string>
|
||||
<string name="revanced_webview_data_sync_id">数据同步 ID</string>
|
||||
<string name="revanced_webview_intent_clear_cookies_on_shutdown">关机时清除 Cookie</string>
|
||||
<string name="revanced_webview_intent_clear_cookies_on_startup">启动时清除 Cookie</string>
|
||||
<string name="revanced_webview_intent_use_desktop_user_agent">使用桌面用户代理</string>
|
||||
<string name="revanced_webview_summary">打开 WebView 来获取 Cookie。</string>
|
||||
<string name="revanced_webview_title">WebView</string>
|
||||
<string name="revanced_webview_toast_copy_success">%s 已复制到剪贴板。</string>
|
||||
<string name="revanced_webview_toast_empty">%s 为空。</string>
|
||||
<string name="revanced_webview_toast_no_network">请检查您的网络连接。</string>
|
||||
<string name="revanced_webview_toast_unavailable">WebView 不可用。</string>
|
||||
<string name="revanced_webview_visitor_data">访客数据</string>
|
||||
<string name="revanced_whitelist_add_failed">无法将频道 \'%1$s\' 添加到 %2$s 白名单</string>
|
||||
<string name="revanced_whitelist_added">频道 \'%1$s\'已添加到 %2$s 白名单</string>
|
||||
<string name="revanced_whitelist_empty">白名单中没有频道</string>
|
||||
|
|
|
|||
|
|
@ -230,14 +230,14 @@
|
|||
<string name="revanced_disable_ambient_mode_summary_off">已啟用微光效果。</string>
|
||||
<string name="revanced_disable_ambient_mode_summary_on">微光模式已停用。</string>
|
||||
<string name="revanced_disable_ambient_mode_title">停用微光模式</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_not_available">若要使用此功能,請更改 \' 預設用戶端(偽裝串流資料)\' 到電視, TV Simply 或 iOS TV。</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_not_available">"若要使用此功能,請更改 '預設用戶端 (偽裝串流資料)' 到電視, TV Simply 或 iOS TV。"</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_summary_off">強制自動音軌已啟用。</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_summary_on">強制自動音軌已停用。</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_summary_on_disclaimer">"強制自動音軌功能已停用。
|
||||
|
||||
此操作可能對某些使用者無效,如果您無法操作,請執行下列操作:
|
||||
1. 前往設定 - RVX- 雜項 - 偽裝串流數據,然後啟用 '使用 JavaScript 用戶端'。
|
||||
2. 前往設定 - RVX - 雜項 - 偽裝串流數據,然後將 '預設客戶端' 變更為 'TV' 或 'TV Simply'。"</string>
|
||||
此功能可能對某些使用者無效,如果您無法使用此功能:
|
||||
1. 前往設定 - RVX - 雜項 - 偽裝串流資料,然後開啟 '使用 JavaScript 用戶端'。
|
||||
2. 前往設定 - RVX - 雜項 - 偽裝串流資料,並將 '預設客戶端' 變更為 'TV' 或 'TV Simply'。"</string>
|
||||
<string name="revanced_disable_auto_audio_tracks_title">停用強制自動音軌</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">強制顯示字幕已啟用。</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">強制顯示字幕已停用。</string>
|
||||
|
|
@ -438,8 +438,9 @@
|
|||
<string name="revanced_enable_watch_next_processing_delay_summary_off">觀看下一部影片處理延遲已禁用。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_summary_on">觀看下一部影片處理延遲已啟用。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_title">啟用觀察下一部影片處理延遲</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_user_dialog_message">此設定會在播放器介面載入前強制加入延遲。
|
||||
可用於測試主執行緒上的行為。</string>
|
||||
<string name="revanced_enable_watch_next_processing_delay_user_dialog_message">"此設定會強制延遲播放器 UI 的載入。
|
||||
|
||||
此功能可用於在主執行緒上測試某些內容。"</string>
|
||||
<string name="revanced_enable_wide_search_bar_in_you_tab_summary">啟用這項設定後,將停用「你的內容」分頁中的設定按鈕
|
||||
|
||||
在這種情況下,請依序輕觸以下路徑來存取設定:
|
||||
|
|
@ -490,7 +491,7 @@
|
|||
<string name="revanced_extended_settings_title">RVX</string>
|
||||
<string name="revanced_external_downloader_dialog_title">外部下載器</string>
|
||||
<string name="revanced_external_downloader_empty_warning">套件名稱不能為空</string>
|
||||
<string name="revanced_external_downloader_not_found_title">應用程式未安裝</string>
|
||||
<string name="revanced_external_downloader_not_found_title">應用程式未安裝。</string>
|
||||
<string name="revanced_external_downloader_not_installed">未安裝</string>
|
||||
<string name="revanced_external_downloader_not_installed_dialog_message">%1$s 未安裝。
|
||||
請從網站下載 %2$s。</string>
|
||||
|
|
@ -504,9 +505,9 @@
|
|||
<string name="revanced_external_downloader_package_name_video_long_press_title">長按時影片下載器套件名稱</string>
|
||||
<string name="revanced_external_downloader_package_name_video_summary">您安裝的外部下載器應用程式的套件名稱。</string>
|
||||
<string name="revanced_external_downloader_package_name_video_title">影片下載套件名稱</string>
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"無法找到已安裝的應用程式,套件名稱為:%s
|
||||
<string name="revanced_external_downloader_package_not_found_warning">"找不到已安裝的應用程式,套件名稱為:%s。
|
||||
|
||||
請驗證套件名稱是否正確以及應用程式是否已安裝"</string>
|
||||
請驗證套件名稱正確,且該應用程式已安裝。"</string>
|
||||
<string name="revanced_fix_hype_button_icon_summary_off">熱門按鈕圖示已隱藏。</string>
|
||||
<string name="revanced_fix_hype_button_icon_summary_on">熱門按鈕圖示已顯示。</string>
|
||||
<string name="revanced_fix_hype_button_icon_title">修復熱門按鈕圖標</string>
|
||||
|
|
@ -564,8 +565,8 @@
|
|||
<string name="revanced_gradient_seekbar_positions_title">進度條漸變邊界值</string>
|
||||
<string name="revanced_hide_account_menu_filter_strings_summary">要篩選的帳戶選單名稱清單,每行一個名稱。</string>
|
||||
<string name="revanced_hide_account_menu_filter_strings_title">編輯帳號選單篩選</string>
|
||||
<string name="revanced_hide_account_menu_filter_type_summary_off">如果匹配則進行過濾。<br><br>隱藏隊列中的 <b>\'獲取 YouTube Premium\'</b> 選單中,您可以使用 <b>\'獲取 YouTube Premium\'</b> 作為關鍵字。</string>
|
||||
<string name="revanced_hide_account_menu_filter_type_summary_on">如果包含則進行過濾。<br><br>隱藏隊列中的 <b>\'獲取 YouTube Premium\'</b> 選單中,您可以使用 <b>\'YouTube Premium\'</b> 或 <b>\'Premium\'</b> 作為關鍵字。</string>
|
||||
<string name="revanced_hide_account_menu_filter_type_summary_off">"如果匹配則進行過濾。<br><br>隱藏隊列中的 <b>'獲取 YouTube Premium'</b> 選單中,您可以使用 <b>'獲取 YouTube Premium'</b> 作為關鍵字。"</string>
|
||||
<string name="revanced_hide_account_menu_filter_type_summary_on">"如果包含則進行過濾。<br><br>隱藏隊列中的 <b>'獲取 YouTube Premium'</b> 選單中,您可以使用 <b>'YouTube Premium'</b> 或 <b>'Premium'</b> 作為關鍵字。"</string>
|
||||
<string name="revanced_hide_account_menu_filter_type_title">帳戶選單過濾類型</string>
|
||||
<string name="revanced_hide_account_menu_summary">隱藏帳戶選單和你的內容分頁的元素。
|
||||
部分元件可能不會隱藏。</string>
|
||||
|
|
@ -746,8 +747,8 @@
|
|||
<string name="revanced_hide_feed_captions_button_title">隱藏動態字幕按鈕</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_strings_summary">要過濾的動態彈出選單名稱清單,每行一個名稱。</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_strings_title">編輯資訊彈出式選單篩選</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_off">如果符合則進行過濾。<br><br>隱藏隊列中的 <b>\'播放隊列中的下一個\'</b> 選單中,您只能使用 <b>\'播放隊列中下一個\'</b> 作為關鍵字。</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_on">如果包含則進行過濾。<br><br>隱藏隊列中的 <b>\'播放隊列中的下一個\'</b> 選單中,您可以使用 <b>\'播放下一個\'</b> 或<b>\'在隊列\'</b> 作為關鍵字。</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_off">"如果符合則進行過濾。<br><br>隱藏隊列中的 <b>'播放隊列中的下一個'</b> 選單中,您只能使用 <b>'播放隊列中下一個'</b> 作為關鍵字。"</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_on">"如果包含則進行過濾。<br><br>隱藏隊列中的 <b>'播放隊列中的下一個'</b> 選單中,您可以使用 <b>'播放下一個'</b> 或<b>'在隊列'</b> 作為關鍵字。"</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_filter_type_title">資訊彈出式選單過濾類型</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_summary_off">資訊彈出式選單已顯示。</string>
|
||||
<string name="revanced_hide_feed_flyout_menu_summary_on">資訊彈出式選單已隱藏。</string>
|
||||
|
|
@ -830,9 +831,9 @@
|
|||
<string name="revanced_hide_keyword_content_subscriptions_summary_off">訂閱影片的關鍵字篩選器已停用。</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_on">訂閱影片的關鍵字篩選器已啟用。</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_title">啟用訂閱影片關鍵字篩選器</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_off">\'AND\' 運算 (\'&\') 已被停用。<br><br>當 <strong>\"Blue\" & \"Red\"</strong> 用作關鍵字時,包含該關鍵字 <strong>\"Blue\" & \"Red\"</strong> 將被過濾。</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_on">\'AND\' 運算 (\'&\') 已被停用。<br><br>當 <strong>\"Blue\" & \"Red\"</strong> 被作為關鍵字使用,包含兩者的關鍵字 <strong>\"Blue\" & \"Red\"</strong> 將被過濾。</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_title">使用 \'AND\' 運算 (\'&\')</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_off">"'AND' 運算 ('&') 已被停用。<br><br>當 <strong>"Blue" & "Red"</strong> 用作關鍵字時,包含該關鍵字 <strong>"Blue" & "Red"</strong> 將被過濾。"</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_summary_on">"'AND' 運算 ('&') 已被啟用。<br><br>當 <strong>"Blue" & "Red"</strong> 用作關鍵字時,包含兩者的關鍵字 <strong>Blue</strong> 和 <strong>Red</strong> 將被過濾。"</string>
|
||||
<string name="revanced_hide_keyword_content_use_and_operator_title">"使用 'AND' 運算 ('&')"</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">關鍵字將隱藏所有影片:%s。</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_common">無效的關鍵字。不能使用:「%s」作為篩選器。</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_common_whole_word_required">添加引號以使用關鍵字:%s 。</string>
|
||||
|
|
@ -924,9 +925,9 @@
|
|||
<string name="revanced_hide_player_flyout_menu_ambient_mode_title">隱藏微光模式選單</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_not_available">"音軌選單已隱藏。
|
||||
|
||||
若要顯示音軌選單,請執行下列操作:
|
||||
1. 前往設定 - RVX - 雜項 - 偽裝串流資料,然後啟用 '使用 JavaScript 用戶端'。
|
||||
2. 前往設定 - RVX - 雜項 - 偽裝串流資料,然後將 '預設客戶端' 變更為 'TV' 或 'TV Simply'。"</string>
|
||||
若要顯示音軌選單:
|
||||
1. 前往設定 - RVX - 雜項 - 偽裝串流資料,然後開啟 '使用 JavaScript 用戶端'。
|
||||
2. 前往設定 - RVX - 雜項 - 偽裝串流資料,並將 '預設客戶端' 變更為 'TV' 或 'TV Simply'。"</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_off">音軌選單已顯示。</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_summary_on">音軌選單已隱藏。</string>
|
||||
<string name="revanced_hide_player_flyout_menu_audio_track_title">隱藏音軌選單</string>
|
||||
|
|
@ -1064,8 +1065,8 @@
|
|||
<string name="revanced_hide_search_term_thumbnail_summary_off">在歷史記錄中的搜尋字詞縮圖已顯示。</string>
|
||||
<string name="revanced_hide_search_term_thumbnail_summary_on">在歷史記錄中的搜尋字詞縮圖已隱藏。</string>
|
||||
<string name="revanced_hide_search_term_thumbnail_title">隱藏搜尋字詞縮圖</string>
|
||||
<string name="revanced_hide_section_header_in_feed_summary_off">訂閱部分標題已顯示。 \n\n點擊訂閱部分中已訂閱頻道的圖示後,訂閱部分標題包括\'造訪社群\'和\'造訪頻道\'按鈕。</string>
|
||||
<string name="revanced_hide_section_header_in_feed_summary_on">訂閱部分標題已隱藏。 \n\n點擊訂閱部分中已訂閱頻道的圖示後,訂閱部分標題包括\'造訪社群\'和\'造訪頻道\'按鈕。</string>
|
||||
<string name="revanced_hide_section_header_in_feed_summary_off">"訂閱部分標題已顯示。 \n\n點擊訂閱部分中已訂閱頻道的圖示後,訂閱部分標題包括'造訪社群'和'造訪頻道'按鈕。"</string>
|
||||
<string name="revanced_hide_section_header_in_feed_summary_on">"訂閱部分標題已隱藏。 \n\n點擊訂閱部分中已訂閱頻道的圖示後,訂閱部分標題包括'造訪社群'和'造訪頻道'按鈕。"</string>
|
||||
<string name="revanced_hide_section_header_in_feed_title">隱藏訂閱部分標題</string>
|
||||
<string name="revanced_hide_seek_message_summary_off">"進度條訊息已顯示"</string>
|
||||
<string name="revanced_hide_seek_message_summary_on">"進度條訊息已隱藏"</string>
|
||||
|
|
@ -1552,20 +1553,20 @@
|
|||
<string name="revanced_language_title">RVX 語言</string>
|
||||
<string name="revanced_minimize">最小化</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_off">已停用雙擊操作和縮放手勢來調整大小。</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_on">啟用雙擊操作和縮放手勢來調整大小。
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_on">"啟用雙擊操作和縮放手勢來調整大小。
|
||||
|
||||
• 雙擊可增加迷你播放器的大小。
|
||||
• 再次雙擊可恢復原始大小。</string>
|
||||
• 再次雙擊可恢復原始大小。"</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_title">啟用雙擊操作和縮放手勢來調整大小</string>
|
||||
<string name="revanced_miniplayer_drag_and_drop_summary_off">拖曳已停用。</string>
|
||||
<string name="revanced_miniplayer_drag_and_drop_summary_on">拖放已啟用。
|
||||
<string name="revanced_miniplayer_drag_and_drop_summary_on">"拖放已啟用。
|
||||
|
||||
迷你播放器可以拖曳到螢幕的任何角落。</string>
|
||||
迷你播放器可以拖曳到螢幕的任何角落。"</string>
|
||||
<string name="revanced_miniplayer_drag_and_drop_title">啟用拖曳</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">顯示擴展和關閉按鈕。</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">按鈕被隱藏。
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"按鈕被隱藏。
|
||||
|
||||
滑動即可展開或關閉。</string>
|
||||
滑動即可展開或關閉。"</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">隱藏展開和關閉按鈕</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">疊加按鈕已顯示。</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">疊加按鈕已隱藏。</string>
|
||||
|
|
@ -1577,9 +1578,9 @@
|
|||
<string name="revanced_miniplayer_hide_subtext_summary_on">對話已隱藏。</string>
|
||||
<string name="revanced_miniplayer_hide_subtext_title">隱藏對話</string>
|
||||
<string name="revanced_miniplayer_horizontal_drag_summary_off">水平拖曳手勢已停用。</string>
|
||||
<string name="revanced_miniplayer_horizontal_drag_summary_on">啟用水平拖曳手勢。
|
||||
<string name="revanced_miniplayer_horizontal_drag_summary_on">"啟用水平拖曳手勢。
|
||||
|
||||
迷你播放器可以向左或向右拖曳出螢幕。</string>
|
||||
迷你播放器可以向左或向右拖曳出螢幕。"</string>
|
||||
<string name="revanced_miniplayer_horizontal_drag_title">啟用水平拖曳手勢。</string>
|
||||
<string name="revanced_miniplayer_opacity_invalid_toast">小型播放器覆蓋層不透明度必須介於 0-100 之間。重設為預設值。</string>
|
||||
<string name="revanced_miniplayer_opacity_summary">不透明度值介於 0-100 之間,其中 0 表示透明。</string>
|
||||
|
|
@ -1619,28 +1620,28 @@
|
|||
<string name="revanced_overlay_button_external_downloader_queue_manager_title">佇列管理器</string>
|
||||
<string name="revanced_overlay_button_external_downloader_summary">點擊以開啟外部下載器。</string>
|
||||
<string name="revanced_overlay_button_external_downloader_title">外部下載按鈕</string>
|
||||
<string name="revanced_overlay_button_gemini_about_summary">解析影片所需時間取決於影片長度。轉錄長影片可能會超過 Gemini 的限制。
|
||||
<string name="revanced_overlay_button_gemini_about_summary">"解析影片所需時間取決於影片長度。轉錄長影片可能會超過 Gemini 的限制。
|
||||
|
||||
AI 生成的回應可能包含不準確的資訊。
|
||||
|
||||
點擊這裡取得 API 金鑰。</string>
|
||||
點擊這裡取得 API 金鑰。"</string>
|
||||
<string name="revanced_overlay_button_gemini_about_title">關於 Gemini</string>
|
||||
<string name="revanced_overlay_button_gemini_summarize">摘要</string>
|
||||
<string name="revanced_overlay_button_gemini_summarize_api_key_summary">在 https://aistudio.google.com/apikey 取得 API 金鑰</string>
|
||||
<string name="revanced_overlay_button_gemini_summarize_api_key_title">Gemini API 金鑰</string>
|
||||
<string name="revanced_overlay_button_gemini_summarize_summary">點擊可摘要影片。長按可轉錄。
|
||||
<string name="revanced_overlay_button_gemini_summarize_summary">"點擊可摘要影片。長按可轉錄。
|
||||
|
||||
摘要和轉錄結果會被保存,除非你關閉應用程式或在其他影片上使用 Gemini。再次點擊按鈕可查看結果。</string>
|
||||
摘要和轉錄結果會被保存,除非你關閉應用程式或在其他影片上使用 Gemini。再次點擊按鈕可查看結果。"</string>
|
||||
<string name="revanced_overlay_button_gemini_summarize_title">顯示 Gemini 按鈕</string>
|
||||
<string name="revanced_overlay_button_mute_volume_summary">點選可將目前影片靜音。 再次點擊即可取消靜音。</string>
|
||||
<string name="revanced_overlay_button_mute_volume_title">顯示靜音按鈕</string>
|
||||
<string name="revanced_overlay_button_not_allowed_warning">長按以更改按鈕狀態。</string>
|
||||
<string name="revanced_overlay_button_play_all_not_available_toast">由於頻道ID不匹配 因此無法產生播放清單。</string>
|
||||
<string name="revanced_overlay_button_play_all_summary">點選可產生頻道中所有影片的播放清單。
|
||||
<string name="revanced_overlay_button_play_all_summary">"點選可產生頻道中所有影片的播放清單。
|
||||
點選並按住可撤銷。
|
||||
|
||||
資訊:
|
||||
• 可能不適用於直播。</string>
|
||||
• 可能不適用於直播。"</string>
|
||||
<string name="revanced_overlay_button_play_all_title">顯示全部播放按鈕</string>
|
||||
<string name="revanced_overlay_button_play_all_type_entry_0">所有內容 (按時間排序,升序)</string>
|
||||
<string name="revanced_overlay_button_play_all_type_entry_1">所有內容 (按時間排序)</string>
|
||||
|
|
@ -1666,13 +1667,13 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_overlay_button_whitelist_title">顯示白名單按鈕</string>
|
||||
<string name="revanced_override_playlist_download_button_summary_off">原生播放清單下載按鈕可開啟本機應用程式內下載器。</string>
|
||||
<string name="revanced_override_playlist_download_button_summary_on">原生播放清單下載按鈕可開啟您的外部下載器。</string>
|
||||
<string name="revanced_override_playlist_download_button_summary_on_disclaimer">如果顯示原生播放清單下載按鈕,則會開啟您的外部下載器。
|
||||
<string name="revanced_override_playlist_download_button_summary_on_disclaimer">"如果顯示原生播放清單下載按鈕,則會開啟您的外部下載器。
|
||||
|
||||
若要顯示原生播放清單下載按鈕,請啟用\'偽裝應用程式版本\',並將\'偽裝應用程式目標版本\'變更為\'19.28.42\'或更早版本。</string>
|
||||
若要顯示原生播放清單下載按鈕,請啟用'偽裝應用程式版本',並將'偽裝應用程式目標版本'變更為'19.28.42'或更早版本。"</string>
|
||||
<string name="revanced_override_playlist_download_button_summary_on_disclaimer_1">如果顯示本機播放清單下載按鈕,則會開啟您的外部下載器。</string>
|
||||
<string name="revanced_override_playlist_download_button_summary_on_disclaimer_2">如果顯示原生播放清單下載按鈕,則會開啟您的外部下載器。
|
||||
<string name="revanced_override_playlist_download_button_summary_on_disclaimer_2">"如果顯示原生播放清單下載按鈕,則會開啟您的外部下載器。
|
||||
|
||||
若要顯示原生播放清單下載按鈕,請啟用\'偽裝應用程式版本\',並將\'偽裝應用程式目標版本\'變更為\'19.28.42\'或更早版本。</string>
|
||||
若要顯示原生播放清單下載按鈕,請啟用'偽裝應用程式版本',並將'偽裝應用程式目標版本'變更為'19.28.42'或更早版本。"</string>
|
||||
<string name="revanced_override_playlist_download_button_title">覆蓋播放清單下載按鈕</string>
|
||||
<string name="revanced_override_video_download_button_queue_manager_summary_off">原生影片下載按鈕開啟您的外部下載器。</string>
|
||||
<string name="revanced_override_video_download_button_queue_manager_summary_on">原生影片下載按鈕開啟佇列管理器。</string>
|
||||
|
|
@ -1816,13 +1817,13 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_queue_manager_remove_queue">移除佇列</string>
|
||||
<string name="revanced_queue_manager_save_queue">儲存佇列</string>
|
||||
<string name="revanced_queue_manager_show_original_video_information">顯示原始影片資訊</string>
|
||||
<string name="revanced_queue_manager_user_dialog_message">不要開啟外部下載器,而是開啟佇列管理器對話方塊。
|
||||
<string name="revanced_queue_manager_user_dialog_message">"不要開啟外部下載器,而是開啟佇列管理器對話方塊。
|
||||
|
||||
您也可以按住導覽列上的返回按鈕來開啟佇列管理器。
|
||||
|
||||
此功能仍在開發中,因此大部分功能可能無法使用。
|
||||
|
||||
請僅將其用於偵錯目的。</string>
|
||||
請僅將其用於偵錯目的。"</string>
|
||||
<string name="revanced_queue_manager_video_information">影片資訊</string>
|
||||
<string name="revanced_queue_manager_video_information_copy">複製</string>
|
||||
<string name="revanced_queue_manager_video_information_no_description_user_dialog_message">頻道
|
||||
|
|
@ -1854,11 +1855,11 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">變更預設播放速度時會顯示提示訊息。</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_title">顯示提示訊息</string>
|
||||
<string name="revanced_remember_playback_speed_shorts_last_selected_summary_off">播放速度變更僅適用於目前的短影音。</string>
|
||||
<string name="revanced_remember_playback_speed_shorts_last_selected_summary_on">播放速度變更適用於所有短影音。
|
||||
<string name="revanced_remember_playback_speed_shorts_last_selected_summary_on">"播放速度變更適用於所有短影音。
|
||||
|
||||
資訊:
|
||||
• 在短影音播放器中變更播放速度的唯一方法是使用「自訂動作」中的「速度對話框」。
|
||||
• 如果您未包含「短影音元件」補丁,則此功能將無法使用。</string>
|
||||
• 如果您未包含「短影音元件」補丁,則此功能將無法使用。"</string>
|
||||
<string name="revanced_remember_playback_speed_shorts_last_selected_title">記住短影音的播放速度變更</string>
|
||||
<string name="revanced_remember_playback_speed_shorts_last_selected_toast_summary_off">變更短影音上的預設播放速度時,不會顯示提示訊息。</string>
|
||||
<string name="revanced_remember_playback_speed_shorts_last_selected_toast_summary_on">變更短影音上的預設播放速度時,會顯示提示訊息。</string>
|
||||
|
|
@ -1883,8 +1884,8 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_remember_video_quality_toast_shorts">將短影音 %1$s 的畫質變更為: %2$s。</string>
|
||||
<string name="revanced_remember_video_quality_wifi">無線上網</string>
|
||||
<string name="revanced_remix_button_index_title">混音按鈕索引</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary">移除觀眾酌情觀看對話方塊。
|
||||
這項選項不會繞過年齡限制,它只會自動接受。</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary">"移除觀眾酌情觀看對話方塊。
|
||||
這項選項不會繞過年齡限制,它只會自動接受。"</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_title">移除查看器的自由裁量對話框</string>
|
||||
<string name="revanced_replace_channel_handle_summary_off">頻道代號已使用。</string>
|
||||
<string name="revanced_replace_channel_handle_summary_on">頻道名稱已使用。</string>
|
||||
|
|
@ -1901,8 +1902,8 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_replace_toolbar_create_button_type_title">分配給按鈕的操作類型</string>
|
||||
<string name="revanced_reset_to_default_toast">重設為預設值。</string>
|
||||
<string name="revanced_restart">重新啟動</string>
|
||||
<string name="revanced_restart_dialog_message">重新啟動應用程式以使此變更生效。</string>
|
||||
<string name="revanced_restart_first_run">重啟即可正常載入佈局</string>
|
||||
<string name="revanced_restart_dialog_message">重新啟動應用程式以此變更生效。</string>
|
||||
<string name="revanced_restart_first_run">重新啟動以正常載入介面佈局</string>
|
||||
<string name="revanced_restart_title">需要重新啟動</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">在全螢幕模式下顯示進度條縮略圖。</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">將進度條縮略圖顯示在進度條上方。</string>
|
||||
|
|
@ -1918,11 +1919,11 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_return_youtube_username_enabled_summary_off">使用者名稱已使用。</string>
|
||||
<string name="revanced_return_youtube_username_enabled_summary_on">使用者名稱已被使用。</string>
|
||||
<string name="revanced_return_youtube_username_enabled_title">啟用恢復 YouTube 使用者名稱</string>
|
||||
<string name="revanced_return_youtube_username_youtube_data_api_v3_about_summary">需要 YouTube 資料 API v3 開發人員金鑰才能將名字替換為使用者名稱。
|
||||
<string name="revanced_return_youtube_username_youtube_data_api_v3_about_summary">"需要 YouTube 資料 API v3 開發人員金鑰才能將名字替換為使用者名稱。
|
||||
|
||||
免費方案的 API 金鑰每日配額為 10,000 個, 1個配額用於將名字替換為使用者名稱 以獲得1條留言。
|
||||
|
||||
按一下查看如何取得 API 金鑰。</string>
|
||||
按一下查看如何取得 API 金鑰。"</string>
|
||||
<string name="revanced_return_youtube_username_youtube_data_api_v3_about_title">關於 YouTube 資料 API 金鑰</string>
|
||||
<string name="revanced_return_youtube_username_youtube_data_api_v3_developer_key_summary">使用 YouTube 資料 API v3 的開發人員金鑰。</string>
|
||||
<string name="revanced_return_youtube_username_youtube_data_api_v3_developer_key_title">YouTube 資料 API 金鑰</string>
|
||||
|
|
@ -1950,9 +1951,9 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">重新載入影片以使用 恢復 YouTube 倒讚 進行投票</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">短影音中的不喜歡數已隱藏。</string>
|
||||
<string name="revanced_ryd_shorts_summary_on">短影音顯示不喜歡數。</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">在短影音中顯示不喜歡數。
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"在短影音中顯示不喜歡數。
|
||||
|
||||
限制:若使用者未登入或使用無痕模式,可能不會顯示不喜歡數。</string>
|
||||
限制:若使用者未登入或使用無痕模式,可能不會顯示不喜歡數。"</string>
|
||||
<string name="revanced_ryd_shorts_title">在短影音中顯示不喜歡數</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">如果 恢復 YouTube 倒讚 無法使用,不顯示訊息。</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">如果 恢復 YouTube 倒讚 無法使用,則顯示提示訊息。</string>
|
||||
|
|
@ -2200,41 +2201,41 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
• Cookies 已過期。
|
||||
• 使用了無效的 Cookies。
|
||||
• YouTube Transcript API 不再驗證 Cookies。"</string>
|
||||
<string name="revanced_settings_color_invalid">無效的顏色</string>
|
||||
<string name="revanced_settings_color_picker">顏色選擇器</string>
|
||||
<string name="revanced_settings_color_invalid">無效顏色。</string>
|
||||
<string name="revanced_settings_color_picker">顏色選取器</string>
|
||||
<string name="revanced_settings_export_failed">匯出設定失敗。</string>
|
||||
<string name="revanced_settings_export_success">設定已成功匯出。</string>
|
||||
<string name="revanced_settings_export_summary">將設定匯出到檔案。</string>
|
||||
<string name="revanced_settings_export_title">匯出設定</string>
|
||||
<string name="revanced_settings_import">匯入</string>
|
||||
<string name="revanced_settings_import_copy">複製</string>
|
||||
<string name="revanced_settings_import_export_as_text_summary">以文字形式匯入/匯出設定。</string>
|
||||
<string name="revanced_settings_import_export_as_text_summary">使用文字匯入 / 匯出設定</string>
|
||||
<string name="revanced_settings_import_export_as_text_title">以文字形式匯入/匯出</string>
|
||||
<string name="revanced_settings_import_failed">匯入設定失敗。</string>
|
||||
<string name="revanced_settings_import_reset">設定重設為預設值。</string>
|
||||
<string name="revanced_settings_import_success">設定已成功匯入。</string>
|
||||
<string name="revanced_settings_import_summary">從已儲存的檔案匯入設定。</string>
|
||||
<string name="revanced_settings_import_title">匯入設定</string>
|
||||
<string name="revanced_settings_reset">重設</string>
|
||||
<string name="revanced_settings_reset_color">重設顏色</string>
|
||||
<string name="revanced_settings_reset">重置</string>
|
||||
<string name="revanced_settings_reset_color">重置顏色</string>
|
||||
<string name="revanced_settings_search_clear_history">清除搜尋記錄</string>
|
||||
<string name="revanced_settings_search_clear_history_message">您確定要清除所有搜尋記錄嗎?</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">若要儲存搜尋記錄,請輸入搜尋查詢並按下 Enter 鍵</string>
|
||||
<string name="revanced_settings_search_empty_history_title">搜尋記錄是空的</string>
|
||||
<string name="revanced_settings_search_clear_history_message">您確定要清除所有搜尋紀錄嗎?</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">若要儲存搜尋記錄,請輸入搜尋查詢並按 Enter。</string>
|
||||
<string name="revanced_settings_search_empty_history_title">搜尋紀錄為空</string>
|
||||
<string name="revanced_settings_search_history_summary">儲存最近的搜尋查詢,當搜尋列為空時顯示。</string>
|
||||
<string name="revanced_settings_search_history_summary_off">不顯示設定搜尋記錄</string>
|
||||
<string name="revanced_settings_search_history_summary_on">顯示設定搜尋記錄</string>
|
||||
<string name="revanced_settings_search_history_summary_off">不顯示設定搜尋記錄。</string>
|
||||
<string name="revanced_settings_search_history_summary_on">顯示設定搜尋記錄。</string>
|
||||
<string name="revanced_settings_search_history_title">顯示設定中搜尋記錄</string>
|
||||
<string name="revanced_settings_search_no_results_summary">嘗試其他關鍵字</string>
|
||||
<string name="revanced_settings_search_no_results_title">沒有找到「%s」的結果</string>
|
||||
<string name="revanced_settings_search_recent_searches">最近搜尋</string>
|
||||
<string name="revanced_settings_search_remove_message">要從搜尋記錄中移除嗎?</string>
|
||||
<string name="revanced_settings_search_tips_summary">"• 輕觸路徑即可前往
|
||||
• 長按設定即可前往
|
||||
• 按下 Enter 鍵即可將搜尋查詢儲存至記錄
|
||||
• 搜尋會忽略大小寫和標點符號
|
||||
• 父設定會顯示在停用的子設定上方"</string>
|
||||
<string name="revanced_settings_search_tips_title">搜尋秘訣</string>
|
||||
<string name="revanced_settings_search_no_results_summary">嘗試另一個關鍵字。</string>
|
||||
<string name="revanced_settings_search_no_results_title">"沒有找到 '%s' 的結果"</string>
|
||||
<string name="revanced_settings_search_recent_searches">最近的搜尋</string>
|
||||
<string name="revanced_settings_search_remove_message">從搜尋紀錄中移除?</string>
|
||||
<string name="revanced_settings_search_tips_summary">"• 點選路徑即可導覽至該路徑。
|
||||
• 長按某個設定即可導覽至該設定。
|
||||
• 按 Enter 鍵可將搜尋查詢儲存至記錄。
|
||||
• 搜尋會忽略大小寫和標點符號。
|
||||
• 父級設定顯示在已停用的子級設定上方。"</string>
|
||||
<string name="revanced_settings_search_tips_title">搜尋提示</string>
|
||||
<string name="revanced_settings_search_title">搜尋 %s</string>
|
||||
<string name="revanced_settings_title">RVX</string>
|
||||
<string name="revanced_share_copy_settings_success">設定已複製到剪貼簿。</string>
|
||||
|
|
@ -2342,7 +2343,7 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
• 如果開啟“偽裝串流數據”,則此設定無法使用。</string>
|
||||
<string name="revanced_spoof_device_dimensions_title">偽裝裝置尺寸</string>
|
||||
<string name="revanced_spoof_streaming_data_audio_track_button_summary_off">未顯示音軌按鈕。</string>
|
||||
<string name="revanced_spoof_streaming_data_audio_track_button_summary_on">當用於取得串流資料的用戶端是 ‘Android VR’, ‘Mobile Web’, 或 ‘visionOS’ 時, 會顯示音軌按鈕。</string>
|
||||
<string name="revanced_spoof_streaming_data_audio_track_button_summary_on">"當用於取得串流資料的用戶端是 ‘Android VR’, ‘Mobile Web’, 或 ‘visionOS’ 時, 會顯示音軌按鈕。"</string>
|
||||
<string name="revanced_spoof_streaming_data_audio_track_button_title">顯示音軌按鈕</string>
|
||||
<string name="revanced_spoof_streaming_data_audio_track_button_user_dialog_message">"使用前提:
|
||||
• 用來取得串流資料的用戶端是 'Android VR', '行動網路' 或 'visionOS'。
|
||||
|
|
@ -2365,16 +2366,13 @@ AI 生成的回應可能包含不準確的資訊。
|
|||
<string name="revanced_spoof_streaming_data_client_entry_mweb">"行動網路
|
||||
<small>(開發中, 無需驗證)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv">電視
|
||||
<small>(開發中)</small>
|
||||
</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_tv_simply">電視簡易功能
|
||||
<small>(開發中)</small>
|
||||
</string>
|
||||
<string name="revanced_spoof_streaming_data_client_entry_visionos">"visionOS
|
||||
<small>(未發布, 無需驗證)</small>"</string>
|
||||
<string name="revanced_spoof_streaming_data_default_client_title">預設用戶端</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden">無法獲取任何客戶端串流。</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">嘗試將預設用戶端變更為 TV 或 TV Simply。</string>
|
||||
<string name="revanced_spoof_streaming_data_failed_forbidden_suggestion">您可能尚未登入。</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_off">影片編解碼器是自動決定的。</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_summary_on">影片編解碼器強制為 AVC (H.264)。</string>
|
||||
<string name="revanced_spoof_streaming_data_ios_force_avc_title">強制 iOS AVC (H.264)</string>
|
||||
|
|
@ -2458,9 +2456,9 @@ AVC 的最大解析度為 1080p,Opus 音訊編解碼器不可用,影片播
|
|||
• 有時影片即使播放 10 秒後也無法播放,在這種情況下,您需要點擊「重新載入影片」按鈕。
|
||||
• 影片可能會延遲播放。"</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_unknown">• 未知</string>
|
||||
<string name="revanced_spoof_streaming_data_side_effects_visionos">• 缺少音軌選單。
|
||||
<string name="revanced_spoof_streaming_data_side_effects_visionos">"• 缺少音軌選單。
|
||||
• 兒童影片在登出或隱身模式下可能無法播放。
|
||||
• 由於這是一個未發布的客戶端,因此它可能隨時停止工作。</string>
|
||||
• 由於這是一個未發布的客戶端,因此它可能隨時停止工作。"</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">用於獲取串流資料的用戶端隱藏在統計資料中。</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">用於取得串流資料的用戶端顯示在統計資料中。</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">顯示統計資料</string>
|
||||
|
|
@ -2504,20 +2502,19 @@ uBlock Origin 已找到解決此問題的方案,可透過 '繞過虛假緩衝'
|
|||
YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法找到 n-sig 模式,播放可能會失敗。
|
||||
|
||||
此功能尚在開發中,請僅用於調試目的。"</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_off">用於反混淆的 JavaScript 未保持最新。
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_off">"用於反混淆的 JavaScript 未保持最新。
|
||||
|
||||
• 雖然使用了可成功反混淆的 JavaScript,但它仍然在一定程度上依賴伺服器。</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_on">用於反混淆的 JavaScript 會保持最新狀態。
|
||||
• 雖然使用了可成功反混淆的 JavaScript,但它仍然在一定程度上依賴伺服器。"</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_summary_on">"用於反混淆的 JavaScript 會保持最新狀態。
|
||||
|
||||
• 它高度依賴伺服器,反混淆的成功或失敗取決於伺服器上目前使用的 JavaScript。</string>
|
||||
• 它高度依賴伺服器,反混淆的成功或失敗取決於伺服器上目前使用的 JavaScript。"</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_js_title">使用最新的 JavaScript</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_off">用於反混淆的播放器 JavaScript 未保持最新。
|
||||
|
||||
• 使用了可成功反混淆的播放器 JavaScript,但它仍然在一定程度上依賴伺服器。</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_on">用於反混淆的播放器 JavaScript 會保持最新狀態。
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_off">"用於反混淆的播放器 JavaScript 不會保持最新狀態。
|
||||
• 使用的是已成功進行反混淆的播放器 JavaScript,但仍在某種程度上依賴伺服器。"</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_summary_on">"用於反混淆的播放器 JavaScript 會保持最新狀態。
|
||||
|
||||
• 它高度依賴伺服器,反混淆的成功或失敗取決於伺服器上目前使用的播放器 JavaScript。
|
||||
• 如果您在使用 JavaScript 用戶端時遇到問題,請先嘗試停用此功能。</string>
|
||||
• 如果您在使用 JavaScript 用戶端時遇到問題,請先嘗試停用此功能。"</string>
|
||||
<string name="revanced_spoof_streaming_data_use_latest_player_js_title">使用最新的播放器 JavaScript</string>
|
||||
<string name="revanced_spoof_streaming_data_user_dialog_message">關閉此設定可能會導致影片播放問題。</string>
|
||||
<string name="revanced_spoof_streaming_data_vr_disable_av1_summary_off">影片編解碼器自動確定。</string>
|
||||
|
|
@ -2526,9 +2523,9 @@ YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法
|
|||
<string name="revanced_swipe_brightness_distance_summary">調整亮度所需滑動的像素數量。數值越低,亮度變化越快,數值越高,亮度變化越慢(1-1000)。</string>
|
||||
<string name="revanced_swipe_brightness_distance_title">亮度範圍</string>
|
||||
<string name="revanced_swipe_brightness_summary_off">全螢幕亮度滑動已停用</string>
|
||||
<string name="revanced_swipe_brightness_summary_on">已啟用全螢幕亮度滑動功能。
|
||||
<string name="revanced_swipe_brightness_summary_on">"已啟用全螢幕亮度滑動功能。
|
||||
|
||||
在螢幕左側垂直滑動即可調整亮度。</string>
|
||||
在螢幕左側垂直滑動即可調整亮度。"</string>
|
||||
<string name="revanced_swipe_brightness_title">啟用亮度手勢</string>
|
||||
<string name="revanced_swipe_distance_invalid">無效滑動範圍,必須介於 1 到 1000 之間。</string>
|
||||
<string name="revanced_swipe_gestures_lock_mode_summary_off">在「鎖定螢幕」模式下停用滑動手勢</string>
|
||||
|
|
@ -2575,16 +2572,16 @@ YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法
|
|||
<string name="revanced_swipe_seek_distance_summary">滑動跳過影片內容所需的像素數。數值越低,搜尋速度越快,數值越高,搜尋速度越慢(1-1000)。</string>
|
||||
<string name="revanced_swipe_seek_distance_title">搜尋範圍</string>
|
||||
<string name="revanced_swipe_seek_summary_off">全螢幕進度搜尋滑動手勢已停用。</string>
|
||||
<string name="revanced_swipe_seek_summary_on">全螢幕進度搜尋滑動手勢已啟用。
|
||||
<string name="revanced_swipe_seek_summary_on">"全螢幕進度搜尋滑動手勢已啟用。
|
||||
|
||||
在螢幕上半部左右滑動以搜尋影片。</string>
|
||||
在螢幕上半部左右滑動以搜尋影片。"</string>
|
||||
<string name="revanced_swipe_seek_title">啟用進度搜尋手勢</string>
|
||||
<string name="revanced_swipe_speed_distance_summary">調整影片速度所需滑動的像素數量。數值越低,速度變化越快;數值越高,速度變化越慢(1-1000)。</string>
|
||||
<string name="revanced_swipe_speed_distance_title">速度範圍</string>
|
||||
<string name="revanced_swipe_speed_summary_off">全螢幕速度滑動已停用。</string>
|
||||
<string name="revanced_swipe_speed_summary_on">全螢幕速度滑動已啟用。
|
||||
<string name="revanced_swipe_speed_summary_on">"全螢幕速度滑動已啟用。
|
||||
|
||||
在螢幕下半部左右滑動以調整速度。</string>
|
||||
在螢幕下半部左右滑動以調整速度。"</string>
|
||||
<string name="revanced_swipe_speed_title">啟用速度手勢</string>
|
||||
<string name="revanced_swipe_switch_speed_and_seek_summary_off">進度搜尋滑動區域在上方,速度滑動區域在下方。</string>
|
||||
<string name="revanced_swipe_switch_speed_and_seek_summary_on">速度滑動區域在上方,進度搜尋滑動區域在下方。</string>
|
||||
|
|
@ -2600,25 +2597,25 @@ YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法
|
|||
<string name="revanced_swipe_volume_sensitivity_summary">每次滑動音量改變多少。</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_title">滑動控制 (音量) 靈敏度</string>
|
||||
<string name="revanced_swipe_volume_summary_off">全螢幕音量滑動已停用。</string>
|
||||
<string name="revanced_swipe_volume_summary_on">全螢幕音量滑動功能已啟用。
|
||||
<string name="revanced_swipe_volume_summary_on">"全螢幕音量滑動功能已啟用。
|
||||
|
||||
在螢幕右側垂直滑動即可調整音量。</string>
|
||||
在螢幕右側垂直滑動即可調整音量。"</string>
|
||||
<string name="revanced_swipe_volume_title">啟用音量手勢</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_summary">交換創作按鈕與通知按鈕的位置,透過偽裝裝置資訊來實現
|
||||
<string name="revanced_switch_create_with_notifications_button_summary">"交換創作按鈕與通知按鈕的位置,透過偽裝裝置資訊來實現
|
||||
|
||||
• 變更這項設定可能需要重新啟動裝置
|
||||
• 停用這項設定會從伺服器端載入更多廣告
|
||||
• 你應該停用這項設定以顯示影片廣告</string>
|
||||
• 你應該停用這項設定以顯示影片廣告"</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_summary_off">「建立」按鈕未與「通知」按鈕交換。</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_summary_on">「建立」按鈕已與「通知」按鈕交換。
|
||||
<string name="revanced_switch_create_with_notifications_button_summary_on">"「建立」按鈕已與「通知」按鈕交換。
|
||||
|
||||
注意:啟用此功能也會強制隱藏影片廣告。</string>
|
||||
注意:啟用此功能也會強制隱藏影片廣告。"</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_title">交換創作和通知按鈕</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_user_dialog_message">停用此功能可能會從伺服器載入更多廣告。
|
||||
<string name="revanced_switch_create_with_notifications_button_user_dialog_message">"停用此功能可能會從伺服器載入更多廣告。
|
||||
|
||||
此外,廣告將不再在 Shorts 中被封鎖。
|
||||
|
||||
若此設定未生效,請嘗試切換至無痕模式。</string>
|
||||
若此設定未生效,請嘗試切換至無痕模式。"</string>
|
||||
<string name="revanced_theme_default">預設</string>
|
||||
<string name="revanced_third_party_youtube_music_dialog_title">RVX 音樂</string>
|
||||
<string name="revanced_third_party_youtube_music_not_installed_dialog_title">警告</string>
|
||||
|
|
@ -2627,7 +2624,7 @@ YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法
|
|||
<string name="revanced_transcript_cookies_about_summary">點擊查看如何取得 Cookies。</string>
|
||||
<string name="revanced_transcript_cookies_about_title">關於字幕 Cookie</string>
|
||||
<string name="revanced_transcript_cookies_dialog_auth_text">驗證</string>
|
||||
<string name="revanced_transcript_cookies_dialog_message">驗證
|
||||
<string name="revanced_transcript_cookies_dialog_message">"驗證
|
||||
═══════════════
|
||||
1. 點選「驗證」在 WebView 中開啟登入頁面。
|
||||
2. 登入您的 Google 帳戶。
|
||||
|
|
@ -2648,7 +2645,7 @@ YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法
|
|||
5. 點選「複製」以複製 Cookie。
|
||||
6. 關閉 WebView 並將複製的 Cookie 貼到「字幕 Cookie」設定中。
|
||||
|
||||
免責聲明:未登入時發出的 Cookie 可能無效,或可能需要一些時間才能提供給轉錄 API。</string>
|
||||
免責聲明:未登入時發出的 Cookie 可能無效,或可能需要一些時間才能提供給轉錄 API。"</string>
|
||||
<string name="revanced_transcript_cookies_dialog_no_auth_text">無需驗證</string>
|
||||
<string name="revanced_transcript_cookies_dialog_title">匯出字幕 Cookies</string>
|
||||
<string name="revanced_transcript_cookies_summary">在 Transcript API 請求使用 Cookie。</string>
|
||||
|
|
@ -2683,17 +2680,17 @@ YouTube 伺服器上的 n-sig 模式變化頻繁,如果正規表示式無法
|
|||
<string name="revanced_webview_toast_no_network">請檢查您的網路連線。</string>
|
||||
<string name="revanced_webview_toast_unavailable">WebView 無法使用。</string>
|
||||
<string name="revanced_webview_visitor_data">訪客資料</string>
|
||||
<string name="revanced_whitelist_add_failed">無法將頻道 %1$s 新增至 %2$s 白名單。</string>
|
||||
<string name="revanced_whitelist_added">頻道 %1$s 已加入 %2$s 白名單。</string>
|
||||
<string name="revanced_whitelist_add_failed">"無法將頻道 '%1$s' 新增至 %2$s 白名單。"</string>
|
||||
<string name="revanced_whitelist_added">"頻道 '%1$s' 已加入 %2$s 白名單。"</string>
|
||||
<string name="revanced_whitelist_empty">沒有列入白名單的頻道。</string>
|
||||
<string name="revanced_whitelist_excluded">未加入白名單。</string>
|
||||
<string name="revanced_whitelist_failure_generic">載入頻道資訊失敗。</string>
|
||||
<string name="revanced_whitelist_included">已新增至白名單。</string>
|
||||
<string name="revanced_whitelist_playback_speed">播放速度</string>
|
||||
<string name="revanced_whitelist_reload_video">你想現在重新加載影片嗎?</string>
|
||||
<string name="revanced_whitelist_remove_dialog_message">從 %2$s 白名單中刪除頻道 %1$s 嗎?</string>
|
||||
<string name="revanced_whitelist_remove_failed">無法從 %2$s 白名單中刪除頻道 %1$s 。</string>
|
||||
<string name="revanced_whitelist_removed">頻道 %1$s 已從 %2$s 白名單中刪除。</string>
|
||||
<string name="revanced_whitelist_remove_dialog_message">"從 %2$s 白名單中刪除頻道 '%1$s' 嗎?"</string>
|
||||
<string name="revanced_whitelist_remove_failed">"無法從 %2$s 白名單中刪除頻道 '%1$s' 。"</string>
|
||||
<string name="revanced_whitelist_removed">"頻道 '%1$s' 已從 %2$s 白名單中刪除。"</string>
|
||||
<string name="revanced_whitelist_settings_summary">查看或刪除已新增至白名單的頻道清單。</string>
|
||||
<string name="revanced_whitelist_settings_title">頻道白名單</string>
|
||||
<string name="revanced_whitelist_sponsor_block">SponsorBlock</string>
|
||||
|
|
|
|||
Loading…
Reference in a new issue