This commit is contained in:
Aaron Veil 2025-09-27 14:28:42 +03:00
parent 4a5bb78ca7
commit cffeb04471
67 changed files with 884 additions and 511 deletions

View file

@ -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);
}
}

View file

@ -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.

View file

@ -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,
)

View file

@ -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.
*/

View file

@ -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) {

View file

@ -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(

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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);
}
}
}

View file

@ -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()));
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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.

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -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 {

View file

@ -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

View file

@ -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) {
}
}

View file

@ -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)

View file

@ -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)
}
}

View file

@ -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)
}

View file

@ -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(

View file

@ -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
}

View file

@ -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>
)

View file

@ -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)}...>"
}
}

View file

@ -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) {

View file

@ -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

View file

@ -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",

View file

@ -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

View file

@ -306,6 +306,7 @@ internal val youtubeControlsOverlayFingerprint = legacyFingerprint(
parameters = emptyList(),
literals = listOf(
// Removed in YouTube 20.09.40+
// eduOverlayStub,
// fadeDurationFast,
insetOverlayViewLayout,
scrimOverlay,

View file

@ -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"
)
}
}
}
}

View file

@ -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),
)

View file

@ -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")

View file

@ -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")

View file

@ -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

View file

@ -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>

View file

@ -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 &lt;i&gt;&lt;u&gt;Settings &gt; %s &gt; Miscellaneous&lt;/u&gt;&lt;/i&gt;.</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>

View file

@ -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>

View file

@ -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.

View file

@ -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>

View file

@ -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>

View file

@ -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">재생 문제가 발생하는 경우에는 &lt;i&gt;&lt;u&gt;설정 &gt; %s &gt; 기타 &gt; 스트리밍 데이터 변경하기&lt;/u&gt;&lt;/i&gt; 에서 \'스트리밍 데이터 변경하기\' 를 활성화하세요.</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>

View file

@ -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>

View file

@ -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>

View file

@ -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\" в &lt;i&gt;&lt;u&gt;Настройках &gt; %s &gt; Разное;/u&gt;&lt;/i&gt;.</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">Если у вас возникли какие-либо проблемы с воспроизведением, включите функцию \"Подмена потоковых данных\" в &lt;i&gt;&lt;u&gt;Настройки &gt; %s &gt; Разное &lt;/u&gt;&lt;/i&gt;.</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>

View file

@ -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.

View file

@ -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>

View file

@ -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.

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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" />

View file

@ -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>

View file

@ -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>

View file

@ -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

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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\' (\'&amp;\') está desativado.&lt;br&gt;&lt;br&gt;Quando &lt;strong&gt;\"Azul\" &amp; \"vermelho\"&lt;/strong&gt; é usado como uma palavra-chave, palavras-chave contendo &lt;strong&gt;\"Blue\" &amp; \"vermelho\"&lt;/strong&gt; serão filtradas.</string>
<string name="revanced_hide_keyword_content_use_and_operator_summary_off">Operador \'AND\' (\'&amp;\') está desativado.&lt;br&gt;&lt;br&gt;Quando &lt;strong&gt;\"Azul\" &amp; \"Vermelho\"&lt;/strong&gt; é usado como uma palavra-chave, palavras-chave contendo &lt;strong&gt;\"Azul\" &amp; \"Vermelho\"&lt;/strong&gt; serão filtradas.</string>
<string name="revanced_hide_keyword_content_use_and_operator_summary_on">Operador \'AND\' (\'&amp;\') está ativado.&lt;br&gt;&lt;br&gt;Quando &lt;strong&gt;\"Azul\" &amp; \"Vermelho\"&lt;/strong&gt; é usado como uma palavra-chave, palavras-chave contendo &lt;strong&gt;Azul&lt;/strong&gt; e &lt;strong&gt;Vermelho&lt;/strong&gt; serão filtrados.</string>
<string name="revanced_hide_keyword_content_use_and_operator_title">Usar operador \'AND\' (\'&amp;\')</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>

View file

@ -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">Ключевые слова/фразы с двойными кавычками, принудительно, используют набор символов между кавычками &lt;br&gt;&lt;br&gt;, как слово.
Например:&lt;br&gt;&lt;b&gt;\"ai\"&lt;/b&gt; скроет видео: &lt;b&gt;How does AI work?&lt;/b&gt;&lt;br&gt;но не будет скрывать: &lt;b&gt;What does fair use mean?&lt;/b&gt;</string>
<string name="revanced_hide_keyword_content_about_whole_words_summary">Если заключить ключевое слово / фразу в двойные кавычки, это предотвратит частичное совпадение названий видео и имен каналов.&lt;br&gt;&lt;br&gt;Например,&lt;br&gt;&lt;b&gt;\"ai\"&lt;/b&gt; скроет видео: &lt;b&gt;Как работает ИИ?&lt;/b&gt;&lt;br&gt;но не скроет: &lt;b&gt;Что означает добросовестное использование?&lt;/b&gt;</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>

