1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-07-30 07:43:08 +00:00

Merge pull request #12444 from Isira-Seneviratne/Per-app-language

Enable per-app language preferences for Android < 13
This commit is contained in:
litetex 2025-07-20 22:20:12 +02:00 committed by GitHub
commit 45589dbf26
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
94 changed files with 112 additions and 231 deletions

View File

@ -225,7 +225,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}"
/** AndroidX **/
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.core:core-ktx:1.12.0'

View File

@ -57,6 +57,15 @@
</intent-filter>
</receiver>
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>
<service
android:name=".player.PlayerService"
android:exported="true"

View File

@ -102,7 +102,7 @@ public class App extends Application {
NewPipe.init(getDownloader(),
Localization.getPreferredLocalization(this),
Localization.getPreferredContentCountry(this));
Localization.initPrettyTime(Localization.resolvePrettyTime(getApplicationContext()));
Localization.initPrettyTime(Localization.resolvePrettyTime());
BridgeStateSaverInitializer.init(this);
StateSaver.init(this);

View File

@ -20,8 +20,6 @@
package org.schabi.newpipe;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@ -142,6 +140,7 @@ public class MainActivity extends AppCompatActivity {
+ "savedInstanceState = [" + savedInstanceState + "]");
}
Localization.migrateAppLanguageSettingIfNecessary(getApplicationContext());
ThemeHelper.setDayNightMode(this);
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));
@ -158,7 +157,6 @@ public class MainActivity extends AppCompatActivity {
}
}
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPrefEditor = sharedPreferences.edit();
@ -197,7 +195,6 @@ public class MainActivity extends AppCompatActivity {
UpdateSettingsFragment.askForConsentToUpdateChecks(this);
}
Localization.migrateAppLanguageSettingIfNecessary(getApplicationContext());
SettingMigrations.showUserInfoIfPresent(this);
}
@ -504,9 +501,8 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onResume() {
assureCorrectAppLanguage(this);
// Change the date format to match the selected language on resume
Localization.initPrettyTime(Localization.resolvePrettyTime(getApplicationContext()));
Localization.initPrettyTime(Localization.resolvePrettyTime());
super.onResume();
// Close drawer on return, and don't show animation,

View File

@ -84,7 +84,6 @@ import org.schabi.newpipe.util.ChannelTabHelper;
import org.schabi.newpipe.util.Constants;
import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.PermissionHelper;
import org.schabi.newpipe.util.ThemeHelper;
@ -132,7 +131,6 @@ public class RouterActivity extends AppCompatActivity {
ThemeHelper.setDayNightMode(this);
setTheme(ThemeHelper.isLightThemeSelected(this)
? R.style.RouterActivityThemeLight : R.style.RouterActivityThemeDark);
Localization.assureCorrectAppLanguage(this);
// Pass-through touch events to background activities
// so that our transparent window won't lock UI in the mean time

View File

@ -16,14 +16,12 @@ import org.schabi.newpipe.BuildConfig
import org.schabi.newpipe.R
import org.schabi.newpipe.databinding.ActivityAboutBinding
import org.schabi.newpipe.databinding.FragmentAboutBinding
import org.schabi.newpipe.util.Localization
import org.schabi.newpipe.util.ThemeHelper
import org.schabi.newpipe.util.external_communication.ShareUtils
class AboutActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Localization.assureCorrectAppLanguage(this)
super.onCreate(savedInstanceState)
ThemeHelper.setTheme(this)
title = getString(R.string.title_activity_about)

View File

@ -19,7 +19,6 @@ import org.schabi.newpipe.R
import org.schabi.newpipe.databinding.FragmentLicensesBinding
import org.schabi.newpipe.databinding.ItemSoftwareComponentBinding
import org.schabi.newpipe.ktx.parcelableArrayList
import org.schabi.newpipe.util.Localization
import org.schabi.newpipe.util.external_communication.ShareUtils
/**
@ -100,7 +99,6 @@ class LicenseFragment : Fragment() {
val webView = WebView(context)
webView.loadData(webViewData, "text/html; charset=UTF-8", "base64")
Localization.assureCorrectAppLanguage(context)
val builder = AlertDialog.Builder(requireContext())
.setTitle(softwareComponent.name)
.setView(webView)

View File

@ -20,8 +20,6 @@ import org.schabi.newpipe.views.FocusOverlayView;
import us.shandian.giga.service.DownloadManagerService;
import us.shandian.giga.ui.fragment.MissionsFragment;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class DownloadActivity extends AppCompatActivity {
private static final String MISSIONS_FRAGMENT_TAG = "fragment_tag";
@ -33,7 +31,6 @@ public class DownloadActivity extends AppCompatActivity {
i.setClass(this, DownloadManagerService.class);
startService(i);
assureCorrectAppLanguage(this);
ThemeHelper.setTheme(this);
super.onCreate(savedInstanceState);

View File

@ -2,7 +2,6 @@ package org.schabi.newpipe.download;
import static org.schabi.newpipe.extractor.stream.DeliveryMethod.PROGRESSIVE_HTTP;
import static org.schabi.newpipe.util.ListHelper.getStreamsOfSpecifiedDelivery;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.app.Activity;
import android.content.ComponentName;
@ -751,7 +750,6 @@ public class DownloadDialog extends DialogFragment
}
private void showFailedDialog(@StringRes final int msg) {
assureCorrectAppLanguage(requireContext());
new AlertDialog.Builder(context)
.setTitle(R.string.general_error)
.setMessage(msg)

View File

@ -1,7 +1,5 @@
package org.schabi.newpipe.error;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@ -79,7 +77,6 @@ public class ErrorActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setDayNightMode(this);
@ -306,7 +303,7 @@ public class ErrorActivity extends AppCompatActivity {
}
private String getAppLanguage() {
return Localization.getAppLocale(getApplicationContext()).toString();
return Localization.getAppLocale().toString();
}
private String getOsString() {

View File

@ -93,7 +93,7 @@ public class DescriptionFragment extends BaseDescriptionFragment {
if (streamInfo.getLanguageInfo() != null) {
addMetadataItem(inflater, layout, false, R.string.metadata_language,
streamInfo.getLanguageInfo().getDisplayLanguage(getAppLocale(getContext())));
streamInfo.getLanguageInfo().getDisplayLanguage(getAppLocale()));
}
addMetadataItem(inflater, layout, true, R.string.metadata_support,

View File

@ -81,9 +81,7 @@ public class ChannelAboutFragment extends BaseDescriptionFragment {
if (channelInfo.getSubscriberCount() != UNKNOWN_SUBSCRIBER_COUNT) {
addMetadataItem(inflater, layout, false, R.string.metadata_subscribers,
Localization.localizeNumber(
requireContext(),
channelInfo.getSubscriberCount()));
Localization.localizeNumber(channelInfo.getSubscriberCount()));
}
addImagesMetadataItem(inflater, layout, R.string.metadata_avatars,

View File

@ -1,7 +1,5 @@
package org.schabi.newpipe.local.subscription;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
@ -35,7 +33,6 @@ public class ImportConfirmationDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
assureCorrectAppLanguage(getContext());
return new AlertDialog.Builder(requireContext())
.setMessage(R.string.import_network_expensive_warning)
.setCancelable(true)

View File

@ -2,7 +2,6 @@ package org.schabi.newpipe.player;
import static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;
import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.content.ComponentName;
import android.content.Intent;
@ -84,7 +83,6 @@ public final class PlayQueueActivity extends AppCompatActivity
@Override
protected void onCreate(final Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));

View File

@ -44,7 +44,6 @@ import static org.schabi.newpipe.player.notification.NotificationConstants.ACTIO
import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE;
import static org.schabi.newpipe.util.ListHelper.getPopupResolutionIndex;
import static org.schabi.newpipe.util.ListHelper.getResolutionIndex;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import android.content.BroadcastReceiver;
@ -88,8 +87,8 @@ import org.schabi.newpipe.databinding.PlayerBinding;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.extractor.stream.VideoStream;
@ -120,9 +119,9 @@ import org.schabi.newpipe.player.ui.VideoPlayerUi;
import org.schabi.newpipe.util.DependentPreferenceHelper;
import org.schabi.newpipe.util.ListHelper;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.image.PicassoHelper;
import org.schabi.newpipe.util.SerializedCache;
import org.schabi.newpipe.util.StreamTypeUtil;
import org.schabi.newpipe.util.image.PicassoHelper;
import java.util.List;
import java.util.Optional;
@ -753,7 +752,6 @@ public final class Player implements PlaybackListener, Listener {
toggleShuffleModeEnabled();
break;
case Intent.ACTION_CONFIGURATION_CHANGED:
assureCorrectAppLanguage(service);
if (DEBUG) {
Log.d(TAG, "ACTION_CONFIGURATION_CHANGED received");
}

View File

@ -19,8 +19,6 @@
package org.schabi.newpipe.player;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
@ -91,7 +89,6 @@ public final class PlayerService extends MediaBrowserServiceCompat {
if (DEBUG) {
Log.d(TAG, "onCreate() called");
}
assureCorrectAppLanguage(this);
ThemeHelper.setTheme(this);
mediaBrowserImpl = new MediaBrowserImpl(this, this::notifyChildrenChanged);

View File

@ -2,7 +2,6 @@ package org.schabi.newpipe.player.helper;
import static org.schabi.newpipe.ktx.ViewUtils.animateRotation;
import static org.schabi.newpipe.player.Player.DEBUG;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import static org.schabi.newpipe.util.ThemeHelper.resolveDrawable;
import android.app.Dialog;
@ -145,7 +144,6 @@ public class PlaybackParameterDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
assureCorrectAppLanguage(getContext());
Bridge.restoreInstanceState(this, savedInstanceState);
binding = DialogPlaybackParameterBinding.inflate(getLayoutInflater());

View File

@ -6,6 +6,7 @@ import android.os.Bundle
import android.os.ResultReceiver
import android.support.v4.media.session.PlaybackStateCompat
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer
@ -109,14 +110,14 @@ class MediaBrowserPlaybackPreparer(
//region Errors
private fun onUnsupportedError() {
setMediaSessionError.accept(
context.getString(R.string.content_not_supported),
ContextCompat.getString(context, R.string.content_not_supported),
PlaybackStateCompat.ERROR_CODE_NOT_SUPPORTED
)
}
private fun onPrepareError() {
setMediaSessionError.accept(
context.getString(R.string.error_snackbar_message),
ContextCompat.getString(context, R.string.error_snackbar_message),
PlaybackStateCompat.ERROR_CODE_APP_ERROR
)
}

View File

@ -1,7 +1,6 @@
package org.schabi.newpipe.settings;
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.app.Activity;
import android.app.AlertDialog;
@ -126,7 +125,6 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment {
}
private void requestExportPathResult(final ActivityResult result) {
assureCorrectAppLanguage(requireContext());
if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
// will be saved only on success
final Uri lastExportDataUri = result.getData().getData();
@ -139,7 +137,6 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment {
}
private void requestImportPathResult(final ActivityResult result) {
assureCorrectAppLanguage(requireContext());
if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
// will be saved only on success
final Uri lastImportDataUri = result.getData().getData();

View File

@ -10,13 +10,13 @@ import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.os.LocaleListCompat;
import androidx.preference.Preference;
import org.schabi.newpipe.DownloaderImpl;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.localization.ContentCountry;
import org.schabi.newpipe.extractor.localization.Localization;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.image.ImageStrategy;
import org.schabi.newpipe.util.image.PicassoHelper;
import org.schabi.newpipe.util.image.PreferredImageQuality;
@ -27,26 +27,27 @@ import java.util.Locale;
public class ContentSettingsFragment extends BasePreferenceFragment {
private String youtubeRestrictedModeEnabledKey;
private String initialLanguage;
@Override
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled);
addPreferencesFromResourceRegistry();
initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en");
setupAppLanguagePreferences();
setupImageQualityPref();
}
private void setupAppLanguagePreferences() {
final Preference appLanguagePref = requirePreference(R.string.app_language_key);
// Android 13+ allows to set app specific languages
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
appLanguagePref.setVisible(false);
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);
final Locale loc = AppCompatDelegate.getApplicationLocales().get(0);
return loc != null ? loc.getDisplayName() : getString(R.string.systems_language);
});
newAppLanguagePref.setOnPreferenceClickListener(preference -> {
final Intent intent = new Intent(Settings.ACTION_APP_LOCALE_SETTINGS)
@ -55,23 +56,33 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
return true;
});
newAppLanguagePref.setVisible(true);
return;
}
final Preference imageQualityPreference = requirePreference(R.string.image_quality_key);
imageQualityPreference.setOnPreferenceChangeListener(
(preference, newValue) -> {
ImageStrategy.setPreferredImageQuality(PreferredImageQuality
.fromPreferenceKey(requireContext(), (String) newValue));
try {
PicassoHelper.clearCache(preference.getContext());
Toast.makeText(preference.getContext(),
R.string.thumbnail_cache_wipe_complete_notice, Toast.LENGTH_SHORT)
.show();
} catch (final IOException e) {
Log.e(TAG, "Unable to clear Picasso cache", e);
}
return true;
});
appLanguagePref.setOnPreferenceChangeListener((preference, newValue) -> {
final String language = (String) newValue;
final String systemLang = getString(R.string.default_localization_key);
final String tag = systemLang.equals(language) ? null : language;
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(tag));
return true;
});
}
private void setupImageQualityPref() {
requirePreference(R.string.image_quality_key).setOnPreferenceChangeListener(
(preference, newValue) -> {
ImageStrategy.setPreferredImageQuality(PreferredImageQuality
.fromPreferenceKey(requireContext(), (String) newValue));
try {
PicassoHelper.clearCache(preference.getContext());
Toast.makeText(preference.getContext(),
R.string.thumbnail_cache_wipe_complete_notice, Toast.LENGTH_SHORT)
.show();
} catch (final IOException e) {
Log.e(TAG, "Unable to clear Picasso cache", e);
}
return true;
});
}
@Override
@ -92,22 +103,9 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
public void onDestroy() {
super.onDestroy();
final String selectedLanguage =
defaultPreferences.getString(getString(R.string.app_language_key), "en");
if (!selectedLanguage.equals(initialLanguage)) {
if (Build.VERSION.SDK_INT < 33) {
Toast.makeText(
requireContext(),
R.string.localization_changes_requires_app_restart,
Toast.LENGTH_LONG
).show();
}
final Localization selectedLocalization = org.schabi.newpipe.util.Localization
.getPreferredLocalization(requireContext());
final ContentCountry selectedContentCountry = org.schabi.newpipe.util.Localization
.getPreferredContentCountry(requireContext());
NewPipe.setupLocalization(selectedLocalization, selectedContentCountry);
}
final Context context = requireContext();
NewPipe.setupLocalization(
Localization.getPreferredLocalization(context),
Localization.getPreferredContentCountry(context));
}
}

View File

@ -1,7 +1,5 @@
package org.schabi.newpipe.settings;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
@ -209,8 +207,6 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
}
private void requestDownloadPathResult(final ActivityResult result, final String key) {
assureCorrectAppLanguage(getContext());
if (result.getResultCode() != Activity.RESULT_OK) {
return;
}

View File

@ -1,7 +1,5 @@
package org.schabi.newpipe.settings;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
@ -89,7 +87,6 @@ public class SettingsActivity extends AppCompatActivity implements
@Override
protected void onCreate(final Bundle savedInstanceBundle) {
setTheme(ThemeHelper.getSettingsThemeStyle(this));
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceBundle);
Bridge.restoreInstanceState(this, savedInstanceBundle);
@ -228,7 +225,6 @@ public class SettingsActivity extends AppCompatActivity implements
// Build search items
final Context searchContext = getApplicationContext();
assureCorrectAppLanguage(searchContext);
final PreferenceParser parser = new PreferenceParser(searchContext, config);
final PreferenceSearcher searcher = new PreferenceSearcher(config);

View File

@ -322,7 +322,7 @@ public final class ListHelper {
}
// Sort collected streams by name
return collectedStreams.values().stream().sorted(getAudioTrackNameComparator(context))
return collectedStreams.values().stream().sorted(getAudioTrackNameComparator())
.collect(Collectors.toList());
}
@ -359,7 +359,7 @@ public final class ListHelper {
}
// Sort tracks alphabetically, sort track streams by quality
final Comparator<AudioStream> nameCmp = getAudioTrackNameComparator(context);
final Comparator<AudioStream> nameCmp = getAudioTrackNameComparator();
final Comparator<AudioStream> formatCmp = getAudioFormatComparator(context);
return collectedStreams.values().stream()
@ -867,12 +867,10 @@ public final class ListHelper {
* Get a {@link Comparator} to compare {@link AudioStream}s by their languages and track types
* for alphabetical sorting.
*
* @param context app context for localization
* @return Comparator
*/
private static Comparator<AudioStream> getAudioTrackNameComparator(
@NonNull final Context context) {
final Locale appLoc = Localization.getAppLocale(context);
private static Comparator<AudioStream> getAudioTrackNameComparator() {
final Locale appLoc = Localization.getAppLocale();
return Comparator.comparing(AudioStream::getAudioLocale, Comparator.nullsLast(
Comparator.comparing(locale -> locale.getDisplayName(appLoc))))

View File

@ -5,14 +5,12 @@ import static org.schabi.newpipe.MainActivity.DEBUG;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.icu.text.CompactDecimalFormat;
import android.os.Build;
import android.text.BidiFormatter;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.BidiFormatter;
import android.util.DisplayMetrics;
import android.util.Log;
import androidx.annotation.NonNull;
@ -43,7 +41,6 @@ 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;
@ -120,39 +117,35 @@ public final class Localization {
return getLocaleFromPrefs(context, R.string.content_language_key);
}
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);
public static Locale getAppLocale() {
final Locale customLocale = AppCompatDelegate.getApplicationLocales().get(0);
return customLocale != null ? customLocale : Locale.getDefault();
}
public static String localizeNumber(@NonNull final Context context, final long number) {
return localizeNumber(context, (double) number);
public static String localizeNumber(final long number) {
return localizeNumber((double) number);
}
public static String localizeNumber(@NonNull final Context context, final double number) {
final NumberFormat nf = NumberFormat.getInstance(getAppLocale(context));
public static String localizeNumber(final double number) {
final NumberFormat nf = NumberFormat.getInstance(getAppLocale());
return nf.format(number);
}
public static String formatDate(@NonNull final Context context,
@NonNull final OffsetDateTime offsetDateTime) {
public static String formatDate(@NonNull final OffsetDateTime offsetDateTime) {
return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(getAppLocale(context)).format(offsetDateTime
.withLocale(getAppLocale()).format(offsetDateTime
.atZoneSameInstant(ZoneId.systemDefault()));
}
@SuppressLint("StringFormatInvalid")
public static String localizeUploadDate(@NonNull final Context context,
@NonNull final OffsetDateTime offsetDateTime) {
return context.getString(R.string.upload_date_text, formatDate(context, offsetDateTime));
return context.getString(R.string.upload_date_text, formatDate(offsetDateTime));
}
public static String localizeViewCount(@NonNull final Context context, final long viewCount) {
return getQuantity(context, R.plurals.views, R.string.no_views, viewCount,
localizeNumber(context, viewCount));
localizeNumber(viewCount));
}
public static String localizeStreamCount(@NonNull final Context context,
@ -166,7 +159,7 @@ public final class Localization {
return context.getResources().getString(R.string.more_than_100_videos);
default:
return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount,
localizeNumber(context, streamCount));
localizeNumber(streamCount));
}
}
@ -187,27 +180,27 @@ public final class Localization {
public static String localizeWatchingCount(@NonNull final Context context,
final long watchingCount) {
return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount,
localizeNumber(context, watchingCount));
localizeNumber(watchingCount));
}
public static String shortCount(@NonNull final Context context, final long count) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return CompactDecimalFormat.getInstance(getAppLocale(context),
return CompactDecimalFormat.getInstance(getAppLocale(),
CompactDecimalFormat.CompactStyle.SHORT).format(count);
}
final double value = (double) count;
if (count >= 1000000000) {
return localizeNumber(context, round(value / 1000000000))
return localizeNumber(round(value / 1000000000))
+ context.getString(R.string.short_billion);
} else if (count >= 1000000) {
return localizeNumber(context, round(value / 1000000))
return localizeNumber(round(value / 1000000))
+ context.getString(R.string.short_million);
} else if (count >= 1000) {
return localizeNumber(context, round(value / 1000))
return localizeNumber(round(value / 1000))
+ context.getString(R.string.short_thousand);
} else {
return localizeNumber(context, value);
return localizeNumber(value);
}
}
@ -377,8 +370,8 @@ public final class Localization {
prettyTime.removeUnit(Decade.class);
}
public static PrettyTime resolvePrettyTime(@NonNull final Context context) {
return new PrettyTime(getAppLocale(context));
public static PrettyTime resolvePrettyTime() {
return new PrettyTime(getAppLocale());
}
public static String relativeTime(@NonNull final OffsetDateTime offsetDateTime) {
@ -410,14 +403,6 @@ public final class Localization {
}
}
public static void assureCorrectAppLanguage(final Context c) {
final Resources res = c.getResources();
final DisplayMetrics dm = res.getDisplayMetrics();
final Configuration conf = res.getConfiguration();
conf.setLocale(getAppLocale(c));
res.updateConfiguration(conf, dm);
}
private static Locale getLocaleFromPrefs(@NonNull final Context context,
@StringRes final int prefKey) {
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
@ -452,29 +437,32 @@ public final class Localization {
return context.getResources().getQuantityString(pluralId, safeCount, formattedCount);
}
// Starting with pull request #12093, NewPipe exclusively uses Android's
// public per-app language APIs to read and set the UI language for NewPipe.
// The following code will migrate any existing custom app language in SharedPreferences to
// use the public per-app language APIs instead.
// For reference, see
// https://android-developers.googleblog.com/2022/11/per-app-language-preferences-part-1.html
public static void migrateAppLanguageSettingIfNecessary(@NonNull final Context context) {
// Starting with pull request #12093, NewPipe on Android 13+ exclusively uses Android's
// public per-app language APIs to read and set the UI language for NewPipe.
// If running on Android 13+, the following code will migrate any existing custom
// app language in SharedPreferences to use the public per-app language APIs instead.
if (Build.VERSION.SDK_INT >= 33) {
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
final String appLanguageKey = context.getString(R.string.app_language_key);
final String appLanguageValue = sp.getString(appLanguageKey, null);
if (appLanguageValue != null) {
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
final String appLanguageKey = context.getString(R.string.app_language_key);
final String appLanguageValue = sp.getString(appLanguageKey, null);
if (appLanguageValue != null) {
// The app language key is used on Android versions < 33
// for more info, see ContentSettingsFragment
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
sp.edit().remove(appLanguageKey).apply();
final String appLanguageDefaultValue =
context.getString(R.string.default_localization_key);
if (!appLanguageValue.equals(appLanguageDefaultValue)) {
try {
AppCompatDelegate.setApplicationLocales(
LocaleListCompat.forLanguageTags(appLanguageValue)
);
} catch (final RuntimeException e) {
Log.e(TAG, "Failed to migrate previous custom app language "
+ "setting to public per-app language APIs"
);
}
}
final String appLanguageDefaultValue =
context.getString(R.string.default_localization_key);
if (!appLanguageValue.equals(appLanguageDefaultValue)) {
try {
AppCompatDelegate.setApplicationLocales(
LocaleListCompat.forLanguageTags(appLanguageValue));
} catch (final RuntimeException e) {
Log.e(TAG, "Failed to migrate previous custom app language "
+ "setting to public per-app language APIs"
);
}
}
}

View File

@ -227,7 +227,6 @@
<string name="featured">المميزة</string>
<string name="show_age_restricted_content_summary">عرض المحتوى الذي يُحتمل أن يكون غير مناسب للأطفال لأن له حدًا عمريًا (مثل 18+)</string>
<string name="start_here_on_background">بدأ التشغيل في الخلفية</string>
<string name="localization_changes_requires_app_restart">ستتغير اللغة بمجرد إعادة تشغيل التطبيق</string>
<string name="channel_tab_shorts">القصيرة</string>
<string name="playlists">قوائم التشغيل</string>
<string name="clear">تنظيف</string>

View File

@ -427,7 +427,6 @@
<string name="default_kiosk_page_summary">الكشك الافتراضي</string>
<string name="no_one_watching">لا توجد مشاهدة</string>
<string name="no_one_listening">لا أحد يستمع</string>
<string name="localization_changes_requires_app_restart">ستتغير اللغة بمجرد إعادة تشغيل التطبيق</string>
<plurals name="watching">
<item quantity="zero">%s مشاهدة</item>
<item quantity="one">%s مشاهدة</item>

View File

@ -342,7 +342,6 @@
<string name="no_valid_zip_file">Etibarlı ZIP faylı yoxdur</string>
<string name="could_not_import_all_files">Xəbərdarlıq: Bütün faylları idxal etmək mümkün olmadı.</string>
<string name="import_settings">Tənzimləmələri də idxal etmək istəyirsiniz\?</string>
<string name="localization_changes_requires_app_restart">Tətbiq yenidən başladıldıqdan sonra dil dəyişəcəkdir</string>
<string name="top_50">Ən yaxşı 50</string>
<string name="new_and_hot">Yeni və populyar</string>
<string name="local">Yerli</string>

View File

@ -223,7 +223,6 @@
<string name="privacy_policy_title">Política de privacidá de NewPipe</string>
<string name="error_file_creation">El ficheru nun pue crease</string>
<string name="error_http_no_content">El sirvidor nun unvia datos</string>
<string name="localization_changes_requires_app_restart">La llingua va camudar namás que se reanicie l\'aplicación.</string>
<string name="search">Buscar</string>
<string name="share_dialog_title">Compartir con</string>
<string name="subscribed_button_title">Soscribiéstite</string>

View File

@ -551,7 +551,6 @@
<string name="new_and_hot">Yangi va qaynoqlari</string>
<string name="top_50">Top 50</string>
<string name="trending">Ommabop</string>
<string name="localization_changes_requires_app_restart">Ilova qayta ishga tushirilgandan so\'ng til o\'zgaradi.</string>
<string name="error_unable_to_load_comments">Fikrlarni yuklab bolmadi</string>
<string name="import_settings">Sozlamalarni ham import qilmoqchimisiz\?</string>
<string name="override_current_data">Bu sizning joriy sozlamangizni bekor qiladi.</string>

View File

@ -537,7 +537,6 @@
<item quantity="other">%d дзён</item>
</plurals>
<string name="clear_download_history">Ачысціць гісторыю спампоўвання</string>
<string name="localization_changes_requires_app_restart">Мова зменіцца пасля перазапуску праграмы</string>
<string name="no_one_listening">Ніхто не слухае</string>
<string name="on">Уключыць</string>
<string name="hash_channel_description">Апавяшчэнні пра ход відэахэшавання</string>

View File

@ -432,7 +432,6 @@
<string name="most_liked">Най-харесвани</string>
<string name="done">Готово</string>
<string name="comments_tab_description">Коментари</string>
<string name="localization_changes_requires_app_restart">Езикът ще се смени след рестартиране на приложението</string>
<string name="metadata_privacy_unlisted">Скрит</string>
<string name="metadata_privacy_private">Частен</string>
<string name="remote_search_suggestions">Предложения за отдалечено търсене</string>

View File

@ -534,7 +534,6 @@
<string name="downloads_storage_ask_summary">প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে।
\nমেমোরি কার্ডে ডাউনলোড করতে সিস্টেম ফোল্ডার পিকার (SAF) এনেবল করুন</string>
<string name="download_already_running">এই নামের একটি ডাউনলোড চলমান</string>
<string name="localization_changes_requires_app_restart">অ্যাপ আবার শুরু হলে ভাষা পাল্টাবে</string>
<string name="disable_media_tunneling_title">মিডিয়া সুরঙ্গকরণ অক্ষম</string>
<string name="feed_load_error_fast_unknown">দ্রুত ফিড অবস্থা এ বিষয়ে এর বেশি তথ্য দেয় না।</string>
<string name="no_dir_yet">কোনো ডাউনলোড ফোল্ডার নির্দিষ্ট করা হয়নি, এখনই একটা সহজাত ডাউনলোড ফোল্ডার নির্বাচন করো</string>

View File

@ -419,7 +419,6 @@
<item quantity="many">%s escoltants</item>
<item quantity="other">%s escoltants</item>
</plurals>
<string name="localization_changes_requires_app_restart">Es canviarà l\'idioma en reiniciar l\'aplicació</string>
<string name="default_kiosk_page_summary">Tendències</string>
<string name="show_original_time_ago_title">Ensenya el temps passat original sobre els \"items\"</string>
<string name="playlist_no_uploader">Auto-generat (no es troba cap uploader)</string>

View File

@ -107,7 +107,6 @@
<string name="subscription_update_failed">ناتوانرێت به‌ژداریكردنه‌كه‌ نوێبكرێته‌وه‌</string>
<string name="controls_background_title">پشت شاشە</string>
<string name="search_no_results">بێ ئەنجامه‌</string>
<string name="localization_changes_requires_app_restart">زمان دەگۆڕدرێت لەدوای داگیرساندنەوەی به‌رنامه‌كه‌</string>
<string name="remove_watched">لادانی سەیرکراو</string>
<string name="enable_playback_state_lists_summary">پیشاندانی نیشانەکەری شوێنی کارپێکەر لە خشتەکاندا</string>
<string name="enable_playback_state_lists_title">شوێنەکان لە خشتەکاندا</string>

View File

@ -427,7 +427,6 @@
<item quantity="few">%s posluchači</item>
<item quantity="other">%s posluchačů</item>
</plurals>
<string name="localization_changes_requires_app_restart">Ke změně jazyka dojde po restartu aplikace</string>
<string name="default_kiosk_page_summary">Výchozí kiosek</string>
<string name="seek_duration_title">Délka přetočení vpřed/zpět</string>
<string name="peertube_instance_url_title">Instance PeerTube</string>

View File

@ -507,7 +507,6 @@
<string name="main_page_content_swipe_remove">Stryg på elementer for at fjerne dem</string>
<string name="select_a_playlist">Vælg en playliste</string>
<string name="no_playlist_bookmarked_yet">Ingen playliste-bogmærker endnu</string>
<string name="localization_changes_requires_app_restart">Sproget ændres, når appen genstarter</string>
<string name="title_activity_play_queue">Afspillerkø</string>
<string name="show_channel_details">Vis kanalens detaljer</string>
<string name="enqueue_stream">Sæt i kø</string>

View File

@ -432,7 +432,6 @@
<item quantity="one">%s Zuhörer</item>
<item quantity="other">%s Zuhörer</item>
</plurals>
<string name="localization_changes_requires_app_restart">Die Sprache ändert sich, sobald die App neu gestartet wird</string>
<string name="peertube_instance_url_title">PeerTube-Instanzen</string>
<string name="peertube_instance_url_help">Finde auf %s die Instanzen, die dir gefallen</string>
<string name="peertube_instance_add_title">Instanz hinzufügen</string>

View File

@ -422,7 +422,6 @@
<item quantity="one">%s ακροατής</item>
<item quantity="other">%s ακροατές</item>
</plurals>
<string name="localization_changes_requires_app_restart">Η γλώσσα θα αλλάξει αφού επανεκκινηθεί η εφαρμογή</string>
<string name="default_kiosk_page_summary">Προεπιλεγμένο περίπτερο</string>
<string name="peertube_instance_add_https_only">Μόνο HTTPS σύνδεσμοι υποστηρίζονται</string>
<string name="local">Τοπικά</string>

View File

@ -421,7 +421,6 @@
<item quantity="one">%s aŭskultanto</item>
<item quantity="other">%s aŭskultantoj</item>
</plurals>
<string name="localization_changes_requires_app_restart">La lingvo ŝanĝos kiam la apo restartos</string>
<string name="seek_duration_title">Daŭro de rapidpluiga/revolva serĉo</string>
<string name="peertube_instance_url_title">Instancoj de PeerTube</string>
<string name="peertube_instance_url_summary">Elekti viajn preferitajn instancojn de PeerTube</string>

View File

@ -427,7 +427,6 @@
<item quantity="many">%s oyentes</item>
<item quantity="other">%s oyentes</item>
</plurals>
<string name="localization_changes_requires_app_restart">El idioma cambiará después del reinicio de la aplicación</string>
<string name="seek_duration_title">Duración de búsqueda al avanzar y/o retroceder</string>
<string name="peertube_instance_url_title">Instancias de PeerTube</string>
<string name="peertube_instance_url_summary">Selecciona tus instancias favoritas de PeerTube</string>

View File

@ -487,7 +487,6 @@
<string name="enqueue_stream">Lisa esitusjärjekorda</string>
<string name="recently_added">Hiljuti lisatud</string>
<string name="local">Kohalikud</string>
<string name="localization_changes_requires_app_restart">Keele muutus jõustub rakenduse uuesti käivitamisel</string>
<string name="error_unable_to_load_comments">Kommentaaride laadimine ei õnnestunud</string>
<string name="no_playlist_bookmarked_yet">Esitusloendi järjehoidjaid veel pole</string>
<string name="select_a_playlist">Vali esitusloend</string>

View File

@ -422,7 +422,6 @@
<string name="clear_playback_states_summary">Erreprodukziorako kokapen guztiak ezabatzen ditu</string>
<string name="delete_playback_states_alert">Ezabatu erreprodukziorako kokapen guztiak\?</string>
<string name="drawer_header_description">Aktibatu zerbitzua, orain hautatua:</string>
<string name="localization_changes_requires_app_restart">Hizkuntza aldatuko da aplikazioa berrabiarazterakoan</string>
<string name="default_kiosk_page_summary">Kiosko Lehenetsia</string>
<string name="seek_duration_title">Aurreratze/atzeratze bilaketaren iraupena</string>
<string name="peertube_instance_url_title">PeerTube instantziak</string>

View File

@ -469,7 +469,6 @@
<string name="most_liked">مورد پسندترین‌ها</string>
<string name="recently_added">اخیرا اضافه شده</string>
<string name="local">محلی</string>
<string name="localization_changes_requires_app_restart">با آغاز دوبارهٔ کاره، زبان تغییر خواهد کرد</string>
<string name="default_kiosk_page_summary">کیوسک پیش‌فرض</string>
<string name="done">انجام شد</string>
<string name="subtitle_activity_recaptcha">وقتی انجام شد، «Done» یا «انجام شد» را بفشارید</string>

View File

@ -337,7 +337,6 @@
<string name="recently_added">Hiljattain lisätyt</string>
<string name="local">Paikalliset</string>
<string name="most_liked">Pidetyimmät</string>
<string name="localization_changes_requires_app_restart">Kieli vaihtuu, kun sovellus uudelleenkäynnistetään</string>
<string name="error_unable_to_load_comments">Kommentteja ei voitu ladata</string>
<string name="main_page_content_summary">Mitkä välilehdet näytetään pääsivulla</string>
<string name="done">Valmis</string>

View File

@ -428,7 +428,6 @@
<item quantity="many">%s auditeurs</item>
<item quantity="other">%s auditeurs</item>
</plurals>
<string name="localization_changes_requires_app_restart">La langue changera une fois que lapplication aura redémarré</string>
<string name="seek_duration_title">Durée de lavance et retour rapide</string>
<string name="peertube_instance_url_title">Instances PeerTube</string>
<string name="peertube_instance_url_summary">Veuillez choisir vos instances PeerTube préférées</string>

View File

@ -463,7 +463,6 @@
<string name="conferences">Conferencias</string>
<string name="most_liked">O que ten mais gústames</string>
<string name="recently_added">Engadiuse recentemente</string>
<string name="localization_changes_requires_app_restart">O idioma cambiará unha vez que se reinicie o aplicativo</string>
<string name="error_unable_to_load_comments">Non se puideron cargar os comentarios</string>
<string name="no_playlist_bookmarked_yet">Aínda non hai marcadores nesta lista de reprodución</string>
<string name="select_a_playlist">Seleccionar unha lista de reprodución</string>

View File

@ -432,7 +432,6 @@
<item quantity="many">%s מאזינים</item>
<item quantity="other">%s מאזינים</item>
</plurals>
<string name="localization_changes_requires_app_restart">השפה תוחלף עם הפעלת היישומון מחדש</string>
<string name="default_kiosk_page_summary">קיוסק ברירת מחדל</string>
<string name="seek_duration_title">משך קפיצה מהירה קדימה/אחורה</string>
<string name="peertube_instance_url_title">מופעים של PeerTube</string>

View File

@ -423,7 +423,6 @@
<item quantity="one">%s श्रोता</item>
<item quantity="other">%s श्रोता</item>
</plurals>
<string name="localization_changes_requires_app_restart">ऐप के पुनः आरंभ होने के बाद भाषा बदल जाएगी</string>
<string name="feed_use_dedicated_fetch_method_enable_button">तेज मोड सक्षम करें</string>
<string name="feed_use_dedicated_fetch_method_disable_button">तेज मोड अक्षम करें</string>
<string name="feed_use_dedicated_fetch_method_help_text">क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है\? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)।

View File

@ -406,7 +406,6 @@
<string name="delete_playback_states_alert">Izbrisati sve pozicije reprodukcije\?</string>
<string name="no_one_watching">Nitko ne gleda</string>
<string name="no_one_listening">Nitko ne sluša</string>
<string name="localization_changes_requires_app_restart">Jezik će se promijeniti nakon ponovnog pokretanja aplikcije</string>
<string name="default_kiosk_page_summary">Standardni kiosk</string>
<string name="peertube_instance_add_https_only">Podržani su samo HTTP URL-ovi</string>
<string name="local">Lokalni</string>

View File

@ -428,7 +428,6 @@
<string name="no_one_watching">Senki sem nézi</string>
<string name="subscribers_count_not_available">A feliratkozók száma nem érhető el</string>
<string name="local">Helyi</string>
<string name="localization_changes_requires_app_restart">A nyelv az alkalmazás újraindításakor fog megváltozni</string>
<string name="error_unable_to_load_comments">A megjegyzések betöltése sikertelen</string>
<string name="select_a_playlist">Válasszon egy lejátszási listát</string>
<string name="autoplay_summary">Lejátszás automatikus indítása — %s</string>

View File

@ -417,7 +417,6 @@
<plurals name="listening">
<item quantity="other">%s pendengar</item>
</plurals>
<string name="localization_changes_requires_app_restart">Bahasa yang diubah akan diterapkan setelah aplikasi dimulai ulang</string>
<string name="peertube_instance_url_title">Situs PeerTube</string>
<string name="peertube_instance_url_summary">Pilih situs PeerTube favorit Anda</string>
<string name="peertube_instance_url_help">Temukan situs yang Anda suka di %s</string>

View File

@ -268,7 +268,6 @@
<string name="title_last_played">Nýlega spilað</string>
<string name="title_most_played">Mest spilað</string>
<string name="main_page_content">Aðalsíða</string>
<string name="localization_changes_requires_app_restart">Tungumálið breytist þegar forritið er endurræst</string>
<string name="export_complete_toast">Flutt út</string>
<string name="import_complete_toast">Flutt inn</string>
<string name="local">Staðbundið</string>

View File

@ -427,7 +427,6 @@
<item quantity="many">%s ascoltatori</item>
<item quantity="other">%s ascoltatori</item>
</plurals>
<string name="localization_changes_requires_app_restart">La lingua verrà cambiata al riavvio dell\'applicazione</string>
<string name="default_kiosk_page_summary">Contenuti in evidenza predefiniti</string>
<string name="seek_duration_title">Durata avanzamento e riavvolgimento rapidi</string>
<string name="peertube_instance_url_title">Istanze PeerTube</string>

View File

@ -418,7 +418,6 @@
<plurals name="listening">
<item quantity="other">%s 人が聴取中</item>
</plurals>
<string name="localization_changes_requires_app_restart">アプリを再起動すると、言語が変更されます</string>
<string name="seek_duration_title">高速早送り/巻き戻し間隔</string>
<string name="peertube_instance_url_title">PeerTube インスタンス</string>
<string name="peertube_instance_url_summary">PeerTube インスタンスを選択する</string>

View File

@ -333,7 +333,6 @@
<string name="could_not_import_all_files">გაფრთხილება: ყველა ფაილის იმპორტი ვერ მოხერხდა.</string>
<string name="override_current_data">ეს უგულებელყოფს თქვენს მიმდინარე პარამეტრს.</string>
<string name="error_unable_to_load_comments">კომენტარების ჩატვირთვა ვერ მოხერხდა</string>
<string name="localization_changes_requires_app_restart">ენა შეიცვლება აპის გადატვირთვის შემდეგ</string>
<string name="trending">ტრენდული</string>
<string name="top_50">ტოპ 50</string>
<string name="new_and_hot">ახალი და ცხელი</string>

View File

@ -139,7 +139,6 @@
<string name="file_deleted">Pel hate jêbirin</string>
<string name="undo">Betal bike</string>
<string name="best_resolution">Çareseriya çêtirîn</string>
<string name="localization_changes_requires_app_restart">Gava ku sepanê ji nû ve dest pê kir dê ziman biguhere.</string>
<string name="error_unable_to_load_comments">Ouldîrove nehat barkirin</string>
<string name="import_settings">Ma hûn dixwazin mîhengan jî îthal bikin\?</string>
<string name="override_current_data">Ev ê sazkirina xweya heyî ji holê rabike.</string>

View File

@ -418,7 +418,6 @@
<plurals name="listening">
<item quantity="other">%s명 청취중</item>
</plurals>
<string name="localization_changes_requires_app_restart">앱이 다시 시작되면 언어가 변경됩니다</string>
<string name="seek_duration_title">빠른-감기/되감기 찾는 시간</string>
<string name="peertube_instance_url_title">피어튜브 인스턴스</string>
<string name="peertube_instance_url_summary">선호하는 PeerTube 인스턴스 선택</string>

View File

@ -398,7 +398,6 @@
<string name="overwrite_unrelated_warning">فایلێک بەهەمان ناو هەیە</string>
<string name="overwrite_finished_warning">فایلێکی دابەزێنراو بەم ناوەوە هەیە</string>
<string name="overwrite_failed">ناتوانرێ لەسەر ئەو فایلە جێگیربکرێ</string>
<string name="localization_changes_requires_app_restart">زمان دەگۆڕدرێ لەدوای داخستن و پاشان کردنەوەی ئەپ.</string>
<string name="default_kiosk_page_summary">پەڕەی بنەڕەتی</string>
<string name="seek_duration_title">ماوەی خێرا بردنە پێشەوە\\ گێڕانەوە بۆ دواوە</string>
<string name="peertube_instance_url_title">دۆخی پێرتووبی</string>

View File

@ -494,7 +494,6 @@
<string name="most_liked">Labiausiai patikę</string>
<string name="recently_added">Nesenai pridėta</string>
<string name="local">Vietinė</string>
<string name="localization_changes_requires_app_restart">Kalba pasikeis paleidus programą iš naujo</string>
<string name="error_unable_to_load_comments">Komentarų įkelti nepavyko</string>
<string name="import_settings">Ar norite importuoti nustatymus\?</string>
<string name="no_playlist_bookmarked_yet">Kol kas nėra grojaraščio žymų</string>

View File

@ -272,7 +272,6 @@
<string name="peertube_instance_url_help">Atrodiet instances, kas jums patīk ar %s</string>
<string name="peertube_instance_url_summary">Izvēlaties jūsu mīļākās PeerTube instances</string>
<string name="peertube_instance_url_title">PeerTube serveri (instances)</string>
<string name="localization_changes_requires_app_restart">Valoda nomainīsies, kad aplikāciju restartēs</string>
<string name="no_app_to_open_intent">Neviena lietotne jūsu ierīcē nevar šo atvērt</string>
<string name="chapters">Nodaļas</string>
<string name="recent">Jaunākie</string>

View File

@ -685,7 +685,6 @@
<item quantity="other">%s нови стримови</item>
</plurals>
<string name="error_report_open_github_notice">Ве молиме, проверете дали веќе има дискусија за проблем како овој. Создадените дупликати ни одземаат од времето, коешто можеме да го посветиме на поправање на проблемот.</string>
<string name="localization_changes_requires_app_restart">Јазикот ќе се смени откако апликацијата ќе биде рестартирана</string>
<string name="enqueue_next_stream">Додај го во редослед следното</string>
<string name="no_one_watching">Нема гледачи</string>
<string name="done">Готово</string>

View File

@ -81,7 +81,6 @@
<string name="new_and_hot">പുതിയതും ചൂടേറിയതും</string>
<string name="top_50">മികച്ച 50</string>
<string name="trending">ട്രെൻഡിങ്ങ്</string>
<string name="localization_changes_requires_app_restart">അപ്ലിക്കേഷൻ പുനരാരംഭിച്ചുകഴിഞ്ഞാൽ ഭാഷ മാറും</string>
<string name="error_unable_to_load_comments">കമെന്റുകൾ ലോഡുചെയ്യാനായില്ല</string>
<string name="import_settings">ക്രമീകരണങ്ങളും ഇമ്പോർട്ടുചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ\?</string>
<string name="override_current_data">ഇത് നിങ്ങളുടെ നിലവിലെ സജ്ജീകരണത്തെ അസാധുവാക്കും.</string>

View File

@ -422,7 +422,6 @@
<item quantity="one">%s lytter</item>
<item quantity="other">%s lyttere</item>
</plurals>
<string name="localization_changes_requires_app_restart">Språket vil endres etter at appen har startet på nytt</string>
<string name="default_kiosk_page_summary">Standard kiosk</string>
<string name="peertube_instance_url_title">PeerTube-instanser</string>
<string name="local">Lokal</string>

View File

@ -416,7 +416,6 @@
<item quantity="one">%s श्रोता</item>
<item quantity="other">%s श्रोताहरु</item>
</plurals>
<string name="localization_changes_requires_app_restart">भाषा परिवर्तन एप पून:सुरु हुदा लागु हुनेछ।</string>
<string name="default_kiosk_page_summary">पूर्वनिर्धारित किओस्क (Kiosk)</string>
<string name="seek_duration_title">छिटो-अगाडि /-पछाडी खोज्न अवधि</string>
<string name="peertube_instance_url_title">PeerTube उदाहरणहरू</string>

View File

@ -486,7 +486,6 @@
<string name="most_liked">Meest leuk gevonden</string>
<string name="recently_added">Recent toegevoegd</string>
<string name="local">Lokaal</string>
<string name="localization_changes_requires_app_restart">De taal zal veranderen zodra de app opnieuw is opgestart</string>
<string name="no_playlist_bookmarked_yet">Geen afspeellijst bladwijzers</string>
<string name="select_a_playlist">Selecteer een afspeellijst</string>
<string name="default_kiosk_page_summary">Standaard kiosk</string>

View File

@ -420,7 +420,6 @@
<item quantity="one">%s luisteraar</item>
<item quantity="other">%s luisteraars</item>
</plurals>
<string name="localization_changes_requires_app_restart">De taal zal veranderen zodra de app opnieuw is opgestart</string>
<string name="default_kiosk_page_summary">Standaard kiosk</string>
<string name="seek_duration_title">Duur voor-/achteruit spoelen</string>
<string name="peertube_instance_url_title">PeerTube-instanties</string>

View File

@ -408,7 +408,6 @@
<string name="could_not_import_all_files">ߖߊ߲߬ߕߏ߬ߒߘߐ: ߞߐߕߐ߮ ߟߎ߬ ߓߍ߯ ߕߍ߫ ߛߋ߫ ߟߊߛߣߍ߫ ߟߊ߫.</string>
<string name="select_a_playlist">ߕߏߟߏ߲߫ ߛߙߍߘߍ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫</string>
<string name="no_playlist_bookmarked_yet">ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߬ ߕߍ߫ ߝߟߐ߫</string>
<string name="localization_changes_requires_app_restart">ߞߊ߲ ߘߌߣߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߣߌ߫ ߟߥߊߟߌߟߊ߲ ߣߊ߬ ߘߊ߫ ߘߐߟߥߌ߬</string>
<string name="trending">ߛߊ߲ߞߊߥߟߌ ߟߎ߬</string>
<string name="error_unable_to_load_comments">ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߖߛߐ߫ ߟߊ߫</string>
<string name="local">ߘߌ߲߬ߞߌ߬ߙߊ߬ߡߊ</string>

View File

@ -62,7 +62,6 @@
<string name="watch_history_deleted">ଇତିହାସ ବିଲୋପ ଦେଖନ୍ତୁ</string>
<string name="watch_history_states_deleted">ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ ହୋଇଛି</string>
<string name="search_history_deleted">ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ ହେଲା</string>
<string name="localization_changes_requires_app_restart">ଆପ୍ ପୁନଃଆରମ୍ଭ ହେବା ପରେ ଭାଷା ପରିବର୍ତ୍ତନ ହେବ</string>
<string name="set_as_playlist_thumbnail">ପ୍ଲେଲିଷ୍ଟ ଥମ୍ବନେଲ ଭାବରେ ସେଟ୍ କରନ୍ତୁ</string>
<string name="overwrite_failed">ଫାଇଲ୍ କୁ ନବଲିଖନ କରିପାରିବ ନାହିଁ</string>
<string name="error_file_creation">ଫାଇଲ୍ ସୃଷ୍ଟି ହୋଇପାରିବ ନାହିଁ</string>

View File

@ -540,7 +540,6 @@
<string name="most_liked">ਵਧੇਰੇ ਪਸੰਦ ਕੀਤੇ ਗਏ</string>
<string name="recently_added">ਹਾਲ ਹੀ ਵਿੱਚ ਸ਼ਾਮਿਲ</string>
<string name="local">ਸਥਾਨਕ</string>
<string name="localization_changes_requires_app_restart">ਭਾਸ਼ਾ ਐਪ ਨੂੰ ਦੋਬਾਰਾ ਚਲਾਉਣ \'ਤੇ ਬਦਲੇਗੀ</string>
<string name="select_a_playlist">ਪਲੇਲਿਸਟ ਚੁਣੋ</string>
<string name="done">ਹੋ ਗਿਆ</string>
<string name="recaptcha_solve">ਹੱਲ ਕਰੋ</string>

View File

@ -432,7 +432,6 @@
<item quantity="few">%s słuchaczy</item>
<item quantity="many">%s słuchaczy</item>
</plurals>
<string name="localization_changes_requires_app_restart">Język zmieni się po ponownym uruchomieniu aplikacji</string>
<string name="seek_duration_title">Wielkość skoku przy przewijaniu</string>
<string name="peertube_instance_url_title">Serwery PeerTube</string>
<string name="peertube_instance_url_summary">Wybierz swoje ulubione serwery PeerTube</string>

View File

@ -428,7 +428,6 @@
<item quantity="many">%s ouvintes</item>
<item quantity="other">%s ouvintes</item>
</plurals>
<string name="localization_changes_requires_app_restart">O idioma será alterado após reiniciar o aplicativo</string>
<string name="seek_duration_title">Duração de avanço/retrocesso rápido</string>
<string name="peertube_instance_url_title">Instâncias PeerTube</string>
<string name="peertube_instance_url_summary">Selecione suas instâncias favoritas do PeerTube</string>

View File

@ -527,7 +527,6 @@
<string name="caption_setting_description">Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações</string>
<string name="permission_denied">Ação recusada pelo sistema</string>
<string name="songs">Músicas</string>
<string name="localization_changes_requires_app_restart">O idioma será alterado assim que reiniciar a app</string>
<string name="peertube_instance_add_title">Adicionar instância</string>
<string name="tracks">Faixas</string>
<string name="play_with_kodi_title">Reproduzir no Kodi</string>

View File

@ -428,7 +428,6 @@
<item quantity="many">%s ouvintes</item>
<item quantity="other">%s ouvintes</item>
</plurals>
<string name="localization_changes_requires_app_restart">O idioma será alterado assim que reiniciar a aplicação</string>
<string name="seek_duration_title">Duração de avanço/recuo rápido</string>
<string name="peertube_instance_url_title">Instâncias PeerTube</string>
<string name="peertube_instance_url_summary">Defina as suas instâncias PeerTube preferidas</string>

View File

@ -559,7 +559,6 @@
<string name="most_liked">Cele mai apreciate</string>
<string name="recently_added">Adăugate recent</string>
<string name="local">Local</string>
<string name="localization_changes_requires_app_restart">Limba se va schimba odată ce aplicația este repornită</string>
<string name="no_playlist_bookmarked_yet">Nu există încă marcaje în playlist</string>
<string name="select_a_playlist">Selectați un playlist</string>
<string name="default_kiosk_page_summary">Chioșc implicit</string>

View File

@ -434,7 +434,6 @@
<item quantity="few">%s слушателя</item>
<item quantity="many">%s слушателей</item>
</plurals>
<string name="localization_changes_requires_app_restart">Язык будет изменён после перезапуска</string>
<string name="seek_duration_title">Шаг перемотки</string>
<string name="peertube_instance_url_title">Серверы PeerTube</string>
<string name="peertube_instance_url_summary">Выберите предпочтительные серверы</string>

View File

@ -423,7 +423,6 @@
<item quantity="one">%sんかいんがちょうしゅちゅう</item>
<item quantity="other">%sんかいんがちょうしゅちゅう</item>
</plurals>
<string name="localization_changes_requires_app_restart">アプリさいきちゃーしーねー、ぎんぐがへいるかんさりやびーん</string>
<string name="seek_duration_title">こうすくはやうくい/まきむどぅしかんかく</string>
<string name="peertube_instance_url_title">PeerTubeインスタンス</string>
<string name="peertube_instance_url_summary">PeerTubeインスタンスさんたくすん</string>

View File

@ -520,7 +520,6 @@
<string name="select_a_playlist">ᱢᱤᱫ ᱯᱷᱟᱤᱞᱤᱥᱴ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>
<string name="import_complete_toast">ᱤᱢᱯᱳᱨᱴ</string>
<string name="no_playlist_bookmarked_yet">ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ playlist bookmarks ᱵᱟᱹᱱᱩᱜᱼᱟ</string>
<string name="localization_changes_requires_app_restart">ᱮᱯ ᱮᱦᱚᱵ ᱞᱮᱠᱷᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ</string>
<string name="export_complete_toast">ᱮᱥᱯᱟᱨᱴ ᱟᱠᱟᱱᱟ</string>
<string name="trending">ᱴᱨᱮᱱᱰᱤᱝ</string>
<string name="play_queue_audio_settings">ᱚᱰᱤᱭᱳ ᱥᱮᱴᱤᱝ</string>

View File

@ -66,7 +66,6 @@
<string name="new_and_hot">Noos e Populares</string>
<string name="top_50">Sos mègius 50</string>
<string name="trending">Tendèntzias</string>
<string name="localization_changes_requires_app_restart">Sa limba at a mudare a pustis chi as a torrare a allùghere s\'aplicatzione</string>
<string name="error_unable_to_load_comments">Carrigamentu de sos cummentos fallidu</string>
<string name="import_settings">Cheres fintzas importare sas impostatziones\?</string>
<string name="override_current_data">Custu at a subraiscrìere sas impostatziones tuas de como.</string>

View File

@ -428,7 +428,6 @@
<item quantity="few">%s poslucháči</item>
<item quantity="other">%s poslucháčov</item>
</plurals>
<string name="localization_changes_requires_app_restart">Zmena jazyka sa prejaví po reštarte aplikácie</string>
<string name="seek_duration_title">Dĺžka rýchleho pretáčania</string>
<string name="peertube_instance_url_title">Inštancie PeerTube</string>
<string name="peertube_instance_url_summary">Vyberte si svoje obľúbené inštancie PeerTube</string>

View File

@ -253,7 +253,6 @@
<string name="most_liked">Najbolj všečkan</string>
<string name="recently_added">Dodano nedolgo nazaj</string>
<string name="local">Lokalno</string>
<string name="localization_changes_requires_app_restart">Jezik bo spremenjen ob ponovnem zagonu aplikacije</string>
<string name="error_unable_to_load_comments">Ni mogoče naložiti komentarjev</string>
<string name="no_valid_zip_file">Ni veljavne ZIP datoteke</string>
<string name="import_complete_toast">Uvoženo</string>

View File

@ -139,7 +139,6 @@
<string name="trending">Shiddan</string>
<string name="new_and_hot">Cusub oo Shiddan</string>
<string name="top_50">50ka Sare</string>
<string name="localization_changes_requires_app_restart">Luuqadu waxay isbaddali doontaa marka appka dib loo soo kiciyo</string>
<string name="error_unable_to_load_comments">Faallooyinka lama soo kicin karo</string>
<string name="import_settings">Inaad sidoo kale fadhiga soo galiso ma rabtaa\?</string>
<string name="override_current_data">Tani waxay baddali fadhiga siduu kuu yahay hadda.</string>

View File

@ -207,7 +207,6 @@
<string name="new_and_hot">Të rejat dhe të nxehtat</string>
<string name="top_50">Top 50</string>
<string name="trending">E trendit</string>
<string name="localization_changes_requires_app_restart">Gjuha do të ndryshojë sapo aplikacioni të riniset</string>
<string name="error_unable_to_load_comments">Nuk mundën të ngarkohen komentet</string>
<string name="import_settings">A dëshironi që të importoni dhe aranzhimet gjithashtu\?</string>
<string name="override_current_data">Kjo do të mbishkruajë strukturimin tuaj të tanishëm.</string>

View File

@ -368,7 +368,6 @@
<string name="most_liked">Највише свиђања</string>
<string name="recently_added">Недавно додато</string>
<string name="local">Локално</string>
<string name="localization_changes_requires_app_restart">Језик ће бити промењен након рестартовања апликације</string>
<string name="error_unable_to_load_comments">Није могуће учитати коментаре</string>
<string name="import_settings">Желите ли да увезете и подешавања\?</string>
<string name="override_current_data">Ово ће заменити ваше тренутно подешавање.</string>

View File

@ -436,7 +436,6 @@
<string name="local">Lokala</string>
<string name="done">Klar</string>
<string name="youtube_restricted_mode_enabled_title">Slå på YouTubes \"Begränsat läge\"</string>
<string name="localization_changes_requires_app_restart">Språket ändras när appen startas om</string>
<string name="error_unable_to_load_comments">Det gick inte att läsa in kommentarerna</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Inaktivera snabbläge</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Aktivera snabbläge</string>

View File

@ -616,7 +616,6 @@
<string name="no_valid_zip_file">செல்லுபடியாகும் சிப் கோப்பு இல்லை</string>
<string name="override_current_data">இது உங்கள் தற்போதைய அமைப்பை மேலெழுதும்.</string>
<string name="error_unable_to_load_comments">கருத்துகளை ஏற்ற முடியவில்லை</string>
<string name="localization_changes_requires_app_restart">பயன்பாடு மறுதொடக்கம் செய்யப்பட்டவுடன் மொழி மாறும்</string>
<string name="recently_added">அண்மைக் காலத்தில் சேர்க்கப்பட்டது</string>
<string name="most_liked">மிகவும் பிடித்தது</string>
<string name="conferences">மாநாடுகள்</string>

View File

@ -363,7 +363,6 @@
<string name="recaptcha_request_toast">reCAPTCHA సవాలు అభ్యర్థించబడింది</string>
<string name="select_a_playlist">ప్లేజాబితాను ఎంచుకోండి</string>
<string name="export_data_title">డాటాబేసుని ఎగుమతిచేయుము</string>
<string name="localization_changes_requires_app_restart">యాప్ పునఃప్రారంభించబడిన తర్వాత భాష మారుతుంది</string>
<string name="show_channel_details">ఛానెల్ వివరాలను చూపు</string>
<string name="preferred_open_action_settings_summary">కంటెంట్‌ని తెరిచేటప్పుడు డిఫాల్ట్ చర్య — %s</string>
<string name="preferred_open_action_settings_title">ప్రాధాన్య \'తెరవండి\' చర్య</string>

View File

@ -422,7 +422,6 @@
<item quantity="one">%s dinleyici</item>
<item quantity="other">%s dinleyici</item>
</plurals>
<string name="localization_changes_requires_app_restart">Uygulama yeniden başlatıldıktan sonra dil değişecektir</string>
<string name="seek_duration_title">Hızlı ileri/geri atlama süresi</string>
<string name="peertube_instance_url_title">PeerTube örnekleri</string>
<string name="peertube_instance_url_summary">Favori PeerTube örneklerinizi seçin</string>

View File

@ -428,7 +428,6 @@
<item quantity="few">%s слухача</item>
<item quantity="many">%s слухачів</item>
</plurals>
<string name="localization_changes_requires_app_restart">Мова зміниться після перезапуску застосунку</string>
<string name="seek_duration_title">Швидке перемотування</string>
<string name="peertube_instance_url_title">Екземпляри PeerTube</string>
<string name="peertube_instance_url_summary">Виберіть сервер PeerTube</string>

View File

@ -417,7 +417,6 @@
<item quantity="one">%s سننے والا</item>
<item quantity="other">%s سننے والے</item>
</plurals>
<string name="localization_changes_requires_app_restart">جب ایپ دوبارہ شروع ہو گی تو زبان تبدیل ہو جائے گی</string>
<string name="default_kiosk_page_summary">طے شدہ کیوسک</string>
<string name="seek_duration_title">آگے بھگانے /- پیچھے کرنے کی مدت</string>
<string name="peertube_instance_url_title">پیر ٹیوب واقعات</string>

View File

@ -441,7 +441,6 @@
<string name="mute">Tắt tiếng</string>
<string name="most_liked">Được yêu thích nhất</string>
<string name="recently_added">Đã thêm gần đây</string>
<string name="localization_changes_requires_app_restart">Ngôn ngữ sẽ thay đổi khi ứng dụng khởi động lại</string>
<string name="subtitle_activity_recaptcha">Bấm \"Xong\" khi hoàn thành</string>
<string name="done">Đã hoàn thành</string>
<string name="infinite_videos">∞ video</string>

View File

@ -418,7 +418,6 @@
<plurals name="listening">
<item quantity="other">%s 位听众</item>
</plurals>
<string name="localization_changes_requires_app_restart">语言更改将在重启应用后生效</string>
<string name="peertube_instance_url_title">PeerTube 服务器</string>
<string name="peertube_instance_url_summary">设置自定义 PeerTube 服务器</string>
<string name="peertube_instance_url_help">查找你需要的服务器 %s</string>

View File

@ -326,7 +326,6 @@
<string name="main_page_content_summary">頭版要擺放邊啲分頁</string>
<string name="main_page_content_swipe_remove">打橫掃走啲項目去剷走佢</string>
<string name="blank_page_summary">空白頁</string>
<string name="localization_changes_requires_app_restart">重新開過個 app 之後就會轉新語言</string>
<string name="trending">時興</string>
<string name="top_50">頭 50 位</string>
<string name="new_and_hot">最新同大熱</string>

View File

@ -418,7 +418,6 @@
<plurals name="listening">
<item quantity="other">%s 位聽眾</item>
</plurals>
<string name="localization_changes_requires_app_restart">語言將會在重新啟動應用程式後變更</string>
<string name="seek_duration_title">快轉/快退搜尋持續時間</string>
<string name="peertube_instance_url_title">PeerTube 站臺</string>
<string name="peertube_instance_url_summary">選取您最愛的 PeerTube 站臺</string>

View File

@ -413,7 +413,6 @@
<string name="override_current_data">This will override your current setup.</string>
<string name="import_settings">Do you want to also import settings?</string>
<string name="error_unable_to_load_comments">Could not load comments</string>
<string name="localization_changes_requires_app_restart">The language will change once the app is restarted</string>
<string name="select_a_feed_group">Select a feed group</string>
<string name="no_feed_group_created_yet">No feed group created yet</string>
<!-- Kiosk Names -->