mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-18 00:33:57 +00:00
Compare commits
4 Commits
v5.39.1-de
...
fix/youtub
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
debe93d87a | ||
|
|
3910d9c9b9 | ||
|
|
e0edfdbd97 | ||
|
|
95580f84ec |
35
CHANGELOG.md
35
CHANGELOG.md
@@ -1,38 +1,3 @@
|
||||
## [5.39.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.39.0...v5.39.1-dev.1) (2025-09-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Force original audio:** Show UI setting summary if spoofing to Android Studio ([b7026b7](https://github.com/ReVanced/revanced-patches/commit/b7026b70865bc44de07b30f84ba8b8b608930d5b))
|
||||
|
||||
# [5.39.0](https://github.com/ReVanced/revanced-patches/compare/v5.38.0...v5.39.0) (2025-09-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Do not use Android Creator for livestreams ([cbe576b](https://github.com/ReVanced/revanced-patches/commit/cbe576bc384ef5f5ee2fa341147925ed0dff568b))
|
||||
* **YouTube - Spoof video streams:** Show Android Studio in spoof stream menu ([c9f741e](https://github.com/ReVanced/revanced-patches/commit/c9f741e616c7acab0cd4558e02b0c4ec18392c10))
|
||||
* **YouTube Music - Spoof video streams:** Remove iPadOS client ([7eeffd3](https://github.com/ReVanced/revanced-patches/commit/7eeffd3392c57555342173103d3a417c038d0970))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide video action buttons:** Add "Hide Shop button" setting ([a84db7b](https://github.com/ReVanced/revanced-patches/commit/a84db7be7fde2e9bb3ac41aec709a1681e845fe1))
|
||||
|
||||
# [5.39.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.39.0-dev.1...v5.39.0-dev.2) (2025-09-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Show Android Studio in spoof stream menu ([c9f741e](https://github.com/ReVanced/revanced-patches/commit/c9f741e616c7acab0cd4558e02b0c4ec18392c10))
|
||||
|
||||
# [5.39.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.38.1-dev.2...v5.39.0-dev.1) (2025-09-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide video action buttons:** Add "Hide Shop button" setting ([a84db7b](https://github.com/ReVanced/revanced-patches/commit/a84db7be7fde2e9bb3ac41aec709a1681e845fe1))
|
||||
|
||||
## [5.38.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.38.1-dev.1...v5.38.1-dev.2) (2025-09-16)
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import static app.revanced.extension.shared.spoof.ClientType.VISIONOS;
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class SpoofVideoStreamsPatch {
|
||||
@@ -22,7 +23,8 @@ public class SpoofVideoStreamsPatch {
|
||||
VISIONOS
|
||||
);
|
||||
|
||||
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse(
|
||||
availableClients, SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
|
||||
ClientType client = SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setPreferredClient(client);
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients, client);
|
||||
}
|
||||
}
|
||||
|
||||
5
extensions/proguard-rules.pro
vendored
5
extensions/proguard-rules.pro
vendored
@@ -7,3 +7,8 @@
|
||||
-keep class com.google.** {
|
||||
*;
|
||||
}
|
||||
-keep class org.mozilla.javascript.** { *; }
|
||||
-dontwarn org.mozilla.javascript.tools.**
|
||||
-dontwarn java.beans.**
|
||||
-dontwarn jdk.dynalink.**
|
||||
-dontwarn javax.script.**
|
||||
@@ -7,8 +7,7 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Searches for a group of different patterns using a trie (prefix tree).
|
||||
/**Searches for a group of different patterns using a trie (prefix tree).
|
||||
* Can significantly speed up searching for multiple patterns.
|
||||
*/
|
||||
public abstract class TrieSearch<T> {
|
||||
@@ -56,13 +55,11 @@ public abstract class TrieSearch<T> {
|
||||
if (searchTextLength - searchTextIndex < patternLength - patternStartIndex) {
|
||||
return false; // Remaining search text is shorter than the remaining leaf pattern and they cannot match.
|
||||
}
|
||||
|
||||
for (int i = searchTextIndex, j = patternStartIndex; j < patternLength; i++, j++) {
|
||||
if (enclosingNode.getCharValue(searchText, i) != enclosingNode.getCharValue(pattern, j)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return callback == null || callback.patternMatched(searchText,
|
||||
searchTextIndex - patternStartIndex, patternLength, callbackParameter);
|
||||
}
|
||||
@@ -146,7 +143,6 @@ public abstract class TrieSearch<T> {
|
||||
endOfPatternCallback.add(callback);
|
||||
return;
|
||||
}
|
||||
|
||||
if (leaf != null) {
|
||||
// Reached end of the graph and a leaf exist.
|
||||
// Recursively call back into this method and push the existing leaf down 1 level.
|
||||
@@ -161,7 +157,6 @@ public abstract class TrieSearch<T> {
|
||||
leaf = new TrieCompressedPath<>(pattern, patternIndex, patternLength, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
final char character = getCharValue(pattern, patternIndex);
|
||||
final int arrayIndex = hashIndexForTableSize(children.length, character);
|
||||
TrieNode<T> child = children[arrayIndex];
|
||||
@@ -186,7 +181,6 @@ public abstract class TrieSearch<T> {
|
||||
//noinspection unchecked
|
||||
TrieNode<T>[] replacement = new TrieNode[replacementArraySize];
|
||||
addNodeToArray(replacement, child);
|
||||
|
||||
boolean collision = false;
|
||||
for (TrieNode<T> existingChild : children) {
|
||||
if (existingChild != null) {
|
||||
@@ -199,7 +193,6 @@ public abstract class TrieSearch<T> {
|
||||
if (collision) {
|
||||
continue;
|
||||
}
|
||||
|
||||
children = replacement;
|
||||
return;
|
||||
}
|
||||
@@ -239,7 +232,6 @@ public abstract class TrieSearch<T> {
|
||||
if (leaf != null && leaf.matches(startNode, searchText, searchTextEndIndex, searchTextIndex, callbackParameter)) {
|
||||
return true; // Leaf exists and it matched the search text.
|
||||
}
|
||||
|
||||
List<TriePatternMatchedCallback<T>> endOfPatternCallback = node.endOfPatternCallback;
|
||||
if (endOfPatternCallback != null) {
|
||||
final int matchStartIndex = searchTextIndex - currentMatchLength;
|
||||
@@ -252,7 +244,6 @@ public abstract class TrieSearch<T> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TrieNode<T>[] children = node.children;
|
||||
if (children == null) {
|
||||
return false; // Reached a graph end point and there's no further patterns to search.
|
||||
@@ -285,11 +276,9 @@ public abstract class TrieSearch<T> {
|
||||
if (leaf != null) {
|
||||
numberOfPointers += 4; // Number of fields in leaf node.
|
||||
}
|
||||
|
||||
if (endOfPatternCallback != null) {
|
||||
numberOfPointers += endOfPatternCallback.size();
|
||||
}
|
||||
|
||||
if (children != null) {
|
||||
numberOfPointers += children.length;
|
||||
for (TrieNode<T> child : children) {
|
||||
|
||||
@@ -69,7 +69,7 @@ public enum ClientType {
|
||||
"132.0.6779.0",
|
||||
"23.47.101",
|
||||
true,
|
||||
"Android Studio"
|
||||
"Android Creator"
|
||||
),
|
||||
/**
|
||||
* Internal YT client for an unreleased YT client. May stop working at any time.
|
||||
|
||||
@@ -6,7 +6,6 @@ import android.text.TextUtils;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -44,7 +43,7 @@ public class SpoofVideoStreamsPatch {
|
||||
/**
|
||||
* @return If this patch was included during patching.
|
||||
*/
|
||||
public static boolean isPatchIncluded() {
|
||||
private static boolean isPatchIncluded() {
|
||||
return false; // Modified during patching.
|
||||
}
|
||||
|
||||
@@ -61,9 +60,8 @@ public class SpoofVideoStreamsPatch {
|
||||
languageOverride = language;
|
||||
}
|
||||
|
||||
public static void setClientsToUse(List<ClientType> availableClients, ClientType client) {
|
||||
public static void setPreferredClient(ClientType client) {
|
||||
preferredClient = Objects.requireNonNull(client);
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients, client);
|
||||
}
|
||||
|
||||
public static boolean spoofingToClientWithNoMultiAudioStreams() {
|
||||
|
||||
@@ -2,6 +2,19 @@ dependencies {
|
||||
compileOnly(project(":extensions:shared:library"))
|
||||
compileOnly(project(":extensions:youtube:stub"))
|
||||
compileOnly(libs.annotation)
|
||||
implementation("com.github.teamnewpipe:NewPipeExtractor:0.24.8")
|
||||
implementation("io.reactivex.rxjava3:rxjava:3.1.8")
|
||||
implementation("com.squareup.okio:okio:3.7.0") // Newer okio use Kotlin 2.0 which Patches does not yet use.
|
||||
implementation("com.github.TeamNewPipe:nanojson:e9d656ddb49a412a5a0a5d5ef20ca7ef09549996")
|
||||
implementation("io.reactivex.rxjava3:rxandroid:3.0.2")
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
google()
|
||||
maven {
|
||||
url = uri("https://jitpack.io")
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -74,10 +74,6 @@ final class ButtonsFilter extends Filter {
|
||||
Settings.HIDE_ASK_BUTTON,
|
||||
"yt_fill_spark"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHOP_BUTTON,
|
||||
"yt_outline_bag"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_STOP_ADS_BUTTON,
|
||||
"yt_outline_slash_circle_left"
|
||||
|
||||
@@ -0,0 +1,695 @@
|
||||
package app.revanced.extension.youtube.patches.spoof
|
||||
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.Log
|
||||
import android.webkit.ConsoleMessage
|
||||
import android.webkit.JavascriptInterface
|
||||
import android.webkit.WebChromeClient
|
||||
import android.webkit.WebView
|
||||
import app.revanced.extension.shared.Utils
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import io.reactivex.rxjava3.core.SingleEmitter
|
||||
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
import org.schabi.newpipe.extractor.NewPipe
|
||||
import org.schabi.newpipe.extractor.services.youtube.InnertubeClientRequestInfo
|
||||
import org.schabi.newpipe.extractor.services.youtube.PoTokenProvider
|
||||
import org.schabi.newpipe.extractor.services.youtube.PoTokenResult
|
||||
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper
|
||||
import java.io.Closeable
|
||||
import java.time.Instant
|
||||
|
||||
import com.grack.nanojson.JsonObject
|
||||
import com.grack.nanojson.JsonParser
|
||||
import com.grack.nanojson.JsonWriter
|
||||
import okio.ByteString.Companion.decodeBase64
|
||||
import okio.ByteString.Companion.toByteString
|
||||
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
|
||||
// TODO: Remove
|
||||
fun test(){
|
||||
YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl);
|
||||
with(StreamInfo.getInfo("https://youtube.com/watch?v=dQw4w9WgXcQ")) {
|
||||
this.videoStreams.first().content
|
||||
this.videoOnlyStreams.first().content
|
||||
this.audioStreams.first().content
|
||||
this.subtitles.first().isAutoGenerated
|
||||
}
|
||||
}
|
||||
|
||||
object BuildConfig {
|
||||
const val DEBUG = true
|
||||
}
|
||||
|
||||
fun parseChallengeData(rawChallengeData: String): String {
|
||||
val scrambled = JsonParser.array().from(rawChallengeData)
|
||||
|
||||
val challengeData = if (scrambled.size > 1 && scrambled.isString(1)) {
|
||||
val descrambled = descramble(scrambled.getString(1))
|
||||
JsonParser.array().from(descrambled)
|
||||
} else {
|
||||
scrambled.getArray(0)
|
||||
}
|
||||
|
||||
val messageId = challengeData.getString(0)
|
||||
val interpreterHash = challengeData.getString(3)
|
||||
val program = challengeData.getString(4)
|
||||
val globalName = challengeData.getString(5)
|
||||
val clientExperimentsStateBlob = challengeData.getString(7)
|
||||
|
||||
val privateDoNotAccessOrElseSafeScriptWrappedValue = challengeData.getArray(1, null)?.find { it is String }
|
||||
val privateDoNotAccessOrElseTrustedResourceUrlWrappedValue = challengeData.getArray(2, null)?.find { it is String }
|
||||
|
||||
return JsonWriter.string(
|
||||
JsonObject.builder()
|
||||
.value("messageId", messageId)
|
||||
.`object`("interpreterJavascript")
|
||||
.value("privateDoNotAccessOrElseSafeScriptWrappedValue", privateDoNotAccessOrElseSafeScriptWrappedValue)
|
||||
.value("privateDoNotAccessOrElseTrustedResourceUrlWrappedValue", privateDoNotAccessOrElseTrustedResourceUrlWrappedValue)
|
||||
.end()
|
||||
.value("interpreterHash", interpreterHash)
|
||||
.value("program", program)
|
||||
.value("globalName", globalName)
|
||||
.value("clientExperimentsStateBlob", clientExperimentsStateBlob)
|
||||
.done()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the raw integrity token data obtained from the GenerateIT endpoint to a JavaScript
|
||||
* `Uint8Array` that can be embedded directly in JavaScript code, and an [Int] representing the
|
||||
* duration of this token in seconds.
|
||||
*/
|
||||
fun parseIntegrityTokenData(rawIntegrityTokenData: String): Pair<String, Long> {
|
||||
val integrityTokenData = JsonParser.array().from(rawIntegrityTokenData)
|
||||
return base64ToU8(integrityTokenData.getString(0)) to integrityTokenData.getLong(1)
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string (usually the identifier used as input to `obtainPoToken`) to a JavaScript
|
||||
* `Uint8Array` that can be embedded directly in JavaScript code.
|
||||
*/
|
||||
fun stringToU8(identifier: String): String {
|
||||
return newUint8Array(identifier.toByteArray())
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a poToken encoded as a sequence of bytes represented as integers separated by commas
|
||||
* (e.g. "97,98,99" would be "abc"), which is the output of `Uint8Array::toString()` in JavaScript,
|
||||
* and converts it to the specific base64 representation for poTokens.
|
||||
*/
|
||||
fun u8ToBase64(poToken: String): String {
|
||||
return poToken.split(",")
|
||||
.map { it.toUByte().toByte() }
|
||||
.toByteArray()
|
||||
.toByteString()
|
||||
.base64()
|
||||
.replace("+", "-")
|
||||
.replace("/", "_")
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the scrambled challenge, decodes it from base64, adds 97 to each byte.
|
||||
*/
|
||||
private fun descramble(scrambledChallenge: String): String {
|
||||
return base64ToByteString(scrambledChallenge)
|
||||
.map { (it + 97).toByte() }
|
||||
.toByteArray()
|
||||
.decodeToString()
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes a base64 string encoded in the specific base64 representation used by YouTube, and
|
||||
* returns a JavaScript `Uint8Array` that can be embedded directly in JavaScript code.
|
||||
*/
|
||||
private fun base64ToU8(base64: String): String {
|
||||
return newUint8Array(base64ToByteString(base64))
|
||||
}
|
||||
|
||||
private fun newUint8Array(contents: ByteArray): String {
|
||||
return "new Uint8Array([" + contents.joinToString(separator = ",") { it.toUByte().toString() } + "])"
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes a base64 string encoded in the specific base64 representation used by YouTube.
|
||||
*/
|
||||
private fun base64ToByteString(base64: String): ByteArray {
|
||||
val base64Mod = base64
|
||||
.replace('-', '+')
|
||||
.replace('_', '/')
|
||||
.replace('.', '=')
|
||||
|
||||
return (base64Mod.decodeBase64() ?: throw PoTokenException("Cannot base64 decode"))
|
||||
.toByteArray()
|
||||
}
|
||||
|
||||
|
||||
class PoTokenException(message: String) : Exception(message)
|
||||
|
||||
// to be thrown if the WebView provided by the system is broken
|
||||
class BadWebViewException(message: String) : Exception(message)
|
||||
|
||||
fun buildExceptionForJsError(error: String): Exception {
|
||||
return if (error.contains("SyntaxError"))
|
||||
BadWebViewException(error)
|
||||
else
|
||||
PoTokenException(error)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This interface was created to allow for multiple methods to generate poTokens in the future (e.g.
|
||||
* via WebView and via a local DOM implementation)
|
||||
*/
|
||||
interface PoTokenGenerator : Closeable {
|
||||
/**
|
||||
* Generates a poToken for the provided identifier, using the `integrityToken` and
|
||||
* `webPoSignalOutput` previously obtained in the initialization of [PoTokenWebView]. Can be
|
||||
* called multiple times.
|
||||
*/
|
||||
fun generatePoToken(identifier: String): Single<String>
|
||||
|
||||
/**
|
||||
* @return whether the `integrityToken` is expired, in which case all tokens generated by
|
||||
* [generatePoToken] will be invalid
|
||||
*/
|
||||
fun isExpired(): Boolean
|
||||
|
||||
interface Factory {
|
||||
/**
|
||||
* Initializes a [PoTokenGenerator] by loading the BotGuard VM, running it, and obtaining
|
||||
* an `integrityToken`. Can then be used multiple times to generate multiple poTokens with
|
||||
* [generatePoToken].
|
||||
*
|
||||
* @param context used e.g. to load the HTML asset or to instantiate a WebView
|
||||
*/
|
||||
fun newPoTokenGenerator(context: Context): Single<PoTokenGenerator>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
object PoTokenProviderImpl : PoTokenProvider {
|
||||
val TAG = PoTokenProviderImpl::class.simpleName
|
||||
private var webViewBadImpl = false // whether the system has a bad WebView implementation
|
||||
|
||||
private object WebPoTokenGenLock
|
||||
private var webPoTokenVisitorData: String? = null
|
||||
private var webPoTokenStreamingPot: String? = null
|
||||
private var webPoTokenGenerator: PoTokenGenerator? = null
|
||||
|
||||
override fun getWebClientPoToken(videoId: String): PoTokenResult? {
|
||||
if (!webViewBadImpl) {
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
return getWebClientPoToken(videoId = videoId, forceRecreate = false)
|
||||
} catch (e: RuntimeException) {
|
||||
// RxJava's Single wraps exceptions into RuntimeErrors, so we need to unwrap them here
|
||||
when (val cause = e.cause) {
|
||||
is BadWebViewException -> {
|
||||
Log.e(TAG, "Could not obtain poToken because WebView is broken", e)
|
||||
webViewBadImpl = true
|
||||
return null
|
||||
}
|
||||
null -> throw e
|
||||
else -> throw cause // includes PoTokenException
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param forceRecreate whether to force the recreation of [webPoTokenGenerator], to be used in
|
||||
* case the current [webPoTokenGenerator] threw an error last time
|
||||
* [PoTokenGenerator.generatePoToken] was called
|
||||
*/
|
||||
private fun getWebClientPoToken(videoId: String, forceRecreate: Boolean): PoTokenResult {
|
||||
// just a helper class since Kotlin does not have builtin support for 4-tuples
|
||||
data class Quadruple<T1, T2, T3, T4>(val t1: T1, val t2: T2, val t3: T3, val t4: T4)
|
||||
|
||||
val (poTokenGenerator, visitorData, streamingPot, hasBeenRecreated) =
|
||||
synchronized(WebPoTokenGenLock) {
|
||||
val shouldRecreate = webPoTokenGenerator == null || forceRecreate ||
|
||||
webPoTokenGenerator!!.isExpired()
|
||||
|
||||
if (shouldRecreate) {
|
||||
|
||||
val innertubeClientRequestInfo = InnertubeClientRequestInfo.ofWebClient()
|
||||
innertubeClientRequestInfo.clientInfo.clientVersion =
|
||||
YoutubeParsingHelper.getClientVersion()
|
||||
|
||||
webPoTokenVisitorData = YoutubeParsingHelper.getVisitorDataFromInnertube(
|
||||
innertubeClientRequestInfo,
|
||||
NewPipe.getPreferredLocalization(),
|
||||
NewPipe.getPreferredContentCountry(),
|
||||
YoutubeParsingHelper.getYouTubeHeaders(),
|
||||
YoutubeParsingHelper.YOUTUBEI_V1_URL,
|
||||
null,
|
||||
false
|
||||
)
|
||||
// close the current webPoTokenGenerator on the main thread
|
||||
webPoTokenGenerator?.let { Handler(Looper.getMainLooper()).post { it.close() } }
|
||||
|
||||
// create a new webPoTokenGenerator
|
||||
webPoTokenGenerator = PoTokenWebView
|
||||
.newPoTokenGenerator(Utils.getContext()).blockingGet()
|
||||
|
||||
// The streaming poToken needs to be generated exactly once before generating
|
||||
// any other (player) tokens.
|
||||
webPoTokenStreamingPot = webPoTokenGenerator!!
|
||||
.generatePoToken(webPoTokenVisitorData!!).blockingGet()
|
||||
}
|
||||
|
||||
return@synchronized Quadruple(
|
||||
webPoTokenGenerator!!,
|
||||
webPoTokenVisitorData!!,
|
||||
webPoTokenStreamingPot!!,
|
||||
shouldRecreate
|
||||
)
|
||||
}
|
||||
|
||||
val playerPot = try {
|
||||
// Not using synchronized here, since poTokenGenerator would be able to generate
|
||||
// multiple poTokens in parallel if needed. The only important thing is for exactly one
|
||||
// visitorData/streaming poToken to be generated before anything else.
|
||||
poTokenGenerator.generatePoToken(videoId).blockingGet()
|
||||
} catch (throwable: Throwable) {
|
||||
if (hasBeenRecreated) {
|
||||
// the poTokenGenerator has just been recreated (and possibly this is already the
|
||||
// second time we try), so there is likely nothing we can do
|
||||
throw throwable
|
||||
} else {
|
||||
// retry, this time recreating the [webPoTokenGenerator] from scratch;
|
||||
// this might happen for example if NewPipe goes in the background and the WebView
|
||||
// content is lost
|
||||
Log.e(TAG, "Failed to obtain poToken, retrying", throwable)
|
||||
return getWebClientPoToken(videoId = videoId, forceRecreate = true)
|
||||
}
|
||||
}
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(
|
||||
TAG,
|
||||
"poToken for $videoId: playerPot=$playerPot, " +
|
||||
"streamingPot=$streamingPot, visitor_data=$visitorData"
|
||||
)
|
||||
}
|
||||
|
||||
return PoTokenResult(visitorData, playerPot, streamingPot)
|
||||
}
|
||||
|
||||
override fun getWebEmbedClientPoToken(videoId: String): PoTokenResult? = null
|
||||
|
||||
override fun getAndroidClientPoToken(videoId: String): PoTokenResult? = null
|
||||
|
||||
override fun getIosClientPoToken(videoId: String): PoTokenResult? = null
|
||||
}
|
||||
|
||||
|
||||
class PoTokenWebView private constructor(
|
||||
context: Context,
|
||||
// to be used exactly once only during initialization!
|
||||
private val generatorEmitter: SingleEmitter<PoTokenGenerator>,
|
||||
) : PoTokenGenerator {
|
||||
private val webView = WebView(context)
|
||||
private val disposables = CompositeDisposable() // used only during initialization
|
||||
private val poTokenEmitters = mutableListOf<Pair<String, SingleEmitter<String>>>()
|
||||
private lateinit var expirationInstant: Instant
|
||||
|
||||
//region Initialization
|
||||
init {
|
||||
val webViewSettings = webView.settings
|
||||
//noinspection SetJavaScriptEnabled we want to use JavaScript!
|
||||
webViewSettings.javaScriptEnabled = true
|
||||
webViewSettings.safeBrowsingEnabled = false
|
||||
webViewSettings.userAgentString = USER_AGENT
|
||||
webViewSettings.blockNetworkLoads = true // the WebView does not need internet access
|
||||
|
||||
// so that we can run async functions and get back the result
|
||||
webView.addJavascriptInterface(this, JS_INTERFACE)
|
||||
|
||||
webView.webChromeClient = object : WebChromeClient() {
|
||||
override fun onConsoleMessage(m: ConsoleMessage): Boolean {
|
||||
if (m.message().contains("Uncaught")) {
|
||||
// There should not be any uncaught errors while executing the code, because
|
||||
// everything that can fail is guarded by try-catch. Therefore, this likely
|
||||
// indicates that there was a syntax error in the code, i.e. the WebView only
|
||||
// supports a really old version of JS.
|
||||
|
||||
val fmt = "\"${m.message()}\", source: ${m.sourceId()} (${m.lineNumber()})"
|
||||
val exception = BadWebViewException(fmt)
|
||||
Log.e(TAG, "This WebView implementation is broken: $fmt")
|
||||
|
||||
onInitializationErrorCloseAndCancel(exception)
|
||||
popAllPoTokenEmitters().forEach { (_, emitter) -> emitter.onError(exception) }
|
||||
}
|
||||
return super.onConsoleMessage(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Must be called right after instantiating [PoTokenWebView] to perform the actual
|
||||
* initialization. This will asynchronously go through all the steps needed to load BotGuard,
|
||||
* run it, and obtain an `integrityToken`.
|
||||
*/
|
||||
private fun loadHtmlAndObtainBotguard(context: Context) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "loadHtmlAndObtainBotguard() called")
|
||||
}
|
||||
|
||||
disposables.add(
|
||||
Single.fromCallable {
|
||||
val html = context.assets.open("po_token.html").bufferedReader()
|
||||
.use { it.readText() }
|
||||
return@fromCallable html
|
||||
}
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{ html ->
|
||||
webView.loadDataWithBaseURL(
|
||||
"https://www.youtube.com",
|
||||
html.replaceFirst(
|
||||
"</script>",
|
||||
// calls downloadAndRunBotguard() when the page has finished loading
|
||||
"\n$JS_INTERFACE.downloadAndRunBotguard()</script>"
|
||||
),
|
||||
"text/html",
|
||||
"utf-8",
|
||||
null,
|
||||
)
|
||||
},
|
||||
this::onInitializationErrorCloseAndCancel
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Called during initialization by the JavaScript snippet appended to the HTML page content in
|
||||
* [loadHtmlAndObtainBotguard] after the WebView content has been loaded.
|
||||
*/
|
||||
@JavascriptInterface
|
||||
fun downloadAndRunBotguard() {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "downloadAndRunBotguard() called")
|
||||
}
|
||||
|
||||
makeBotguardServiceRequest(
|
||||
"https://www.youtube.com/api/jnn/v1/Create",
|
||||
"[ \"$REQUEST_KEY\" ]",
|
||||
) { responseBody ->
|
||||
val parsedChallengeData = parseChallengeData(responseBody)
|
||||
webView.evaluateJavascript(
|
||||
"""try {
|
||||
data = $parsedChallengeData
|
||||
runBotGuard(data).then(function (result) {
|
||||
this.webPoSignalOutput = result.webPoSignalOutput
|
||||
$JS_INTERFACE.onRunBotguardResult(result.botguardResponse)
|
||||
}, function (error) {
|
||||
$JS_INTERFACE.onJsInitializationError(error + "\n" + error.stack)
|
||||
})
|
||||
} catch (error) {
|
||||
$JS_INTERFACE.onJsInitializationError(error + "\n" + error.stack)
|
||||
}""",
|
||||
null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called during initialization by the JavaScript snippets from either
|
||||
* [downloadAndRunBotguard] or [onRunBotguardResult].
|
||||
*/
|
||||
@JavascriptInterface
|
||||
fun onJsInitializationError(error: String) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e(TAG, "Initialization error from JavaScript: $error")
|
||||
}
|
||||
onInitializationErrorCloseAndCancel(buildExceptionForJsError(error))
|
||||
}
|
||||
|
||||
/**
|
||||
* Called during initialization by the JavaScript snippet from [downloadAndRunBotguard] after
|
||||
* obtaining the BotGuard execution output [botguardResponse].
|
||||
*/
|
||||
@JavascriptInterface
|
||||
fun onRunBotguardResult(botguardResponse: String) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "botguardResponse: $botguardResponse")
|
||||
}
|
||||
makeBotguardServiceRequest(
|
||||
"https://www.youtube.com/api/jnn/v1/GenerateIT",
|
||||
"[ \"$REQUEST_KEY\", \"$botguardResponse\" ]",
|
||||
) { responseBody ->
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "GenerateIT response: $responseBody")
|
||||
}
|
||||
val (integrityToken, expirationTimeInSeconds) = parseIntegrityTokenData(responseBody)
|
||||
|
||||
// leave 10 minutes of margin just to be sure
|
||||
expirationInstant = Instant.now().plusSeconds(expirationTimeInSeconds - 600)
|
||||
|
||||
webView.evaluateJavascript(
|
||||
"this.integrityToken = $integrityToken"
|
||||
) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "initialization finished, expiration=${expirationTimeInSeconds}s")
|
||||
}
|
||||
generatorEmitter.onSuccess(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
//endregion
|
||||
|
||||
//region Obtaining poTokens
|
||||
override fun generatePoToken(identifier: String): Single<String> =
|
||||
Single.create { emitter ->
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "generatePoToken() called with identifier $identifier")
|
||||
}
|
||||
runOnMainThread(emitter) {
|
||||
addPoTokenEmitter(identifier, emitter)
|
||||
val u8Identifier = stringToU8(identifier)
|
||||
webView.evaluateJavascript(
|
||||
"""try {
|
||||
identifier = "$identifier"
|
||||
u8Identifier = $u8Identifier
|
||||
poTokenU8 = obtainPoToken(webPoSignalOutput, integrityToken, u8Identifier)
|
||||
poTokenU8String = ""
|
||||
for (i = 0; i < poTokenU8.length; i++) {
|
||||
if (i != 0) poTokenU8String += ","
|
||||
poTokenU8String += poTokenU8[i]
|
||||
}
|
||||
$JS_INTERFACE.onObtainPoTokenResult(identifier, poTokenU8String)
|
||||
} catch (error) {
|
||||
$JS_INTERFACE.onObtainPoTokenError(identifier, error + "\n" + error.stack)
|
||||
}""",
|
||||
) {}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by the JavaScript snippet from [generatePoToken] when an error occurs in calling the
|
||||
* JavaScript `obtainPoToken()` function.
|
||||
*/
|
||||
@JavascriptInterface
|
||||
fun onObtainPoTokenError(identifier: String, error: String) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e(TAG, "obtainPoToken error from JavaScript: $error")
|
||||
}
|
||||
popPoTokenEmitter(identifier)?.onError(buildExceptionForJsError(error))
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by the JavaScript snippet from [generatePoToken] with the original identifier and the
|
||||
* result of the JavaScript `obtainPoToken()` function.
|
||||
*/
|
||||
@JavascriptInterface
|
||||
fun onObtainPoTokenResult(identifier: String, poTokenU8: String) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "Generated poToken (before decoding): identifier=$identifier poTokenU8=$poTokenU8")
|
||||
}
|
||||
val poToken = try {
|
||||
u8ToBase64(poTokenU8)
|
||||
} catch (t: Throwable) {
|
||||
popPoTokenEmitter(identifier)?.onError(t)
|
||||
return
|
||||
}
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "Generated poToken: identifier=$identifier poToken=$poToken")
|
||||
}
|
||||
popPoTokenEmitter(identifier)?.onSuccess(poToken)
|
||||
}
|
||||
|
||||
override fun isExpired(): Boolean {
|
||||
return Instant.now().isAfter(expirationInstant)
|
||||
}
|
||||
//endregion
|
||||
|
||||
//region Handling multiple emitters
|
||||
/**
|
||||
* Adds the ([identifier], [emitter]) pair to the [poTokenEmitters] list. This makes it so that
|
||||
* multiple poToken requests can be generated invparallel, and the results will be notified to
|
||||
* the right emitters.
|
||||
*/
|
||||
private fun addPoTokenEmitter(identifier: String, emitter: SingleEmitter<String>) {
|
||||
synchronized(poTokenEmitters) {
|
||||
poTokenEmitters.add(Pair(identifier, emitter))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts and removes from the [poTokenEmitters] list a [SingleEmitter] based on its
|
||||
* [identifier]. The emitter is supposed to be used immediately after to either signal a success
|
||||
* or an error.
|
||||
*/
|
||||
private fun popPoTokenEmitter(identifier: String): SingleEmitter<String>? {
|
||||
return synchronized(poTokenEmitters) {
|
||||
poTokenEmitters.indexOfFirst { it.first == identifier }.takeIf { it >= 0 }?.let {
|
||||
poTokenEmitters.removeAt(it).second
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears [poTokenEmitters] and returns its previous contents. The emitters are supposed to be
|
||||
* used immediately after to either signal a success or an error.
|
||||
*/
|
||||
private fun popAllPoTokenEmitters(): List<Pair<String, SingleEmitter<String>>> {
|
||||
return synchronized(poTokenEmitters) {
|
||||
val result = poTokenEmitters.toList()
|
||||
poTokenEmitters.clear()
|
||||
result
|
||||
}
|
||||
}
|
||||
//endregion
|
||||
|
||||
//region Utils
|
||||
/**
|
||||
* Makes a POST request to [url] with the given [data] by setting the correct headers. Calls
|
||||
* [onInitializationErrorCloseAndCancel] in case of any network errors and also if the response
|
||||
* does not have HTTP code 200, therefore this is supposed to be used only during
|
||||
* initialization. Calls [handleResponseBody] with the response body if the response is
|
||||
* successful. The request is performed in the background and a disposable is added to
|
||||
* [disposables].
|
||||
*/
|
||||
private fun makeBotguardServiceRequest(
|
||||
url: String,
|
||||
data: String,
|
||||
handleResponseBody: (String) -> Unit,
|
||||
) {
|
||||
disposables.add(
|
||||
Single.fromCallable {
|
||||
val connection = URL(url).openConnection() as HttpURLConnection
|
||||
connection.requestMethod = "POST"
|
||||
connection.doOutput = true
|
||||
|
||||
// headers
|
||||
connection.setRequestProperty("User-Agent", USER_AGENT)
|
||||
connection.setRequestProperty("Accept", "application/json")
|
||||
connection.setRequestProperty("Content-Type", "application/json+protobuf")
|
||||
connection.setRequestProperty("x-goog-api-key", GOOGLE_API_KEY)
|
||||
connection.setRequestProperty("x-user-agent", "grpc-web-javascript/0.1")
|
||||
|
||||
// body
|
||||
connection.outputStream.use { os ->
|
||||
os.writer().write(data);
|
||||
}
|
||||
|
||||
// response
|
||||
|
||||
return@fromCallable connection
|
||||
}
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{ connection ->
|
||||
val httpCode = connection.responseCode
|
||||
if (httpCode != 200) {
|
||||
onInitializationErrorCloseAndCancel(
|
||||
PoTokenException("Invalid response code: $httpCode")
|
||||
)
|
||||
return@subscribe
|
||||
}
|
||||
|
||||
val responseBody = connection.inputStream.bufferedReader().use { it.readText() }
|
||||
connection.disconnect()
|
||||
|
||||
handleResponseBody(responseBody)
|
||||
},
|
||||
this::onInitializationErrorCloseAndCancel
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles any error happening during initialization, releasing resources and sending the error
|
||||
* to [generatorEmitter].
|
||||
*/
|
||||
private fun onInitializationErrorCloseAndCancel(error: Throwable) {
|
||||
runOnMainThread(generatorEmitter) {
|
||||
close()
|
||||
generatorEmitter.onError(error)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Releases all [webView] and [disposables] resources.
|
||||
*/
|
||||
override fun close() {
|
||||
disposables.dispose()
|
||||
|
||||
webView.clearHistory()
|
||||
// clears RAM cache and disk cache (globally for all WebViews)
|
||||
webView.clearCache(true)
|
||||
|
||||
// ensures that the WebView isn't doing anything when destroying it
|
||||
webView.loadUrl("about:blank")
|
||||
|
||||
webView.onPause()
|
||||
webView.removeAllViews()
|
||||
webView.destroy()
|
||||
}
|
||||
//endregion
|
||||
|
||||
companion object : PoTokenGenerator.Factory {
|
||||
private val TAG = PoTokenWebView::class.simpleName
|
||||
// Public API key used by BotGuard, which has been got by looking at BotGuard requests
|
||||
private const val GOOGLE_API_KEY = "AIzaSyDyT5W0Jh49F30Pqqtyfdf7pDLFKLJoAnw" // NOSONAR
|
||||
private const val REQUEST_KEY = "O43z0dpjhgX20SCx4KAo"
|
||||
private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
|
||||
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3"
|
||||
private const val JS_INTERFACE = "PoTokenWebView"
|
||||
|
||||
override fun newPoTokenGenerator(context: Context): Single<PoTokenGenerator> =
|
||||
Single.create { emitter ->
|
||||
runOnMainThread(emitter) {
|
||||
val potWv = PoTokenWebView(context, emitter)
|
||||
potWv.loadHtmlAndObtainBotguard(context)
|
||||
emitter.setDisposable(potWv.disposables)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs [runnable] on the main thread using `Handler(Looper.getMainLooper()).post()`, and
|
||||
* if the `post` fails emits an error on [emitterIfPostFails].
|
||||
*/
|
||||
private fun runOnMainThread(
|
||||
emitterIfPostFails: SingleEmitter<out Any>,
|
||||
runnable: Runnable,
|
||||
) {
|
||||
if (!Handler(Looper.getMainLooper()).post(runnable)) {
|
||||
emitterIfPostFails.onError(PoTokenException("Could not run on main thread"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import static app.revanced.extension.shared.spoof.ClientType.VISIONOS;
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -26,7 +27,8 @@ public class SpoofVideoStreamsPatch {
|
||||
IPADOS
|
||||
);
|
||||
|
||||
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse(
|
||||
availableClients, Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
|
||||
ClientType client = Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setPreferredClient(client);
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients, client);
|
||||
}
|
||||
}
|
||||
@@ -230,7 +230,6 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting HIDE_REPORT_BUTTON = new BooleanSetting("revanced_hide_report_button", FALSE);
|
||||
public static final BooleanSetting HIDE_SAVE_BUTTON = new BooleanSetting("revanced_hide_save_button", FALSE);
|
||||
public static final BooleanSetting HIDE_SHARE_BUTTON = new BooleanSetting("revanced_hide_share_button", FALSE);
|
||||
public static final BooleanSetting HIDE_SHOP_BUTTON = new BooleanSetting("revanced_hide_shop_button", FALSE);
|
||||
public static final BooleanSetting HIDE_STOP_ADS_BUTTON = new BooleanSetting("revanced_hide_stop_ads_button", TRUE);
|
||||
public static final BooleanSetting HIDE_THANKS_BUTTON = new BooleanSetting("revanced_hide_thanks_button", TRUE);
|
||||
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
package app.revanced.extension.youtube.settings.preference;
|
||||
|
||||
import static app.revanced.extension.shared.StringRef.str;
|
||||
|
||||
import android.content.Context;
|
||||
import android.preference.SwitchPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings({"deprecation", "unused"})
|
||||
public class ForceOriginalAudioSwitchPreference extends SwitchPreference {
|
||||
|
||||
// Spoof stream patch is not included, or is not currently spoofing to Android Studio.
|
||||
private static final boolean available = !SpoofVideoStreamsPatch.isPatchIncluded()
|
||||
|| !(Settings.SPOOF_VIDEO_STREAMS.get()
|
||||
&& Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_CREATOR);
|
||||
|
||||
{
|
||||
if (!available) {
|
||||
// Show why force audio is not available.
|
||||
String summary = str("revanced_force_original_audio_not_available");
|
||||
super.setSummary(summary);
|
||||
super.setSummaryOn(summary);
|
||||
super.setSummaryOff(summary);
|
||||
super.setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
public ForceOriginalAudioSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
}
|
||||
public ForceOriginalAudioSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
}
|
||||
public ForceOriginalAudioSwitchPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
public ForceOriginalAudioSwitchPreference(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean enabled) {
|
||||
if (!available) {
|
||||
return;
|
||||
}
|
||||
|
||||
super.setEnabled(enabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSummary(CharSequence summary) {
|
||||
if (!available) {
|
||||
return;
|
||||
}
|
||||
|
||||
super.setSummary(summary);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,19 +83,19 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
|
||||
|
||||
String summary = str(clientType == ClientType.IPADOS
|
||||
? "revanced_spoof_video_streams_about_ipados_summary"
|
||||
// Same base side effects for Android VR, Android Studio, and visionOS.
|
||||
// visionOS has same base side effects as Android VR.
|
||||
: "revanced_spoof_video_streams_about_android_summary");
|
||||
|
||||
if (clientType == ClientType.IPADOS) {
|
||||
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1");
|
||||
summary = str("revanced_spoof_video_streams_about_no_av1")
|
||||
+ '\n' + summary;
|
||||
} else if (clientType == ClientType.VISIONOS) {
|
||||
summary = str("revanced_spoof_video_streams_about_experimental")
|
||||
+ '\n' + summary
|
||||
+ '\n' + str("revanced_spoof_video_streams_about_no_av1")
|
||||
+ '\n' + str("revanced_spoof_video_streams_about_kids_videos");
|
||||
} else if (clientType == ClientType.ANDROID_CREATOR) {
|
||||
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1")
|
||||
+ '\n' + str("revanced_spoof_video_streams_about_kids_videos");
|
||||
} else {
|
||||
summary += '\n' + str("revanced_spoof_video_streams_about_kids_videos");
|
||||
}
|
||||
|
||||
setSummary(summary);
|
||||
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.39.1-dev.1
|
||||
version = 5.38.1-dev.2
|
||||
|
||||
@@ -150,6 +150,7 @@ internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint {
|
||||
}
|
||||
|
||||
internal val patchIncludedExtensionMethodFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC)
|
||||
returns("Z")
|
||||
parameters()
|
||||
custom { method, classDef ->
|
||||
|
||||
@@ -49,7 +49,6 @@ val hideButtonsPatch = resourcePatch(
|
||||
SwitchPreference("revanced_hide_report_button"),
|
||||
SwitchPreference("revanced_hide_save_button"),
|
||||
SwitchPreference("revanced_hide_share_button"),
|
||||
SwitchPreference("revanced_hide_shop_button"),
|
||||
SwitchPreference("revanced_hide_stop_ads_button"),
|
||||
SwitchPreference("revanced_hide_thanks_button"),
|
||||
)
|
||||
|
||||
@@ -57,10 +57,7 @@ val forceOriginalAudioPatch = bytecodePatch(
|
||||
addResources("youtube", "video.audio.forceOriginalAudioPatch")
|
||||
|
||||
PreferenceScreen.VIDEO.addPreferences(
|
||||
SwitchPreference(
|
||||
key = "revanced_force_original_audio",
|
||||
tag = "app.revanced.extension.youtube.settings.preference.ForceOriginalAudioSwitchPreference"
|
||||
)
|
||||
SwitchPreference("revanced_force_original_audio")
|
||||
)
|
||||
|
||||
mainActivityOnCreateFingerprint.method.addInstruction(
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">إخفاء المقطع</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">تم إخفاء زر إنشاء مقطع</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">يتم عرض زر إنشاء مقطع</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">إخفاء المتجر</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">زر المتجر مخفي</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">زر المتجر معروض</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">إخفاء حفظ</string>
|
||||
<string name="revanced_hide_save_button_summary_on">زر الحفظ مخفي</string>
|
||||
@@ -1476,7 +1472,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">فرض لغة الصوت الأصلية</string>
|
||||
<string name="revanced_force_original_audio_summary_on">استخدام لغة الصوت الأصلية</string>
|
||||
<string name="revanced_force_original_audio_summary_off">استخدام الصوت الافتراضي</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">لاستخدام هذه الميزة، غيّر \'Spoof Video Streams\' إلى iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,7 +621,6 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz
|
||||
<string name="revanced_hide_clip_button_title">Kəsmə/ gizlət</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Kəsmə düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Kəsmə düyməsi göstərilir</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Saxlayın-ı Gizlət</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Saxlayın düyməsi gizlidir</string>
|
||||
@@ -1472,7 +1471,8 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
|
||||
<string name="revanced_force_original_audio_title">Orijinal səs dilini zorla</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Orijinal səs dilini istifadə</string>
|
||||
<string name="revanced_force_original_audio_summary_off">İlkin səs istifadəsi</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Bu xüsusiyyəti istifadə etmək üçün \"Saxta video yayımların\" iOS TV-yə dəyiş</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">Схаваць кліп</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Кнопка кліпа схавана</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Паказана кнопка кліпа</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Схаваць Краму</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Кнопка \"Крама\" схавана</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Кнопка \"Крама\" паказана</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Схаваць \"Захаваць\"</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Кнопка \"Захаваць\" схавана</string>
|
||||
@@ -1477,7 +1473,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">Вымушаная арыгінальная мова аўдыё</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Выкарыстоўваць арыгінальную мову аўдыя</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Выкарыстанне аўдыё па змаўчанні</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Каб выкарыстоўваць гэту функцыю, змяніце параметр \"Падрабляць відэаструмені\" на iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">Бутон за създаване на клип</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Бутона за клип е скрит</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Бутона за клип се показва</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Скрий магазин</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Бутонът за магазин е скрит</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Бутонът за магазин е показан</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Скриване на Запазване</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Бутонът за запазване е скрит</string>
|
||||
@@ -1476,7 +1472,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">Принудително оригинално аудио език</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Използване на оригиналния език на аудиото</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Използване на аудио по подразбиране</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">За да използвате тази функция, сменете „Фалшифициране на видео потоци“ на iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -617,10 +617,6 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_clip_button_title">ক্লিপ লুকান</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">ক্লিপ বোতাম লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">ক্লিপ বোতাম প্রদর্শিত হয়েছে</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">শপ লুকান</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">শপ বাটন লুকানো আছে</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">শপ বাটন দেখানো আছে</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">সংরক্ষণ লুকান</string>
|
||||
<string name="revanced_hide_save_button_summary_on">সংরক্ষণ বোতাম লুকানো আছে</string>
|
||||
@@ -1472,7 +1468,8 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট
|
||||
<string name="revanced_force_original_audio_title">মূল অডিও ভাষা বলপূর্বক চালু করুন</string>
|
||||
<string name="revanced_force_original_audio_summary_on">মূল অডিও ভাষা ব্যবহার করা হচ্ছে</string>
|
||||
<string name="revanced_force_original_audio_summary_off">ডিফল্ট অডিও ব্যবহার করছে</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">এই বৈশিষ্ট্যটি ব্যবহার করতে, \'স্পুফ ভিডিও স্ট্রীম\' কে iOS TV-তে পরিবর্তন করুন</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky"</string>
|
||||
<string name="revanced_hide_clip_button_title">Skrýt Klip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Tlačítko Klip je skryto</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Tlačítko Klip je zobrazeno</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Skrýt Obchod</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Tlačítko Obchod je skryté</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Tlačítko Obchod je zobrazené</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Skrýt Uložit</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Tlačítko Uložit je skryté</string>
|
||||
@@ -1476,6 +1472,8 @@ Povolením této funkce lze odemknout vyšší kvality videa"</string>
|
||||
<string name="revanced_force_original_audio_title">Vynutit původní jazyk zvuku</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Použít původní jazyk zvuku</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Používání výchozího zvuku</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Chcete-li používat tuto funkci, změňte možnost „Zfalšovat datové proudy videa“ na iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen"</string>
|
||||
<string name="revanced_hide_clip_button_title">Skjul klip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Klip knappen er skjult</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Klip knappen er vist</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Skjul butik</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Butiksknappen er skjult</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Butiksknappen vises</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Skjul Gem</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Knappen \"Gem\" er skjult</string>
|
||||
@@ -1478,7 +1474,8 @@ Aktivering af dette kan låse op for højere videokvalitet"</string>
|
||||
<string name="revanced_force_original_audio_title">Tving originalt lydsprog</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Bruger originalt lydsprog</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Brug standard lyd</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">For at bruge denne funktion skal du ændre \"Spoof videostreams\" til iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -616,10 +616,6 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver
|
||||
<string name="revanced_hide_clip_button_title">Clip ausblenden</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Clip-Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Clip-Taste wird angezeigt</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Shop ausblenden</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Shop-Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Shop-Button wird angezeigt</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Speichern ausblenden</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Schaltfläche \"Speichern\" ist ausgeblendet</string>
|
||||
@@ -1471,7 +1467,8 @@ Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet w
|
||||
<string name="revanced_force_original_audio_title">Original Audio erzwingen</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Original-Audiosprache verwenden</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Standardaudio verwenden</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Um diese Funktion zu nutzen, ändere \"Video-Streams fälschen\" zu iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -623,10 +623,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">Κουμπί «Κλιπ»</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Εμφανίζεται</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Κουμπί «Αγορές»</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Εμφανίζεται</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Κουμπί «Αποθήκευση»</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Κρυμμένο</string>
|
||||
@@ -1475,7 +1471,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">Εξαναγκασμός αρχικής γλώσσας ήχου</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Χρησιμοποιείται η αρχική γλώσσα ήχου</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Χρησιμοποιείται ο προεπιλεγμένος ήχος</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Για να χρησιμοποιήσετε αυτήν τη λειτουργία, αλλάξτε την επιλογή «Παραποίηση ροών βίντεο» σε iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"</s
|
||||
<string name="revanced_hide_clip_button_title">Ocultar Recortar</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">El botón del recortar está oculto</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Se muestra el botón de recortar</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Ocultar Tienda</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">El botón de la Tienda está oculto</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">El botón de la Tienda es visible</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Ocultar Guardar</string>
|
||||
<string name="revanced_hide_save_button_summary_on">El botón de Guardar está oculto</string>
|
||||
@@ -1467,7 +1463,8 @@ Habilitar esto puede desbloquear calidades de vídeo más altas"</string>
|
||||
<string name="revanced_force_original_audio_title">Forzar idioma de audio original</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Usar el idioma de audio original</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Utilizando audio predeterminado</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Para usar esta función, cambia \"Falsificar transmisiones de vídeo\" a iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"</st
|
||||
<string name="revanced_hide_clip_button_title">Peida Lõik</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Lõigu nupp on peidetud</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Lõigu nupp on nähtav</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Peida pood</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Poe nupp on peidetud</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Poe nupp on nähtaval</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Peida Salvesta</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Nupp Salvesta on peidetud</string>
|
||||
@@ -1476,7 +1472,8 @@ Selle lubamine võib avada kõrgema video kvaliteedi"</string>
|
||||
<string name="revanced_force_original_audio_title">Sunni originaalheli keel</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Algse helikeele kasutamine</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Kasutan vaikeheli</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Selle funktsiooni kasutamiseks muuda valik „Pettemanööver videovoogudele” iOS TV peale</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -147,7 +147,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu
|
||||
<string name="revanced_hide_clip_button_title">Piilota Klippi</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Klippi-painike on piilotettu</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Klippi-painike näytetään</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Piilota Ostokset</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Kauppa-painike on piilotettu</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Kauppa-painike näytetään</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Piilota Tallenna</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Tallenna-painike on piilotettu</string>
|
||||
@@ -1476,7 +1472,8 @@ Tämä voi avata korkealaatuisemmat videot"</string>
|
||||
<string name="revanced_force_original_audio_title">Pakota alkuperäinen äänen kieli</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Käytetään alkuperäistä ääntä</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Käytetään oletusääntä</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Voit käyttää tätä ominaisuutta muuttamalla \"Naamioi videovirrat\" iOS TV:ksi</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc
|
||||
<string name="revanced_hide_clip_button_title">Itago ang Clip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Nakatago ang clip button</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Ang pindutan ng clip ay ipinapakita</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Itago ang Tindahan</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Ang pindutan ng Tindahan ay nakatago</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Ang pindutan ng Tindahan ay nakikita</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Itago ang I-save</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Nakatago ang button ng I-save</string>
|
||||
@@ -1474,7 +1470,8 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video"</st
|
||||
<string name="revanced_force_original_audio_title">Pilitin ang orihinal na wika ng audio</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Ginagamit ang orihinal na wika ng audio</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Gumagamit ng default audio</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Para magamit ang feature na ito, palitan ang \'Magpanggap na video stream\' sa iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"</st
|
||||
<string name="revanced_hide_clip_button_title">Masquer \"Clip\"</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Le bouton Clip est masqué</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Le bouton Clip est affiché</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Masquer la Boutique</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Le bouton Boutique est masqué</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Le bouton Boutique est affiché</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Masquer \"Enregistrer\"</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Le bouton Enregistrer est masqué</string>
|
||||
@@ -1477,7 +1473,8 @@ Activer cette option peut déverrouiller des qualités vidéo supérieures"</str
|
||||
<string name="revanced_force_original_audio_title">Forcer la langue audio d\'origine</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Utilisation de la langue audio d\'origine</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Utilisation de l\'audio par défaut</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Pour utiliser cette fonctionnalité, définissez \"Falsifier les flux vidéo\" sur iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile
|
||||
<string name="revanced_hide_clip_button_title">Folaigh Gearrthóg</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Tá an cnaipe gearrthóg i bhfolach</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Taispeántar cnaipe gearrthóg</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Folaigh Siopa</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Tá cnaipe an tSiopa i bhfolach</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Tá cnaipe an tSiopa ar taispeáint</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Folaigh Sábháil</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Tá cnaipe sábhála i bhfolach</string>
|
||||
@@ -1476,7 +1472,8 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil"</string>
|
||||
<string name="revanced_force_original_audio_title">Fórsaigh teanga bhunaidh na fuaime</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Ag úsáid teanga bhunaidh na fuaime</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Ag úsáid fuaim réamhshocraithe</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Chun an ghné seo a úsáid, athraigh \'Sruthanna físeáin bhréige\' go iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"</st
|
||||
<string name="revanced_hide_clip_button_title">Vágás gomb elrejtése</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">A klip gomb el van rejtve</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">A klip gomb látható</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Bolt elrejtése</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">A Bolt gomb elrejtve</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">A Bolt gomb látható</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Mentés elrejtése</string>
|
||||
<string name="revanced_hide_save_button_summary_on">A mentés gomb rejtett</string>
|
||||
@@ -1473,7 +1469,8 @@ Ez a beállítás lehetővé teszi a magasabb videóminőségek feloldását"</s
|
||||
<string name="revanced_force_original_audio_title">Eredeti hang kikényszerítése</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Eredeti hang használata a hang nyelvén</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Alapértelmezett hang használata</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">A funkció használatához módosítsa a „Videófolyamok hamisítása” beállítást iOS TV-re</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_clip_button_title">Թաքցնել Clip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Clip կոճակը թաքցված է</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Clip կոճակը ցուցադրվում է</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Թաքցնել Խանութը</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Խանութի կոճակը թաքնված է</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Խանութի կոճակը ցուցադրվում է</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Թաքցնել պահելը</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Պահելու կոճակը թաքցված է</string>
|
||||
@@ -1477,7 +1473,8 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի
|
||||
<string name="revanced_force_original_audio_title">Բնօրինակ ձայն օգտագործել լեզուն</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Օգտագործելով ձայնային օրիգինալ լեզուն</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Վերջնական ձայն օգտագործվում է</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Այս գործառույթն օգտագործելու համար փոխեք «Կեղծել տեսահոսքերը» iOS TV-ի</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -98,7 +98,7 @@ Jika Anda adalah pengguna YouTube Premium, setelan ini mungkin tidak diperlukan"
|
||||
<string name="revanced_spoof_video_streams_summary_off">"Aliran video tidak dipalsukan
|
||||
|
||||
Pemutaran mungkin tidak berfungsi"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Menonaktifkan pengaturan ini mungkin menyebabkan masalah pemutaran.</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Mematikan pengaturan ini dapat menyebabkan masalah pemutaran.</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_title">Klien bawaan</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
@@ -621,10 +621,6 @@ Menyesuaikan volume dengan mengusap secara vertikal di sisi kanan layar"</string
|
||||
<string name="revanced_hide_clip_button_title">Sembunyikan Klip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Tombol klip disembunyikan</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Tombol klip ditampilkan</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Sembunyikan Toko</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Tombol Toko disembunyikan</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Tombol Toko ditampilkan</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Sembunyikan Simpan</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Tombol Simpan disembunyikan</string>
|
||||
@@ -1475,7 +1471,8 @@ Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi"</string>
|
||||
<string name="revanced_force_original_audio_title">Paksa bahasa audio asli</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Menggunakan bahasa audio asli</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Menggunakan audio bawaan</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo"</string>
|
||||
<string name="revanced_hide_clip_button_title">Nascondi Clip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Il pulsante Clip è nascosto</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Il pulsante Clip è visibile</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Nascondi Acquisti</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Il pulsante Acquisti è nascosto</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Il pulsante Acquisti è visibile</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Nascondi Salva</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Il pulsante Salva è nascosto</string>
|
||||
@@ -1475,7 +1471,8 @@ Abilitare questa opzione può sbloccare qualità video più elevate"</string>
|
||||
<string name="revanced_force_original_audio_title">Forza la lingua audio originale</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Utilizza la lingua audio originale</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Utilizzo audio predefinito</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Per utilizzare questa funzionalità, cambia \'Spoof video streams\' in iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">הסתר קליפ</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">לחצן קליפ מוסתר</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">לחצן קליפ מוצג</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">הסתר \'חנות\'</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">הלחצן \'חנות\' מוסתר</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">הלחצן \'חנות\' מוצג</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">הסתר \'שמירה\'</string>
|
||||
<string name="revanced_hide_save_button_summary_on">הלחצן \'שמירה\' מוסתר</string>
|
||||
@@ -1478,7 +1474,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">כפה שפת שמע מקורית</string>
|
||||
<string name="revanced_force_original_audio_summary_on">שימוש בשפת שמע מקורית</string>
|
||||
<string name="revanced_force_original_audio_summary_off">שימוש בשמע ברירת מחדל</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">כדי להשתמש בתכונה זו, שנה את \'זייף זרמי וידאו\' ל-iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -90,15 +90,15 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
<string name="revanced_spoof_video_streams_screen_title">動画ストリームを偽装</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します</string>
|
||||
<string name="revanced_spoof_video_streams_screen_title">動画ストリームを偽装</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">再生の問題を防ぐためにクライアントのビデオストリームを偽装する</string>
|
||||
<string name="revanced_spoof_video_streams_title">動画ストリームを偽装</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">"動画ストリームは偽装されます
|
||||
|
||||
YouTube Premium ユーザーの場合、この設定は必要ない可能性があります"</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">"動画ストリームは偽装されません
|
||||
<string name="revanced_spoof_video_streams_summary_off">"ビデオストリームが偽装されていません
|
||||
|
||||
再生に失敗する可能性があります"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">この設定を無効にすると、動画の再生に失敗するようになる可能性があります。</string>
|
||||
再生できない可能性があります"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">この設定をオフにすると、再生の問題が発生する可能性があります。</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_title">デフォルトのクライアント</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
@@ -623,10 +623,6 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_hide_clip_button_title">クリップボタンを非表示</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">クリップボタンは表示されません</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">クリップボタンは表示されます</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">「ショップ」を非表示</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">ショップボタンは表示されません</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">ショップボタンは表示されます</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">「保存」を非表示にする</string>
|
||||
<string name="revanced_hide_save_button_summary_on">「保存」ボタンは表示されません</string>
|
||||
@@ -1478,7 +1474,8 @@ Automotive レイアウト
|
||||
<string name="revanced_force_original_audio_title">オリジナルの音声を強制的に使用</string>
|
||||
<string name="revanced_force_original_audio_summary_on">オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用しません</string>
|
||||
<string name="revanced_force_original_audio_summary_off">アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックを使用する場合があります</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">この機能を使用するには、「動画ストリームを偽装」のクライアントを iOS TV に変更してください</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
@@ -1556,7 +1553,7 @@ Automotive レイアウト
|
||||
<string name="revanced_spoof_video_streams_about_android_title">Android クライアントの副作用</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• 「音声トラック」がフライアウト メニューに表示されない
|
||||
• 「一定音量」が利用できない"</string>
|
||||
<string name="revanced_spoof_video_streams_about_ipados_summary">• 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある</string>
|
||||
<string name="revanced_spoof_video_streams_about_ipados_summary">• 動画は1:00で停止する場合があります。または、一部の地域では利用できない場合があります。</string>
|
||||
<string name="revanced_spoof_video_streams_about_experimental">• 実験的なクライアントであり、いつでも動作しなくなる可能性がある</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• AV1 コーデックが利用できない</string>
|
||||
<string name="revanced_spoof_video_streams_about_kids_videos">• ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある</string>
|
||||
@@ -1565,14 +1562,14 @@ Automotive レイアウト
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">統計情報に現在のクライアントは表示されません</string>
|
||||
<string name="revanced_spoof_video_streams_language_title">音声ストリームの言語</string>
|
||||
<!-- 'Force original audio language' should use the same text as revanced_force_original_audio_title -->
|
||||
<string name="revanced_spoof_video_streams_language_not_available">特定の音声言語を選択するには、「オリジナルの音声を強制的に使用」を無効にしてください</string>
|
||||
<string name="revanced_spoof_video_streams_language_not_available">特定の音声言語を選択するには、「元の音声言語を強制」をオフにしてください</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="music">
|
||||
<patch id="misc.settings.settingsPatch">
|
||||
<string name="revanced_settings_music_screen_0_about_title">ReVanced について</string>
|
||||
<string name="revanced_settings_music_screen_1_ads_title">広告</string>
|
||||
<string name="revanced_settings_music_screen_2_general_title">全般</string>
|
||||
<string name="revanced_settings_music_screen_2_general_title">その他</string>
|
||||
<string name="revanced_settings_music_screen_3_player_title">プレーヤー</string>
|
||||
<string name="revanced_settings_music_screen_4_misc_title">その他</string>
|
||||
</patch>
|
||||
@@ -1582,24 +1579,24 @@ Automotive レイアウト
|
||||
<string name="revanced_music_hide_video_ads_summary_off">動画広告は表示されます</string>
|
||||
</patch>
|
||||
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
|
||||
<string name="revanced_music_play_permanent_repeat_title">常時リピートを有効化</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_on">常時リピートは有効です\n\nリピート設定が保存され常時適用されます</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_off">常時リピートは無効です\n\nリピート設定は保存されません</string>
|
||||
<string name="revanced_music_play_permanent_repeat_title">永続リピートを有効にする</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_on">永続リピートが有効です</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_off">永続リピートが無効です</string>
|
||||
</patch>
|
||||
<patch id="layout.compactheader.hideCategoryBar">
|
||||
<string name="revanced_music_hide_category_bar_title">カテゴリバーを非表示</string>
|
||||
<string name="revanced_music_hide_category_bar_summary_on">カテゴリバーは表示されません</string>
|
||||
<string name="revanced_music_hide_category_bar_summary_on">カテゴリバーは非表示です</string>
|
||||
<string name="revanced_music_hide_category_bar_summary_off">カテゴリバーは表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.premium.hideGetPremiumPatch">
|
||||
<string name="revanced_music_hide_get_premium_label_title">「Music Premium に登録」ラベルを非表示</string>
|
||||
<string name="revanced_music_hide_get_premium_label_summary_on">ラベルは表示されません</string>
|
||||
<string name="revanced_music_hide_get_premium_label_title">「Get Music Premium」ラベルを非表示</string>
|
||||
<string name="revanced_music_hide_get_premium_label_summary_on">ラベルは非表示です</string>
|
||||
<string name="revanced_music_hide_get_premium_label_summary_off">ラベルは表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.upgradebutton.hideUpgradeButtonPatch">
|
||||
<string name="revanced_music_hide_upgrade_button_title">アップグレード ボタンを非表示</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_on">ボタンは表示されません</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_off">ボタンは表示されます</string>
|
||||
<string name="revanced_music_hide_upgrade_button_title">アップグレードボタンを非表示</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_on">「メンバーになる」ボタンは表示されません</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_off">「メンバーになる」ボタンは表示されます</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="twitch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -115,7 +115,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -619,10 +619,6 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니
|
||||
<string name="revanced_hide_clip_button_title">클립 버튼 숨기기</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">클립 버튼이 숨겨집니다</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">클립 버튼이 표시됩니다</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">쇼핑 버튼 숨기기</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">쇼핑 버튼이 숨겨집니다</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">쇼핑 버튼이 표시됩니다</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">저장 버튼 숨기기</string>
|
||||
<string name="revanced_hide_save_button_summary_on">저장 버튼이 숨겨집니다</string>
|
||||
@@ -1483,7 +1479,8 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요"</string>
|
||||
<string name="revanced_force_original_audio_title">원본 오디오 스트림 언어 강제로 활성화하기</string>
|
||||
<string name="revanced_force_original_audio_summary_on">원본 오디오 스트림 언어를 사용 중입니다</string>
|
||||
<string name="revanced_force_original_audio_summary_off">기본 오디오 스트림 언어를 사용 중입니다</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">이 기능을 사용하려면, \'동영상 스트림 변경하기\'에서 기본 클라이언트를 iOS TV로 변경하세요</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje"</string>
|
||||
<string name="revanced_hide_clip_button_title">Slėpti Iškarpą</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Iškarpos mygtukas paslėptas</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Iškarpos mygtukas rodomas</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Slėpti parduotuvę</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Parduotuvės mygtukas paslėptas</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Parduotuvės mygtukas rodomas</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Slėpti Išsaugoti</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Išsaugojimo mygtukas paslėptas</string>
|
||||
@@ -1477,7 +1473,8 @@ Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti v
|
||||
<string name="revanced_force_original_audio_title">Priversti originalią garso kalbą</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Naudojama originali garso kalba</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Naudojamas numatytasis garsas</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Norėdami naudoti šią funkciją, pakeiskite „Klastoti vaizdo srautus“ į iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē"</string>
|
||||
<string name="revanced_hide_clip_button_title">Paslēpt Izgriezt</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Izgriezt poga ir paslēpta</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Izgriezt poga ir redzama</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Paslēpt veikalu</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Veikala poga ir paslēpta</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Veikala poga ir redzama</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Paslēpt Saglabāt</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Poga Saglabāt ir paslēpta</string>
|
||||
@@ -1477,7 +1473,8 @@ Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atsk
|
||||
<string name="revanced_force_original_audio_title">Piespiest oriģinālo audio valodu</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Izmantot oriģinālo audio valodu</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Tiek izmantots noklusējuma audio</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Lai izmantotu šo funkciju, nomainiet \"Video straumju viltošana\" uz iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -102,7 +102,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"</
|
||||
<string name="revanced_hide_clip_button_title">Fragment verbergen</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Fragment knop is verborgen</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Fragment knop wordt weergegeven</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Winkel verbergen</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Winkelknop is verborgen</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Winkelknop is weergegeven</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Opslaan verbergen</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Knop \"Opslaan\" is verborgen</string>
|
||||
@@ -1474,7 +1470,8 @@ Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen"</string>
|
||||
<string name="revanced_force_original_audio_title">Forceer de originele audiotaal</string>
|
||||
<string name="revanced_force_original_audio_summary_on">De oorspronkelijke audiotaal gebruiken</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Standaard audio gebruiken</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Om deze functie te gebruiken, wijzig je \'Videostreams vervalsen\' in iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -617,10 +617,6 @@ Dostosuj głośność, przesuwając pionowo po prawej stronie ekranu"</string>
|
||||
<string name="revanced_hide_clip_button_title">Przycisk od klipów</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Przycisk tworzenia klipów jest ukryty</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Przycisk tworzenia klipów jest widoczny</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Ukryj Sklep</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Przycisk Sklep jest ukryty</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Przycisk Sklep jest widoczny</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Ukryj Zapisz</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Przycisk Zapisz jest ukryty</string>
|
||||
@@ -1472,7 +1468,8 @@ Włączenie tego może odblokować wyższe jakości wideo"</string>
|
||||
<string name="revanced_force_original_audio_title">Wymuś język oryginalnego dźwięku</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Używanie oryginalnego języka audio</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Używanie domyślnego dźwięku</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Aby użyć tej funkcji, zmień opcję \"Fałszuj strumienie wideo\" na iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Ajuste o volume deslizando verticalmente no lado direito da tela"</string>
|
||||
<string name="revanced_hide_clip_button_title">Ocultar Clipe</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Botão clipe está oculto</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">O botão clipe é mostrado</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Ocultar Loja</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">O botão Loja está oculto</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">O botão Loja é exibido</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Ocultar Salvar</string>
|
||||
<string name="revanced_hide_save_button_summary_on">O botão Salvar está oculto</string>
|
||||
@@ -1473,7 +1469,8 @@ Habilitar isso pode desbloquear qualidades de vídeo mais altas"</string>
|
||||
<string name="revanced_force_original_audio_title">Forçar idioma do áudio original</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Usar o idioma original do áudio</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Usando áudio padrão</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Para usar este recurso, altere \"Spoof video streams\" para iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Ajuste o volume deslizando verticalmente no lado direito da tela"</string>
|
||||
<string name="revanced_hide_clip_button_title">Esconder clipe</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">O botão do clipe está escondido</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Botão de corte é visível</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Ocultar Loja</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">O botão Loja está oculto</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">O botão Loja está exibido</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Ocultar Salvar</string>
|
||||
<string name="revanced_hide_save_button_summary_on">O botão Salvar está oculto</string>
|
||||
@@ -1476,7 +1472,8 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"</str
|
||||
<string name="revanced_force_original_audio_title">Forçar idioma original do áudio</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Usando o idioma de áudio original</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Usando o áudio predefinido</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Para usar este recurso, altere \"Spoof video streams\" para iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului"</string>
|
||||
<string name="revanced_hide_clip_button_title">Ascunde Clip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Butonul clip este ascuns</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Butonul clipului este afișat</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Ascunde Magazinul</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Butonul Magazin este ascuns</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Butonul Magazin este afișat</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Ascunde Salvare</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Butonul Salvare este ascuns</string>
|
||||
@@ -1475,7 +1471,8 @@ Activarea acestei opțiuni poate debloca calități video mai mari"</string>
|
||||
<string name="revanced_force_original_audio_title">Forțează limba audio originală</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Folosind limba audio originală</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Utilizează audio implicit</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Pentru a utiliza această funcție, schimbați „Spoof video streams” în iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">Скрыть кнопку \"Создать клип\"</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Кнопка \"Создать клип\" под плеером скрыта</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Кнопка \"Создать клип\" под плеером показана</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Скрыть магазин</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Кнопка \"Магазин\" в Shorts скрыта</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Кнопка \"Магазин\" в Shorts показана</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Скрыть кнопку \"Сохранить\"</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Кнопка \"Сохранить\" скрыта</string>
|
||||
@@ -1483,7 +1479,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">Принудительно оригинальная звуковая дорожка</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Используется оригинальная звуковая дорожка</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Используется звуковая дорожка по умолчанию</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Для использования данной опции измените подмену видеопотока на тип клиента iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -619,10 +619,6 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky"</string>
|
||||
<string name="revanced_hide_clip_button_title">Skryť klip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Tlačidlo klipu je skryté</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Zobrazí sa tlačidlo klipu</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Skryť obchod</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Tlačidlo Obchod je skryté</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Tlačidlo Obchod je zobrazené</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Skryť Uložiť</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Tlačidlo Uložiť je skryté</string>
|
||||
@@ -1469,7 +1465,8 @@ Povolením tejto možnosti môžete odomknúť vyššie kvality videa"</string>
|
||||
<string name="revanced_force_original_audio_title">Vynútiť pôvodný jazyk zvuku</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Používa sa pôvodný jazyk zvuku</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Používanie predvoleného zvuku</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Ak chcete používať túto funkciu, zmeňte možnosť „Zosmiešniť streamy videa“ na iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona"</string>
|
||||
<string name="revanced_hide_clip_button_title">Skrij Izrezek</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Gumb Izrezek je skrit</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Gumb Izrezek je prikazan</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Skrij Trgovino</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Gumb Trgovina je skrit</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Gumb Trgovina je prikazan</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Skrij Shrani</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Gumb Shrani je skrit</string>
|
||||
@@ -1476,7 +1472,8 @@ Omogočanje tega lahko odklene višje kakovosti videa"</string>
|
||||
<string name="revanced_force_original_audio_title">Izsili izvirni jezik zvoka</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Uporabi izvirni jezik zvoka</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Uporaba privzetega zvoka</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Če želite uporabiti to funkcijo, spremenite »Spoof video streams« v iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra
|
||||
<string name="revanced_hide_clip_button_title">Fsheh \"Klip\"</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Butoni \"Klip\" është i fshehur</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Butoni \"Klip\" është i dukshëm</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Fshih Dyqanin</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Butoni i dyqanit është fshehur</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Butoni i dyqanit është shfaqur</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Fshih Ruaj</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Butoni Ruaj është i fshehur</string>
|
||||
@@ -1474,7 +1470,8 @@ Aktivizimi i kësaj mund të zhbllokojë cilësi më të larta video"</string>
|
||||
<string name="revanced_force_original_audio_title">Forco gjuhën origjinale të audios</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Duke përdorur gjuhën origjinale audio</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Përdorimi i Zërit Parazgjedhur</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Për ta përdorur këtë veçori, ndryshoni \'Rrjedhat e videos tallëse\' në iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"</string
|
||||
<string name="revanced_hide_clip_button_title">Sakrij dugme „Klip”</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Dugme „Klip” je skriveno</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Dugme „Klip” je prikazano</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Sakrij Prodavnicu</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Dugme „Prodavnica” je skriveno</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Dugme „Prodavnica” je prikazano</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Sakrij dugme „Sačuvaj”</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Dugme „Sačuvaj” je skriveno</string>
|
||||
@@ -1475,7 +1471,8 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa"</string>
|
||||
<string name="revanced_force_original_audio_title">Prisili originalni jezik zvuka</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Korišćenje originalnog jezika zvuka</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Korišćenje podrazumevanog zvuka</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Da biste koristili ovu funkciju, promenite opciju „Lažirani video strimovi” na iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">Сакриј дугме „Клип”</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Дугме „Клип” је скривено</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Дугме „Клип” је приказано</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Сакриј дугме „Продавница”</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Дугме „Продавница” је скривено</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Дугме „Продавница” је приказано</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Сакриј дугме „Сачувај”</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Дугме „Сачувај” је скривено</string>
|
||||
@@ -1478,7 +1474,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">Присили оригинални језик звука</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Коришћење оригиналног језика звука</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Коришћење подразумеваног звука</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Да бисте користили ову функцију, промените „Лажирани видео стримови” на iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Justera volymen genom att svepa vertikalt till höger på skärmen"</string>
|
||||
<string name="revanced_hide_clip_button_title">Dölj Klipp</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Knappen Klipp är dold</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Knappen Klipp visas</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Dölj Butik</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Knappen Butik är dold</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Knappen Butik visas</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Dölj Spara</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Knappen Spara är dold</string>
|
||||
@@ -1475,7 +1471,8 @@ Om du aktiverar detta kan högre videokvaliteter låsas upp"</string>
|
||||
<string name="revanced_force_original_audio_title">Tvinga ursprungligt ljudspråk</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Använder ursprungligt ljudspråk</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Använder standardljud</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Om du vill använda den här funktionen ändrar du \"Förfalska videoströmmar\" till iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -619,10 +619,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">ซ่อนคลิป</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">ปุ่มคลิปถูกซ่อน</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">ปุ่มคลิปถูกแสดง</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">ซ่อนร้านค้า</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">ปุ่มร้านค้าถูกซ่อน</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">ปุ่มร้านค้าถูกแสดง</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">ซ่อนบันทึก</string>
|
||||
<string name="revanced_hide_save_button_summary_on">ปุ่มบันทึกถูกซ่อน</string>
|
||||
@@ -1478,7 +1474,8 @@ User id ของคุณเหมือนกับรหัสผ่าน
|
||||
<string name="revanced_force_original_audio_title">บังคับใช้ภาษาเสียงต้นฉบับ</string>
|
||||
<string name="revanced_force_original_audio_summary_on">กำลังใช้ภาษาเสียงต้นฉบับ</string>
|
||||
<string name="revanced_force_original_audio_summary_off">กำลังใช้ออดิโอเริ่มต้น</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">หากต้องการใช้คุณสมบัตินี้ ให้เปลี่ยน \'ปลอมแปลงสตรีมวิดีโอ\' เป็น iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Ekranın sağ tarafında dikey olarak kaydırarak sesi ayarlayın"</string>
|
||||
<string name="revanced_hide_clip_button_title">Klip\'i gizle</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Klip düğmesi gizli</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Klip düğmesi görünür</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Alışverişi gizle</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Alışveriş düğmesi gizli</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Alışveriş düğmesi görünür</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Kaydet\'i Gizle</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Kaydet düğmesi gizli</string>
|
||||
@@ -1483,7 +1479,8 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir"</string>
|
||||
<string name="revanced_force_original_audio_title">Orijinal ses dilini zorla</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Orijinal ses dili kullanılıyor</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Varsayılan ses kullanılıyor</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını iOS TV olarak değiştirin</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">Приховати \"Створити кліп\"</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Кнопку \"Створити кліп\" приховано</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Кнопка \"Створити кліп\" показується</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Приховати Магазин</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Кнопку магазину приховано</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Кнопка магазину показується</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Приховати \"Зберегти\"</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Кнопку \"Зберегти\" приховано</string>
|
||||
@@ -1475,7 +1471,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">Примусово оригінальна мова звукової доріжки</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Використовується оригінальна мова звукової доріжки</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Використовується стандартна (регіональна) мова звукової доріжки</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Щоб використовувати цю функцію, змініть клієнт \"Підробки відеопотоків\" на iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -621,10 +621,6 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được
|
||||
<string name="revanced_hide_clip_button_title">Ẩn Tạo đoạn video</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Nút tạo đoạn video đã bị ẩn</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Nút tạo đoạn video được hiển thị</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Ẩn Cửa hàng</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Nút Cửa hàng đã bị ẩn</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Nút Cửa hàng được hiển thị</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Ẩn Lưu</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Nút Lưu đã bị ẩn</string>
|
||||
@@ -1482,7 +1478,8 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"</str
|
||||
<string name="revanced_force_original_audio_title">Buộc ngôn ngữ âm thanh gốc</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Đang dùng ngôn ngữ âm thanh gốc</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Đang dùng âm thanh mặc định</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">Để dùng tính năng này, hãy đổi \'Giả mạo luồng video\' thành iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">隐藏「剪辑」按钮</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">剪辑按钮已隐藏</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">剪辑按钮已显示</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">隐藏购物</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">购物按钮已隐藏</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">购物按钮已显示</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">隐藏保存</string>
|
||||
<string name="revanced_hide_save_button_summary_on">保存按钮已隐藏</string>
|
||||
@@ -1481,7 +1477,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">强制使用原始音频语言</string>
|
||||
<string name="revanced_force_original_audio_summary_on">使用原始音频语言</string>
|
||||
<string name="revanced_force_original_audio_summary_off">正在使用默认音频</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">要使用此功能,请将“欺骗视频流”更改为 iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,10 +621,6 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_clip_button_title">隱藏剪輯片段</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">已隱藏「剪輯片段」按鈕</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">已顯示「剪輯片段」按鈕</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">隱藏「商店」</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">「商店」按鈕已隱藏</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">「商店」按鈕已顯示</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">隱藏「儲存」</string>
|
||||
<string name="revanced_hide_save_button_summary_on">「儲存」按鈕已隱藏</string>
|
||||
@@ -1486,7 +1482,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">強制使用原始音訊語言</string>
|
||||
<string name="revanced_force_original_audio_summary_on">正在使用原始音訊語言</string>
|
||||
<string name="revanced_force_original_audio_summary_off">使用預設音訊</string>
|
||||
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">如要使用這項功能,請將「偽裝視訊串流」變更為 iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,7 +100,6 @@ Second \"item\" text"</string>
|
||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||
This button only shows if the user ip is from specific region such as the USA or EU. -->
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||
|
||||
@@ -138,13 +138,11 @@
|
||||
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
||||
<string-array name="revanced_spoof_video_streams_client_type_entries">
|
||||
<item>Android VR</item>
|
||||
<item>Android Studio</item>
|
||||
<item>visionOS</item>
|
||||
<item>iPadOS</item>
|
||||
</string-array>
|
||||
<string-array name="revanced_spoof_video_streams_client_type_entry_values">
|
||||
<item>ANDROID_VR_1_61_48</item>
|
||||
<item>ANDROID_CREATOR</item>
|
||||
<item>VISIONOS</item>
|
||||
<item>IPADOS</item>
|
||||
</string-array>
|
||||
|
||||
@@ -684,10 +684,6 @@ Adjust volume by swiping vertically on the right side of the screen"</string>
|
||||
<string name="revanced_hide_clip_button_title">Hide Clip</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">Clip button is hidden</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">Clip button is shown</string>
|
||||
<!-- 'Shop' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_shop_button_title">Hide Shop</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Shop button is hidden</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Shop button is shown</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">Hide Save</string>
|
||||
<string name="revanced_hide_save_button_summary_on">Save button is hidden</string>
|
||||
@@ -1555,7 +1551,7 @@ Enabling this can unlock higher video qualities"</string>
|
||||
<string name="revanced_force_original_audio_summary_on">Using original audio language</string>
|
||||
<string name="revanced_force_original_audio_summary_off">Using default audio</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_force_original_audio_not_available">To use this feature, change \'Spoof video streams\' to any client except Android Studio</string>
|
||||
<string name="revanced_force_original_audio_not_available">To use this feature, change \'Spoof video streams\' to iOS TV</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
Reference in New Issue
Block a user