View file

@ -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>

View file

@ -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>

View file

@ -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 最大分辨率为 1080pOpus 音频编解码器不可用,并且视频
<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>

View file

@ -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">如果匹配則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;\'獲取 YouTube Premium\'&lt;/b&gt; 選單中,您可以使用 &lt;b&gt;\'獲取 YouTube Premium\'&lt;/b&gt; 作為關鍵字。</string>
<string name="revanced_hide_account_menu_filter_type_summary_on">如果包含則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;\'獲取 YouTube Premium\'&lt;/b&gt; 選單中,您可以使用 &lt;b&gt;\'YouTube Premium\'&lt;/b&gt;&lt;b&gt;\'Premium\'&lt;/b&gt; 作為關鍵字。</string>
<string name="revanced_hide_account_menu_filter_type_summary_off">"如果匹配則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;'獲取 YouTube Premium'&lt;/b&gt; 選單中,您可以使用 &lt;b&gt;'獲取 YouTube Premium'&lt;/b&gt; 作為關鍵字。"</string>
<string name="revanced_hide_account_menu_filter_type_summary_on">"如果包含則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;'獲取 YouTube Premium'&lt;/b&gt; 選單中,您可以使用 &lt;b&gt;'YouTube Premium'&lt;/b&gt;&lt;b&gt;'Premium'&lt;/b&gt; 作為關鍵字。"</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">如果符合則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;\'播放隊列中的下一個\'&lt;/b&gt; 選單中,您只能使用 &lt;b&gt;\'播放隊列中下一個\'&lt;/b&gt; 作為關鍵字。</string>
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_on">如果包含則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;\'播放隊列中的下一個\'&lt;/b&gt; 選單中,您可以使用 &lt;b&gt;\'播放下一個\'&lt;/b&gt;&lt;b&gt;\'在隊列\'&lt;/b&gt; 作為關鍵字。</string>
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_off">"如果符合則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;'播放隊列中的下一個'&lt;/b&gt; 選單中,您只能使用 &lt;b&gt;'播放隊列中下一個'&lt;/b&gt; 作為關鍵字。"</string>
<string name="revanced_hide_feed_flyout_menu_filter_type_summary_on">"如果包含則進行過濾。&lt;br&gt;&lt;br&gt;隱藏隊列中的 &lt;b&gt;'播放隊列中的下一個'&lt;/b&gt; 選單中,您可以使用 &lt;b&gt;'播放下一個'&lt;/b&gt;&lt;b&gt;'在隊列'&lt;/b&gt; 作為關鍵字。"</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\' 運算 (\'&amp;\') 已被停用。&lt;br&gt;&lt;br&gt;&lt;strong&gt;\"Blue\" &amp; \"Red\"&lt;/strong&gt; 用作關鍵字時,包含該關鍵字 &lt;strong&gt;\"Blue\" &amp; \"Red\"&lt;/strong&gt; 將被過濾。</string>
<string name="revanced_hide_keyword_content_use_and_operator_summary_on">\'AND\' 運算 (\'&amp;\') 已被停用。&lt;br&gt;&lt;br&gt;&lt;strong&gt;\"Blue\" &amp; \"Red\"&lt;/strong&gt; 被作為關鍵字使用,包含兩者的關鍵字 &lt;strong&gt;\"Blue\" &amp; \"Red\"&lt;/strong&gt; 將被過濾。</string>
<string name="revanced_hide_keyword_content_use_and_operator_title">使用 \'AND\' 運算 (\'&amp;\')</string>
<string name="revanced_hide_keyword_content_use_and_operator_summary_off">"'AND' 運算 ('&amp;') 已被停用。&lt;br&gt;&lt;br&gt;&lt;strong&gt;"Blue" &amp; "Red"&lt;/strong&gt; 用作關鍵字時,包含該關鍵字 &lt;strong&gt;"Blue" &amp; "Red"&lt;/strong&gt; 將被過濾。"</string>
<string name="revanced_hide_keyword_content_use_and_operator_summary_on">"'AND' 運算 ('&amp;') 已被啟用。&lt;br&gt;&lt;br&gt;&lt;strong&gt;"Blue" &amp; "Red"&lt;/strong&gt; 用作關鍵字時,包含兩者的關鍵字 &lt;strong&gt;Blue&lt;/strong&gt;&lt;strong&gt;Red&lt;/strong&gt; 將被過濾。"</string>
<string name="revanced_hide_keyword_content_use_and_operator_title">"使用 'AND' 運算 ('&amp;')"</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 的最大解析度為 1080pOpus 音訊編解碼器不可用,影片播
• 有時影片即使播放 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>