mirror of
https://github.com/revanced/revanced-patches
synced 2025-01-02 17:15:48 +01:00
feat(YouTube): Add in app option to select a preferred language for ReVanced specific text (#4231)
This commit is contained in:
parent
8aa25c31db
commit
3932af397a
@ -40,6 +40,8 @@ import java.util.concurrent.SynchronousQueue;
|
|||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import app.revanced.extension.shared.settings.AppLanguage;
|
||||||
|
import app.revanced.extension.shared.settings.BaseSettings;
|
||||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||||
import app.revanced.extension.shared.settings.preference.ReVancedAboutPreference;
|
import app.revanced.extension.shared.settings.preference.ReVancedAboutPreference;
|
||||||
|
|
||||||
@ -360,7 +362,17 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void setContext(Context appContext) {
|
public static void setContext(Context appContext) {
|
||||||
|
// Must initially set context as the language settings needs it.
|
||||||
context = appContext;
|
context = appContext;
|
||||||
|
|
||||||
|
AppLanguage language = BaseSettings.REVANCED_LANGUAGE.get();
|
||||||
|
if (language != AppLanguage.DEFAULT) {
|
||||||
|
// Create a new context with the desired language.
|
||||||
|
Configuration config = appContext.getResources().getConfiguration();
|
||||||
|
config.setLocale(language.getLocale());
|
||||||
|
context = appContext.createConfigurationContext(config);
|
||||||
|
}
|
||||||
|
|
||||||
// In some apps like TikTok, the Setting classes can load in weird orders due to cyclic class dependencies.
|
// In some apps like TikTok, the Setting classes can load in weird orders due to cyclic class dependencies.
|
||||||
// Calling the regular printDebug method here can cause a Settings context null pointer exception,
|
// Calling the regular printDebug method here can cause a Settings context null pointer exception,
|
||||||
// even though the context is already set before the call.
|
// even though the context is already set before the call.
|
||||||
@ -765,8 +777,8 @@ public class Utils {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String deviceLanguage = Utils.getContext().getResources().getConfiguration().locale.getLanguage();
|
String revancedLocale = Utils.getContext().getResources().getConfiguration().locale.getLanguage();
|
||||||
if (deviceLanguage.equals("en")) {
|
if (revancedLocale.equals(Locale.ENGLISH.getLanguage())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -774,8 +786,8 @@ public class Utils {
|
|||||||
Preference pref = group.getPreference(i);
|
Preference pref = group.getPreference(i);
|
||||||
pref.setSingleLineTitle(false);
|
pref.setSingleLineTitle(false);
|
||||||
|
|
||||||
if (pref instanceof PreferenceGroup) {
|
if (pref instanceof PreferenceGroup subGroup) {
|
||||||
setPreferenceTitlesToMultiLineIfNeeded((PreferenceGroup) pref);
|
setPreferenceTitlesToMultiLineIfNeeded(subGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package app.revanced.extension.shared.spoof;
|
package app.revanced.extension.shared.settings;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
public enum AudioStreamLanguage {
|
public enum AppLanguage {
|
||||||
/**
|
/**
|
||||||
* The current app language.
|
* The current app language.
|
||||||
*/
|
*/
|
||||||
@ -34,7 +34,7 @@ public enum AudioStreamLanguage {
|
|||||||
GL,
|
GL,
|
||||||
GU,
|
GU,
|
||||||
HI,
|
HI,
|
||||||
HE, // App uses obsolete 'IW' and 'HE' is modern ISO code.
|
HE, // App uses obsolete 'IW' and not the modern 'HE' ISO code.
|
||||||
HR,
|
HR,
|
||||||
HU,
|
HU,
|
||||||
HY,
|
HY,
|
||||||
@ -87,7 +87,7 @@ public enum AudioStreamLanguage {
|
|||||||
|
|
||||||
private final String language;
|
private final String language;
|
||||||
|
|
||||||
AudioStreamLanguage() {
|
AppLanguage() {
|
||||||
language = name().toLowerCase(Locale.US);
|
language = name().toLowerCase(Locale.US);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,4 +103,12 @@ public enum AudioStreamLanguage {
|
|||||||
|
|
||||||
return language;
|
return language;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Locale getLocale() {
|
||||||
|
if (this == DEFAULT) {
|
||||||
|
return Locale.getDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Locale.forLanguageTag(language);
|
||||||
|
}
|
||||||
}
|
}
|
@ -6,7 +6,6 @@ import static app.revanced.extension.shared.settings.Setting.parent;
|
|||||||
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
|
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
|
||||||
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.SpoofiOSAvailability;
|
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.SpoofiOSAvailability;
|
||||||
|
|
||||||
import app.revanced.extension.shared.spoof.AudioStreamLanguage;
|
|
||||||
import app.revanced.extension.shared.spoof.ClientType;
|
import app.revanced.extension.shared.spoof.ClientType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -22,8 +21,10 @@ 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 EnumSetting<AppLanguage> REVANCED_LANGUAGE = new EnumSetting<>("revanced_language", AppLanguage.DEFAULT, true, "revanced_language_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 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, new AudioStreamLanguageOverrideAvailability());
|
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));
|
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));
|
||||||
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 SpoofiOSAvailability());
|
"revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new SpoofiOSAvailability());
|
||||||
|
@ -10,7 +10,7 @@ import app.revanced.extension.shared.Logger;
|
|||||||
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.settings.BaseSettings;
|
||||||
import app.revanced.extension.shared.spoof.AudioStreamLanguage;
|
import app.revanced.extension.shared.settings.AppLanguage;
|
||||||
import app.revanced.extension.shared.spoof.ClientType;
|
import app.revanced.extension.shared.spoof.ClientType;
|
||||||
|
|
||||||
final class PlayerRoutes {
|
final class PlayerRoutes {
|
||||||
@ -42,9 +42,9 @@ final class PlayerRoutes {
|
|||||||
// but if this is a fall over client it will set the language even though
|
// but if this is a fall over client it will set the language even though
|
||||||
// the audio language is not selectable in the UI.
|
// the audio language is not selectable in the UI.
|
||||||
ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||||
AudioStreamLanguage language = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH
|
AppLanguage language = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH
|
||||||
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get()
|
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get()
|
||||||
: AudioStreamLanguage.DEFAULT;
|
: AppLanguage.DEFAULT;
|
||||||
|
|
||||||
JSONObject client = new JSONObject();
|
JSONObject client = new JSONObject();
|
||||||
client.put("hl", language.getLanguage());
|
client.put("hl", language.getLanguage());
|
||||||
|
@ -49,7 +49,10 @@ public class ExitFullscreenPatch {
|
|||||||
Logger.printDebug(() -> "Fullscreen button is null, cannot click");
|
Logger.printDebug(() -> "Fullscreen button is null, cannot click");
|
||||||
} else {
|
} else {
|
||||||
Logger.printDebug(() -> "Clicking fullscreen button");
|
Logger.printDebug(() -> "Clicking fullscreen button");
|
||||||
|
final boolean soundEffectsEnabled = button.isSoundEffectsEnabled();
|
||||||
|
button.setSoundEffectsEnabled(false);
|
||||||
button.performClick();
|
button.performClick();
|
||||||
|
button.setSoundEffectsEnabled(soundEffectsEnabled);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,15 @@ package app.revanced.extension.youtube.settings;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
|
import app.revanced.extension.shared.Utils;
|
||||||
|
import app.revanced.extension.shared.settings.AppLanguage;
|
||||||
|
import app.revanced.extension.shared.settings.BaseSettings;
|
||||||
import app.revanced.extension.youtube.ThemeHelper;
|
import app.revanced.extension.youtube.ThemeHelper;
|
||||||
import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment;
|
import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment;
|
||||||
import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment;
|
import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment;
|
||||||
@ -25,6 +29,19 @@ import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class LicenseActivityHook {
|
public class LicenseActivityHook {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injection point.
|
||||||
|
* Overrides the ReVanced settings language.
|
||||||
|
*/
|
||||||
|
public static Context getAttachBaseContext(Context original) {
|
||||||
|
AppLanguage language = BaseSettings.REVANCED_LANGUAGE.get();
|
||||||
|
if (language == AppLanguage.DEFAULT) {
|
||||||
|
return original;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Utils.getContext();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injection point.
|
* Injection point.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -25,6 +25,8 @@ 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.BaseSettings;
|
||||||
|
import app.revanced.extension.shared.settings.EnumSetting;
|
||||||
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
||||||
import app.revanced.extension.youtube.ThemeHelper;
|
import app.revanced.extension.youtube.ThemeHelper;
|
||||||
import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch;
|
import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch;
|
||||||
@ -109,15 +111,20 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
|||||||
CustomPlaybackSpeedPatch.initializeListPreference(playbackPreference);
|
CustomPlaybackSpeedPatch.initializeListPreference(playbackPreference);
|
||||||
}
|
}
|
||||||
|
|
||||||
preference = findPreference(Settings.SPOOF_VIDEO_STREAMS_LANGUAGE.key);
|
sortPreferenceListMenu(Settings.SPOOF_VIDEO_STREAMS_LANGUAGE);
|
||||||
if (preference instanceof ListPreference languagePreference) {
|
sortPreferenceListMenu(BaseSettings.REVANCED_LANGUAGE);
|
||||||
sortListPreferenceByValues(languagePreference, 1);
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.printException(() -> "initialize failure", ex);
|
Logger.printException(() -> "initialize failure", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sortPreferenceListMenu(EnumSetting<?> setting) {
|
||||||
|
Preference preference = findPreference(setting.key);
|
||||||
|
if (preference instanceof ListPreference languagePreference) {
|
||||||
|
sortListPreferenceByValues(languagePreference, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setPreferenceScreenToolbar(PreferenceScreen parentScreen) {
|
private void setPreferenceScreenToolbar(PreferenceScreen parentScreen) {
|
||||||
for (int i = 0, preferenceCount = parentScreen.getPreferenceCount(); i < preferenceCount; i++) {
|
for (int i = 0, preferenceCount = parentScreen.getPreferenceCount(); i < preferenceCount; i++) {
|
||||||
Preference childPreference = parentScreen.getPreference(i);
|
Preference childPreference = parentScreen.getPreference(i);
|
||||||
|
@ -6,6 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
|||||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||||
import app.revanced.patcher.patch.bytecodePatch
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
import app.revanced.patcher.patch.resourcePatch
|
import app.revanced.patcher.patch.resourcePatch
|
||||||
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||||
import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName
|
import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName
|
||||||
import app.revanced.patches.all.misc.resources.addResources
|
import app.revanced.patches.all.misc.resources.addResources
|
||||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||||
@ -20,8 +21,12 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
|||||||
import app.revanced.patches.youtube.misc.fix.cairo.disableCairoSettingsPatch
|
import app.revanced.patches.youtube.misc.fix.cairo.disableCairoSettingsPatch
|
||||||
import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch
|
import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch
|
||||||
import app.revanced.util.*
|
import app.revanced.util.*
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||||
|
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||||
|
|
||||||
// Used by a fingerprint() from SettingsPatch.
|
// Used by a fingerprint() from SettingsPatch.
|
||||||
@ -150,6 +155,10 @@ val settingsPatch = bytecodePatch(
|
|||||||
inputType = InputType.TEXT_MULTI_LINE,
|
inputType = InputType.TEXT_MULTI_LINE,
|
||||||
tag = "app.revanced.extension.shared.settings.preference.ImportExportPreference",
|
tag = "app.revanced.extension.shared.settings.preference.ImportExportPreference",
|
||||||
),
|
),
|
||||||
|
ListPreference(
|
||||||
|
key = "revanced_language",
|
||||||
|
summaryKey = null
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
setThemeFingerprint.method.let { setThemeMethod ->
|
setThemeFingerprint.method.let { setThemeMethod ->
|
||||||
@ -189,6 +198,32 @@ val settingsPatch = bytecodePatch(
|
|||||||
licenseActivityOnCreateFingerprint.classDef.apply {
|
licenseActivityOnCreateFingerprint.classDef.apply {
|
||||||
methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) }
|
methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add context override to force a specific settings language.
|
||||||
|
licenseActivityOnCreateFingerprint.classDef.apply {
|
||||||
|
val attachBaseContext = ImmutableMethod(
|
||||||
|
type,
|
||||||
|
"attachBaseContext",
|
||||||
|
listOf(ImmutableMethodParameter("Landroid/content/Context;", null, null)),
|
||||||
|
"V",
|
||||||
|
AccessFlags.PROTECTED.value,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
MutableMethodImplementation(3),
|
||||||
|
).toMutable().apply {
|
||||||
|
addInstructions(
|
||||||
|
"""
|
||||||
|
invoke-static { p1 }, $activityHookClassDescriptor->getAttachBaseContext(Landroid/content/Context;)Landroid/content/Context;
|
||||||
|
move-result-object p1
|
||||||
|
invoke-super { p0, p1 }, $superclass->attachBaseContext(Landroid/content/Context;)V
|
||||||
|
return-void
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
methods.add(attachBaseContext)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
finalize {
|
finalize {
|
||||||
|
@ -47,8 +47,11 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
|
|||||||
tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference"
|
tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference"
|
||||||
),
|
),
|
||||||
ListPreference(
|
ListPreference(
|
||||||
"revanced_spoof_video_streams_language",
|
key = "revanced_spoof_video_streams_language",
|
||||||
summaryKey = null
|
summaryKey = null,
|
||||||
|
// Language strings are declared in Setting patch.
|
||||||
|
entriesKey = "revanced_language_entries",
|
||||||
|
entryValuesKey = "revanced_language_entry_values"
|
||||||
),
|
),
|
||||||
SwitchPreference("revanced_spoof_video_streams_ios_force_avc"),
|
SwitchPreference("revanced_spoof_video_streams_ios_force_avc"),
|
||||||
SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"),
|
SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"),
|
||||||
|
@ -1,74 +1,61 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<app id="youtube">
|
<app id="shared">
|
||||||
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
<patch id="misc.settings.settingsResourcePatch">
|
||||||
<string-array name="revanced_spoof_video_streams_client_type_entries">
|
<string-array name="revanced_language_entries">
|
||||||
<item>Android VR</item>
|
<item>@string/revanced_language_DEFAULT</item>
|
||||||
<item>@string/revanced_spoof_video_streams_client_type_android_vr_no_auth</item>
|
<item>@string/revanced_language_AR</item>
|
||||||
<item>Android TV</item>
|
<item>@string/revanced_language_AZ</item>
|
||||||
<item>iOS TV</item>
|
<item>@string/revanced_language_BG</item>
|
||||||
|
<item>@string/revanced_language_BN</item>
|
||||||
|
<item>@string/revanced_language_CA</item>
|
||||||
|
<item>@string/revanced_language_CS</item>
|
||||||
|
<item>@string/revanced_language_DA</item>
|
||||||
|
<item>@string/revanced_language_DE</item>
|
||||||
|
<item>@string/revanced_language_EL</item>
|
||||||
|
<item>@string/revanced_language_EN</item>
|
||||||
|
<item>@string/revanced_language_ES</item>
|
||||||
|
<item>@string/revanced_language_ET</item>
|
||||||
|
<item>@string/revanced_language_FA</item>
|
||||||
|
<item>@string/revanced_language_FI</item>
|
||||||
|
<item>@string/revanced_language_FR</item>
|
||||||
|
<item>@string/revanced_language_GU</item>
|
||||||
|
<item>@string/revanced_language_HI</item>
|
||||||
|
<item>@string/revanced_language_HR</item>
|
||||||
|
<item>@string/revanced_language_HU</item>
|
||||||
|
<item>@string/revanced_language_ID</item>
|
||||||
|
<item>@string/revanced_language_IT</item>
|
||||||
|
<item>@string/revanced_language_JA</item>
|
||||||
|
<item>@string/revanced_language_KK</item>
|
||||||
|
<item>@string/revanced_language_KO</item>
|
||||||
|
<item>@string/revanced_language_LT</item>
|
||||||
|
<item>@string/revanced_language_LV</item>
|
||||||
|
<item>@string/revanced_language_MK</item>
|
||||||
|
<item>@string/revanced_language_MN</item>
|
||||||
|
<item>@string/revanced_language_MR</item>
|
||||||
|
<item>@string/revanced_language_MS</item>
|
||||||
|
<item>@string/revanced_language_MY</item>
|
||||||
|
<item>@string/revanced_language_NL</item>
|
||||||
|
<item>@string/revanced_language_OR</item>
|
||||||
|
<item>@string/revanced_language_PA</item>
|
||||||
|
<item>@string/revanced_language_PL</item>
|
||||||
|
<item>@string/revanced_language_PT</item>
|
||||||
|
<item>@string/revanced_language_RO</item>
|
||||||
|
<item>@string/revanced_language_RU</item>
|
||||||
|
<item>@string/revanced_language_SK</item>
|
||||||
|
<item>@string/revanced_language_SL</item>
|
||||||
|
<item>@string/revanced_language_SR</item>
|
||||||
|
<item>@string/revanced_language_SV</item>
|
||||||
|
<item>@string/revanced_language_SW</item>
|
||||||
|
<item>@string/revanced_language_TA</item>
|
||||||
|
<item>@string/revanced_language_TE</item>
|
||||||
|
<item>@string/revanced_language_TH</item>
|
||||||
|
<item>@string/revanced_language_TR</item>
|
||||||
|
<item>@string/revanced_language_UK</item>
|
||||||
|
<item>@string/revanced_language_UR</item>
|
||||||
|
<item>@string/revanced_language_VI</item>
|
||||||
|
<item>@string/revanced_language_ZH</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="revanced_spoof_video_streams_client_type_entry_values">
|
<string-array name="revanced_language_entry_values">
|
||||||
<!-- Extension enum names. -->
|
|
||||||
<item>ANDROID_VR</item>
|
|
||||||
<item>ANDROID_VR_NO_AUTH</item>
|
|
||||||
<item>ANDROID_UNPLUGGED</item>
|
|
||||||
<item>IOS_UNPLUGGED</item>
|
|
||||||
</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</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>DEFAULT</item>
|
||||||
<item>AR</item>
|
<item>AR</item>
|
||||||
<item>AZ</item>
|
<item>AZ</item>
|
||||||
@ -123,6 +110,23 @@
|
|||||||
<item>ZH</item>
|
<item>ZH</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
</patch>
|
</patch>
|
||||||
|
</app>
|
||||||
|
<app id="youtube">
|
||||||
|
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
||||||
|
<string-array name="revanced_spoof_video_streams_client_type_entries">
|
||||||
|
<item>Android VR</item>
|
||||||
|
<item>@string/revanced_spoof_video_streams_client_type_android_vr_no_auth</item>
|
||||||
|
<item>Android TV</item>
|
||||||
|
<item>iOS TV</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="revanced_spoof_video_streams_client_type_entry_values">
|
||||||
|
<!-- Extension enum names. -->
|
||||||
|
<item>ANDROID_VR</item>
|
||||||
|
<item>ANDROID_VR_NO_AUTH</item>
|
||||||
|
<item>ANDROID_UNPLUGGED</item>
|
||||||
|
<item>IOS_UNPLUGGED</item>
|
||||||
|
</string-array>
|
||||||
|
</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">
|
||||||
<item>@string/revanced_spoof_app_version_target_entry_1</item>
|
<item>@string/revanced_spoof_app_version_target_entry_1</item>
|
||||||
|
@ -42,6 +42,62 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_settings_import_reset">ReVanced settings reset to default</string>
|
<string name="revanced_settings_import_reset">ReVanced settings reset to default</string>
|
||||||
<string name="revanced_settings_import_success">Imported %d settings</string>
|
<string name="revanced_settings_import_success">Imported %d settings</string>
|
||||||
<string name="revanced_settings_import_failure_parse">Import failed: %s</string>
|
<string name="revanced_settings_import_failure_parse">Import failed: %s</string>
|
||||||
|
<string name="revanced_language_title">ReVanced language</string>
|
||||||
|
<string name="revanced_language_user_dialog_message">"Translations for some languages may be missing or incomplete.
|
||||||
|
|
||||||
|
To translate new languages visit translate.revanced.app"</string>
|
||||||
|
<string name="revanced_language_DEFAULT">App language</string>
|
||||||
|
<string name="revanced_language_AR">Arabic</string>
|
||||||
|
<string name="revanced_language_AZ">Azerbaijani</string>
|
||||||
|
<string name="revanced_language_BG">Bulgarian</string>
|
||||||
|
<string name="revanced_language_BN">Bengali</string>
|
||||||
|
<string name="revanced_language_CA">Catalan</string>
|
||||||
|
<string name="revanced_language_CS">Czech</string>
|
||||||
|
<string name="revanced_language_DA">Danish</string>
|
||||||
|
<string name="revanced_language_DE">German</string>
|
||||||
|
<string name="revanced_language_EL">Greek</string>
|
||||||
|
<string name="revanced_language_EN">English</string>
|
||||||
|
<string name="revanced_language_ES">Spanish</string>
|
||||||
|
<string name="revanced_language_ET">Estonian</string>
|
||||||
|
<string name="revanced_language_FA">Persian</string>
|
||||||
|
<string name="revanced_language_FI">Finnish</string>
|
||||||
|
<string name="revanced_language_FR">French</string>
|
||||||
|
<string name="revanced_language_GU">Gujarati</string>
|
||||||
|
<string name="revanced_language_HI">Hindi</string>
|
||||||
|
<string name="revanced_language_HR">Croatian</string>
|
||||||
|
<string name="revanced_language_HU">Hungarian</string>
|
||||||
|
<string name="revanced_language_ID">Indonesian</string>
|
||||||
|
<string name="revanced_language_IT">Italian</string>
|
||||||
|
<string name="revanced_language_JA">Japanese</string>
|
||||||
|
<string name="revanced_language_KK">Kazakh</string>
|
||||||
|
<string name="revanced_language_KO">Korean</string>
|
||||||
|
<string name="revanced_language_LT">Lithuanian</string>
|
||||||
|
<string name="revanced_language_LV">Latvian</string>
|
||||||
|
<string name="revanced_language_MK">Macedonian</string>
|
||||||
|
<string name="revanced_language_MN">Mongolian</string>
|
||||||
|
<string name="revanced_language_MR">Marathi</string>
|
||||||
|
<string name="revanced_language_MS">Malay</string>
|
||||||
|
<string name="revanced_language_MY">Burmese</string>
|
||||||
|
<string name="revanced_language_NL">Dutch</string>
|
||||||
|
<string name="revanced_language_OR">Odia</string>
|
||||||
|
<string name="revanced_language_PA">Punjabi</string>
|
||||||
|
<string name="revanced_language_PL">Polish</string>
|
||||||
|
<string name="revanced_language_PT">Portuguese</string>
|
||||||
|
<string name="revanced_language_RO">Romanian</string>
|
||||||
|
<string name="revanced_language_RU">Russian</string>
|
||||||
|
<string name="revanced_language_SK">Slovak</string>
|
||||||
|
<string name="revanced_language_SL">Slovene</string>
|
||||||
|
<string name="revanced_language_SR">Serbian</string>
|
||||||
|
<string name="revanced_language_SV">Swedish</string>
|
||||||
|
<string name="revanced_language_SW">Swahili</string>
|
||||||
|
<string name="revanced_language_TA">Tamil</string>
|
||||||
|
<string name="revanced_language_TE">Telugu</string>
|
||||||
|
<string name="revanced_language_TH">Thai</string>
|
||||||
|
<string name="revanced_language_TR">Turkish</string>
|
||||||
|
<string name="revanced_language_UK">Ukrainian</string>
|
||||||
|
<string name="revanced_language_UR">Urdu</string>
|
||||||
|
<string name="revanced_language_VI">Vietnamese</string>
|
||||||
|
<string name="revanced_language_ZH">Chinese</string>
|
||||||
<string name="revanced_pref_import_export_title">Import / Export</string>
|
<string name="revanced_pref_import_export_title">Import / Export</string>
|
||||||
<string name="revanced_pref_import_export_summary">Import / Export ReVanced settings</string>
|
<string name="revanced_pref_import_export_summary">Import / Export ReVanced settings</string>
|
||||||
<!-- Settings about dialog. -->
|
<!-- Settings about dialog. -->
|
||||||
@ -1343,58 +1399,6 @@ AVC has a maximum resolution of 1080p, Opus audio codec is not available, and vi
|
|||||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Client type is shown in Stats for nerds</string>
|
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Client type is shown in Stats for nerds</string>
|
||||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Client is hidden in Stats for nerds</string>
|
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Client is hidden in Stats for nerds</string>
|
||||||
<string name="revanced_spoof_video_streams_language_title">VR default audio stream language</string>
|
<string name="revanced_spoof_video_streams_language_title">VR default 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">Portuguese</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