mirror of
https://github.com/revanced/revanced-patches
synced 2024-12-26 21:25:56 +01:00
feat(YouTube - Spoof video streams): Allow picking a default audio language track (#4050)
This commit is contained in:
parent
fd7db2fa9c
commit
ede666b5cb
@ -1,11 +1,12 @@
|
|||||||
package app.revanced.extension.shared.settings;
|
package app.revanced.extension.shared.settings;
|
||||||
|
|
||||||
import app.revanced.extension.shared.spoof.ClientType;
|
|
||||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
|
||||||
|
|
||||||
import static java.lang.Boolean.FALSE;
|
import static java.lang.Boolean.FALSE;
|
||||||
import static java.lang.Boolean.TRUE;
|
import static java.lang.Boolean.TRUE;
|
||||||
import static app.revanced.extension.shared.settings.Setting.parent;
|
import static app.revanced.extension.shared.settings.Setting.parent;
|
||||||
|
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.ForceiOSAVCAvailability;
|
||||||
|
|
||||||
|
import app.revanced.extension.shared.spoof.AudioStreamLanguage;
|
||||||
|
import app.revanced.extension.shared.spoof.ClientType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Settings shared across multiple apps.
|
* Settings shared across multiple apps.
|
||||||
@ -21,8 +22,9 @@ public class BaseSettings {
|
|||||||
public static final IntegerSetting CHECK_ENVIRONMENT_WARNINGS_ISSUED = new IntegerSetting("revanced_check_environment_warnings_issued", 0, true, false);
|
public static final IntegerSetting CHECK_ENVIRONMENT_WARNINGS_ISSUED = new IntegerSetting("revanced_check_environment_warnings_issued", 0, true, false);
|
||||||
|
|
||||||
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 BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
|
||||||
|
public static final EnumSetting<AudioStreamLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AudioStreamLanguage.DEFAULT);
|
||||||
public static final BooleanSetting SPOOF_VIDEO_STREAMS_IOS_FORCE_AVC = new BooleanSetting("revanced_spoof_video_streams_ios_force_avc", FALSE, true,
|
public static final BooleanSetting SPOOF_VIDEO_STREAMS_IOS_FORCE_AVC = new BooleanSetting("revanced_spoof_video_streams_ios_force_avc", FALSE, true,
|
||||||
"revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new SpoofVideoStreamsPatch.ForceiOSAVCAvailability());
|
"revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new ForceiOSAVCAvailability());
|
||||||
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client", ClientType.ANDROID_VR, true, parent(SPOOF_VIDEO_STREAMS));
|
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client", ClientType.ANDROID_VR, true, parent(SPOOF_VIDEO_STREAMS));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,102 @@
|
|||||||
|
package app.revanced.extension.shared.spoof;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public enum AudioStreamLanguage {
|
||||||
|
DEFAULT,
|
||||||
|
|
||||||
|
// Language codes found in locale_config.xml
|
||||||
|
// Region specific variants of Chinese/English/Spanish/French have been removed.
|
||||||
|
AF,
|
||||||
|
AM,
|
||||||
|
AR,
|
||||||
|
AS,
|
||||||
|
AZ,
|
||||||
|
BE,
|
||||||
|
BG,
|
||||||
|
BN,
|
||||||
|
BS,
|
||||||
|
CA,
|
||||||
|
CS,
|
||||||
|
DA,
|
||||||
|
DE,
|
||||||
|
EL,
|
||||||
|
EN,
|
||||||
|
ES,
|
||||||
|
ET,
|
||||||
|
EU,
|
||||||
|
FA,
|
||||||
|
FI,
|
||||||
|
FR,
|
||||||
|
GL,
|
||||||
|
GU,
|
||||||
|
HI,
|
||||||
|
HE, // App uses obsolete 'IW' and 'HE' is modern ISO code.
|
||||||
|
HR,
|
||||||
|
HU,
|
||||||
|
HY,
|
||||||
|
ID,
|
||||||
|
IS,
|
||||||
|
IT,
|
||||||
|
JA,
|
||||||
|
KA,
|
||||||
|
KK,
|
||||||
|
KM,
|
||||||
|
KN,
|
||||||
|
KO,
|
||||||
|
KY,
|
||||||
|
LO,
|
||||||
|
LT,
|
||||||
|
LV,
|
||||||
|
MK,
|
||||||
|
ML,
|
||||||
|
MN,
|
||||||
|
MR,
|
||||||
|
MS,
|
||||||
|
MY,
|
||||||
|
NE,
|
||||||
|
NL,
|
||||||
|
NB,
|
||||||
|
OR,
|
||||||
|
PA,
|
||||||
|
PL,
|
||||||
|
PT_BR,
|
||||||
|
PT_PT,
|
||||||
|
RO,
|
||||||
|
RU,
|
||||||
|
SI,
|
||||||
|
SK,
|
||||||
|
SL,
|
||||||
|
SQ,
|
||||||
|
SR,
|
||||||
|
SV,
|
||||||
|
SW,
|
||||||
|
TA,
|
||||||
|
TE,
|
||||||
|
TH,
|
||||||
|
TL,
|
||||||
|
TR,
|
||||||
|
UK,
|
||||||
|
UR,
|
||||||
|
UZ,
|
||||||
|
VI,
|
||||||
|
ZH,
|
||||||
|
ZU;
|
||||||
|
|
||||||
|
private final String iso639_1;
|
||||||
|
|
||||||
|
AudioStreamLanguage() {
|
||||||
|
iso639_1 = name().replace('_', '-');
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIso639_1() {
|
||||||
|
// Changing the app language does not force the app to completely restart,
|
||||||
|
// so the default needs to be the current language and not a static field.
|
||||||
|
if (this == DEFAULT) {
|
||||||
|
// Android VR requires uppercase language code.
|
||||||
|
return Locale.getDefault().toLanguageTag().toUpperCase(Locale.US);
|
||||||
|
}
|
||||||
|
|
||||||
|
return iso639_1;
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,6 @@ import app.revanced.extension.shared.Utils;
|
|||||||
import app.revanced.extension.shared.settings.BaseSettings;
|
import app.revanced.extension.shared.settings.BaseSettings;
|
||||||
import app.revanced.extension.shared.settings.Setting;
|
import app.revanced.extension.shared.settings.Setting;
|
||||||
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
|
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
|
||||||
import app.revanced.extension.shared.settings.BaseSettings;
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class SpoofVideoStreamsPatch {
|
public class SpoofVideoStreamsPatch {
|
||||||
|
@ -7,9 +7,9 @@ import java.io.IOException;
|
|||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
|
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
import app.revanced.extension.shared.Utils;
|
|
||||||
import app.revanced.extension.shared.requests.Requester;
|
import app.revanced.extension.shared.requests.Requester;
|
||||||
import app.revanced.extension.shared.requests.Route;
|
import app.revanced.extension.shared.requests.Route;
|
||||||
|
import app.revanced.extension.shared.settings.BaseSettings;
|
||||||
import app.revanced.extension.shared.spoof.ClientType;
|
import app.revanced.extension.shared.spoof.ClientType;
|
||||||
|
|
||||||
final class PlayerRoutes {
|
final class PlayerRoutes {
|
||||||
@ -25,9 +25,6 @@ final class PlayerRoutes {
|
|||||||
*/
|
*/
|
||||||
private static final int CONNECTION_TIMEOUT_MILLISECONDS = 10 * 1000; // 10 Seconds.
|
private static final int CONNECTION_TIMEOUT_MILLISECONDS = 10 * 1000; // 10 Seconds.
|
||||||
|
|
||||||
private static final String LOCALE_LANGUAGE = Utils.getContext().getResources()
|
|
||||||
.getConfiguration().locale.getLanguage();
|
|
||||||
|
|
||||||
private PlayerRoutes() {
|
private PlayerRoutes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,8 +35,7 @@ final class PlayerRoutes {
|
|||||||
JSONObject context = new JSONObject();
|
JSONObject context = new JSONObject();
|
||||||
|
|
||||||
JSONObject client = new JSONObject();
|
JSONObject client = new JSONObject();
|
||||||
// Required to use correct default audio channel with iOS.
|
client.put("hl", BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get().getIso639_1());
|
||||||
client.put("hl", LOCALE_LANGUAGE);
|
|
||||||
client.put("clientName", clientType.name());
|
client.put("clientName", clientType.name());
|
||||||
client.put("clientVersion", clientType.clientVersion);
|
client.put("clientVersion", clientType.clientVersion);
|
||||||
client.put("deviceModel", clientType.deviceModel);
|
client.put("deviceModel", clientType.deviceModel);
|
||||||
|
@ -10,6 +10,7 @@ import android.os.Build;
|
|||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
@ -18,6 +19,10 @@ import android.widget.Toolbar;
|
|||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
import app.revanced.extension.shared.Utils;
|
import app.revanced.extension.shared.Utils;
|
||||||
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
||||||
@ -41,6 +46,46 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
|||||||
return Utils.getContext().getResources().getDrawable(backButtonResource);
|
return Utils.getContext().getResources().getDrawable(backButtonResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts a preference list by menu entries, but preserves the first value as the first entry.
|
||||||
|
*/
|
||||||
|
private static void sortListPreferenceByValues(ListPreference listPreference) {
|
||||||
|
CharSequence[] entries = listPreference.getEntries();
|
||||||
|
CharSequence[] entryValues = listPreference.getEntryValues();
|
||||||
|
final int entrySize = entries.length;
|
||||||
|
|
||||||
|
if (entrySize != entryValues.length) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the first entry remains the first after sorting.
|
||||||
|
CharSequence firstEntry = entries[0];
|
||||||
|
CharSequence firstEntryValue = entryValues[0];
|
||||||
|
|
||||||
|
List<Pair<String, String>> entryPairs = new ArrayList<>(entrySize);
|
||||||
|
for (int i = 1; i < entrySize; i++) {
|
||||||
|
entryPairs.add(new Pair<>(entries[i].toString(), entryValues[i].toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.sort(entryPairs, (pair1, pair2) -> pair1.first.compareToIgnoreCase(pair2.first));
|
||||||
|
|
||||||
|
CharSequence[] sortedEntries = new CharSequence[entrySize];
|
||||||
|
CharSequence[] sortedEntryValues = new CharSequence[entrySize];
|
||||||
|
|
||||||
|
sortedEntries[0] = firstEntry;
|
||||||
|
sortedEntryValues[0] = firstEntryValue;
|
||||||
|
|
||||||
|
int i = 1;
|
||||||
|
for (Pair<String, String> pair : entryPairs) {
|
||||||
|
sortedEntries[i] = pair.first;
|
||||||
|
sortedEntryValues[i] = pair.second;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
listPreference.setEntries(sortedEntries);
|
||||||
|
listPreference.setEntryValues(sortedEntryValues);
|
||||||
|
}
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
@Override
|
@Override
|
||||||
protected void initialize() {
|
protected void initialize() {
|
||||||
@ -50,9 +95,14 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
|||||||
setPreferenceScreenToolbar(getPreferenceScreen());
|
setPreferenceScreenToolbar(getPreferenceScreen());
|
||||||
|
|
||||||
// If the preference was included, then initialize it based on the available playback speed.
|
// If the preference was included, then initialize it based on the available playback speed.
|
||||||
Preference defaultSpeedPreference = findPreference(Settings.PLAYBACK_SPEED_DEFAULT.key);
|
Preference preference = findPreference(Settings.PLAYBACK_SPEED_DEFAULT.key);
|
||||||
if (defaultSpeedPreference instanceof ListPreference) {
|
if (preference instanceof ListPreference playbackPreference) {
|
||||||
CustomPlaybackSpeedPatch.initializeListPreference((ListPreference) defaultSpeedPreference);
|
CustomPlaybackSpeedPatch.initializeListPreference(playbackPreference);
|
||||||
|
}
|
||||||
|
|
||||||
|
preference = findPreference(Settings.SPOOF_VIDEO_STREAMS_LANGUAGE.key);
|
||||||
|
if (preference instanceof ListPreference languagePreference) {
|
||||||
|
sortListPreferenceByValues(languagePreference);
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.printException(() -> "initialize failure", ex);
|
Logger.printException(() -> "initialize failure", ex);
|
||||||
|
@ -11,6 +11,116 @@
|
|||||||
<item>ANDROID_VR</item>
|
<item>ANDROID_VR</item>
|
||||||
<item>IOS</item>
|
<item>IOS</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="revanced_spoof_video_streams_language_entries">
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_DEFAULT</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_AR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_AZ</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_BG</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_BN</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_CA</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_CS</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_DA</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_DE</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_EL</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_EN</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_ES</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_ET</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_FA</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_FI</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_FR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_GU</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_HI</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_HR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_HU</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_ID</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_IT</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_JA</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_KK</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_KO</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_LT</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_LV</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_MK</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_MN</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_MR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_MS</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_MY</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_NL</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_OR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_PA</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_PL</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_PT_BR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_PT_PT</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_RO</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_RU</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_SK</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_SL</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_SR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_SV</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_SW</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_TA</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_TE</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_TH</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_TR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_UK</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_UR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_VI</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_language_ZH</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="revanced_spoof_video_streams_language_entry_values">
|
||||||
|
<item>DEFAULT</item>
|
||||||
|
<item>AR</item>
|
||||||
|
<item>AZ</item>
|
||||||
|
<item>BG</item>
|
||||||
|
<item>BN</item>
|
||||||
|
<item>CA</item>
|
||||||
|
<item>CS</item>
|
||||||
|
<item>DA</item>
|
||||||
|
<item>DE</item>
|
||||||
|
<item>EL</item>
|
||||||
|
<item>EN</item>
|
||||||
|
<item>ES</item>
|
||||||
|
<item>ET</item>
|
||||||
|
<item>FA</item>
|
||||||
|
<item>FI</item>
|
||||||
|
<item>FR</item>
|
||||||
|
<item>GU</item>
|
||||||
|
<item>HI</item>
|
||||||
|
<item>HR</item>
|
||||||
|
<item>HU</item>
|
||||||
|
<item>ID</item>
|
||||||
|
<item>IT</item>
|
||||||
|
<item>JA</item>
|
||||||
|
<item>KK</item>
|
||||||
|
<item>KO</item>
|
||||||
|
<item>LT</item>
|
||||||
|
<item>LV</item>
|
||||||
|
<item>MK</item>
|
||||||
|
<item>MN</item>
|
||||||
|
<item>MR</item>
|
||||||
|
<item>MS</item>
|
||||||
|
<item>MY</item>
|
||||||
|
<item>NL</item>
|
||||||
|
<item>OR</item>
|
||||||
|
<item>PA</item>
|
||||||
|
<item>PL</item>
|
||||||
|
<item>PT_BR</item>
|
||||||
|
<item>PT_PT</item>
|
||||||
|
<item>RO</item>
|
||||||
|
<item>RU</item>
|
||||||
|
<item>SK</item>
|
||||||
|
<item>SL</item>
|
||||||
|
<item>SR</item>
|
||||||
|
<item>SV</item>
|
||||||
|
<item>SW</item>
|
||||||
|
<item>TA</item>
|
||||||
|
<item>TE</item>
|
||||||
|
<item>TH</item>
|
||||||
|
<item>TR</item>
|
||||||
|
<item>UK</item>
|
||||||
|
<item>UR</item>
|
||||||
|
<item>VI</item>
|
||||||
|
<item>ZH</item>
|
||||||
|
</string-array>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.spoofappversion.spoofAppVersionPatch">
|
<patch id="layout.spoofappversion.spoofAppVersionPatch">
|
||||||
<string-array name="revanced_spoof_app_version_target_entries">
|
<string-array name="revanced_spoof_app_version_target_entries">
|
||||||
|
@ -1232,6 +1232,61 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
|||||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Private kids videos may not play\n• Livestreams start from the beginning\n• Videos may end 1 second early</string>
|
<string name="revanced_spoof_video_streams_about_ios_summary">• Private kids videos may not play\n• Livestreams start from the beginning\n• Videos may end 1 second early</string>
|
||||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Android VR spoofing side effects</string>
|
<string name="revanced_spoof_video_streams_about_android_vr_title">Android VR spoofing side effects</string>
|
||||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Kids videos may not play\n• Audio track menu is missing\n• Stable volume is not available</string>
|
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Kids videos may not play\n• Audio track menu is missing\n• Stable volume is not available</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_">Video streams are spoofed</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_title">Preferred audio stream language</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_DEFAULT">App language</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_AR">Arabic</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_AZ">Azerbaijani</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_BG">Bulgarian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_BN">Bengali</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_CA">Catalan</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_CS">Czech</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_DA">Danish</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_DE">German</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_EL">Greek</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_EN">English</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_ES">Spanish</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_ET">Estonian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_FA">Persian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_FI">Finnish</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_FR">French</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_GU">Gujarati</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_HI">Hindi</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_HR">Croatian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_HU">Hungarian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_ID">Indonesian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_IT">Italian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_JA">Japanese</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_KK">Kazakh</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_KO">Korean</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_LT">Lithuanian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_LV">Latvian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_MK">Macedonian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_MN">Mongolian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_MR">Marathi</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_MS">Malay</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_MY">Burmese</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_NL">Dutch</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_OR">Odia</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_PA">Punjabi</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_PL">Polish</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_PT_BR">Portuguese (Brazil)</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_PT_PT">Portuguese (Portugal)</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_RO">Romanian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_RU">Russian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_SK">Slovak</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_SL">Slovene</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_SR">Serbian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_SV">Swedish</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_SW">Swahili</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_TA">Tamil</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_TE">Telugu</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_TH">Thai</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_TR">Turkish</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_UK">Ukrainian</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_UR">Urdu</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_VI">Vietnamese</string>
|
||||||
|
<string name="revanced_spoof_video_streams_language_ZH">Chinese</string>
|
||||||
</patch>
|
</patch>
|
||||||
</app>
|
</app>
|
||||||
<app id="twitch">
|
<app id="twitch">
|
||||||
|
Loading…
Reference in New Issue
Block a user