diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
index ec2bed67a..575d6c733 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
@@ -1,10 +1,15 @@
package org.schabi.newpipe.settings;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
+import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.Preference;
import org.schabi.newpipe.DownloaderImpl;
@@ -17,6 +22,7 @@ import org.schabi.newpipe.util.image.PicassoHelper;
import org.schabi.newpipe.util.image.PreferredImageQuality;
import java.io.IOException;
+import java.util.Locale;
public class ContentSettingsFragment extends BasePreferenceFragment {
private String youtubeRestrictedModeEnabledKey;
@@ -37,6 +43,26 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
.getPreferredContentCountry(requireContext());
initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en");
+ if (Build.VERSION.SDK_INT >= 33) {
+ requirePreference(R.string.app_language_key).setVisible(false);
+ final Preference newAppLanguagePref =
+ requirePreference(R.string.app_language_android_13_and_up_key);
+ newAppLanguagePref.setSummaryProvider(preference -> {
+ final Locale customLocale = AppCompatDelegate.getApplicationLocales().get(0);
+ if (customLocale != null) {
+ return customLocale.getDisplayName();
+ }
+ return getString(R.string.systems_language);
+ });
+ newAppLanguagePref.setOnPreferenceClickListener(preference -> {
+ final Intent intent = new Intent(Settings.ACTION_APP_LOCALE_SETTINGS)
+ .setData(Uri.fromParts("package", requireContext().getPackageName(), null));
+ startActivity(intent);
+ return true;
+ });
+ newAppLanguagePref.setVisible(true);
+ }
+
final Preference imageQualityPreference = requirePreference(R.string.image_quality_key);
imageQualityPreference.setOnPreferenceChangeListener(
(preference, newValue) -> {
diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java
index 8f8ba596f..acb0dff04 100644
--- a/app/src/main/java/org/schabi/newpipe/util/Localization.java
+++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java
@@ -17,6 +17,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.PluralsRes;
import androidx.annotation.StringRes;
+import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.math.MathUtils;
import androidx.preference.PreferenceManager;
@@ -39,6 +40,7 @@ import java.time.format.FormatStyle;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
import java.util.stream.Collectors;
@@ -101,6 +103,10 @@ public final class Localization {
}
public static Locale getAppLocale(@NonNull final Context context) {
+ if (Build.VERSION.SDK_INT >= 33) {
+ final Locale customLocale = AppCompatDelegate.getApplicationLocales().get(0);
+ return Objects.requireNonNullElseGet(customLocale, Locale::getDefault);
+ }
return getLocaleFromPrefs(context, R.string.app_language_key);
}
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index fb68a464d..61125c47f 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -353,6 +353,7 @@
playback_skip_silence_key
app_language_key
+ app_language_android_13_and_up_key
feed_update_threshold_key
300
diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml
index 2cdc6c545..f17783a22 100644
--- a/app/src/main/res/xml/content_settings.xml
+++ b/app/src/main/res/xml/content_settings.xml
@@ -13,6 +13,13 @@
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" />
+
+