mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-17 00:03:57 +00:00
Compare commits
31 Commits
v5.38.0-de
...
v5.40.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb1d07fd98 | ||
|
|
651d358096 | ||
|
|
0d15c5f338 | ||
|
|
5c7c8b5364 | ||
|
|
729997ec3e | ||
|
|
767f1e3695 | ||
|
|
7857876551 | ||
|
|
04057c6e56 | ||
|
|
8ba9a19ade | ||
|
|
6862200a28 | ||
|
|
dfff3d7c0a | ||
|
|
e6cce85541 | ||
|
|
8502eb8eac | ||
|
|
0652c56d0d | ||
|
|
b7026b7086 | ||
|
|
fa4f422a15 | ||
|
|
38e0cbd724 | ||
|
|
0bdebd927d | ||
|
|
3eac25cf7f | ||
|
|
c9f741e616 | ||
|
|
cba44ccfc8 | ||
|
|
a84db7be7f | ||
|
|
2520129ace | ||
|
|
7eeffd3392 | ||
|
|
6c3391164e | ||
|
|
0b8b46c73e | ||
|
|
cbe576bc38 | ||
|
|
3a29f2a805 | ||
|
|
50069c7e05 | ||
|
|
2e9c9dc244 | ||
|
|
56166896d9 |
102
CHANGELOG.md
102
CHANGELOG.md
@@ -1,3 +1,105 @@
|
||||
# [5.40.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.4...v5.40.0-dev.5) (2025-09-20)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube Music:** Add `Hide cast button` and `Navigation bar` patches ([#5934](https://github.com/ReVanced/revanced-patches/issues/5934)) ([651d358](https://github.com/ReVanced/revanced-patches/commit/651d3580967a252b57cbf4afbba02d6a4601ccfe))
|
||||
|
||||
# [5.40.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.3...v5.40.0-dev.4) (2025-09-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Spoof video streams:** Resolve occasional playback stuttering ([5c7c8b5](https://github.com/ReVanced/revanced-patches/commit/5c7c8b536416ec53cd98f7d59d11850aa1b70f11))
|
||||
|
||||
# [5.40.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.2...v5.40.0-dev.3) (2025-09-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Instagram - Limit feed to followed profiles:** Change patch to default off ([767f1e3](https://github.com/ReVanced/revanced-patches/commit/767f1e3695327bdbc4daea8b50a80d4c0a38456a))
|
||||
|
||||
# [5.40.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.40.0-dev.1...v5.40.0-dev.2) (2025-09-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Instagram:** Add `Limit feed to followed profiles` patch ([#5908](https://github.com/ReVanced/revanced-patches/issues/5908)) ([8ba9a19](https://github.com/ReVanced/revanced-patches/commit/8ba9a19ade24c5fe9bd6d4e49772b7663522780e))
|
||||
|
||||
# [5.40.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.39.1-dev.1...v5.40.0-dev.1) (2025-09-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Viber - Hide ads:** Support latest app target ([#5863](https://github.com/ReVanced/revanced-patches/issues/5863)) ([e6cce85](https://github.com/ReVanced/revanced-patches/commit/e6cce8554116df3c0ea6dbb7440c59c9e73d8334))
|
||||
|
||||
## [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)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube Music - Spoof video streams:** Remove iPadOS client ([7eeffd3](https://github.com/ReVanced/revanced-patches/commit/7eeffd3392c57555342173103d3a417c038d0970))
|
||||
|
||||
## [5.38.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.38.0...v5.38.1-dev.1) (2025-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Do not use Android Creator for livestreams ([cbe576b](https://github.com/ReVanced/revanced-patches/commit/cbe576bc384ef5f5ee2fa341147925ed0dff568b))
|
||||
|
||||
# [5.38.0](https://github.com/ReVanced/revanced-patches/compare/v5.37.0...v5.38.0) (2025-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Instagram - Hide navigation buttons:** Support v397.1.0.52.81 ([#5855](https://github.com/ReVanced/revanced-patches/issues/5855)) ([f11d1ef](https://github.com/ReVanced/revanced-patches/commit/f11d1ef9907082512f139d4ab0e2e9f707de7e48))
|
||||
* **Spoof video streams:** Remove Android TV and iOS TV clients, add experimental VisionOS, add temporary fix for `Force original audio` to work with any spoof client ([#5861](https://github.com/ReVanced/revanced-patches/issues/5861)) ([abe3943](https://github.com/ReVanced/revanced-patches/commit/abe3943f98fd86dcd74c7e07cf65d3c7fc24fef9))
|
||||
* **YouTube - Spoof video streams:** Show settings summary if `Force original audio` is enabled ([3776dda](https://github.com/ReVanced/revanced-patches/commit/3776dda710a7780717b7e6f2cdc1333ab67b92fc))
|
||||
* **YouTube Music - Spoof video streams:** Fix playback issues when using a cellular network ([fa04c8e](https://github.com/ReVanced/revanced-patches/commit/fa04c8eecfbdd0b6ed082b464ca9032536d71762))
|
||||
* **YouTube Music:** Use correct light/dark mode settings UI ([1475643](https://github.com/ReVanced/revanced-patches/commit/1475643f84e9ee4af2ba360a2274001ff1570dad))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Instagram:** Add `Hide explore feed` patch ([#5856](https://github.com/ReVanced/revanced-patches/issues/5856)) ([1d65887](https://github.com/ReVanced/revanced-patches/commit/1d65887e015a067196f5a84db486fff355c96596))
|
||||
* **YouTube - Spoof video streams:** Add iPadOS client ([2726231](https://github.com/ReVanced/revanced-patches/commit/2726231404384d87f101d825e10a17c944e8f1bd))
|
||||
* **YouTube Music:** Add `Settings` patch ([#5838](https://github.com/ReVanced/revanced-patches/issues/5838)) ([5e20bd8](https://github.com/ReVanced/revanced-patches/commit/5e20bd80f138d7ca94f18857194c46e489c435dc))
|
||||
|
||||
# [5.38.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.38.0-dev.4...v5.38.0-dev.5) (2025-09-16)
|
||||
|
||||
|
||||
|
||||
3
extensions/instagram/build.gradle.kts
Normal file
3
extensions/instagram/build.gradle.kts
Normal file
@@ -0,0 +1,3 @@
|
||||
dependencies {
|
||||
compileOnly(project(":extensions:shared:library"))
|
||||
}
|
||||
1
extensions/instagram/src/main/AndroidManifest.xml
Normal file
1
extensions/instagram/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1 @@
|
||||
<manifest/>
|
||||
@@ -0,0 +1,18 @@
|
||||
package app.revanced.extension.instagram.feed;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class LimitFeedToFollowedProfiles {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static Map<String, String> setFollowingHeader(Map<String, String> requestHeaderMap) {
|
||||
// Create new map as original is unmodifiable.
|
||||
Map<String, String> patchedRequestHeaderMap = new HashMap<>(requestHeaderMap);
|
||||
patchedRequestHeaderMap.put("pagination_source", "following");
|
||||
return patchedRequestHeaderMap;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package app.revanced.extension.music.patches;
|
||||
|
||||
import static app.revanced.extension.shared.Utils.hideViewBy0dpUnderCondition;
|
||||
|
||||
import android.view.View;
|
||||
import app.revanced.extension.music.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class HideCastButtonPatch {
|
||||
|
||||
/**
|
||||
* Injection point
|
||||
*/
|
||||
public static int hideCastButton(int original) {
|
||||
return Settings.HIDE_CAST_BUTTON.get() ? View.GONE : original;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point
|
||||
*/
|
||||
public static void hideCastButton(View view) {
|
||||
hideViewBy0dpUnderCondition(Settings.HIDE_CAST_BUTTON.get(), view);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package app.revanced.extension.music.patches;
|
||||
|
||||
import static app.revanced.extension.shared.Utils.hideViewUnderCondition;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.revanced.extension.music.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class NavigationBarPatch {
|
||||
@NonNull
|
||||
private static String lastYTNavigationEnumName = "";
|
||||
|
||||
public static void setLastAppNavigationEnum(@Nullable Enum<?> ytNavigationEnumName) {
|
||||
if (ytNavigationEnumName != null) {
|
||||
lastYTNavigationEnumName = ytNavigationEnumName.name();
|
||||
}
|
||||
}
|
||||
|
||||
public static void hideNavigationLabel(TextView textview) {
|
||||
hideViewUnderCondition(Settings.HIDE_NAVIGATION_BAR_LABEL.get(), textview);
|
||||
}
|
||||
|
||||
public static void hideNavigationButton(@NonNull View view) {
|
||||
// Hide entire navigation bar.
|
||||
if (Settings.HIDE_NAVIGATION_BAR.get() && view.getParent() != null) {
|
||||
hideViewUnderCondition(true, (View) view.getParent());
|
||||
return;
|
||||
}
|
||||
|
||||
// Hide navigation buttons based on their type.
|
||||
for (NavigationButton button : NavigationButton.values()) {
|
||||
if (button.ytEnumNames.equals(lastYTNavigationEnumName)) {
|
||||
hideViewUnderCondition(button.hidden, view);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum NavigationButton {
|
||||
HOME(
|
||||
"TAB_HOME",
|
||||
Settings.HIDE_NAVIGATION_BAR_HOME_BUTTON.get()
|
||||
),
|
||||
SAMPLES(
|
||||
"TAB_SAMPLES",
|
||||
Settings.HIDE_NAVIGATION_BAR_SAMPLES_BUTTON.get()
|
||||
),
|
||||
EXPLORE(
|
||||
"TAB_EXPLORE",
|
||||
Settings.HIDE_NAVIGATION_BAR_EXPLORE_BUTTON.get()
|
||||
),
|
||||
LIBRARY(
|
||||
"LIBRARY_MUSIC",
|
||||
Settings.HIDE_NAVIGATION_BAR_LIBRARY_BUTTON.get()
|
||||
),
|
||||
UPGRADE(
|
||||
"TAB_MUSIC_PREMIUM",
|
||||
Settings.HIDE_NAVIGATION_BAR_UPGRADE_BUTTON.get()
|
||||
);
|
||||
|
||||
private final String ytEnumNames;
|
||||
private final boolean hidden;
|
||||
|
||||
NavigationButton(@NonNull String ytEnumNames, boolean hidden) {
|
||||
this.ytEnumNames = ytEnumNames;
|
||||
this.hidden = hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.extension.music.patches.spoof;
|
||||
|
||||
import static app.revanced.extension.music.settings.Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE;
|
||||
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_43_32;
|
||||
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48;
|
||||
import static app.revanced.extension.shared.spoof.ClientType.VISIONOS;
|
||||
@@ -7,7 +8,6 @@ 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,6 +22,7 @@ public class SpoofVideoStreamsPatch {
|
||||
VISIONOS
|
||||
);
|
||||
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients, ANDROID_VR_1_43_32);
|
||||
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse(
|
||||
availableClients, SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,12 @@ package app.revanced.extension.music.settings;
|
||||
import static java.lang.Boolean.FALSE;
|
||||
import static java.lang.Boolean.TRUE;
|
||||
|
||||
import static app.revanced.extension.shared.settings.Setting.parent;
|
||||
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||
import app.revanced.extension.shared.settings.EnumSetting;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
|
||||
public class Settings extends BaseSettings {
|
||||
|
||||
@@ -14,8 +18,20 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting HIDE_UPGRADE_BUTTON = new BooleanSetting("revanced_music_hide_upgrade_button", TRUE, true);
|
||||
|
||||
// General
|
||||
public static final BooleanSetting HIDE_CAST_BUTTON = new BooleanSetting("revanced_music_hide_cast_button", FALSE, false);
|
||||
public static final BooleanSetting HIDE_CATEGORY_BAR = new BooleanSetting("revanced_music_hide_category_bar", FALSE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR_HOME_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_home_button", FALSE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR_SAMPLES_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_samples_button", FALSE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR_EXPLORE_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_explore_button", FALSE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR_LIBRARY_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_library_button", FALSE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR_UPGRADE_BUTTON = new BooleanSetting("revanced_music_hide_navigation_bar_upgrade_button", TRUE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR = new BooleanSetting("revanced_music_hide_navigation_bar", FALSE, true);
|
||||
public static final BooleanSetting HIDE_NAVIGATION_BAR_LABEL = new BooleanSetting("revanced_music_hide_navigation_bar_labels", FALSE, true);
|
||||
|
||||
// Player
|
||||
public static final BooleanSetting PERMANENT_REPEAT = new BooleanSetting("revanced_music_play_permanent_repeat", FALSE, true);
|
||||
|
||||
// Miscellaneous
|
||||
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type",
|
||||
ClientType.ANDROID_VR_1_43_32, true, parent(SPOOF_VIDEO_STREAMS));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
package app.revanced.extension.youtube;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
package app.revanced.extension.shared;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
@@ -39,7 +37,7 @@ public final class ByteTrieSearch extends TrieSearch<byte[]> {
|
||||
return replacement;
|
||||
}
|
||||
|
||||
public ByteTrieSearch(@NonNull byte[]... patterns) {
|
||||
public ByteTrieSearch(byte[]... patterns) {
|
||||
super(new ByteTrieNode(), patterns);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,4 @@
|
||||
package app.revanced.extension.youtube;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
package app.revanced.extension.shared;
|
||||
|
||||
/**
|
||||
* Text pattern searching using a prefix tree (trie).
|
||||
@@ -28,7 +26,7 @@ public final class StringTrieSearch extends TrieSearch<String> {
|
||||
}
|
||||
}
|
||||
|
||||
public StringTrieSearch(@NonNull String... patterns) {
|
||||
public StringTrieSearch(String... patterns) {
|
||||
super(new StringTrieNode(), patterns);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package app.revanced.extension.youtube;
|
||||
package app.revanced.extension.shared;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -57,11 +56,13 @@ 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);
|
||||
}
|
||||
@@ -136,7 +137,7 @@ public abstract class TrieSearch<T> {
|
||||
* @param patternLength Length of the pattern.
|
||||
* @param callback Callback, where a value of NULL indicates to always accept a pattern match.
|
||||
*/
|
||||
private void addPattern(@NonNull T pattern, int patternIndex, int patternLength,
|
||||
private void addPattern(T pattern, int patternIndex, int patternLength,
|
||||
@Nullable TriePatternMatchedCallback<T> callback) {
|
||||
if (patternIndex == patternLength) { // Reached the end of the pattern.
|
||||
if (endOfPatternCallback == null) {
|
||||
@@ -145,6 +146,7 @@ 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.
|
||||
@@ -159,6 +161,7 @@ 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];
|
||||
@@ -183,6 +186,7 @@ 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) {
|
||||
@@ -195,6 +199,7 @@ public abstract class TrieSearch<T> {
|
||||
if (collision) {
|
||||
continue;
|
||||
}
|
||||
|
||||
children = replacement;
|
||||
return;
|
||||
}
|
||||
@@ -234,6 +239,7 @@ 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;
|
||||
@@ -246,6 +252,7 @@ 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.
|
||||
@@ -278,9 +285,11 @@ 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) {
|
||||
@@ -308,13 +317,13 @@ public abstract class TrieSearch<T> {
|
||||
private final List<T> patterns = new ArrayList<>();
|
||||
|
||||
@SafeVarargs
|
||||
TrieSearch(@NonNull TrieNode<T> root, @NonNull T... patterns) {
|
||||
TrieSearch(TrieNode<T> root, T... patterns) {
|
||||
this.root = Objects.requireNonNull(root);
|
||||
addPatterns(patterns);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public final void addPatterns(@NonNull T... patterns) {
|
||||
public final void addPatterns(T... patterns) {
|
||||
for (T pattern : patterns) {
|
||||
addPattern(pattern);
|
||||
}
|
||||
@@ -325,7 +334,7 @@ public abstract class TrieSearch<T> {
|
||||
*
|
||||
* @param pattern Pattern to add. Calling this with a zero length pattern does nothing.
|
||||
*/
|
||||
public void addPattern(@NonNull T pattern) {
|
||||
public void addPattern(T pattern) {
|
||||
addPattern(pattern, root.getTextLength(pattern), null);
|
||||
}
|
||||
|
||||
@@ -333,31 +342,31 @@ public abstract class TrieSearch<T> {
|
||||
* @param pattern Pattern to add. Calling this with a zero length pattern does nothing.
|
||||
* @param callback Callback to determine if searching should halt when a match is found.
|
||||
*/
|
||||
public void addPattern(@NonNull T pattern, @NonNull TriePatternMatchedCallback<T> callback) {
|
||||
public void addPattern(T pattern, TriePatternMatchedCallback<T> callback) {
|
||||
addPattern(pattern, root.getTextLength(pattern), Objects.requireNonNull(callback));
|
||||
}
|
||||
|
||||
void addPattern(@NonNull T pattern, int patternLength, @Nullable TriePatternMatchedCallback<T> callback) {
|
||||
void addPattern(T pattern, int patternLength, @Nullable TriePatternMatchedCallback<T> callback) {
|
||||
if (patternLength == 0) return; // Nothing to match
|
||||
|
||||
patterns.add(pattern);
|
||||
root.addPattern(pattern, 0, patternLength, callback);
|
||||
}
|
||||
|
||||
public final boolean matches(@NonNull T textToSearch) {
|
||||
public final boolean matches(T textToSearch) {
|
||||
return matches(textToSearch, 0);
|
||||
}
|
||||
|
||||
public boolean matches(@NonNull T textToSearch, @NonNull Object callbackParameter) {
|
||||
public boolean matches(T textToSearch, Object callbackParameter) {
|
||||
return matches(textToSearch, 0, root.getTextLength(textToSearch),
|
||||
Objects.requireNonNull(callbackParameter));
|
||||
}
|
||||
|
||||
public boolean matches(@NonNull T textToSearch, int startIndex) {
|
||||
public boolean matches(T textToSearch, int startIndex) {
|
||||
return matches(textToSearch, startIndex, root.getTextLength(textToSearch));
|
||||
}
|
||||
|
||||
public final boolean matches(@NonNull T textToSearch, int startIndex, int endIndex) {
|
||||
public final boolean matches(T textToSearch, int startIndex, int endIndex) {
|
||||
return matches(textToSearch, startIndex, endIndex, null);
|
||||
}
|
||||
|
||||
@@ -370,11 +379,11 @@ public abstract class TrieSearch<T> {
|
||||
* @param callbackParameter Optional parameter passed to the callbacks.
|
||||
* @return If any pattern matched, and it's callback halted searching.
|
||||
*/
|
||||
public boolean matches(@NonNull T textToSearch, int startIndex, int endIndex, @Nullable Object callbackParameter) {
|
||||
public boolean matches(T textToSearch, int startIndex, int endIndex, @Nullable Object callbackParameter) {
|
||||
return matches(textToSearch, root.getTextLength(textToSearch), startIndex, endIndex, callbackParameter);
|
||||
}
|
||||
|
||||
private boolean matches(@NonNull T textToSearch, int textToSearchLength, int startIndex, int endIndex,
|
||||
private boolean matches(T textToSearch, int textToSearchLength, int startIndex, int endIndex,
|
||||
@Nullable Object callbackParameter) {
|
||||
if (endIndex > textToSearchLength) {
|
||||
throw new IllegalArgumentException("endIndex: " + endIndex
|
||||
@@ -5,9 +5,6 @@ import static java.lang.Boolean.TRUE;
|
||||
import static app.revanced.extension.shared.settings.Setting.parent;
|
||||
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
|
||||
/**
|
||||
* Settings shared across multiple apps.
|
||||
* <p>
|
||||
@@ -31,13 +28,4 @@ public class BaseSettings {
|
||||
public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
|
||||
public static final EnumSetting<AppLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AppLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
|
||||
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));
|
||||
// Client type must be last spoof setting due to cyclic references.
|
||||
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS));
|
||||
|
||||
static {
|
||||
if (SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.IOS_UNPLUGGED) {
|
||||
Logger.printInfo(() -> "Migrating from iOS Unplugged to iPadOS");
|
||||
SPOOF_VIDEO_STREAMS_CLIENT_TYPE.save(ClientType.IPADOS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@ public enum ClientType {
|
||||
"132.0.6808.3",
|
||||
"1.61.48",
|
||||
false,
|
||||
false,
|
||||
"Android VR 1.61"
|
||||
),
|
||||
/**
|
||||
@@ -50,7 +49,6 @@ public enum ClientType {
|
||||
Objects.requireNonNull(ANDROID_VR_1_61_48.buildId),
|
||||
"107.0.5284.2",
|
||||
"1.43.32",
|
||||
ANDROID_VR_1_61_48.requiresAuth,
|
||||
ANDROID_VR_1_61_48.useAuth,
|
||||
"Android VR 1.43"
|
||||
),
|
||||
@@ -71,8 +69,7 @@ public enum ClientType {
|
||||
"132.0.6779.0",
|
||||
"23.47.101",
|
||||
true,
|
||||
true,
|
||||
"Android Creator"
|
||||
"Android Studio"
|
||||
),
|
||||
/**
|
||||
* Internal YT client for an unreleased YT client. May stop working at any time.
|
||||
@@ -86,7 +83,6 @@ public enum ClientType {
|
||||
"0.1",
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15",
|
||||
false,
|
||||
false,
|
||||
"visionOS"
|
||||
),
|
||||
/**
|
||||
@@ -111,25 +107,7 @@ public enum ClientType {
|
||||
"19.22.3",
|
||||
"com.google.ios.youtube/19.22.3 (iPad7,6; U; CPU iPadOS 17_7_10 like Mac OS X; " + Locale.getDefault() + ")",
|
||||
false,
|
||||
false,
|
||||
"iPadOS"
|
||||
),
|
||||
/**
|
||||
* Obsolete and broken client. Here only to migrate data.
|
||||
*/
|
||||
@Deprecated
|
||||
IOS_UNPLUGGED(
|
||||
33,
|
||||
"IOS_UNPLUGGED",
|
||||
"Apple",
|
||||
"iPhone16,2",
|
||||
"iOS",
|
||||
"18.2.22C152",
|
||||
"8.49",
|
||||
"dummy user-agent",
|
||||
true,
|
||||
true,
|
||||
"iOS TV"
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -197,12 +175,6 @@ public enum ClientType {
|
||||
*/
|
||||
public final String clientVersion;
|
||||
|
||||
/**
|
||||
* If this client requires authentication and does not work
|
||||
* if logged out or in incognito mode.
|
||||
*/
|
||||
public final boolean requiresAuth;
|
||||
|
||||
/**
|
||||
* If the client should use authentication if available.
|
||||
*/
|
||||
@@ -227,7 +199,6 @@ public enum ClientType {
|
||||
@NonNull String buildId,
|
||||
@NonNull String cronetVersion,
|
||||
String clientVersion,
|
||||
boolean requiresAuth,
|
||||
boolean useAuth,
|
||||
String friendlyName) {
|
||||
this.id = id;
|
||||
@@ -241,7 +212,6 @@ public enum ClientType {
|
||||
this.buildId = buildId;
|
||||
this.cronetVersion = cronetVersion;
|
||||
this.clientVersion = clientVersion;
|
||||
this.requiresAuth = requiresAuth;
|
||||
this.useAuth = useAuth;
|
||||
this.friendlyName = friendlyName;
|
||||
|
||||
@@ -267,7 +237,6 @@ public enum ClientType {
|
||||
String osVersion,
|
||||
String clientVersion,
|
||||
String userAgent,
|
||||
boolean requiresAuth,
|
||||
boolean useAuth,
|
||||
String friendlyName) {
|
||||
this.id = id;
|
||||
@@ -278,7 +247,6 @@ public enum ClientType {
|
||||
this.osVersion = osVersion;
|
||||
this.clientVersion = clientVersion;
|
||||
this.userAgent = userAgent;
|
||||
this.requiresAuth = requiresAuth;
|
||||
this.useAuth = useAuth;
|
||||
this.friendlyName = friendlyName;
|
||||
this.packageName = null;
|
||||
|
||||
@@ -6,7 +6,9 @@ import android.text.TextUtils;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
@@ -17,14 +19,6 @@ import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class SpoofVideoStreamsPatch {
|
||||
private static final boolean SPOOF_STREAMING_DATA = BaseSettings.SPOOF_VIDEO_STREAMS.get();
|
||||
|
||||
private static final boolean FIX_HLS_CURRENT_TIME = SPOOF_STREAMING_DATA
|
||||
&& BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.VISIONOS;
|
||||
|
||||
@Nullable
|
||||
private static volatile AppLanguage languageOverride;
|
||||
|
||||
/**
|
||||
* Domain used for internet connectivity verification.
|
||||
* It has an empty response body and is only used to check for a 204 response code.
|
||||
@@ -40,15 +34,23 @@ public class SpoofVideoStreamsPatch {
|
||||
private static final String INTERNET_CONNECTION_CHECK_URI_STRING = "https://www.google.com/gen_204";
|
||||
private static final Uri INTERNET_CONNECTION_CHECK_URI = Uri.parse(INTERNET_CONNECTION_CHECK_URI_STRING);
|
||||
|
||||
private static final boolean SPOOF_STREAMING_DATA = BaseSettings.SPOOF_VIDEO_STREAMS.get();
|
||||
|
||||
@Nullable
|
||||
private static volatile AppLanguage languageOverride;
|
||||
|
||||
private static volatile ClientType preferredClient = ClientType.ANDROID_VR_1_61_48;
|
||||
|
||||
/**
|
||||
* @return If this patch was included during patching.
|
||||
*/
|
||||
private static boolean isPatchIncluded() {
|
||||
public static boolean isPatchIncluded() {
|
||||
return false; // Modified during patching.
|
||||
}
|
||||
|
||||
public static boolean spoofingToClientWithNoMultiAudioStreams() {
|
||||
return isPatchIncluded() && BaseSettings.SPOOF_VIDEO_STREAMS.get();
|
||||
@Nullable
|
||||
public static AppLanguage getLanguageOverride() {
|
||||
return languageOverride;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,9 +61,15 @@ public class SpoofVideoStreamsPatch {
|
||||
languageOverride = language;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static AppLanguage getLanguageOverride() {
|
||||
return languageOverride;
|
||||
public static void setClientsToUse(List<ClientType> availableClients, ClientType client) {
|
||||
preferredClient = Objects.requireNonNull(client);
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients, client);
|
||||
}
|
||||
|
||||
public static boolean spoofingToClientWithNoMultiAudioStreams() {
|
||||
return isPatchIncluded()
|
||||
&& SPOOF_STREAMING_DATA
|
||||
&& preferredClient != ClientType.IPADOS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,6 +97,35 @@ public class SpoofVideoStreamsPatch {
|
||||
return playerRequestUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*
|
||||
* Blocks /get_watch requests by returning an unreachable URI.
|
||||
* /att/get requests are used to obtain a PoToken challenge.
|
||||
* See: <a href="https://github.com/FreeTubeApp/FreeTube/blob/4b7208430bc1032019a35a35eb7c8a84987ddbd7/src/botGuardScript.js#L15">botGuardScript.js#L15</a>
|
||||
* <p>
|
||||
* Since the Spoof streaming data patch was implemented because a valid PoToken cannot be obtained,
|
||||
* Blocking /att/get requests are not a problem.
|
||||
*/
|
||||
public static String blockGetAttRequest(String originalUrlString) {
|
||||
if (SPOOF_STREAMING_DATA) {
|
||||
try {
|
||||
var originalUri = Uri.parse(originalUrlString);
|
||||
String path = originalUri.getPath();
|
||||
|
||||
if (path != null && path.contains("att/get")) {
|
||||
Logger.printDebug(() -> "Blocking 'att/get' by returning internet connection check uri");
|
||||
|
||||
return INTERNET_CONNECTION_CHECK_URI_STRING;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "blockGetAttRequest failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
return originalUrlString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* <p>
|
||||
@@ -122,7 +159,7 @@ public class SpoofVideoStreamsPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* Only invoked when playing a livestream on an iOS client.
|
||||
* Only invoked when playing a livestream on an Apple client.
|
||||
*/
|
||||
public static boolean fixHLSCurrentTime(boolean original) {
|
||||
if (!SPOOF_STREAMING_DATA) {
|
||||
@@ -131,6 +168,14 @@ public class SpoofVideoStreamsPatch {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Injection point.
|
||||
* Fix audio stuttering in YouTube Music.
|
||||
*/
|
||||
public static boolean disableSABR() {
|
||||
return SPOOF_STREAMING_DATA;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* Turns off a feature flag that interferes with spoofing.
|
||||
@@ -276,8 +321,7 @@ public class SpoofVideoStreamsPatch {
|
||||
public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability {
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
// Since all current clients are un-authenticated, this works for all spoof clients.
|
||||
return BaseSettings.SPOOF_VIDEO_STREAMS.get();
|
||||
return BaseSettings.SPOOF_VIDEO_STREAMS.get() && !preferredClient.useAuth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,10 +42,10 @@ final class PlayerRoutes {
|
||||
JSONObject context = new JSONObject();
|
||||
|
||||
AppLanguage language = SpoofVideoStreamsPatch.getLanguageOverride();
|
||||
if (language == null || BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ANDROID_VR_1_43_32) {
|
||||
if (language == null || clientType == ANDROID_VR_1_43_32) {
|
||||
// Force original audio has not overrode the language.
|
||||
// Or if YT has fallen over to the very last client (VR 1.43), then always
|
||||
// use the app language because forcing an audio stream of specific languages
|
||||
// Or if YT has fallen over to the last unauthenticated client (VR 1.43), then
|
||||
// always use the app language because forcing an audio stream of specific languages
|
||||
// can sometimes fail so it's better to try and load something rather than nothing.
|
||||
language = BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.extension.shared.spoof.requests;
|
||||
|
||||
import static app.revanced.extension.shared.ByteTrieSearch.convertStringsToBytes;
|
||||
import static app.revanced.extension.shared.spoof.requests.PlayerRoutes.GET_STREAMING_DATA;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -13,12 +14,18 @@ import java.net.HttpURLConnection;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import app.revanced.extension.shared.ByteTrieSearch;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
@@ -93,6 +100,16 @@ public class StreamingDataRequest {
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Strings found in the response if the video is a livestream.
|
||||
*/
|
||||
private static final ByteTrieSearch liveStreamBufferSearch = new ByteTrieSearch(
|
||||
convertStringsToBytes(
|
||||
"yt_live_broadcast",
|
||||
"yt_premiere_broadcast"
|
||||
)
|
||||
);
|
||||
|
||||
private static volatile ClientType lastSpoofedClientType;
|
||||
|
||||
public static String getLastSpoofedClientName() {
|
||||
@@ -160,7 +177,7 @@ public class StreamingDataRequest {
|
||||
}
|
||||
}
|
||||
|
||||
if (!authHeadersIncludes && clientType.requiresAuth) {
|
||||
if (!authHeadersIncludes && clientType.useAuth) {
|
||||
Logger.printDebug(() -> "Skipping client since user is not logged in: " + clientType
|
||||
+ " videoId: " + videoId);
|
||||
return null;
|
||||
@@ -221,9 +238,13 @@ public class StreamingDataRequest {
|
||||
while ((bytesRead = inputStream.read(buffer)) >= 0) {
|
||||
baos.write(buffer, 0, bytesRead);
|
||||
}
|
||||
lastSpoofedClientType = clientType;
|
||||
if (clientType == ClientType.ANDROID_CREATOR && liveStreamBufferSearch.matches(buffer)) {
|
||||
Logger.printDebug(() -> "Skipping Android Studio as video is a livestream: " + videoId);
|
||||
} else {
|
||||
lastSpoofedClientType = clientType;
|
||||
|
||||
return ByteBuffer.wrap(baos.toByteArray());
|
||||
return ByteBuffer.wrap(baos.toByteArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.shared.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
||||
@@ -74,6 +74,10 @@ 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"
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.ByteTrieSearch;
|
||||
import app.revanced.extension.shared.ByteTrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package app.revanced.extension.youtube.patches.components;
|
||||
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.shared.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||
import app.revanced.extension.youtube.ByteTrieSearch;
|
||||
import app.revanced.extension.shared.ByteTrieSearch;
|
||||
|
||||
abstract class FilterGroup<T> {
|
||||
final static class FilterGroupResult {
|
||||
|
||||
@@ -5,9 +5,9 @@ import androidx.annotation.NonNull;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import app.revanced.extension.youtube.ByteTrieSearch;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.TrieSearch;
|
||||
import app.revanced.extension.shared.ByteTrieSearch;
|
||||
import app.revanced.extension.shared.StringTrieSearch;
|
||||
import app.revanced.extension.shared.TrieSearch;
|
||||
|
||||
abstract class FilterGroupList<V, T extends FilterGroup<V>> implements Iterable<T> {
|
||||
|
||||
|
||||
@@ -14,9 +14,9 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.ByteTrieSearch;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.TrieSearch;
|
||||
import app.revanced.extension.shared.ByteTrieSearch;
|
||||
import app.revanced.extension.shared.StringTrieSearch;
|
||||
import app.revanced.extension.shared.TrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.NavigationBar;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.shared.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.patches.ChangeHeaderPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.NavigationBar;
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.shared.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
||||
@@ -12,7 +12,7 @@ import app.revanced.extension.youtube.patches.ReturnYouTubeDislikePatch;
|
||||
import app.revanced.extension.youtube.patches.VideoInformation;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.youtube.TrieSearch;
|
||||
import app.revanced.extension.shared.TrieSearch;
|
||||
|
||||
/**
|
||||
* Searches for video id's in the proto buffer of Shorts dislike.
|
||||
|
||||
@@ -8,9 +8,8 @@ import static app.revanced.extension.shared.spoof.ClientType.VISIONOS;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class SpoofVideoStreamsPatch {
|
||||
@@ -22,14 +21,12 @@ public class SpoofVideoStreamsPatch {
|
||||
List<ClientType> availableClients = List.of(
|
||||
ANDROID_VR_1_61_48,
|
||||
VISIONOS,
|
||||
IPADOS,
|
||||
// Creator must be next to last, because livestreams fetch successfully but don't playback.
|
||||
ANDROID_CREATOR,
|
||||
// VR 1.43 must be last as spoof streaming data handles it slightly differently.
|
||||
ANDROID_VR_1_43_32
|
||||
ANDROID_VR_1_43_32,
|
||||
IPADOS
|
||||
);
|
||||
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients,
|
||||
BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
|
||||
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse(
|
||||
availableClients, Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
|
||||
}
|
||||
}
|
||||
@@ -41,6 +41,7 @@ import app.revanced.extension.shared.settings.LongSetting;
|
||||
import app.revanced.extension.shared.settings.Setting;
|
||||
import app.revanced.extension.shared.settings.StringSetting;
|
||||
import app.revanced.extension.shared.settings.preference.SharedPrefCategory;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.DeArrowAvailability;
|
||||
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability;
|
||||
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption;
|
||||
@@ -229,6 +230,7 @@ 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);
|
||||
|
||||
@@ -356,6 +358,7 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting REMOVE_TRACKING_QUERY_PARAMETER = new BooleanSetting("revanced_remove_tracking_query_parameter", TRUE);
|
||||
public static final BooleanSetting SPOOF_DEVICE_DIMENSIONS = new BooleanSetting("revanced_spoof_device_dimensions", FALSE, true,
|
||||
"revanced_spoof_device_dimensions_user_dialog_message");
|
||||
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS));
|
||||
public static final BooleanSetting DEBUG_PROTOBUFFER = new BooleanSetting("revanced_debug_protobuffer", FALSE, false,
|
||||
"revanced_debug_protobuffer_user_dialog_message", parent(BaseSettings.DEBUG));
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.Setting;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings({"deprecation", "unused"})
|
||||
public class SpoofStreamingDataSideEffectsPreference extends Preference {
|
||||
@@ -69,7 +70,7 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
|
||||
}
|
||||
|
||||
private void updateUI() {
|
||||
ClientType clientType = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||
ClientType clientType = Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||
if (currentClientType == clientType) {
|
||||
return;
|
||||
}
|
||||
@@ -82,19 +83,19 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
|
||||
|
||||
String summary = str(clientType == ClientType.IPADOS
|
||||
? "revanced_spoof_video_streams_about_ipados_summary"
|
||||
// visionOS has same base side effects as Android VR.
|
||||
// Same base side effects for Android VR, Android Studio, and visionOS.
|
||||
: "revanced_spoof_video_streams_about_android_summary");
|
||||
|
||||
if (clientType == ClientType.IPADOS) {
|
||||
summary = str("revanced_spoof_video_streams_about_no_av1")
|
||||
+ '\n' + summary;
|
||||
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1");
|
||||
} 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 {
|
||||
summary += '\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");
|
||||
}
|
||||
|
||||
setSummary(summary);
|
||||
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.38.0-dev.5
|
||||
version = 5.40.0-dev.5
|
||||
|
||||
@@ -264,6 +264,10 @@ public final class app/revanced/patches/instagram/ads/HideAdsPatchKt {
|
||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/instagram/feed/LimitFeedToFollowedProfilesKt {
|
||||
public static final fun getLimitFeedToFollowedProfiles ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/instagram/hide/explore/HideExploreFeedKt {
|
||||
public static final fun getHideExportFeedPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -276,6 +280,10 @@ public final class app/revanced/patches/instagram/hide/stories/HideStoriesKt {
|
||||
public static final fun getHideStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/instagram/misc/extension/SharedExtensionPatchKt {
|
||||
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt {
|
||||
public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -364,10 +372,18 @@ public final class app/revanced/patches/music/interaction/permanentshuffle/Perma
|
||||
public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt {
|
||||
public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/compactheader/HideCategoryBarKt {
|
||||
public static final fun getHideCategoryBar ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/navigationbar/NavigationBarPatchKt {
|
||||
public static final fun getNavigationBarPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/premium/HideGetPremiumPatchKt {
|
||||
public static final fun getHideGetPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package app.revanced.patches.instagram.feed
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patcher.patch.BytecodePatchContext
|
||||
|
||||
internal val mainFeedRequestClassFingerprint = fingerprint {
|
||||
strings("Request{mReason=", ", mInstanceNumber=")
|
||||
}
|
||||
|
||||
context(BytecodePatchContext)
|
||||
internal val initMainFeedRequestFingerprint get() = fingerprint {
|
||||
custom { method, classDef ->
|
||||
method.name == "<init>" &&
|
||||
classDef == mainFeedRequestClassFingerprint.classDef
|
||||
}
|
||||
}
|
||||
|
||||
internal val mainFeedHeaderMapFinderFingerprint = fingerprint {
|
||||
strings("pagination_source", "FEED_REQUEST_SENT")
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package app.revanced.patches.instagram.feed
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/feed/LimitFeedToFollowedProfiles;"
|
||||
|
||||
@Suppress("unused")
|
||||
val limitFeedToFollowedProfiles = bytecodePatch(
|
||||
name = "Limit feed to followed profiles",
|
||||
description = "Filters the home feed to display only content from profiles you follow.",
|
||||
use = false
|
||||
) {
|
||||
compatibleWith("com.instagram.android")
|
||||
|
||||
dependsOn(sharedExtensionPatch)
|
||||
|
||||
execute {
|
||||
/**
|
||||
* Since the header field is obfuscated and there is no easy way to identify it among all the class fields,
|
||||
* an additional method is fingerprinted.
|
||||
* This method uses the map, so we can get the field name of the map field using this.
|
||||
*/
|
||||
val mainFeedRequestHeaderFieldName: String
|
||||
|
||||
with(mainFeedHeaderMapFinderFingerprint.method) {
|
||||
mainFeedRequestHeaderFieldName = indexOfFirstInstructionOrThrow {
|
||||
getReference<FieldReference>().let { ref ->
|
||||
ref?.type == "Ljava/util/Map;" &&
|
||||
ref.definingClass == mainFeedRequestClassFingerprint.classDef.toString()
|
||||
|
||||
}
|
||||
}.let { instructionIndex ->
|
||||
getInstruction(instructionIndex).getReference<FieldReference>()!!.name
|
||||
}
|
||||
}
|
||||
|
||||
initMainFeedRequestFingerprint.method.apply {
|
||||
// Finds the instruction where the map is being initialized in the constructor
|
||||
val getHeaderIndex = indexOfFirstInstructionOrThrow {
|
||||
getReference<FieldReference>().let {
|
||||
it?.name == mainFeedRequestHeaderFieldName
|
||||
}
|
||||
}
|
||||
|
||||
val paramHeaderRegister = getInstruction<TwoRegisterInstruction>(getHeaderIndex).registerA
|
||||
|
||||
// Replace the `pagination_source` header value with `following` in the feed/timeline request.
|
||||
addInstructions(
|
||||
getHeaderIndex,
|
||||
"""
|
||||
invoke-static { v$paramHeaderRegister }, $EXTENSION_CLASS_DESCRIPTOR->setFollowingHeader(Ljava/util/Map;)Ljava/util/Map;
|
||||
move-result-object v$paramHeaderRegister
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,7 @@ val hideNavigationButtonsPatch = bytecodePatch(
|
||||
val freeRegister = findFreeRegister(insertIndex, loopIndexRegister)
|
||||
val instruction = getInstruction(endIndex - 1)
|
||||
|
||||
var instructions = buildString {
|
||||
val instructions = buildString {
|
||||
if (hideCreate!!) {
|
||||
appendLine(
|
||||
"""
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package app.revanced.patches.instagram.misc.extension
|
||||
|
||||
import app.revanced.patches.instagram.misc.extension.hooks.applicationInitHook
|
||||
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
|
||||
|
||||
val sharedExtensionPatch = sharedExtensionPatch(
|
||||
"instagram",
|
||||
applicationInitHook,
|
||||
)
|
||||
@@ -0,0 +1,9 @@
|
||||
package app.revanced.patches.instagram.misc.extension.hooks
|
||||
|
||||
import app.revanced.patches.shared.misc.extension.extensionHook
|
||||
|
||||
internal val applicationInitHook = extensionHook {
|
||||
custom { method, classDef ->
|
||||
method.name == "onCreate" && classDef.endsWith("/InstagramAppShell;")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package app.revanced.patches.music.layout.castbutton
|
||||
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.literal
|
||||
|
||||
internal val mediaRouteButtonFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL)
|
||||
returns("Z")
|
||||
strings("MediaRouteButton")
|
||||
}
|
||||
|
||||
internal val playerOverlayChipFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("L")
|
||||
literal { playerOverlayChip }
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package app.revanced.patches.music.layout.castbutton
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.music.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.music.misc.settings.settingsPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
internal var playerOverlayChip = -1L
|
||||
private set
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCastButtonPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val hideCastButton = bytecodePatch(
|
||||
name = "Hide cast button",
|
||||
description = "Adds an option to hide the cast button."
|
||||
) {
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
settingsPatch,
|
||||
addResourcesPatch,
|
||||
)
|
||||
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.29.52"
|
||||
)
|
||||
)
|
||||
|
||||
execute {
|
||||
addResources("music", "layout.castbutton.hideCastButton")
|
||||
|
||||
PreferenceScreen.GENERAL.addPreferences(
|
||||
SwitchPreference("revanced_music_hide_cast_button"),
|
||||
)
|
||||
|
||||
mediaRouteButtonFingerprint.classDef.apply {
|
||||
val setVisibilityMethod = methods.first { method -> method.name == "setVisibility" }
|
||||
|
||||
setVisibilityMethod.addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->hideCastButton(I)I
|
||||
move-result p1
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
playerOverlayChipFingerprint.method.apply {
|
||||
val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerOverlayChip)
|
||||
val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT)
|
||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||
|
||||
addInstruction(
|
||||
targetIndex + 1,
|
||||
"invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideCastButton(Landroid/view/View;)V"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package app.revanced.patches.music.layout.navigationbar
|
||||
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.literal
|
||||
import com.android.tools.smali.dexlib2.iface.Method
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal val tabLayoutTextFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("V")
|
||||
parameters("L")
|
||||
opcodes(
|
||||
Opcode.IGET,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
Opcode.MOVE_RESULT
|
||||
)
|
||||
strings("FEmusic_search")
|
||||
literal { text1 }
|
||||
custom { method, _ ->
|
||||
indexOfGetVisibilityInstruction(method) >= 0
|
||||
}
|
||||
}
|
||||
|
||||
internal fun indexOfGetVisibilityInstruction(method: Method) =
|
||||
method.indexOfFirstInstruction {
|
||||
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||
getReference<MethodReference>()?.name == "getVisibility"
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package app.revanced.patches.music.layout.navigationbar
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.music.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.music.misc.settings.settingsPatch
|
||||
import app.revanced.patches.shared.misc.mapping.get
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappings
|
||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
|
||||
internal var text1 = -1L
|
||||
private set
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/NavigationBarPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val navigationBarPatch = bytecodePatch(
|
||||
name = "Navigation bar",
|
||||
description = "Adds options to hide navigation bar, labels and buttons."
|
||||
) {
|
||||
dependsOn(
|
||||
resourceMappingPatch,
|
||||
sharedExtensionPatch,
|
||||
settingsPatch,
|
||||
addResourcesPatch
|
||||
)
|
||||
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.29.52"
|
||||
)
|
||||
)
|
||||
|
||||
execute {
|
||||
text1 = resourceMappings[
|
||||
"id",
|
||||
"text1",
|
||||
]
|
||||
|
||||
addResources("music", "layout.navigationbar.navigationBarPatch")
|
||||
|
||||
PreferenceScreen.GENERAL.addPreferences(
|
||||
PreferenceScreenPreference(
|
||||
key = "revanced_music_navigation_bar_screen",
|
||||
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
|
||||
preferences = setOf(
|
||||
SwitchPreference("revanced_music_hide_navigation_bar_home_button"),
|
||||
SwitchPreference("revanced_music_hide_navigation_bar_samples_button"),
|
||||
SwitchPreference("revanced_music_hide_navigation_bar_explore_button"),
|
||||
SwitchPreference("revanced_music_hide_navigation_bar_library_button"),
|
||||
SwitchPreference("revanced_music_hide_navigation_bar_upgrade_button"),
|
||||
|
||||
SwitchPreference("revanced_music_hide_navigation_bar"),
|
||||
SwitchPreference("revanced_music_hide_navigation_bar_labels"),
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
tabLayoutTextFingerprint.method.apply {
|
||||
/**
|
||||
* Hide navigation labels.
|
||||
*/
|
||||
val constIndex = indexOfFirstLiteralInstructionOrThrow(text1)
|
||||
val targetIndex = indexOfFirstInstructionOrThrow(constIndex, Opcode.CHECK_CAST)
|
||||
val targetParameter = getInstruction<ReferenceInstruction>(targetIndex).reference
|
||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||
|
||||
if (!targetParameter.toString().endsWith("Landroid/widget/TextView;"))
|
||||
throw PatchException("Method signature parameter did not match: $targetParameter")
|
||||
|
||||
addInstruction(
|
||||
targetIndex + 1,
|
||||
"invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationLabel(Landroid/widget/TextView;)V"
|
||||
)
|
||||
|
||||
/**
|
||||
* Set navigation enum and hide navigation buttons.
|
||||
*/
|
||||
val enumIndex = tabLayoutTextFingerprint.patternMatch!!.startIndex + 3
|
||||
val enumRegister = getInstruction<OneRegisterInstruction>(enumIndex).registerA
|
||||
val insertEnumIndex = indexOfFirstInstructionOrThrow(Opcode.AND_INT_LIT8) - 2
|
||||
|
||||
val pivotTabIndex = indexOfGetVisibilityInstruction(this)
|
||||
val pivotTabRegister = getInstruction<FiveRegisterInstruction>(pivotTabIndex).registerC
|
||||
|
||||
addInstruction(
|
||||
pivotTabIndex,
|
||||
"invoke-static { v$pivotTabRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationButton(Landroid/view/View;)V"
|
||||
)
|
||||
|
||||
addInstruction(
|
||||
insertEnumIndex,
|
||||
"invoke-static { v$enumRegister }, $EXTENSION_CLASS_DESCRIPTOR->setLastAppNavigationEnum(Ljava/lang/Enum;)V"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,9 +21,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideUpgradeButtonPatch;"
|
||||
|
||||
@Deprecated("This patch will be removed in the future.")
|
||||
@Suppress("unused")
|
||||
val hideUpgradeButton = bytecodePatch(
|
||||
name = "Hide upgrade button",
|
||||
description = "Hides the upgrade tab from the pivot bar.",
|
||||
) {
|
||||
dependsOn(
|
||||
|
||||
@@ -38,7 +38,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
|
||||
)
|
||||
},
|
||||
executeBlock = {
|
||||
addResources("shared", "misc.spoof.spoofVideoStreamsPatch")
|
||||
addResources("music", "misc.fix.playback.spoofVideoStreamsPatch")
|
||||
|
||||
PreferenceScreen.MISC.addPreferences(
|
||||
PreferenceScreenPreference(
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
package app.revanced.patches.shared.misc.spoof
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.literal
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal val buildInitPlaybackRequestFingerprint = fingerprint {
|
||||
returns("Lorg/chromium/net/UrlRequest\$Builder;")
|
||||
@@ -40,10 +37,7 @@ internal val buildRequestFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder;
|
||||
custom { methodDef, _ ->
|
||||
if (methodDef.indexOfFirstInstruction {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.name == "newUrlRequestBuilder"
|
||||
} < 0) {
|
||||
if (indexOfNewUrlRequestBuilderInstruction(methodDef) < 0) {
|
||||
return@custom false
|
||||
}
|
||||
|
||||
@@ -142,6 +136,17 @@ internal val hlsCurrentTimeFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal const val DISABLED_BY_SABR_STREAMING_URI_STRING = "DISABLED_BY_SABR_STREAMING_URI"
|
||||
|
||||
internal val mediaFetchEnumConstructorFingerprint = fingerprint {
|
||||
returns("V")
|
||||
strings(
|
||||
"ENABLED",
|
||||
"DISABLED_FOR_PLAYBACK",
|
||||
DISABLED_BY_SABR_STREAMING_URI_STRING
|
||||
)
|
||||
}
|
||||
|
||||
internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Ljava/lang/String;")
|
||||
@@ -150,7 +155,6 @@ internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint {
|
||||
}
|
||||
|
||||
internal val patchIncludedExtensionMethodFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC)
|
||||
returns("Z")
|
||||
parameters()
|
||||
custom { method, classDef ->
|
||||
|
||||
@@ -5,23 +5,28 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.instructions
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patcher.patch.BytecodePatchBuilder
|
||||
import app.revanced.patcher.patch.BytecodePatchContext
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.util.findFreeRegister
|
||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.insertLiteralOverride
|
||||
import app.revanced.util.returnEarly
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.Method
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
@@ -31,6 +36,9 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||
internal const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/shared/spoof/SpoofVideoStreamsPatch;"
|
||||
|
||||
private lateinit var buildRequestMethod: MutableMethod
|
||||
private var buildRequestMethodUrlRegister = -1
|
||||
|
||||
fun spoofVideoStreamsPatch(
|
||||
block: BytecodePatchBuilder.() -> Unit = {},
|
||||
fixMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false },
|
||||
@@ -91,18 +99,17 @@ fun spoofVideoStreamsPatch(
|
||||
// region Get replacement streams at player requests.
|
||||
|
||||
buildRequestFingerprint.method.apply {
|
||||
val newRequestBuilderIndex = indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||
getReference<MethodReference>()?.name == "newUrlRequestBuilder"
|
||||
}
|
||||
val urlRegister = getInstruction<FiveRegisterInstruction>(newRequestBuilderIndex).registerD
|
||||
val freeRegister = findFreeRegister(newRequestBuilderIndex, urlRegister)
|
||||
buildRequestMethod = this
|
||||
|
||||
val newRequestBuilderIndex = indexOfNewUrlRequestBuilderInstruction(this)
|
||||
buildRequestMethodUrlRegister = getInstruction<FiveRegisterInstruction>(newRequestBuilderIndex).registerD
|
||||
val freeRegister = findFreeRegister(newRequestBuilderIndex, buildRequestMethodUrlRegister)
|
||||
|
||||
addInstructions(
|
||||
newRequestBuilderIndex,
|
||||
"""
|
||||
move-object v$freeRegister, p1
|
||||
invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V
|
||||
invoke-static { v$buildRequestMethodUrlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V
|
||||
"""
|
||||
)
|
||||
}
|
||||
@@ -187,6 +194,21 @@ fun spoofVideoStreamsPatch(
|
||||
|
||||
// endregion
|
||||
|
||||
// region block getAtt request
|
||||
|
||||
buildRequestMethod.apply {
|
||||
val insertIndex = indexOfNewUrlRequestBuilderInstruction(this)
|
||||
|
||||
addInstructions(
|
||||
insertIndex, """
|
||||
invoke-static { v$buildRequestMethodUrlRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetAttRequest(Ljava/lang/String;)Ljava/lang/String;
|
||||
move-result-object v$buildRequestMethodUrlRegister
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region Remove /videoplayback request body to fix playback.
|
||||
// It is assumed, YouTube makes a request with a body tuned for Android.
|
||||
// Requesting streams intended for other platforms with a body tuned for Android could be the cause of 400 errors.
|
||||
@@ -243,6 +265,50 @@ fun spoofVideoStreamsPatch(
|
||||
|
||||
// endregion
|
||||
|
||||
// region Disable SABR playback.
|
||||
// If SABR is disabled, it seems 'MediaFetchHotConfig' may no longer need an override (not confirmed).
|
||||
|
||||
val (mediaFetchEnumClass, sabrFieldReference) = with(mediaFetchEnumConstructorFingerprint.method) {
|
||||
val stringIndex = mediaFetchEnumConstructorFingerprint.stringMatches!!.first {
|
||||
it.string == DISABLED_BY_SABR_STREAMING_URI_STRING
|
||||
}.index
|
||||
|
||||
val mediaFetchEnumClass = definingClass
|
||||
val sabrFieldIndex = indexOfFirstInstructionOrThrow(stringIndex) {
|
||||
opcode == Opcode.SPUT_OBJECT &&
|
||||
getReference<FieldReference>()?.type == mediaFetchEnumClass
|
||||
}
|
||||
|
||||
Pair(
|
||||
mediaFetchEnumClass,
|
||||
getInstruction<ReferenceInstruction>(sabrFieldIndex).reference
|
||||
)
|
||||
}
|
||||
|
||||
fingerprint {
|
||||
returns(mediaFetchEnumClass)
|
||||
opcodes(
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.RETURN_OBJECT,
|
||||
)
|
||||
custom { method, _ ->
|
||||
!method.parameterTypes.isEmpty()
|
||||
}
|
||||
}.method.addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSABR()Z
|
||||
move-result v0
|
||||
if-eqz v0, :ignore
|
||||
sget-object v0, $sabrFieldReference
|
||||
return-object v0
|
||||
:ignore
|
||||
nop
|
||||
"""
|
||||
)
|
||||
|
||||
// endregion
|
||||
|
||||
// region turn off stream config replacement feature flag.
|
||||
|
||||
if (fixMediaFetchHotConfigChanges()) {
|
||||
@@ -271,3 +337,12 @@ fun spoofVideoStreamsPatch(
|
||||
executeBlock()
|
||||
}
|
||||
}
|
||||
|
||||
internal fun indexOfNewUrlRequestBuilderInstruction(method: Method) = method.indexOfFirstInstruction {
|
||||
opcode == Opcode.INVOKE_VIRTUAL && getReference<MethodReference>().toString() ==
|
||||
"Lorg/chromium/net/CronetEngine;" +
|
||||
"->newUrlRequestBuilder(" +
|
||||
"Ljava/lang/String;Lorg/chromium/net/UrlRequest${'$'}Callback;" +
|
||||
"Ljava/util/concurrent/Executor;" +
|
||||
")Lorg/chromium/net/UrlRequest${'$'}Builder;"
|
||||
}
|
||||
|
||||
@@ -2,12 +2,6 @@ package app.revanced.patches.viber.ads
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val adsFreeFingerprint = fingerprint {
|
||||
returns("I")
|
||||
parameters()
|
||||
custom { method, classDef ->
|
||||
classDef.type.contains("com/viber/voip/feature/viberplus") &&
|
||||
classDef.superclass?.contains("com/viber/voip/core/feature") == true && // Must extend com.viber.voip.core.feature.?
|
||||
classDef.methods.count() == 1
|
||||
}
|
||||
internal val findAdStringFingerprint = fingerprint {
|
||||
strings("viber_plus_debug_ads_free_flag")
|
||||
}
|
||||
|
||||
@@ -1,17 +1,41 @@
|
||||
package app.revanced.patches.viber.ads
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
|
||||
import app.revanced.util.returnEarly
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
|
||||
|
||||
@Suppress("unused")
|
||||
val hideAdsPatch = bytecodePatch(
|
||||
name = "Hide Ads",
|
||||
description = "Hides ad banners between chats.",
|
||||
) {
|
||||
compatibleWith("com.viber.voip"("25.9.2.0"))
|
||||
compatibleWith("com.viber.voip"("25.9.2.0", "26.1.2.0"))
|
||||
|
||||
execute {
|
||||
// Return 1 (true) indicating ads should be disabled.
|
||||
adsFreeFingerprint.method.returnEarly(1)
|
||||
val method = findAdStringFingerprint.method
|
||||
|
||||
// Find the ads free string index
|
||||
val stringIndex = findAdStringFingerprint.stringMatches!!.first().index
|
||||
|
||||
// Search backwards from the string to find the `new-instance` (TypeReference) instruction
|
||||
val typeRefIndex = method.indexOfFirstInstructionReversedOrThrow(stringIndex) { this.opcode == Opcode.NEW_INSTANCE }
|
||||
|
||||
// Get the class name from the TypeReference
|
||||
val targetClass = method.getInstruction<ReferenceInstruction>(typeRefIndex).reference as TypeReference
|
||||
|
||||
// Patch the ads-free method to always return true
|
||||
fingerprint {
|
||||
returns("I")
|
||||
parameters()
|
||||
custom { method, classDef ->
|
||||
classDef == targetClass
|
||||
}
|
||||
}.method.returnEarly(1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ 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,7 +57,10 @@ val forceOriginalAudioPatch = bytecodePatch(
|
||||
addResources("youtube", "video.audio.forceOriginalAudioPatch")
|
||||
|
||||
PreferenceScreen.VIDEO.addPreferences(
|
||||
SwitchPreference("revanced_force_original_audio")
|
||||
SwitchPreference(
|
||||
key = "revanced_force_original_audio",
|
||||
tag = "app.revanced.extension.youtube.settings.preference.ForceOriginalAudioSwitchPreference"
|
||||
)
|
||||
)
|
||||
|
||||
mainActivityOnCreateFingerprint.method.addInstruction(
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1473,7 +1477,7 @@ Second \"item\" text"</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>
|
||||
<string name="revanced_force_original_audio_not_available">لاستخدام هذه الميزة، غيّر \"تزوير تدفقات الفيديو\" إلى أي عميل باستثناء Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,6 +100,7 @@ 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">
|
||||
|
||||
@@ -89,10 +89,16 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et."
|
||||
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Video yayımları saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Oynatma problemlərin önləmək üçün qəbuledici video yayımların saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_screen_title">Video yayımların saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Oynatma problemlərin önləmək üçün qəbuledici video yayımların saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_title">Video yayımları saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">"Video yayımları saxtalaşdırılıb
|
||||
|
||||
Əgər YouTube Premium istifadəçisisinizsə, bu tənzimlənmə tələb olunmaya bilər"</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">"Video yayımları saxtalaşmayıb
|
||||
|
||||
Oynatma işləməyə bilər"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Bu tənzimləməni qapatmaq oynatma problemlərinə səbəb ola bilər.</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_title">İlkin qəbuledici</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
@@ -615,6 +621,10 @@ 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. -->
|
||||
<string name="revanced_hide_shop_button_title">Mağazanı Gizlət</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Mağaza düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Mağaza düyməsi görünür</string>
|
||||
<!-- '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>
|
||||
@@ -713,6 +723,9 @@ Bu seçimi dəyişdirmə işə düşmürsə, Gizli rejimə keçməyə çalışı
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Səs axını menyusu gizlidir</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Səs axını menyusu göstərilir</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Səs trek menyusu gizlidir
|
||||
|
||||
Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"ı iPadOS-a dəyiş"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">\"VR-da İzləni\" gizlət</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">VR menyusunda izləmə gizlidir</string>
|
||||
@@ -1463,7 +1476,7 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Bu funksiyanı istifadə etmək üçün \"Video yayımları saxtalaşdırı\" Android Studio savayı istənilən qəbulediciyə dəyiş</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
@@ -1541,6 +1554,7 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
|
||||
<string name="revanced_spoof_video_streams_about_android_title">Android saxtalaşdırma yan təsirləri</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Səs treki menyusu əlçatmazdır
|
||||
• Sabit səs səviyyəsi yoxdur"</string>
|
||||
<string name="revanced_spoof_video_streams_about_ipados_summary">• Video 01:00-da dayana bilər və ya bəzi bölgələrdə mövcud olmaya bilər</string>
|
||||
<string name="revanced_spoof_video_streams_about_experimental">• Təcrübi qəbuledici və hər vaxt işləməyi dayandıra bilər</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• AV1 video kodlayıcı yoxdur</string>
|
||||
<string name="revanced_spoof_video_streams_about_kids_videos">• Giriş edilməyəndə və ya gizli rejimdə uşaq videoları oynadıla bilməz</string>
|
||||
@@ -1549,6 +1563,7 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Qəbuledici nerd üçün Statistikada gizlidir</string>
|
||||
<string name="revanced_spoof_video_streams_language_title">Səs yayım dili</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">Xüsusi səs dilini seçmək üçün \"Orijinal səs dilini zorlanı\" qapat</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="music">
|
||||
@@ -1556,18 +1571,31 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
|
||||
<string name="revanced_settings_music_screen_0_about_title">Haqqında</string>
|
||||
<string name="revanced_settings_music_screen_1_ads_title">Reklamlar</string>
|
||||
<string name="revanced_settings_music_screen_2_general_title">Ümumi</string>
|
||||
<string name="revanced_settings_music_screen_3_player_title">Oyunçu</string>
|
||||
<string name="revanced_settings_music_screen_3_player_title">Oynadıcı</string>
|
||||
<string name="revanced_settings_music_screen_4_misc_title">Çoxvariantlı</string>
|
||||
</patch>
|
||||
<patch id="ad.video.hideVideoAdsPatch">
|
||||
<string name="revanced_music_hide_video_ads_title">Video reklamlarını gizlət</string>
|
||||
<string name="revanced_music_hide_video_ads_summary_on">Video reklamları gizlidir</string>
|
||||
<string name="revanced_music_hide_video_ads_summary_off">Video reklamları görünür</string>
|
||||
</patch>
|
||||
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
|
||||
<string name="revanced_music_play_permanent_repeat_title">Kəsintisiz təkrarlamanı aktivləşdir</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_on">Kəsintisiz təkrarlama aktivdir</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_off">Kəsintisiz təkrarlama qapalıdır</string>
|
||||
</patch>
|
||||
<patch id="layout.compactheader.hideCategoryBar">
|
||||
<string name="revanced_music_hide_category_bar_title">Kateqoriya cizgisin gizlət</string>
|
||||
<string name="revanced_music_hide_category_bar_summary_on">Kateqoriya cizgisi gizlidir</string>
|
||||
<string name="revanced_music_hide_category_bar_summary_off">Kateqoriya cizgisi görünür</string>
|
||||
</patch>
|
||||
<patch id="layout.premium.hideGetPremiumPatch">
|
||||
<string name="revanced_music_hide_get_premium_label_title"> \'Musiqi Premiumu Əldə et\' etiketini gizlət</string>
|
||||
<string name="revanced_music_hide_get_premium_label_summary_on">Etiket gizlidir</string>
|
||||
<string name="revanced_music_hide_get_premium_label_summary_off">Etiket görünür</string>
|
||||
</patch>
|
||||
<patch id="layout.upgradebutton.hideUpgradeButtonPatch">
|
||||
<string name="revanced_music_hide_upgrade_button_title">Təkmilləşdirmə düyməsini gizlət</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_on">Düymə gizlidir</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_off">Düymə görünür</string>
|
||||
</patch>
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1474,7 +1478,7 @@ Second \"item\" text"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Каб выкарыстаць гэтую функцыю, змяніце \'Падмена відэаструменяў\' на любога кліента, акрамя Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1473,7 +1477,7 @@ Second \"item\" text"</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>
|
||||
<string name="revanced_force_original_audio_not_available">За да използвате тази функция, променете \'Фалшифициране на видео потоци\' на всеки клиент, освен Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -617,6 +617,10 @@ 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>
|
||||
@@ -1469,7 +1473,7 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">এই বৈশিষ্ট্যটি ব্যবহার করতে, \'ভিডিও স্ট্রিম স্পুফ করুন\' অ্যান্ড্রয়েড স্টুডিও ছাড়া অন্য কোনো ক্লায়েন্টে পরিবর্তন করুন</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1473,7 +1477,7 @@ Povolením této funkce lze odemknout vyšší kvality videa"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Chcete-li použít tuto funkci, změňte \'Zfalšovat video streamy\' na libovolného klienta kromě Android Studia</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1475,7 +1479,7 @@ Aktivering af dette kan låse op for højere videokvalitet"</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>
|
||||
<string name="revanced_force_original_audio_not_available">For at bruge denne funktion skal du ændre \"Forfalsk videostreams\" til en hvilken som helst klient undtagen Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -61,7 +61,7 @@ Um neue Sprachen zu übersetzen, besuchen Sie translate.revanced.app"</string>
|
||||
<string name="revanced_pref_import_export_summary">ReVanced-Einstellungen importieren/exportieren</string>
|
||||
<!-- Settings about dialog. -->
|
||||
<string name="revanced_settings_about_links_body">Sie verwenden ReVanced-Patches Version <i>%s</i></string>
|
||||
<string name="revanced_settings_about_links_dev_header">Notiz</string>
|
||||
<string name="revanced_settings_about_links_dev_header">Hinweis</string>
|
||||
<string name="revanced_settings_about_links_dev_body">Diese Version ist eine Vorabversion, es kann zu unerwarteten Problemen kommen</string>
|
||||
<string name="revanced_settings_about_links_header">Offizielle Links</string>
|
||||
<!-- NOTE: the about strings above are duplicated in the TikTok about screen code,
|
||||
@@ -79,21 +79,23 @@ Folgen Sie der Anleitung \"Don't kill my app\" für Ihr Gerät und wenden Sie di
|
||||
|
||||
Dies ist erforderlich, damit die App funktioniert."</string>
|
||||
<string name="gms_core_dialog_open_website_text">Website öffnen</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">"Die Batterieoptimierung von MicroG GmsCore muss deaktiviert werden, um Probleme zu vermeiden.
|
||||
Die Deaktivierung der Batterieoptimierung für MicroG hat keinen negativen Einfluss auf den Batterieverbrauch.
|
||||
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">"Die Akku-Optimierung muss für MicroG GmsCore deaktiviert werden, um Probleme zu vermeiden.
|
||||
|
||||
Die Deaktivierung der Akku-Optimierung für MicroG hat keinen negativen Einfluss auf den Akkuverbrauch.
|
||||
|
||||
Tippen Sie auf die Schaltfläche \"Fortfahren\" und erlauben Sie die Optimierungsänderungen."</string>
|
||||
<string name="gms_core_dialog_continue_text">Weiter</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spoof-Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spoof der Client-Videostreams um Wiedergabeprobleme zu verhindern</string>
|
||||
<string name="revanced_spoof_video_streams_screen_title">Video-Streams vortäuschen</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Die Client-Video-Streams vortäuschen, um Wiedergabeprobleme zu verhindern</string>
|
||||
<string name="revanced_spoof_video_streams_title">Spoof-Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spoofe Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spoofe die Client-Videostreams um Wiedergabeprobleme zu verhindern</string>
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spoofe Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spoofe die Client-Video-Streams, um Wiedergabeprobleme zu verhindern</string>
|
||||
<string name="revanced_spoof_video_streams_title">Spoofe Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">"Videostreams werden gespooft
|
||||
|
||||
Wenn Sie ein YouTube Premium-Nutzer sind, ist diese Einstellung möglicherweise nicht erforderlich"</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">"Video-Streams werden nicht vorgetäuscht
|
||||
<string name="revanced_spoof_video_streams_summary_off">"Video-Streams werden nicht gespooft
|
||||
|
||||
Die Wiedergabe funktioniert möglicherweise nicht"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Das Deaktivieren dieser Einstellung kann Wiedergabeprobleme verursachen.</string>
|
||||
@@ -136,9 +138,9 @@ Die Wiedergabe funktioniert möglicherweise nicht"</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Der Suchverlauf der Einstellungen wird nicht angezeigt</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Shorts-Hintergrundwiedergabe deaktivieren</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_on">Shorts-Hintergrundwiedergabe ist deaktiviert</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_off">Shorts-Hintergrundwiedergabe ist aktiviert</string>
|
||||
<string name="revanced_shorts_disable_background_playback_title">Hintergrundwiedergabe von Shorts deaktivieren</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_on">Hintergrundwiedergabe von Shorts ist deaktiviert</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_off">Hintergrundwiedergabe von Shorts ist aktiviert</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
<string name="revanced_debug_protobuffer_title">Protokollpuffer protokollieren</string>
|
||||
@@ -154,20 +156,20 @@ Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Ad
|
||||
<string name="revanced_debug_stacktrace_summary_off">Debug-Logs enthalten keine Stack-Traces</string>
|
||||
<string name="revanced_debug_toast_on_error_title">Toast bei ReVanced Fehler anzeigen</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_on">Ein Toast wird angezeigt, wenn ein Fehler auftritt</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Es wird keine Toast-Nachricht angezeigt, wenn ein Fehler Auftritt</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Es wird keine Toast-Nachricht angezeigt, wenn ein Fehler auftritt</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">"Das Ausschalten von Fehler-Toasts blendet alle Benachrichtigungen über Fehler in ReVanced aus.
|
||||
|
||||
Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
||||
<string name="revanced_hide_album_cards_title">Albumkarten ausblenden</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">Albumkarten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">Albumkarten werden ausgeblendet</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">Albumkarten werden angezeigt</string>
|
||||
<string name="revanced_hide_artist_cards_title">Interpretenkarten ausblenden</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Künstlerkarten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Interpretenkarten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Interpretenkarten werden angezeigt</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Chips ausblenden</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Chips sind ausgeblendet</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Chips werden ausgeblendet</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Chips werden angezeigt</string>
|
||||
<string name="revanced_hide_community_posts_title">Communitybeiträge ausblenden</string>
|
||||
<string name="revanced_hide_community_posts_summary_on">Communitybeiträge sind ausgeblendet</string>
|
||||
@@ -180,10 +182,10 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_off">Crowdfunding-Box wird angezeigt</string>
|
||||
<string name="revanced_hide_expandable_card_title">Ausklappbare Karte ausblenden</string>
|
||||
<string name="revanced_hide_expandable_card_summary_on">Ausklappbare Karte unter Videos ist ausgeblendet</string>
|
||||
<string name="revanced_hide_expandable_card_summary_off">Ausklappbare Karte unter Videos ist angezeigt</string>
|
||||
<string name="revanced_hide_floating_microphone_button_title">Schwebende Mikrofon-Taste ausblenden</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Schwebende Mikrofonschaltfläche in der Suche ist ausgeblendet</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Der schwebende Mikrofon-Button in der Suche wird angezeigt</string>
|
||||
<string name="revanced_hide_expandable_card_summary_off">Ausklappbare Karte unter Videos wird angezeigt</string>
|
||||
<string name="revanced_hide_floating_microphone_button_title">Schwebende Mikrofon-Schaltfläche ausblenden</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Schwebende Mikrofon-Schaltfläche wird in der Suche ausgeblendet</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Schwebende Mikrofon-Schaltfläche wird in der Suche angezeigt</string>
|
||||
<string name="revanced_hide_horizontal_shelves_title">Horizontale Reihe ausblenden</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">"Horizontale Regale sind ausgeblendet, wie zum Beispiel:
|
||||
• Aktuelle Nachrichten
|
||||
@@ -197,29 +199,29 @@ Sie werden nicht über unerwartete Ereignisse informiert."</string>
|
||||
<string name="revanced_hide_image_shelf_summary_on">Bild-Regal in den Suchergebnissen ist ausgeblendet</string>
|
||||
<string name="revanced_hide_image_shelf_summary_off">Bild-Regal in den Suchergebnissen ist angezeigt</string>
|
||||
<string name="revanced_hide_latest_posts_title">Neueste Beiträge ausblenden</string>
|
||||
<string name="revanced_hide_latest_posts_summary_on">Neueste Beiträge sind ausgeblendet</string>
|
||||
<string name="revanced_hide_latest_posts_summary_on">Neueste Beiträge werden ausgeblendet</string>
|
||||
<string name="revanced_hide_latest_posts_summary_off">Neueste Beiträge werden angezeigt</string>
|
||||
<string name="revanced_hide_mix_playlists_title">Mix-Wiedergabelisten ausblenden</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_on">Mix-Wiedergabelisten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_on">Mix-Wiedergabelisten werden ausgeblendet</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_off">Mix-Wiedergabelisten werden angezeigt</string>
|
||||
<string name="revanced_hide_movies_section_title">Filme-Bereich ausblenden</string>
|
||||
<string name="revanced_hide_movies_section_summary_on">Film Abschnitt ist ausgeblendet</string>
|
||||
<string name="revanced_hide_movies_section_summary_off">Film Bereich wird angezeigt</string>
|
||||
<string name="revanced_hide_movies_section_title">Film-Bereich ausblenden</string>
|
||||
<string name="revanced_hide_movies_section_summary_on">Film-Bereich wird ausgeblendet</string>
|
||||
<string name="revanced_hide_movies_section_summary_off">Film-Bereich wird angezeigt</string>
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the Subscriptions feed for future livestreams or unreleased videos. -->
|
||||
<string name="revanced_hide_notify_me_button_title">\'Benachrichtigungen\' Button ausblenden</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Schaltfläche \"Benachrichtige mich\" ist ausgeblendet</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Schaltfläche \"Benachrichtige mich\" ausblenden</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Schaltfläche \"Benachrichtige mich\" wird ausgeblendet</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Schaltfläche \"Benachrichtige mich\" wird angezeigt</string>
|
||||
<string name="revanced_hide_playables_title">Playables ausblenden</string>
|
||||
<string name="revanced_hide_playables_summary_on">Spiele sind ausgeblendet</string>
|
||||
<string name="revanced_hide_playables_summary_off">Spielbare werden angezeigt</string>
|
||||
<string name="revanced_hide_playables_summary_on">Playables sind ausgeblendet</string>
|
||||
<string name="revanced_hide_playables_summary_off">Playables werden angezeigt</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">\'Mehr anzeigen\' Button ausblenden</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Schaltfläche \"Mehr anzeigen\" in den Suchergebnissen ist ausgeblendet</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Schaltfläche \"Mehr anzeigen\" in den Suchergebnissen wird angezeigt</string>
|
||||
<string name="revanced_hide_surveys_title">Umfragen ausblenden</string>
|
||||
<string name="revanced_hide_surveys_summary_on">Umfragen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_surveys_summary_on">Umfragen werden ausgeblendet</string>
|
||||
<string name="revanced_hide_surveys_summary_off">Umfragen werden angezeigt</string>
|
||||
<string name="revanced_hide_ticket_shelf_title">Ticket-Reihe ausblenden</string>
|
||||
<string name="revanced_hide_ticket_shelf_summary_on">Ticket-Reihe ist ausgeblendet</string>
|
||||
@@ -421,14 +423,14 @@ Diese Funktion ist nur für ältere Geräte verfügbar"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Vollbild-Werbung ausblenden funktioniert nur mit älteren Geräten</string>
|
||||
<string name="revanced_hide_general_ads_title">Allgemeine Werbung ausblenden</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Allgemeine Anzeigen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Allgemeine Anzeigen werden angezeigt</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">Allgemeine Werbung werden ausgeblendet</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">Allgemeine Werbung werden angezeigt</string>
|
||||
<string name="revanced_hide_merchandise_banners_title">Merchandise-Banner ausblenden</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise-Banner sind ausgeblendet</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">Warenbanner werden angezeigt</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Bezahltes Werbe-Label ausblenden</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Bezahltes Werbelabel ist ausgeblendet</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Bezahltes Werbe-Label wird angezeigt</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">\"Enthält bezahlte Werbung\"-Hinweis ausblenden</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">\"Enthält bezahlte Werbung\"-Hinweis wird ausgeblendet</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">\"Enthält bezahlte Werbung\"-Hinweis wird angezeigt</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Selbst gesponserte Karten ausblenden</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">Selbst gesponserte Karten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">Selbstgesponserte Karten werden angezeigt</string>
|
||||
@@ -616,6 +618,10 @@ 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>
|
||||
@@ -998,22 +1004,22 @@ Diese Funktion funktioniert am besten mit einer Videoqualität von 720p oder nie
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">SponsorBlock aktivieren</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock ist ein Crowdsourcing-System zum Überspringen von nervigen Teilen von YouTube-Videos</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock ist ein Crowdsourcing-System zum Überspringen von nervigen Segmenten von YouTube-Videos</string>
|
||||
<string name="revanced_sb_appearance_category">Darstellung</string>
|
||||
<string name="revanced_sb_enable_voting">Stimmen-Button anzeigen</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">Segmentstimmen Button wird angezeigt</string>
|
||||
<string name="revanced_sb_enable_voting_sum_off">Segmentstimmen Button wird nicht angezeigt</string>
|
||||
<string name="revanced_sb_square_layout">Quadratisches Layout verwenden</string>
|
||||
<string name="revanced_sb_enable_voting">Like-Button anzeigen</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">Segmentbewertungs-Button wird angezeigt</string>
|
||||
<string name="revanced_sb_enable_voting_sum_off">Segmentbewertungs-Button wird nicht angezeigt</string>
|
||||
<string name="revanced_sb_square_layout">Quadratische Bedienelemente verwenden</string>
|
||||
<string name="revanced_sb_square_layout_sum_on">Schaltflächen und Steuerelemente sind quadratisch</string>
|
||||
<string name="revanced_sb_square_layout_sum_off">Schaltflächen und Bedienelemente sind abgerundet</string>
|
||||
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title'. -->
|
||||
<string name="revanced_sb_enable_compact_skip_button">Kompakten Überspringen-Button verwenden</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">Überspringe Taste für minimale Breite</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">Überspringen-Button für beste Darstellung gestaltet</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">Überspringen-Button wird mit minimale Breite angezeigt</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">Überspringen-Button wird mit bestem Aussehen angezeigt</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Überspringen-Button automatisch ausblenden</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Überspringe Taste verbirgt sich nach ein paar Sekunden</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Die Schaltfläche \"Überspringen\" wird für das gesamte Segment angezeigt</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Dauer des Überspringen-Buttons</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Überspringen-Button wird nach ein paar Sekunden ausgeblendet</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Überspringen-Button wird während des ganzen Segmentes angezeigt</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">Anzeigedauer des Überspringen-Buttons</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Wie lange die Schaltflächen zum Überspringen und zum Hervorheben angezeigt werden sollen, bevor sie automatisch ausgeblendet werden</string>
|
||||
<string name="revanced_sb_general_skiptoast">Toast zum Rückgängigmachen des Überspringens anzeigen</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">Ein Toast wird angezeigt, wenn ein Segment automatisch übersprungen wird. Tippen Sie auf die Toast-Benachrichtigung, um das Überspringen rückgängig zu machen</string>
|
||||
@@ -1078,25 +1084,25 @@ Ihre Benutzer-ID ist wie ein Passwort und sollte niemals weitergegeben werden.
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Nicht wieder anzeigen</string>
|
||||
<string name="revanced_sb_diff_segments">Segmentverhalten ändern</string>
|
||||
<string name="revanced_sb_segments_sponsor">Sponsor</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Bezahlte Förderung, bezahlte Empfehlungen und direkte Werbung. Nicht für Selbstwerbung oder kostenlose Shoutouts an Ursachen/Webseiten/Produkte, die ihnen gefallen</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Unbezahlt/Eigenwerbung</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung. Nicht für Eigenwerbung oder kostenlose Shoutouts an Zwecke/Webseiten/Produkte, die ihnen gefallen</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Unbezahlte oder Eigenwerbung</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Ähnlich wie Sponsor, jedoch für unbezahlte oder Eigenwerbung. Enthält Abschnitte über Merchandise, Spenden oder Informationen darüber, mit wem sie zusammengearbeitet haben</string>
|
||||
<string name="revanced_sb_segments_interaction">Interaktionserinnerung (Abonnieren)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">Eine kurze Erinnerung, sie in der Mitte des Inhalts zu zitieren, zu abonnieren oder zu verfolgen. Wenn es lang ist oder etwas Konkretes ist, sollte es stattdessen unter Selbstförderung stehen</string>
|
||||
<string name="revanced_sb_segments_highlight">Hervorheben</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">Eine kurze Erinnerung, sie in der Mitte des Inhalts zu liken, abonnieren oder folgen. Wenn er lang ist oder es um etwas Bestimmtes geht, sollte es stattdessen als Eigenwerbung gekennzeichnet sein</string>
|
||||
<string name="revanced_sb_segments_highlight">Highlight</string>
|
||||
<string name="revanced_sb_segments_highlight_sum">Der Teil des Videos, nach dem die meisten Menschen suchen</string>
|
||||
<string name="revanced_sb_segments_intro">Unterbrechung/Introanimation</string>
|
||||
<string name="revanced_sb_segments_intro_sum">Ein Intervall ohne aktuellen Inhalt. Kann eine Pause, ein statischer Rahmen oder eine Wiederholung der Animation sein. Enthält keine Übergänge mit Informationen</string>
|
||||
<string name="revanced_sb_segments_outro">Endkarten / Credits</string>
|
||||
<string name="revanced_sb_segments_outro_sum">Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für Schlussfolgerungen mit Informationen</string>
|
||||
<string name="revanced_sb_segments_intro_sum">Ein Intervall ohne aktuellen Inhalt. Kann eine Pause, ein statischer Frame oder eine wiederholende Animation sein. Enthält keine Übergänge mit Informationen</string>
|
||||
<string name="revanced_sb_segments_outro">Endkarte / Credits</string>
|
||||
<string name="revanced_sb_segments_outro_sum">Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für Fazite mit Informationen</string>
|
||||
<string name="revanced_sb_segments_hook">Hook / Begrüßungen</string>
|
||||
<string name="revanced_sb_segments_hook_sum">Erzählte Trailer für das kommende Video, Begrüßungen und Verabschiedungen. Enthält keine Abschnitte, die zusätzlichen Inhalt hinzufügen</string>
|
||||
<string name="revanced_sb_segments_hook_sum">Erzählte Trailer für das kommende Video, Begrüßungen und Verabschiedungen. Enthält keine Segmente, die zusätzlichen Inhalt hinzufügen</string>
|
||||
<string name="revanced_sb_segments_preview">Vorschau / Rückblick</string>
|
||||
<string name="revanced_sb_segments_preview_sum">Sammlung von Clips, die zeigen, was im Video oder in anderen Videos einer Serie vor sich geht, wo alle Informationen andernorts wiederholt werden</string>
|
||||
<string name="revanced_sb_segments_preview_sum">Sammlung von Clips, die zeigen, was im Video oder in anderen Videos einer Serie passiert ist, wo alle Informationen andernorts wiederholt werden</string>
|
||||
<string name="revanced_sb_segments_filler">Abschweifung / Witze</string>
|
||||
<string name="revanced_sb_segments_filler_sum">Tangentiale Szenen oder Witze, die nicht erforderlich sind, um den Hauptinhalt des Videos zu verstehen. Dies sollte keine Segmente enthalten, die Kontext oder Hintergrunddetails liefern</string>
|
||||
<string name="revanced_sb_segments_nomusic">Musik: Nicht-Musik-Sektion</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">Nur für die Verwendung in Musikvideos. Abschnitte von Musikvideos ohne Musik, die noch nicht von einer anderen Kategorie abgedeckt sind</string>
|
||||
<string name="revanced_sb_segments_filler_sum">Tangentiale Szenen oder Witze, die nicht erforderlich sind, um den Hauptinhalt des Videos zu verstehen. Enthält keine Segmente, die Kontext oder Hintergrunddetails liefern</string>
|
||||
<string name="revanced_sb_segments_nomusic">Musikvideos: Nicht-Musik-Passagen</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">Nur für die Verwendung in Musikvideos. Abschnitte von Musikvideos ohne Musik, die noch nicht von einer anderen Kategorie abgedeckt werden</string>
|
||||
<string name="revanced_sb_skip_button_compact">Überspringen</string>
|
||||
<string name="revanced_sb_skip_button_compact_highlight">Hervorheben</string>
|
||||
<string name="revanced_sb_skip_button_sponsor">Sponsor überspringen</string>
|
||||
@@ -1371,29 +1377,29 @@ Durch Aktivieren dieser Option können fehlende Bilder behoben werden, die in ei
|
||||
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
|
||||
<string name="revanced_alt_thumbnail_subscription_title">Abos-Tab</string>
|
||||
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
|
||||
<string name="revanced_alt_thumbnail_library_title">Tab</string>
|
||||
<string name="revanced_alt_thumbnail_library_title">Mein YouTube-Tab</string>
|
||||
<string name="revanced_alt_thumbnail_player_title">Player-Wiedergabelisten & Empfehlungen</string>
|
||||
<string name="revanced_alt_thumbnail_search_title">Suchergebnisse</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_1">Original-Miniaturansichten</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_2">Pfeil & Original-Miniaturansichten</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_3">Pfeil & immer noch erfasst</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_4">Noch Aufnahmen</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow bietet von der Community bereitgestellte Miniaturansichten für YouTube-Videos. Diese Miniaturansichten sind oft relevanter als die von YouTube bereitgestellten.
|
||||
<string name="revanced_alt_thumbnail_options_entry_1">Original-Vorschaubilder</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_2">Pfeil & Original-Vorschaubilder</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_3">Pfeil & Standbild</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_4">Standbild</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow bietet von der Community bereitgestellte Vorschaubilder für YouTube-Videos. Diese Vorschaubilder sind oft relevanter als die von YouTube bereitgestellten.
|
||||
|
||||
Wenn diese Option aktiviert ist, werden Video-URLs an den API-Server gesendet und keine anderen Daten werden gesendet. Wenn ein Video keine DeArrow-Miniaturansichten hat, werden die Original- oder Still-Captures angezeigt.
|
||||
Wenn diese Option aktiviert ist, werden Video-URLs an den API-Server gesendet und keine anderen Daten werden gesendet. Wenn ein Video keine DeArrow-Vorschaubilder hat, wird das originale Vorschaubild oder ein Standbild angezeigt.
|
||||
|
||||
Tippen Sie hier, um mehr über DeArrow zu erfahren"</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">Einen Toast anzeigen, wenn die API nicht verfügbar ist</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">Toast wird angezeigt, wenn der Pfeil nicht verfügbar ist</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Toast wird nicht angezeigt, wenn der Pfeil nicht verfügbar ist</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">Ein Toast anzeigen, wenn die API nicht verfügbar ist</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">Toast wird angezeigt, wenn DeArrow nicht verfügbar ist</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Toast wird nicht angezeigt, wenn DeArrow nicht verfügbar ist</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_title">DeArrow API-Endpunkt</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">Die URL des Cache Endpunkts der DeArrow Thumbnails</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_title">Noch Videoaufnahmen</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_summary">Die Aufnahmen werden immer noch von Anfang an / Mitte / Ende jedes Videos übernommen. Diese Bilder sind in YouTube eingebaut und es wird keine externe API verwendet</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_title">Schnelle Stand-Captures verwenden</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_on">Die Verwendung von mittlerer Qualität bleibt erhalten. Die Vorschaubilder werden schneller geladen, aber Live-Streams, unveröffentlichte oder sehr alte Videos können leere Thumbnails anzeigen</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_off">Verwendung hoher Qualität immer noch Captures</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_title">Videozeit für Aufnahmen von</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_title">Standbilder</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_summary">Die Standbilder werden vom Anfang / Mitte / Ende jedes Videos erstellt. Diese Bilder stammen von YouTube und es wird keine externe API verwendet</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_title">Schnelle Standbilder verwenden</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_on">Standbilder in mittlerer Qualität verwenden. Die Vorschaubilder werden schneller geladen, aber Livestreams, unveröffentlichte oder sehr alte Videos können leere Vorschaubilder anzeigen.</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_off">Standbilder in hoher Qualität verwenden</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_title">Videozeitpunkt von dem Standbilder aufgenommen werden</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_1">Beginn des Videos</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_2">Mitte des Videos</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_3">Ende des Videos</string>
|
||||
@@ -1468,7 +1474,7 @@ Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet w
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Um diese Funktion zu nutzen, ändere \"Video-Streams fälschen\" auf einen beliebigen Client außer Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -623,6 +623,10 @@ 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>
|
||||
@@ -721,7 +725,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Εμφανίζεται</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Το μενού «Κομμάτι ήχου» είναι κρυμμένο
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Κρυμμένο
|
||||
|
||||
Για να εμφανίζεται το μενού κομματιού ήχου, αλλάξτε την «Παραποίηση ροών βίντεο» σε iPadOS"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
@@ -1472,7 +1476,7 @@ Second \"item\" text"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Για να χρησιμοποιήσετε αυτήν τη λειτουργία, αλλάξτε την επιλογή «Παραποίηση ροών βίντεο» σε οποιονδήποτε πελάτη εκτός από το Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
@@ -1550,7 +1554,7 @@ Second \"item\" text"</string>
|
||||
<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">• Το βίντεο ενδέχεται να σταματήσει στο 1: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>
|
||||
@@ -1559,12 +1563,12 @@ Second \"item\" text"</string>
|
||||
<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">Ομάδα προγραμματιστών</string>
|
||||
<string name="revanced_settings_music_screen_0_about_title">Σχετικά με</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_3_player_title">Οθόνη αναπαραγωγής</string>
|
||||
@@ -1581,17 +1585,17 @@ Second \"item\" text"</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_off">Η γραμμή κατηγοριών εμφανίζεται</string>
|
||||
<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_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_summary_off">Η ετικέτα εμφανίζεται</string>
|
||||
<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_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_title">Κουμπί «Αναβάθμιση»</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_music_hide_upgrade_button_summary_off">Εμφανίζεται</string>
|
||||
</patch>
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1464,7 +1468,7 @@ Habilitar esto puede desbloquear calidades de vídeo más altas"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Para usar esta función, cambia \'Falsificar transmisiones de vídeo\' a cualquier cliente excepto Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1473,7 +1477,7 @@ Selle lubamine võib avada kõrgema video kvaliteedi"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Selle funktsiooni kasutamiseks muutke „Võltsitud videovood” mis tahes muule kliendile peale Android Studio.</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +147,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1473,7 +1477,7 @@ Tämä voi avata korkealaatuisemmat videot"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Jotta voit käyttää tätä ominaisuutta, muuta \'Huijaa videovirtoja\' mihin tahansa asiakasohjelmaan paitsi Android Studioon</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1471,7 +1475,7 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video"</st
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Para magamit ang feature na ito, palitan ang \'Panggagaya ng mga video stream\' sa anumang client maliban sa Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -94,10 +94,10 @@ Appuyez sur le bouton Continuer et autorisez les modifications."</string>
|
||||
<string name="revanced_spoof_video_streams_title">Falsifier les flux vidéo</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">"Les flux vidéo sont falsifiés
|
||||
|
||||
Si vous avez YouTube Premium, il est possible que ce paramètre ne soit pas nécessaire"</string>
|
||||
Si vous êtes abonné à YouTube Premium, ce paramètre n'est peut-être pas nécessaire"</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">"Les flux vidéo ne sont pas falsifiés
|
||||
|
||||
La lecture est susceptible de ne pas fonctionner"</string>
|
||||
Il est possible que la lecture ne fonctionne pas"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">La désactivation de ce paramètre peut entraîner des problèmes de lecture.</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_title">Client par défaut</string>
|
||||
</patch>
|
||||
@@ -621,6 +621,10 @@ 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 \"Magasin\"</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Le bouton Magasin est masqué</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Le bouton Magasin 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>
|
||||
@@ -1063,9 +1067,9 @@ Cette fonctionnalité fonctionne de manière optimale avec une qualité vidéo d
|
||||
<string name="revanced_sb_general_min_duration">Durée minimale d\'un segment</string>
|
||||
<string name="revanced_sb_general_min_duration_sum">Les segments dont la durée est inférieure à cette valeur (en secondes) ne seront ni affichés ni ignorés</string>
|
||||
<string name="revanced_sb_general_min_duration_invalid">Durée invalide</string>
|
||||
<string name="revanced_sb_general_uuid">Votre ID privé d\'utilisateur</string>
|
||||
<string name="revanced_sb_general_uuid">Votre ID d\'utilisateur privé</string>
|
||||
<string name="revanced_sb_general_uuid_sum">Cet identifiant doit rester confidentiel. Cet identifiant est comme un mot de passe et ne doit être partagé avec qui que ce soit. Si quelqu\'un venait à mettre la main dessus, il pourrait usurper votre identité.</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">L\'ID privé d\'utilisateur doit comporter au moins 30 caractères</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">ID d\'utilisateur privé trop court (30+ caractères)</string>
|
||||
<string name="revanced_sb_general_api_url">Modifier l\'URL de l\'API</string>
|
||||
<string name="revanced_sb_general_api_url_sum">L\'adresse utilisée par SponsorBlock pour contacter son serveur</string>
|
||||
<string name="revanced_sb_api_url_reset">URL de l\'API réinitialisée</string>
|
||||
@@ -1074,11 +1078,11 @@ Cette fonctionnalité fonctionne de manière optimale avec une qualité vidéo d
|
||||
<string name="revanced_sb_settings_ie">Importer/Exporter les paramètres</string>
|
||||
<string name="revanced_sb_settings_copy">Copier</string>
|
||||
<string name="revanced_sb_settings_ie_sum">Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et les autres plateformes SponsorBlock</string>
|
||||
<string name="revanced_sb_settings_ie_sum_warning">Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et d\'autres plateformes SponsorBlock. Votre ID privé d\'utilisateur y est présent, partagez-la avec prudence.</string>
|
||||
<string name="revanced_sb_settings_ie_sum_warning">Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et d\'autres plateformes SponsorBlock. Votre ID d\'utilisateur privé y est présent, partagez-la avec prudence.</string>
|
||||
<string name="revanced_sb_settings_import_successful">Paramètres importés avec succès</string>
|
||||
<string name="revanced_sb_settings_import_failed">Échec de l\'importation : %s</string>
|
||||
<string name="revanced_sb_settings_export_failed">Échec de l\'exportation : %s</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning">"Vos paramètres contiennent un ID privé d'utilisateur.
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning">"Vos paramètres contiennent un ID d'utilisateur SponsorBlock privé.
|
||||
|
||||
Votre ID d'utilisateur est comme un mot de passe et ne doit jamais être partagé."</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Ne plus afficher</string>
|
||||
@@ -1159,20 +1163,20 @@ Il existe déjà."</string>
|
||||
<string name="revanced_sb_vote_upvote">Voter pour</string>
|
||||
<string name="revanced_sb_vote_downvote">Voter contre</string>
|
||||
<string name="revanced_sb_vote_category">Modifier la catégorie</string>
|
||||
<string name="revanced_sb_vote_no_segments">Il n\'y a pas de segments où voter</string>
|
||||
<string name="revanced_sb_vote_no_segments">Il n\'y a pas de segments sur lesquels voter</string>
|
||||
<!-- A segment start and end time, such as "02:10 to 03:40". -->
|
||||
<string name="revanced_sb_vote_segment_time_to_from">%1$s – %2$s</string>
|
||||
<string name="revanced_sb_new_segment_choose_category">Choisissez la catégorie du segment</string>
|
||||
<string name="revanced_sb_new_segment_disabled_category">La catégorie est désactivée dans les paramètres. Activez la catégorie pour soumettre.</string>
|
||||
<string name="revanced_sb_new_segment_disabled_category">Catégorie désact. ds paramètres. Activer pr soumettre.</string>
|
||||
<string name="revanced_sb_new_segment_title">Nouveau segment SponsorBlock</string>
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">Définir %s comme début ou fin du nouveau segment ?</string>
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">Définir %s comme début ou fin d\'un nouveau segment ?</string>
|
||||
<string name="revanced_sb_new_segment_mark_start">Début</string>
|
||||
<string name="revanced_sb_new_segment_mark_end">Fin</string>
|
||||
<string name="revanced_sb_new_segment_now">Maint.</string>
|
||||
<string name="revanced_sb_new_segment_now">Maintenant</string>
|
||||
<string name="revanced_sb_new_segment_time_start">Instant de début du segment</string>
|
||||
<string name="revanced_sb_new_segment_time_end">Instant de fin du segment</string>
|
||||
<string name="revanced_sb_new_segment_confirm_title">Est-ce que ces valeurs sont correctes ?</string>
|
||||
<string name="revanced_sb_new_segment_confirm_content">"Le segment dure de
|
||||
<string name="revanced_sb_new_segment_confirm_title">Ces valeurs sont-elles correctes ?</string>
|
||||
<string name="revanced_sb_new_segment_confirm_content">"Le segment s'étend de
|
||||
|
||||
%1$s
|
||||
à
|
||||
@@ -1180,10 +1184,10 @@ Il existe déjà."</string>
|
||||
|
||||
(%3$s)
|
||||
|
||||
Prêt à soumettre ?"</string>
|
||||
<string name="revanced_sb_new_segment_start_is_before_end">Le début doit être avant la fin</string>
|
||||
Prêt à le soumettre ?"</string>
|
||||
<string name="revanced_sb_new_segment_start_is_before_end">Le début doit précéder la fin</string>
|
||||
<string name="revanced_sb_new_segment_mark_locations_first">Marquez d\'abord deux emplacements sur la barre de progression</string>
|
||||
<string name="revanced_sb_new_segment_preview_segment_first">Regardez la vidéo au moment du segment, et assurez-vous qu\'il est ignoré de manière fluide</string>
|
||||
<string name="revanced_sb_new_segment_preview_segment_first">Prévisualisez segment + contrôlez fluidité du saut</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Modifier la durée du segment manuellement</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Voulez-vous modifier le début ou la fin du segment ?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Temps fourni invalide</string>
|
||||
@@ -1205,7 +1209,7 @@ Prêt à soumettre ?"</string>
|
||||
<string name="revanced_sb_stats_saved_sum">Cela représente <b>%s</b> de leur vie.<br>Appuyez ici pour voir le classement</string>
|
||||
<string name="revanced_sb_stats_self_saved">Vous avez passé <b>%s</b> segments</string>
|
||||
<string name="revanced_sb_stats_self_saved_sum">Pour un total de <b>%s</b></string>
|
||||
<string name="revanced_sb_stats_self_saved_reset_title">Réinitialiser le compteur de segments ignorés ?</string>
|
||||
<string name="revanced_sb_stats_self_saved_reset_title">Réinitialiser le compteur de segments passés ?</string>
|
||||
<string name="revanced_sb_stats_saved_hour_format">%1$s heures et %2$s minutes</string>
|
||||
<string name="revanced_sb_stats_saved_minute_format">%1$s minutes et %2$s secondes</string>
|
||||
<string name="revanced_sb_stats_saved_second_format">%s secondes</string>
|
||||
@@ -1474,7 +1478,7 @@ Activer cette option peut déverrouiller des qualités vidéo supérieures"</str
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Pour utiliser cette fonctionnalité, définissez \"Falsifier les flux vidéo\" sur n\'importe quel client, sauf Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1473,7 +1477,7 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1470,7 +1474,7 @@ 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_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>
|
||||
<string name="revanced_force_original_audio_not_available">A funkció használatához módosítsa a \"Videóstreamek hamisítása\" beállítást bármely kliensre, kivéve az Android Studiót</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1474,7 +1478,7 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Այս հնարավորությունն օգտագործելու համար «Կեղծել վիդեո հոսքերը» տարբերակը փոխեք ցանկացած հաճախորդի, բացի Android Studio-ից</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">Mematikan pengaturan ini dapat menyebabkan masalah pemutaran.</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Menonaktifkan pengaturan ini mungkin menyebabkan masalah pemutaran.</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_title">Klien bawaan</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
@@ -621,6 +621,10 @@ 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 Belanja</string>
|
||||
<string name="revanced_hide_shop_button_summary_on">Tombol belanja disembunyikan</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">Tombol belanja 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>
|
||||
@@ -721,7 +725,7 @@ Jika mengubah setelan ini tidak berpengaruh, coba beralih ke mode Penyamaran."</
|
||||
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Menu trek audio disembunyikan
|
||||
|
||||
Untuk menampilkan menu trek audio, ubah 'Spoof stream video' ke iPadOS"</string>
|
||||
Untuk menampilkan menu trek audio, ubah 'Palsukan aliran video' ke iPadOS"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Sembunyikan Tonton di VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Menu tonton di VR disembunyikan</string>
|
||||
@@ -831,7 +835,7 @@ Untuk menampilkan menu trek audio, ubah 'Spoof stream video' ke iPadOS"</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Sembunyikan saran penelusuran</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Saran penelusuran disembunyikan</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Saran penelusuran ditampilkan</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">Sembunyikan tombol Toko</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">Sembunyikan tombol Belanja</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_on">Tombol belanja disembunyikan</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_off">Tombol belanja ditampilkan</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Sembunyikan stiker</string>
|
||||
@@ -1472,7 +1476,7 @@ Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Untuk menggunakan fitur ini, ubah \'Spoof aliran video\' ke klien apa pun kecuali Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
@@ -1548,9 +1552,9 @@ Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi"</string>
|
||||
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_about_title">Efek samping pemalsuan</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_title">Efek samping pemalsuan Android</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Menu trek audio tidak ada
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Menu trek audio hilang
|
||||
• Volume stabil tidak tersedia"</string>
|
||||
<string name="revanced_spoof_video_streams_about_ipados_summary">• Video mungkin berhenti pada pukul 1:00, atau mungkin tidak tersedia di beberapa wilayah</string>
|
||||
<string name="revanced_spoof_video_streams_about_ipados_summary">• Video mungkin berhenti pada menit 1:00, atau mungkin tidak tersedia di beberapa wilayah</string>
|
||||
<string name="revanced_spoof_video_streams_about_experimental">• Klien eksperimental dan dapat berhenti berfungsi kapan saja</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• Tidak ada codec video AV1</string>
|
||||
<string name="revanced_spoof_video_streams_about_kids_videos">• Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran</string>
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1472,7 +1476,7 @@ Abilitare questa opzione può sbloccare qualità video più elevate"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Per usare questa funzionalità, cambia \"Falsifica i flussi video\" a qualsiasi client eccetto Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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 +1479,7 @@ Second \"item\" text"</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>
|
||||
<string name="revanced_force_original_audio_not_available">כדי להשתמש בתכונה זו, שנה את \'זיוף זרמי וידאו\' לכל לקוח מלבד Android Studio</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,6 +623,10 @@ 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>
|
||||
@@ -1310,12 +1314,12 @@ Automotive レイアウト
|
||||
<string name="revanced_miniplayer_rounded_corners_title">丸角を有効化</string>
|
||||
<string name="revanced_miniplayer_rounded_corners_summary_on">ミニプレーヤーの角は丸角です</string>
|
||||
<string name="revanced_miniplayer_rounded_corners_summary_off">ミニプレーヤーの角は直角です</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_title">「ダブルタップとピンチでサイズ変更」を有効化</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_on">"「ダブルタップとピンチでサイズ変更」は有効です
|
||||
<string name="revanced_miniplayer_double_tap_action_title">ダブルタップとピンチによるサイズ変更を有効化</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_on">"ダブルタップとピンチによるサイズ変更は有効です
|
||||
|
||||
• ダブルタップすると、ミニプレーヤーのサイズが大きくなる
|
||||
• もう一度ダブルタップすると、元のサイズに戻る"</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_off">「 ダブルタップとピンチでサイズ変更」は無効です</string>
|
||||
<string name="revanced_miniplayer_double_tap_action_summary_off">ダブルタップとピンチによるサイズ変更は無効です</string>
|
||||
<string name="revanced_miniplayer_drag_and_drop_title">ドラッグ&ドロップを有効化</string>
|
||||
<string name="revanced_miniplayer_drag_and_drop_summary_on">"ドラッグ&ドロップは有効です
|
||||
|
||||
@@ -1475,7 +1479,7 @@ Automotive レイアウト
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">この機能を使用するには、「動画ストリームを偽装」のクライアントを Android Studio 以外の任意のクライアントに変更してください</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
@@ -1553,7 +1557,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">• 動画は1:00で停止する場合があります。または、一部の地域では利用できない場合があります。</string>
|
||||
<string name="revanced_spoof_video_streams_about_ipados_summary">• 動画が 01: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>
|
||||
@@ -1562,14 +1566,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>
|
||||
@@ -1579,24 +1583,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">永続リピートが有効です</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_off">永続リピートが無効です</string>
|
||||
<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>
|
||||
</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">「Get Music Premium」ラベルを非表示</string>
|
||||
<string name="revanced_music_hide_get_premium_label_summary_on">ラベルは非表示です</string>
|
||||
<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_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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +115,7 @@ 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,6 +619,10 @@ 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>
|
||||
@@ -1480,7 +1484,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요"</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>
|
||||
<string name="revanced_force_original_audio_not_available">이 기능을 사용하려면, \'동영상 스트림 변경하기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
@@ -1558,7 +1562,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요"</string>
|
||||
<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">• 동영상이 1: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">• Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다</string>
|
||||
@@ -1567,7 +1571,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요"</string>
|
||||
<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">
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1474,7 +1478,7 @@ Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti v
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Kad naudotumėte šią funkciją, pakeiskite „Klastoti vaizdo įrašų srautus“ į bet kurį klientą, išskyrus „Android Studio“</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -621,6 +621,10 @@ 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>
|
||||
@@ -1474,7 +1478,7 @@ Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atsk
|
||||
<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>
|
||||
<string name="revanced_force_original_audio_not_available">Lai izmantotu šo funkciju, mainiet \"Viltotās video plūsmas\" uz jebkuru klientu, izņemot Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
@@ -100,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +100,7 @@ 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,6 +102,7 @@ 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,6 +621,10 @@ 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>
|
||||
@@ -1471,7 +1475,7 @@ Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen"</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>
|
||||
<string name="revanced_force_original_audio_not_available">Om deze functie te gebruiken, wijzig \'Videostreams spoofen\' naar elke client behalve Android Studio</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user