mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2025-10-03 09:49:21 +02:00
Merge branch 'dev' into Core-i18n
# Conflicts: # app/src/main/res/values-da/strings.xml
This commit is contained in:
commit
71854e10ca
81 changed files with 339 additions and 241 deletions
|
@ -214,7 +214,7 @@ dependencies {
|
||||||
// the corresponding commit hash, since JitPack sometimes deletes artifacts.
|
// the corresponding commit hash, since JitPack sometimes deletes artifacts.
|
||||||
// If there’s already a git hash, just add more of it to the end (or remove a letter)
|
// If there’s already a git hash, just add more of it to the end (or remove a letter)
|
||||||
// to cause jitpack to regenerate the artifact.
|
// to cause jitpack to regenerate the artifact.
|
||||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.24.8'
|
implementation 'com.github.TeamNewPipe:NewPipeExtractor:0023b22095a2d62a60cdfc87f4b5cd85c8b266c3'
|
||||||
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
|
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
|
||||||
|
|
||||||
/** Checkstyle **/
|
/** Checkstyle **/
|
||||||
|
@ -281,7 +281,7 @@ dependencies {
|
||||||
implementation "com.github.lisawray.groupie:groupie-viewbinding:${groupieVersion}"
|
implementation "com.github.lisawray.groupie:groupie-viewbinding:${groupieVersion}"
|
||||||
|
|
||||||
// Image loading
|
// Image loading
|
||||||
//noinspection GradleDependency --> 2.8 is the last version, not 2.71828!
|
//noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828!
|
||||||
implementation "com.squareup.picasso:picasso:2.8"
|
implementation "com.squareup.picasso:picasso:2.8"
|
||||||
|
|
||||||
// Markdown library for Android
|
// Markdown library for Android
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.schabi.newpipe.extractor.ServiceList;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
@ -23,8 +24,23 @@ import static org.junit.Assert.assertTrue;
|
||||||
@LargeTest
|
@LargeTest
|
||||||
public class ErrorInfoTest {
|
public class ErrorInfoTest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param errorInfo the error info to access
|
||||||
|
* @return the private field errorInfo.message.stringRes using reflection
|
||||||
|
*/
|
||||||
|
private int getMessageFromErrorInfo(final ErrorInfo errorInfo)
|
||||||
|
throws NoSuchFieldException, IllegalAccessException {
|
||||||
|
final var message = ErrorInfo.class.getDeclaredField("message");
|
||||||
|
message.setAccessible(true);
|
||||||
|
final var messageValue = (ErrorInfo.Companion.ErrorMessage) message.get(errorInfo);
|
||||||
|
|
||||||
|
final var stringRes = ErrorInfo.Companion.ErrorMessage.class.getDeclaredField("stringRes");
|
||||||
|
stringRes.setAccessible(true);
|
||||||
|
return (int) Objects.requireNonNull(stringRes.get(messageValue));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void errorInfoTestParcelable() {
|
public void errorInfoTestParcelable() throws NoSuchFieldException, IllegalAccessException {
|
||||||
final ErrorInfo info = new ErrorInfo(new ParsingException("Hello"),
|
final ErrorInfo info = new ErrorInfo(new ParsingException("Hello"),
|
||||||
UserAction.USER_REPORT, "request", ServiceList.YouTube.getServiceId());
|
UserAction.USER_REPORT, "request", ServiceList.YouTube.getServiceId());
|
||||||
// Obtain a Parcel object and write the parcelable object to it:
|
// Obtain a Parcel object and write the parcelable object to it:
|
||||||
|
@ -39,7 +55,7 @@ public class ErrorInfoTest {
|
||||||
assertEquals(ServiceList.YouTube.getServiceInfo().getName(),
|
assertEquals(ServiceList.YouTube.getServiceInfo().getName(),
|
||||||
infoFromParcel.getServiceName());
|
infoFromParcel.getServiceName());
|
||||||
assertEquals("request", infoFromParcel.getRequest());
|
assertEquals("request", infoFromParcel.getRequest());
|
||||||
assertEquals(R.string.parsing_error, infoFromParcel.getMessageStringId());
|
assertEquals(R.string.parsing_error, getMessageFromErrorInfo(infoFromParcel));
|
||||||
|
|
||||||
parcel.recycle();
|
parcel.recycle();
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,11 +96,23 @@
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/title_activity_about" />
|
android:label="@string/title_activity_about" />
|
||||||
|
|
||||||
<service android:name=".local.subscription.services.SubscriptionsImportService" />
|
<service
|
||||||
<service android:name=".local.subscription.services.SubscriptionsExportService" />
|
android:name=".local.subscription.services.SubscriptionsImportService"
|
||||||
<service android:name=".local.feed.service.FeedLoadService"
|
|
||||||
android:foregroundServiceType="dataSync" />
|
android:foregroundServiceType="dataSync" />
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".local.subscription.services.SubscriptionsExportService"
|
||||||
|
android:foregroundServiceType="dataSync" />
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".local.feed.service.FeedLoadService"
|
||||||
|
android:foregroundServiceType="dataSync" />
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name="androidx.work.impl.foreground.SystemForegroundService"
|
||||||
|
android:foregroundServiceType="dataSync"
|
||||||
|
tools:node="merge" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".PanicResponderActivity"
|
android:name=".PanicResponderActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
@ -425,6 +437,7 @@
|
||||||
</activity>
|
</activity>
|
||||||
<service
|
<service
|
||||||
android:name=".RouterActivity$FetcherService"
|
android:name=".RouterActivity$FetcherService"
|
||||||
|
android:foregroundServiceType="dataSync"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|
||||||
<!-- opting out of sending metrics to Google in Android System WebView -->
|
<!-- opting out of sending metrics to Google in Android System WebView -->
|
||||||
|
|
|
@ -58,20 +58,13 @@ import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.StreamingService.LinkType;
|
import org.schabi.newpipe.extractor.StreamingService.LinkType;
|
||||||
import org.schabi.newpipe.extractor.channel.ChannelInfo;
|
import org.schabi.newpipe.extractor.channel.ChannelInfo;
|
||||||
import org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;
|
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.PaidContentException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.PrivateContentException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.SoundCloudGoPlusContentException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException;
|
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||||
import org.schabi.newpipe.ktx.ExceptionUtils;
|
|
||||||
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
||||||
import org.schabi.newpipe.player.PlayerType;
|
import org.schabi.newpipe.player.PlayerType;
|
||||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||||
|
@ -279,28 +272,11 @@ public class RouterActivity extends AppCompatActivity {
|
||||||
final Intent intent = new Intent(context, ReCaptchaActivity.class);
|
final Intent intent = new Intent(context, ReCaptchaActivity.class);
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
} else if (errorInfo.getThrowable() != null
|
} else if (errorInfo.getThrowable() instanceof ContentNotAvailableException
|
||||||
&& ExceptionUtils.isNetworkRelated(errorInfo.getThrowable())) {
|
|| errorInfo.getThrowable() instanceof ContentNotSupportedException) {
|
||||||
Toast.makeText(context, R.string.network_error, Toast.LENGTH_LONG).show();
|
// this exception does not usually indicate a problem that should be reported,
|
||||||
} else if (errorInfo.getThrowable() instanceof AgeRestrictedContentException) {
|
// so just show a toast instead of the notification
|
||||||
Toast.makeText(context, R.string.restricted_video_no_stream,
|
Toast.makeText(context, errorInfo.getMessage(context), Toast.LENGTH_LONG).show();
|
||||||
Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof GeographicRestrictionException) {
|
|
||||||
Toast.makeText(context, R.string.georestricted_content, Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof PaidContentException) {
|
|
||||||
Toast.makeText(context, R.string.paid_content, Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof PrivateContentException) {
|
|
||||||
Toast.makeText(context, R.string.private_content, Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof SoundCloudGoPlusContentException) {
|
|
||||||
Toast.makeText(context, R.string.soundcloud_go_plus_content,
|
|
||||||
Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof YoutubeMusicPremiumContentException) {
|
|
||||||
Toast.makeText(context, R.string.youtube_music_premium_content,
|
|
||||||
Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof ContentNotAvailableException) {
|
|
||||||
Toast.makeText(context, R.string.content_not_available, Toast.LENGTH_LONG).show();
|
|
||||||
} else if (errorInfo.getThrowable() instanceof ContentNotSupportedException) {
|
|
||||||
Toast.makeText(context, R.string.content_not_supported, Toast.LENGTH_LONG).show();
|
|
||||||
} else {
|
} else {
|
||||||
ErrorUtil.createNotification(context, errorInfo);
|
ErrorUtil.createNotification(context, errorInfo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class AcraReportSender implements ReportSender {
|
||||||
ErrorUtil.openActivity(context, new ErrorInfo(
|
ErrorUtil.openActivity(context, new ErrorInfo(
|
||||||
new String[]{report.getString(ReportField.STACK_TRACE)},
|
new String[]{report.getString(ReportField.STACK_TRACE)},
|
||||||
UserAction.UI_ERROR,
|
UserAction.UI_ERROR,
|
||||||
ErrorInfo.SERVICE_NONE,
|
null,
|
||||||
"ACRA report",
|
"ACRA report",
|
||||||
R.string.app_ui_crash));
|
R.string.app_ui_crash));
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ public class ErrorActivity extends AppCompatActivity {
|
||||||
|
|
||||||
// normal bugreport
|
// normal bugreport
|
||||||
buildInfo(errorInfo);
|
buildInfo(errorInfo);
|
||||||
activityErrorBinding.errorMessageView.setText(errorInfo.getMessageStringId());
|
activityErrorBinding.errorMessageView.setText(errorInfo.getMessage(this));
|
||||||
activityErrorBinding.errorView.setText(formErrorText(errorInfo.getStackTraces()));
|
activityErrorBinding.errorView.setText(formErrorText(errorInfo.getStackTraces()));
|
||||||
|
|
||||||
// print stack trace once again for debugging:
|
// print stack trace once again for debugging:
|
||||||
|
|
|
@ -1,26 +1,42 @@
|
||||||
package org.schabi.newpipe.error
|
package org.schabi.newpipe.error
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException
|
import com.google.android.exoplayer2.ExoPlaybackException
|
||||||
|
import com.google.android.exoplayer2.upstream.HttpDataSource
|
||||||
|
import com.google.android.exoplayer2.upstream.Loader
|
||||||
import kotlinx.parcelize.IgnoredOnParcel
|
import kotlinx.parcelize.IgnoredOnParcel
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import org.schabi.newpipe.R
|
import org.schabi.newpipe.R
|
||||||
import org.schabi.newpipe.extractor.Info
|
import org.schabi.newpipe.extractor.Info
|
||||||
|
import org.schabi.newpipe.extractor.ServiceList
|
||||||
|
import org.schabi.newpipe.extractor.ServiceList.YouTube
|
||||||
import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException
|
import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException
|
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.PaidContentException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.PrivateContentException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.SignInConfirmNotBotException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.SoundCloudGoPlusContentException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.UnsupportedContentInCountryException
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException
|
||||||
import org.schabi.newpipe.ktx.isNetworkRelated
|
import org.schabi.newpipe.ktx.isNetworkRelated
|
||||||
import org.schabi.newpipe.util.ServiceHelper
|
import org.schabi.newpipe.player.mediasource.FailedMediaSource
|
||||||
|
import org.schabi.newpipe.player.resolver.PlaybackResolver
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
class ErrorInfo(
|
class ErrorInfo private constructor(
|
||||||
val stackTraces: Array<String>,
|
val stackTraces: Array<String>,
|
||||||
val userAction: UserAction,
|
val userAction: UserAction,
|
||||||
val serviceName: String,
|
val serviceId: Int?,
|
||||||
val request: String,
|
val request: String,
|
||||||
val messageStringId: Int
|
private val message: ErrorMessage,
|
||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
|
|
||||||
// no need to store throwable, all data for report is in other variables
|
// no need to store throwable, all data for report is in other variables
|
||||||
|
@ -31,14 +47,14 @@ class ErrorInfo(
|
||||||
private constructor(
|
private constructor(
|
||||||
throwable: Throwable,
|
throwable: Throwable,
|
||||||
userAction: UserAction,
|
userAction: UserAction,
|
||||||
serviceName: String,
|
serviceId: Int?,
|
||||||
request: String
|
request: String
|
||||||
) : this(
|
) : this(
|
||||||
throwableToStringList(throwable),
|
throwableToStringList(throwable),
|
||||||
userAction,
|
userAction,
|
||||||
serviceName,
|
serviceId,
|
||||||
request,
|
request,
|
||||||
getMessageStringId(throwable, userAction)
|
getMessage(throwable, userAction, serviceId)
|
||||||
) {
|
) {
|
||||||
this.throwable = throwable
|
this.throwable = throwable
|
||||||
}
|
}
|
||||||
|
@ -46,70 +62,176 @@ class ErrorInfo(
|
||||||
private constructor(
|
private constructor(
|
||||||
throwable: List<Throwable>,
|
throwable: List<Throwable>,
|
||||||
userAction: UserAction,
|
userAction: UserAction,
|
||||||
serviceName: String,
|
serviceId: Int?,
|
||||||
request: String
|
request: String
|
||||||
) : this(
|
) : this(
|
||||||
throwableListToStringList(throwable),
|
throwableListToStringList(throwable),
|
||||||
userAction,
|
userAction,
|
||||||
serviceName,
|
serviceId,
|
||||||
request,
|
request,
|
||||||
getMessageStringId(throwable.firstOrNull(), userAction)
|
getMessage(throwable.firstOrNull(), userAction, serviceId)
|
||||||
) {
|
) {
|
||||||
this.throwable = throwable.firstOrNull()
|
this.throwable = throwable.firstOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// constructor to manually build ErrorInfo
|
||||||
|
constructor(stackTraces: Array<String>, userAction: UserAction, serviceId: Int?, request: String, @StringRes message: Int) :
|
||||||
|
this(stackTraces, userAction, serviceId, request, ErrorMessage(message))
|
||||||
|
|
||||||
// constructors with single throwable
|
// constructors with single throwable
|
||||||
constructor(throwable: Throwable, userAction: UserAction, request: String) :
|
constructor(throwable: Throwable, userAction: UserAction, request: String) :
|
||||||
this(throwable, userAction, SERVICE_NONE, request)
|
this(throwable, userAction, null, request)
|
||||||
constructor(throwable: Throwable, userAction: UserAction, request: String, serviceId: Int) :
|
constructor(throwable: Throwable, userAction: UserAction, request: String, serviceId: Int) :
|
||||||
this(throwable, userAction, ServiceHelper.getNameOfServiceById(serviceId), request)
|
this(throwable, userAction, serviceId, request)
|
||||||
constructor(throwable: Throwable, userAction: UserAction, request: String, info: Info?) :
|
constructor(throwable: Throwable, userAction: UserAction, request: String, info: Info?) :
|
||||||
this(throwable, userAction, getInfoServiceName(info), request)
|
this(throwable, userAction, info?.serviceId, request)
|
||||||
|
|
||||||
// constructors with list of throwables
|
// constructors with list of throwables
|
||||||
constructor(throwable: List<Throwable>, userAction: UserAction, request: String) :
|
constructor(throwable: List<Throwable>, userAction: UserAction, request: String) :
|
||||||
this(throwable, userAction, SERVICE_NONE, request)
|
this(throwable, userAction, null, request)
|
||||||
constructor(throwable: List<Throwable>, userAction: UserAction, request: String, serviceId: Int) :
|
constructor(throwable: List<Throwable>, userAction: UserAction, request: String, serviceId: Int) :
|
||||||
this(throwable, userAction, ServiceHelper.getNameOfServiceById(serviceId), request)
|
this(throwable, userAction, serviceId, request)
|
||||||
constructor(throwable: List<Throwable>, userAction: UserAction, request: String, info: Info?) :
|
constructor(throwable: List<Throwable>, userAction: UserAction, request: String, info: Info?) :
|
||||||
this(throwable, userAction, getInfoServiceName(info), request)
|
this(throwable, userAction, info?.serviceId, request)
|
||||||
|
|
||||||
|
fun getServiceName(): String {
|
||||||
|
return getServiceName(serviceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getMessage(context: Context): String {
|
||||||
|
return message.getString(context)
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val SERVICE_NONE = "none"
|
@Parcelize
|
||||||
|
class ErrorMessage(
|
||||||
|
@StringRes
|
||||||
|
private val stringRes: Int,
|
||||||
|
private vararg val formatArgs: String,
|
||||||
|
) : Parcelable {
|
||||||
|
fun getString(context: Context): String {
|
||||||
|
return if (formatArgs.isEmpty()) {
|
||||||
|
// use ContextCompat.getString() just in case context is not AppCompatActivity
|
||||||
|
ContextCompat.getString(context, stringRes)
|
||||||
|
} else {
|
||||||
|
// ContextCompat.getString() with formatArgs does not exist, so we just
|
||||||
|
// replicate its source code but with formatArgs
|
||||||
|
ContextCompat.getContextForLanguage(context).getString(stringRes, *formatArgs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const val SERVICE_NONE = "<unknown_service>"
|
||||||
|
|
||||||
|
private fun getServiceName(serviceId: Int?) =
|
||||||
|
// not using getNameOfServiceById since we want to accept a nullable serviceId and we
|
||||||
|
// want to default to SERVICE_NONE
|
||||||
|
ServiceList.all()?.firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name
|
||||||
|
?: SERVICE_NONE
|
||||||
|
|
||||||
fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString())
|
fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString())
|
||||||
|
|
||||||
fun throwableListToStringList(throwableList: List<Throwable>) =
|
fun throwableListToStringList(throwableList: List<Throwable>) =
|
||||||
throwableList.map { it.stackTraceToString() }.toTypedArray()
|
throwableList.map { it.stackTraceToString() }.toTypedArray()
|
||||||
|
|
||||||
private fun getInfoServiceName(info: Info?) =
|
fun getMessage(
|
||||||
if (info == null) SERVICE_NONE else ServiceHelper.getNameOfServiceById(info.serviceId)
|
|
||||||
|
|
||||||
@StringRes
|
|
||||||
private fun getMessageStringId(
|
|
||||||
throwable: Throwable?,
|
throwable: Throwable?,
|
||||||
action: UserAction
|
action: UserAction?,
|
||||||
): Int {
|
serviceId: Int?,
|
||||||
|
): ErrorMessage {
|
||||||
return when {
|
return when {
|
||||||
throwable is AccountTerminatedException -> R.string.account_terminated
|
// player exceptions
|
||||||
throwable is ContentNotAvailableException -> R.string.content_not_available
|
// some may be IOException, so do these checks before isNetworkRelated!
|
||||||
throwable != null && throwable.isNetworkRelated -> R.string.network_error
|
|
||||||
throwable is ContentNotSupportedException -> R.string.content_not_supported
|
|
||||||
throwable is ExtractionException -> R.string.parsing_error
|
|
||||||
throwable is ExoPlaybackException -> {
|
throwable is ExoPlaybackException -> {
|
||||||
when (throwable.type) {
|
val cause = throwable.cause
|
||||||
ExoPlaybackException.TYPE_SOURCE -> R.string.player_stream_failure
|
when {
|
||||||
ExoPlaybackException.TYPE_UNEXPECTED -> R.string.player_recoverable_failure
|
cause is HttpDataSource.InvalidResponseCodeException -> {
|
||||||
else -> R.string.player_unrecoverable_failure
|
if (cause.responseCode == 403) {
|
||||||
|
if (serviceId == YouTube.serviceId) {
|
||||||
|
ErrorMessage(R.string.youtube_player_http_403)
|
||||||
|
} else {
|
||||||
|
ErrorMessage(R.string.player_http_403)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ErrorMessage(R.string.player_http_invalid_status, cause.responseCode.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
action == UserAction.UI_ERROR -> R.string.app_ui_crash
|
cause is Loader.UnexpectedLoaderException && cause.cause is ExtractionException ->
|
||||||
action == UserAction.REQUESTED_COMMENTS -> R.string.error_unable_to_load_comments
|
getMessage(throwable, action, serviceId)
|
||||||
action == UserAction.SUBSCRIPTION_CHANGE -> R.string.subscription_change_failed
|
throwable.type == ExoPlaybackException.TYPE_SOURCE ->
|
||||||
action == UserAction.SUBSCRIPTION_UPDATE -> R.string.subscription_update_failed
|
ErrorMessage(R.string.player_stream_failure)
|
||||||
action == UserAction.LOAD_IMAGE -> R.string.could_not_load_thumbnails
|
throwable.type == ExoPlaybackException.TYPE_UNEXPECTED ->
|
||||||
action == UserAction.DOWNLOAD_OPEN_DIALOG -> R.string.could_not_setup_download_menu
|
ErrorMessage(R.string.player_recoverable_failure)
|
||||||
else -> R.string.general_error
|
else ->
|
||||||
|
ErrorMessage(R.string.player_unrecoverable_failure)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throwable is FailedMediaSource.FailedMediaSourceException ->
|
||||||
|
getMessage(throwable.cause, action, serviceId)
|
||||||
|
throwable is PlaybackResolver.ResolverException ->
|
||||||
|
ErrorMessage(R.string.player_stream_failure)
|
||||||
|
|
||||||
|
// content not available exceptions
|
||||||
|
throwable is AccountTerminatedException ->
|
||||||
|
throwable.message
|
||||||
|
?.takeIf { reason -> !reason.isEmpty() }
|
||||||
|
?.let { reason ->
|
||||||
|
ErrorMessage(
|
||||||
|
R.string.account_terminated_service_provides_reason,
|
||||||
|
getServiceName(serviceId),
|
||||||
|
reason
|
||||||
|
)
|
||||||
|
}
|
||||||
|
?: ErrorMessage(R.string.account_terminated)
|
||||||
|
throwable is AgeRestrictedContentException ->
|
||||||
|
ErrorMessage(R.string.restricted_video_no_stream)
|
||||||
|
throwable is GeographicRestrictionException ->
|
||||||
|
ErrorMessage(R.string.georestricted_content)
|
||||||
|
throwable is PaidContentException ->
|
||||||
|
ErrorMessage(R.string.paid_content)
|
||||||
|
throwable is PrivateContentException ->
|
||||||
|
ErrorMessage(R.string.private_content)
|
||||||
|
throwable is SoundCloudGoPlusContentException ->
|
||||||
|
ErrorMessage(R.string.soundcloud_go_plus_content)
|
||||||
|
throwable is UnsupportedContentInCountryException ->
|
||||||
|
ErrorMessage(R.string.unsupported_content_in_country)
|
||||||
|
throwable is YoutubeMusicPremiumContentException ->
|
||||||
|
ErrorMessage(R.string.youtube_music_premium_content)
|
||||||
|
throwable is SignInConfirmNotBotException ->
|
||||||
|
ErrorMessage(R.string.sign_in_confirm_not_bot_error, getServiceName(serviceId))
|
||||||
|
throwable is ContentNotAvailableException ->
|
||||||
|
ErrorMessage(R.string.content_not_available)
|
||||||
|
|
||||||
|
// other extractor exceptions
|
||||||
|
throwable is ContentNotSupportedException ->
|
||||||
|
ErrorMessage(R.string.content_not_supported)
|
||||||
|
// ReCaptchas should have already been handled elsewhere,
|
||||||
|
// but return an error message here just in case
|
||||||
|
throwable is ReCaptchaException ->
|
||||||
|
ErrorMessage(R.string.recaptcha_request_toast)
|
||||||
|
// test this at the end as many exceptions could be a subclass of IOException
|
||||||
|
throwable != null && throwable.isNetworkRelated ->
|
||||||
|
ErrorMessage(R.string.network_error)
|
||||||
|
// an extraction exception unrelated to the network
|
||||||
|
// is likely an issue with parsing the website
|
||||||
|
throwable is ExtractionException ->
|
||||||
|
ErrorMessage(R.string.parsing_error)
|
||||||
|
|
||||||
|
// user actions (in case the exception is null or unrecognizable)
|
||||||
|
action == UserAction.UI_ERROR ->
|
||||||
|
ErrorMessage(R.string.app_ui_crash)
|
||||||
|
action == UserAction.REQUESTED_COMMENTS ->
|
||||||
|
ErrorMessage(R.string.error_unable_to_load_comments)
|
||||||
|
action == UserAction.SUBSCRIPTION_CHANGE ->
|
||||||
|
ErrorMessage(R.string.subscription_change_failed)
|
||||||
|
action == UserAction.SUBSCRIPTION_UPDATE ->
|
||||||
|
ErrorMessage(R.string.subscription_update_failed)
|
||||||
|
action == UserAction.LOAD_IMAGE ->
|
||||||
|
ErrorMessage(R.string.could_not_load_thumbnails)
|
||||||
|
action == UserAction.DOWNLOAD_OPEN_DIALOG ->
|
||||||
|
ErrorMessage(R.string.could_not_setup_download_menu)
|
||||||
|
else ->
|
||||||
|
ErrorMessage(R.string.error_snackbar_message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,21 +14,11 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.disposables.Disposable
|
import io.reactivex.rxjava3.disposables.Disposable
|
||||||
import org.schabi.newpipe.MainActivity
|
import org.schabi.newpipe.MainActivity
|
||||||
import org.schabi.newpipe.R
|
import org.schabi.newpipe.R
|
||||||
import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException
|
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException
|
||||||
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.PaidContentException
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.PrivateContentException
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException
|
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException
|
||||||
import org.schabi.newpipe.extractor.exceptions.SoundCloudGoPlusContentException
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException
|
|
||||||
import org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty
|
|
||||||
import org.schabi.newpipe.ktx.animate
|
import org.schabi.newpipe.ktx.animate
|
||||||
import org.schabi.newpipe.ktx.isInterruptedCaused
|
import org.schabi.newpipe.ktx.isInterruptedCaused
|
||||||
import org.schabi.newpipe.ktx.isNetworkRelated
|
|
||||||
import org.schabi.newpipe.util.ServiceHelper
|
|
||||||
import org.schabi.newpipe.util.external_communication.ShareUtils
|
import org.schabi.newpipe.util.external_communication.ShareUtils
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
@ -106,20 +96,6 @@ class ErrorPanelHelper(
|
||||||
|
|
||||||
errorRetryButton.isVisible = retryShouldBeShown
|
errorRetryButton.isVisible = retryShouldBeShown
|
||||||
showAndSetOpenInBrowserButtonAction(errorInfo)
|
showAndSetOpenInBrowserButtonAction(errorInfo)
|
||||||
} else if (errorInfo.throwable is AccountTerminatedException) {
|
|
||||||
errorTextView.setText(R.string.account_terminated)
|
|
||||||
|
|
||||||
if (!isNullOrEmpty((errorInfo.throwable as AccountTerminatedException).message)) {
|
|
||||||
errorServiceInfoTextView.text = context.resources.getString(
|
|
||||||
R.string.service_provides_reason,
|
|
||||||
ServiceHelper.getSelectedService(context)?.serviceInfo?.name ?: "<unknown>"
|
|
||||||
)
|
|
||||||
errorServiceInfoTextView.isVisible = true
|
|
||||||
|
|
||||||
errorServiceExplanationTextView.text =
|
|
||||||
(errorInfo.throwable as AccountTerminatedException).message
|
|
||||||
errorServiceExplanationTextView.isVisible = true
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
showAndSetErrorButtonAction(
|
showAndSetErrorButtonAction(
|
||||||
R.string.error_snackbar_action
|
R.string.error_snackbar_action
|
||||||
|
@ -127,7 +103,7 @@ class ErrorPanelHelper(
|
||||||
ErrorUtil.openActivity(context, errorInfo)
|
ErrorUtil.openActivity(context, errorInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
errorTextView.setText(getExceptionDescription(errorInfo.throwable))
|
errorTextView.text = errorInfo.getMessage(context)
|
||||||
|
|
||||||
if (errorInfo.throwable !is ContentNotAvailableException &&
|
if (errorInfo.throwable !is ContentNotAvailableException &&
|
||||||
errorInfo.throwable !is ContentNotSupportedException
|
errorInfo.throwable !is ContentNotSupportedException
|
||||||
|
@ -192,27 +168,5 @@ class ErrorPanelHelper(
|
||||||
companion object {
|
companion object {
|
||||||
val TAG: String = ErrorPanelHelper::class.simpleName!!
|
val TAG: String = ErrorPanelHelper::class.simpleName!!
|
||||||
val DEBUG: Boolean = MainActivity.DEBUG
|
val DEBUG: Boolean = MainActivity.DEBUG
|
||||||
|
|
||||||
@StringRes
|
|
||||||
fun getExceptionDescription(throwable: Throwable?): Int {
|
|
||||||
return when (throwable) {
|
|
||||||
is AgeRestrictedContentException -> R.string.restricted_video_no_stream
|
|
||||||
is GeographicRestrictionException -> R.string.georestricted_content
|
|
||||||
is PaidContentException -> R.string.paid_content
|
|
||||||
is PrivateContentException -> R.string.private_content
|
|
||||||
is SoundCloudGoPlusContentException -> R.string.soundcloud_go_plus_content
|
|
||||||
is YoutubeMusicPremiumContentException -> R.string.youtube_music_premium_content
|
|
||||||
is ContentNotAvailableException -> R.string.content_not_available
|
|
||||||
is ContentNotSupportedException -> R.string.content_not_supported
|
|
||||||
else -> {
|
|
||||||
// show retry button only for content which is not unavailable or unsupported
|
|
||||||
if (throwable != null && throwable.isNetworkRelated) {
|
|
||||||
R.string.network_error
|
|
||||||
} else {
|
|
||||||
R.string.error_snackbar_message
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,7 @@ class ErrorUtil {
|
||||||
)
|
)
|
||||||
.setSmallIcon(R.drawable.ic_bug_report)
|
.setSmallIcon(R.drawable.ic_bug_report)
|
||||||
.setContentTitle(context.getString(R.string.error_report_notification_title))
|
.setContentTitle(context.getString(R.string.error_report_notification_title))
|
||||||
.setContentText(context.getString(errorInfo.messageStringId))
|
.setContentText(errorInfo.getMessage(context))
|
||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setContentIntent(
|
.setContentIntent(
|
||||||
PendingIntentCompat.getActivity(
|
PendingIntentCompat.getActivity(
|
||||||
|
@ -156,10 +156,10 @@ class ErrorUtil {
|
||||||
// fallback to showing a notification if no root view is available
|
// fallback to showing a notification if no root view is available
|
||||||
createNotification(context, errorInfo)
|
createNotification(context, errorInfo)
|
||||||
} else {
|
} else {
|
||||||
Snackbar.make(rootView, R.string.error_snackbar_message, Snackbar.LENGTH_LONG)
|
Snackbar.make(rootView, errorInfo.getMessage(context), Snackbar.LENGTH_LONG)
|
||||||
.setActionTextColor(Color.YELLOW)
|
.setActionTextColor(Color.YELLOW)
|
||||||
.setAction(context.getString(R.string.error_snackbar_action).uppercase()) {
|
.setAction(context.getString(R.string.error_snackbar_action).uppercase()) {
|
||||||
openActivity(context, errorInfo)
|
context.startActivity(getErrorActivityIntent(context, errorInfo))
|
||||||
}.show()
|
}.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,9 @@ public enum UserAction {
|
||||||
SHARE_TO_NEWPIPE("share to newpipe"),
|
SHARE_TO_NEWPIPE("share to newpipe"),
|
||||||
CHECK_FOR_NEW_APP_VERSION("check for new app version"),
|
CHECK_FOR_NEW_APP_VERSION("check for new app version"),
|
||||||
OPEN_INFO_ITEM_DIALOG("open info item dialog"),
|
OPEN_INFO_ITEM_DIALOG("open info item dialog"),
|
||||||
GETTING_MAIN_SCREEN_TAB("getting main screen tab");
|
GETTING_MAIN_SCREEN_TAB("getting main screen tab"),
|
||||||
|
PLAY_ON_POPUP("play on popup"),
|
||||||
|
SUBSCRIPTIONS("loading subscriptions");
|
||||||
|
|
||||||
private final String message;
|
private final String message;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.schabi.newpipe.local.feed.notifications
|
package org.schabi.newpipe.local.feed.notifications
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
|
import android.os.Build
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.work.Constraints
|
import androidx.work.Constraints
|
||||||
|
@ -83,7 +85,9 @@ class NotificationWorker(
|
||||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||||
.setContentTitle(applicationContext.getString(R.string.feed_notification_loading))
|
.setContentTitle(applicationContext.getString(R.string.feed_notification_loading))
|
||||||
.build()
|
.build()
|
||||||
setForegroundAsync(ForegroundInfo(FeedLoadService.NOTIFICATION_ID, notification))
|
// ServiceInfo constants are not used below Android Q, so 0 is set here
|
||||||
|
val serviceType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC else 0
|
||||||
|
setForegroundAsync(ForegroundInfo(FeedLoadService.NOTIFICATION_ID, notification, serviceType))
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class SubscriptionsImportFragment extends BaseFragment {
|
||||||
if (supportedSources.isEmpty() && currentServiceId != Constants.NO_SERVICE_ID) {
|
if (supportedSources.isEmpty() && currentServiceId != Constants.NO_SERVICE_ID) {
|
||||||
ErrorUtil.showSnackbar(activity,
|
ErrorUtil.showSnackbar(activity,
|
||||||
new ErrorInfo(new String[]{}, UserAction.SUBSCRIPTION_IMPORT_EXPORT,
|
new ErrorInfo(new String[]{}, UserAction.SUBSCRIPTION_IMPORT_EXPORT,
|
||||||
ServiceHelper.getNameOfServiceById(currentServiceId),
|
currentServiceId,
|
||||||
"Service does not support importing subscriptions",
|
"Service does not support importing subscriptions",
|
||||||
R.string.general_error));
|
R.string.general_error));
|
||||||
activity.finish();
|
activity.finish();
|
||||||
|
|
|
@ -17,6 +17,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
import org.schabi.newpipe.MainActivity
|
import org.schabi.newpipe.MainActivity
|
||||||
import org.schabi.newpipe.NewPipeDatabase
|
import org.schabi.newpipe.NewPipeDatabase
|
||||||
import org.schabi.newpipe.R
|
import org.schabi.newpipe.R
|
||||||
|
import org.schabi.newpipe.error.ErrorInfo
|
||||||
import org.schabi.newpipe.extractor.InfoItem.InfoType
|
import org.schabi.newpipe.extractor.InfoItem.InfoType
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler
|
||||||
|
@ -84,7 +85,7 @@ class MediaBrowserPlaybackPreparer(
|
||||||
},
|
},
|
||||||
{ throwable ->
|
{ throwable ->
|
||||||
Log.e(TAG, "Failed to start playback of media ID [$mediaId]", throwable)
|
Log.e(TAG, "Failed to start playback of media ID [$mediaId]", throwable)
|
||||||
onPrepareError()
|
onPrepareError(throwable)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -115,9 +116,9 @@ class MediaBrowserPlaybackPreparer(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onPrepareError() {
|
private fun onPrepareError(throwable: Throwable) {
|
||||||
setMediaSessionError.accept(
|
setMediaSessionError.accept(
|
||||||
ContextCompat.getString(context, R.string.error_snackbar_message),
|
ErrorInfo.getMessage(throwable, null, null).getString(context),
|
||||||
PlaybackStateCompat.ERROR_CODE_APP_ERROR
|
PlaybackStateCompat.ERROR_CODE_APP_ERROR
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,19 +167,17 @@ public final class NotificationUtil {
|
||||||
&& notificationBuilder.mActions.get(2).actionIntent != null);
|
&& notificationBuilder.mActions.get(2).actionIntent != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void createNotificationAndStartForeground() {
|
public void createNotificationAndStartForeground() {
|
||||||
if (notificationBuilder == null) {
|
if (notificationBuilder == null) {
|
||||||
notificationBuilder = createNotification();
|
notificationBuilder = createNotification();
|
||||||
}
|
}
|
||||||
updateNotification();
|
updateNotification();
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
// ServiceInfo constants are not used below Android Q, so 0 is set here
|
||||||
player.getService().startForeground(NOTIFICATION_ID, notificationBuilder.build(),
|
final int serviceType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||||
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK);
|
? ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK : 0;
|
||||||
} else {
|
ServiceCompat.startForeground(player.getService(), NOTIFICATION_ID,
|
||||||
player.getService().startForeground(NOTIFICATION_ID, notificationBuilder.build());
|
notificationBuilder.build(), serviceType);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelNotificationAndStopForeground() {
|
public void cancelNotificationAndStopForeground() {
|
||||||
|
|
|
@ -9,9 +9,11 @@ import android.content.pm.PackageManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
import android.text.Html;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
|
@ -113,6 +115,7 @@ public final class PermissionHelper {
|
||||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||||
public static boolean checkSystemAlertWindowPermission(final Context context) {
|
public static boolean checkSystemAlertWindowPermission(final Context context) {
|
||||||
if (!Settings.canDrawOverlays(context)) {
|
if (!Settings.canDrawOverlays(context)) {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
|
||||||
final Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
final Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||||
Uri.parse("package:" + context.getPackageName()));
|
Uri.parse("package:" + context.getPackageName()));
|
||||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
@ -121,6 +124,38 @@ public final class PermissionHelper {
|
||||||
} catch (final ActivityNotFoundException ignored) {
|
} catch (final ActivityNotFoundException ignored) {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
// from Android R the ACTION_MANAGE_OVERLAY_PERMISSION will only point to the menu,
|
||||||
|
// so let’s add a dialog that points the user to the right setting.
|
||||||
|
} else {
|
||||||
|
final String appName = context.getApplicationInfo()
|
||||||
|
.loadLabel(context.getPackageManager()).toString();
|
||||||
|
final String title = context.getString(R.string.permission_display_over_apps);
|
||||||
|
final String permissionName =
|
||||||
|
context.getString(R.string.permission_display_over_apps_permission_name);
|
||||||
|
final String appNameItalic = "<i>" + appName + "</i>";
|
||||||
|
final String permissionNameItalic = "<i>" + permissionName + "</i>";
|
||||||
|
final String message =
|
||||||
|
context.getString(R.string.permission_display_over_apps_message,
|
||||||
|
appNameItalic,
|
||||||
|
permissionNameItalic
|
||||||
|
);
|
||||||
|
new AlertDialog.Builder(context)
|
||||||
|
.setTitle(title)
|
||||||
|
.setMessage(Html.fromHtml(message, Html.FROM_HTML_MODE_COMPACT))
|
||||||
|
.setPositiveButton("OK", (dialog, which) -> {
|
||||||
|
// we don’t need the package name here, since it won’t do anything on >R
|
||||||
|
final Intent intent =
|
||||||
|
new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
|
||||||
|
try {
|
||||||
|
context.startActivity(intent);
|
||||||
|
} catch (final ActivityNotFoundException ignored) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setCancelable(true)
|
||||||
|
.show();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
package org.schabi.newpipe.util.text;
|
package org.schabi.newpipe.util.text;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.MainActivity;
|
import org.schabi.newpipe.MainActivity;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.error.ErrorInfo;
|
||||||
import org.schabi.newpipe.error.ErrorPanelHelper;
|
import org.schabi.newpipe.error.ErrorUtil;
|
||||||
|
import org.schabi.newpipe.error.UserAction;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
|
@ -158,19 +157,13 @@ public final class InternalUrlsHandler {
|
||||||
disposables.add(single.subscribeOn(Schedulers.io())
|
disposables.add(single.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe(info -> {
|
.subscribe(info -> {
|
||||||
final PlayQueue playQueue =
|
final PlayQueue playQueue = new SinglePlayQueue(info, seconds * 1000L);
|
||||||
new SinglePlayQueue(info, seconds * 1000L);
|
|
||||||
NavigationHelper.playOnPopupPlayer(context, playQueue, false);
|
NavigationHelper.playOnPopupPlayer(context, playQueue, false);
|
||||||
}, throwable -> {
|
}, throwable -> {
|
||||||
if (DEBUG) {
|
final var errorInfo = new ErrorInfo(throwable, UserAction.PLAY_ON_POPUP, url);
|
||||||
Log.e(TAG, "Could not play on popup: " + url, throwable);
|
// This will only show a snackbar if the passed context has a root view:
|
||||||
}
|
// otherwise it will resort to showing a notification, so we are safe here.
|
||||||
new AlertDialog.Builder(context)
|
ErrorUtil.showSnackbar(context, errorInfo);
|
||||||
.setTitle(R.string.player_stream_failure)
|
|
||||||
.setMessage(
|
|
||||||
ErrorPanelHelper.Companion.getExceptionDescription(throwable))
|
|
||||||
.setPositiveButton(R.string.ok, null)
|
|
||||||
.show();
|
|
||||||
}));
|
}));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -265,7 +265,7 @@ public class DownloadManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteMission(Mission mission) {
|
public void deleteMission(Mission mission, boolean alsoDeleteFile) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (mission instanceof DownloadMission) {
|
if (mission instanceof DownloadMission) {
|
||||||
mMissionsPending.remove(mission);
|
mMissionsPending.remove(mission);
|
||||||
|
@ -274,9 +274,11 @@ public class DownloadManager {
|
||||||
mFinishedMissionStore.deleteMission(mission);
|
mFinishedMissionStore.deleteMission(mission);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alsoDeleteFile) {
|
||||||
mission.delete();
|
mission.delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void forgetMission(StoredFileHelper storage) {
|
public void forgetMission(StoredFileHelper storage) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
|
|
@ -563,11 +563,11 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
||||||
}
|
}
|
||||||
request.append("]");
|
request.append("]");
|
||||||
|
|
||||||
String service;
|
Integer service;
|
||||||
try {
|
try {
|
||||||
service = NewPipe.getServiceByUrl(mission.source).getServiceInfo().getName();
|
service = NewPipe.getServiceByUrl(mission.source).getServiceId();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
service = ErrorInfo.SERVICE_NONE;
|
service = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorUtil.createNotification(mContext,
|
ErrorUtil.createNotification(mContext,
|
||||||
|
@ -614,7 +614,7 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
Mission mission = i.next();
|
Mission mission = i.next();
|
||||||
if (mission != null) {
|
if (mission != null) {
|
||||||
mDownloadManager.deleteMission(mission);
|
mDownloadManager.deleteMission(mission, true);
|
||||||
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
|
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
|
||||||
}
|
}
|
||||||
i.remove();
|
i.remove();
|
||||||
|
@ -667,7 +667,14 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
||||||
shareFile(h.item.mission);
|
shareFile(h.item.mission);
|
||||||
return true;
|
return true;
|
||||||
case R.id.delete:
|
case R.id.delete:
|
||||||
mDeleter.append(h.item.mission);
|
// delete the entry and the file
|
||||||
|
mDeleter.append(h.item.mission, true);
|
||||||
|
applyChanges();
|
||||||
|
checkMasterButtonsVisibility();
|
||||||
|
return true;
|
||||||
|
case R.id.delete_entry:
|
||||||
|
// just delete the entry
|
||||||
|
mDeleter.append(h.item.mission, false);
|
||||||
applyChanges();
|
applyChanges();
|
||||||
checkMasterButtonsVisibility();
|
checkMasterButtonsVisibility();
|
||||||
return true;
|
return true;
|
||||||
|
@ -676,7 +683,7 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
||||||
final StoredFileHelper storage = h.item.mission.storage;
|
final StoredFileHelper storage = h.item.mission.storage;
|
||||||
if (!storage.existsAsFile()) {
|
if (!storage.existsAsFile()) {
|
||||||
Toast.makeText(mContext, R.string.missing_file, Toast.LENGTH_SHORT).show();
|
Toast.makeText(mContext, R.string.missing_file, Toast.LENGTH_SHORT).show();
|
||||||
mDeleter.append(h.item.mission);
|
mDeleter.append(h.item.mission, true);
|
||||||
applyChanges();
|
applyChanges();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,9 @@ import com.google.android.material.snackbar.Snackbar;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import kotlin.Pair;
|
||||||
import us.shandian.giga.get.FinishedMission;
|
import us.shandian.giga.get.FinishedMission;
|
||||||
import us.shandian.giga.get.Mission;
|
import us.shandian.giga.get.Mission;
|
||||||
import us.shandian.giga.service.DownloadManager;
|
import us.shandian.giga.service.DownloadManager;
|
||||||
|
@ -30,7 +32,8 @@ public class Deleter {
|
||||||
private static final int DELAY_RESUME = 400;// ms
|
private static final int DELAY_RESUME = 400;// ms
|
||||||
|
|
||||||
private Snackbar snackbar;
|
private Snackbar snackbar;
|
||||||
private ArrayList<Mission> items;
|
// list of missions to be deleted, and whether to also delete the corresponding file
|
||||||
|
private ArrayList<Pair<Mission, Boolean>> items;
|
||||||
private boolean running = true;
|
private boolean running = true;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
@ -51,7 +54,7 @@ public class Deleter {
|
||||||
items = new ArrayList<>(2);
|
items = new ArrayList<>(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void append(Mission item) {
|
public void append(Mission item, boolean alsoDeleteFile) {
|
||||||
/* If a mission is removed from the list while the Snackbar for a previously
|
/* If a mission is removed from the list while the Snackbar for a previously
|
||||||
* removed item is still showing, commit the action for the previous item
|
* removed item is still showing, commit the action for the previous item
|
||||||
* immediately. This prevents Snackbars from stacking up in reverse order.
|
* immediately. This prevents Snackbars from stacking up in reverse order.
|
||||||
|
@ -60,13 +63,13 @@ public class Deleter {
|
||||||
commit();
|
commit();
|
||||||
|
|
||||||
mIterator.hide(item);
|
mIterator.hide(item);
|
||||||
items.add(0, item);
|
items.add(0, new Pair<>(item, alsoDeleteFile));
|
||||||
|
|
||||||
show();
|
show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void forget() {
|
private void forget() {
|
||||||
mIterator.unHide(items.remove(0));
|
mIterator.unHide(items.remove(0).getFirst());
|
||||||
mAdapter.applyChanges();
|
mAdapter.applyChanges();
|
||||||
|
|
||||||
show();
|
show();
|
||||||
|
@ -84,7 +87,19 @@ public class Deleter {
|
||||||
private void next() {
|
private void next() {
|
||||||
if (items.size() < 1) return;
|
if (items.size() < 1) return;
|
||||||
|
|
||||||
String msg = mContext.getString(R.string.file_deleted).concat(":\n").concat(items.get(0).storage.getName());
|
final Optional<String> fileToBeDeleted = items.stream()
|
||||||
|
.filter(Pair::getSecond)
|
||||||
|
.map(p -> p.getFirst().storage.getName())
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
String msg;
|
||||||
|
if (fileToBeDeleted.isPresent()) {
|
||||||
|
msg = mContext.getString(R.string.file_deleted)
|
||||||
|
.concat(":\n")
|
||||||
|
.concat(fileToBeDeleted.get());
|
||||||
|
} else {
|
||||||
|
msg = mContext.getString(R.string.entry_deleted);
|
||||||
|
}
|
||||||
|
|
||||||
snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);
|
snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);
|
||||||
snackbar.setAction(R.string.undo, s -> forget());
|
snackbar.setAction(R.string.undo, s -> forget());
|
||||||
|
@ -98,11 +113,13 @@ public class Deleter {
|
||||||
if (items.size() < 1) return;
|
if (items.size() < 1) return;
|
||||||
|
|
||||||
while (items.size() > 0) {
|
while (items.size() > 0) {
|
||||||
Mission mission = items.remove(0);
|
Pair<Mission, Boolean> missionAndAlsoDeleteFile = items.remove(0);
|
||||||
|
Mission mission = missionAndAlsoDeleteFile.getFirst();
|
||||||
|
boolean alsoDeleteFile = missionAndAlsoDeleteFile.getSecond();
|
||||||
if (mission.deleted) continue;
|
if (mission.deleted) continue;
|
||||||
|
|
||||||
mIterator.unHide(mission);
|
mIterator.unHide(mission);
|
||||||
mDownloadManager.deleteMission(mission);
|
mDownloadManager.deleteMission(mission, alsoDeleteFile);
|
||||||
|
|
||||||
if (mission instanceof FinishedMission) {
|
if (mission instanceof FinishedMission) {
|
||||||
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
|
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
|
||||||
|
@ -137,7 +154,11 @@ public class Deleter {
|
||||||
|
|
||||||
pause();
|
pause();
|
||||||
|
|
||||||
for (Mission mission : items) mDownloadManager.deleteMission(mission);
|
for (Pair<Mission, Boolean> missionAndAlsoDeleteFile : items) {
|
||||||
|
Mission mission = missionAndAlsoDeleteFile.getFirst();
|
||||||
|
boolean alsoDeleteFile = missionAndAlsoDeleteFile.getSecond();
|
||||||
|
mDownloadManager.deleteMission(mission, alsoDeleteFile);
|
||||||
|
}
|
||||||
items = null;
|
items = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,11 @@
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/delete"
|
android:id="@+id/delete"
|
||||||
android:title="@string/delete" />
|
android:title="@string/delete_file" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/delete_entry"
|
||||||
|
android:title="@string/delete_entry" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/error_message_view"
|
android:id="@+id/error_message_view"
|
||||||
|
|
|
@ -604,7 +604,6 @@
|
||||||
<string name="play_queue_audio_track">الصوت : %s</string>
|
<string name="play_queue_audio_track">الصوت : %s</string>
|
||||||
<string name="playback_step">خطوة</string>
|
<string name="playback_step">خطوة</string>
|
||||||
<string name="recaptcha_solve">حل</string>
|
<string name="recaptcha_solve">حل</string>
|
||||||
<string name="service_provides_reason">%s يقدم هذا السبب:</string>
|
|
||||||
<string name="selected_stream_external_player_not_supported">الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون</string>
|
<string name="selected_stream_external_player_not_supported">الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون</string>
|
||||||
<string name="title_activity_about">عن تطبيق نيوپايپ</string>
|
<string name="title_activity_about">عن تطبيق نيوپايپ</string>
|
||||||
<string name="seek_duration_title">تسريع إلى الأمام/-ترجيع وقت البحث</string>
|
<string name="seek_duration_title">تسريع إلى الأمام/-ترجيع وقت البحث</string>
|
||||||
|
|
|
@ -602,7 +602,6 @@
|
||||||
<string name="description_select_enable">تمكين تحديد نص في الوصف</string>
|
<string name="description_select_enable">تمكين تحديد نص في الوصف</string>
|
||||||
<string name="description_select_note">يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد.</string>
|
<string name="description_select_note">يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد.</string>
|
||||||
<string name="open_website_license">فتح الموقع</string>
|
<string name="open_website_license">فتح الموقع</string>
|
||||||
<string name="service_provides_reason">%s يقدم هذا السبب:</string>
|
|
||||||
<string name="account_terminated">تم إنهاء الحساب</string>
|
<string name="account_terminated">تم إنهاء الحساب</string>
|
||||||
<string name="feed_load_error_fast_unknown">لا يوفر وضع التغذية السريعة مزيدًا من المعلومات حول هذا الموضوع.</string>
|
<string name="feed_load_error_fast_unknown">لا يوفر وضع التغذية السريعة مزيدًا من المعلومات حول هذا الموضوع.</string>
|
||||||
<string name="feed_load_error_terminated">حساب منشئ المحتوى قد تم إنهائه.
|
<string name="feed_load_error_terminated">حساب منشئ المحتوى قد تم إنهائه.
|
||||||
|
|
|
@ -482,7 +482,6 @@
|
||||||
<string name="enable_queue_limit">Endirmə növbəsini məhdudlaşdır</string>
|
<string name="enable_queue_limit">Endirmə növbəsini məhdudlaşdır</string>
|
||||||
<string name="enable_queue_limit_desc">Eyni vaxtda ancaq bir endirmə həyata keçiriləcək</string>
|
<string name="enable_queue_limit_desc">Eyni vaxtda ancaq bir endirmə həyata keçiriləcək</string>
|
||||||
<string name="account_terminated">Hesab ləğv edildi</string>
|
<string name="account_terminated">Hesab ləğv edildi</string>
|
||||||
<string name="service_provides_reason">%s bu səbəbi təmin edir:</string>
|
|
||||||
<string name="download_has_started">Yükləmə başladı</string>
|
<string name="download_has_started">Yükləmə başladı</string>
|
||||||
<string name="description_select_disable">Açıqlamadakı mətni seçməyi qeyri-aktiv et</string>
|
<string name="description_select_disable">Açıqlamadakı mətni seçməyi qeyri-aktiv et</string>
|
||||||
<string name="metadata_category">Kateqoriya</string>
|
<string name="metadata_category">Kateqoriya</string>
|
||||||
|
|
|
@ -667,7 +667,6 @@
|
||||||
<string name="private_content">Гэта змесціва з\'яўляецца прыватным, таму NewPipe не можа яго трансляваць або спампоўваць.</string>
|
<string name="private_content">Гэта змесціва з\'яўляецца прыватным, таму NewPipe не можа яго трансляваць або спампоўваць.</string>
|
||||||
<string name="youtube_music_premium_content">Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго трансляваць або спампоўваць.</string>
|
<string name="youtube_music_premium_content">Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго трансляваць або спампоўваць.</string>
|
||||||
<string name="account_terminated">Уліковы запіс спынены</string>
|
<string name="account_terminated">Уліковы запіс спынены</string>
|
||||||
<string name="service_provides_reason">%s дае наступную прычыну:</string>
|
|
||||||
<string name="featured">Вартае ўвагі</string>
|
<string name="featured">Вартае ўвагі</string>
|
||||||
<string name="metadata_privacy_internal">Унутраная</string>
|
<string name="metadata_privacy_internal">Унутраная</string>
|
||||||
<string name="feed_show_watched">Прагледжаныя цалкам</string>
|
<string name="feed_show_watched">Прагледжаныя цалкам</string>
|
||||||
|
|
|
@ -392,7 +392,6 @@
|
||||||
<string name="playlist_page_summary">Страница на плейлиста</string>
|
<string name="playlist_page_summary">Страница на плейлиста</string>
|
||||||
<string name="chapters">Глави</string>
|
<string name="chapters">Глави</string>
|
||||||
<string name="metadata_licence">Лиценз</string>
|
<string name="metadata_licence">Лиценз</string>
|
||||||
<string name="service_provides_reason">%s посочва следната причина:</string>
|
|
||||||
<string name="metadata_tags">Маркери</string>
|
<string name="metadata_tags">Маркери</string>
|
||||||
<string name="metadata_privacy">Поверителност</string>
|
<string name="metadata_privacy">Поверителност</string>
|
||||||
<string name="metadata_language">Език</string>
|
<string name="metadata_language">Език</string>
|
||||||
|
|
|
@ -513,7 +513,6 @@
|
||||||
<string name="feed_load_error_account_info">\'%s\' এর জন্য ফিড প্রক্রিয়া করা যাচ্ছে না।</string>
|
<string name="feed_load_error_account_info">\'%s\' এর জন্য ফিড প্রক্রিয়া করা যাচ্ছে না।</string>
|
||||||
<string name="description_select_disable">বর্ণনার লেখা নির্বাচন করা নিষ্ক্রিয় করো</string>
|
<string name="description_select_disable">বর্ণনার লেখা নির্বাচন করা নিষ্ক্রিয় করো</string>
|
||||||
<string name="description_select_enable">বর্ণনার লেখা নির্বাচন করা সক্ষম করো</string>
|
<string name="description_select_enable">বর্ণনার লেখা নির্বাচন করা সক্ষম করো</string>
|
||||||
<string name="service_provides_reason">%s এই কারণ বলছে:</string>
|
|
||||||
<string name="feed_load_error">প্রক্রিয়াকরণ ফিডে ত্রুটি</string>
|
<string name="feed_load_error">প্রক্রিয়াকরণ ফিডে ত্রুটি</string>
|
||||||
<string name="open_website_license">ওয়েবসাইট খুলুন</string>
|
<string name="open_website_license">ওয়েবসাইট খুলুন</string>
|
||||||
<string name="account_terminated">অ্যাকাউন্ট ধ্বংসকৃত</string>
|
<string name="account_terminated">অ্যাকাউন্ট ধ্বংসকৃত</string>
|
||||||
|
|
|
@ -580,7 +580,6 @@
|
||||||
<string name="select_night_theme_toast">Pot seleccionar el seu tema fosc favorit aqui sota</string>
|
<string name="select_night_theme_toast">Pot seleccionar el seu tema fosc favorit aqui sota</string>
|
||||||
<string name="night_theme_summary">Selecciona el teu tema fosc favorit — %s</string>
|
<string name="night_theme_summary">Selecciona el teu tema fosc favorit — %s</string>
|
||||||
<string name="auto_device_theme_title">Automàtic (tema del dispositiu)</string>
|
<string name="auto_device_theme_title">Automàtic (tema del dispositiu)</string>
|
||||||
<string name="service_provides_reason">%s dóna aquesta raó:</string>
|
|
||||||
<string name="account_terminated">Usuari suspes</string>
|
<string name="account_terminated">Usuari suspes</string>
|
||||||
<string name="feed_load_error_terminated">El compte de l\'autor ha estat esborrat.
|
<string name="feed_load_error_terminated">El compte de l\'autor ha estat esborrat.
|
||||||
\nNewPipe no serà capaç de carregar aquest fil en el futur.
|
\nNewPipe no serà capaç de carregar aquest fil en el futur.
|
||||||
|
|
|
@ -570,7 +570,6 @@
|
||||||
<string name="radio">ڕادیۆ</string>
|
<string name="radio">ڕادیۆ</string>
|
||||||
<string name="featured">تایبەتکراو</string>
|
<string name="featured">تایبەتکراو</string>
|
||||||
<string name="paid_content">ئهم بابهته تهنیا بۆ ئهو كهسانه بهردهسته كه پارهیان داوه ، بۆیه ناتوانرێت له نیوپایپهوه داببهزێنرێت.</string>
|
<string name="paid_content">ئهم بابهته تهنیا بۆ ئهو كهسانه بهردهسته كه پارهیان داوه ، بۆیه ناتوانرێت له نیوپایپهوه داببهزێنرێت.</string>
|
||||||
<string name="service_provides_reason">%s ئهم هۆكاره دابین دهكات:</string>
|
|
||||||
<string name="account_terminated">ههژمار لهناوبراوه</string>
|
<string name="account_terminated">ههژمار لهناوبراوه</string>
|
||||||
<string name="youtube_music_premium_content">ئهم ڤیدیۆیه تهنیا له وهشانی نایابی یوتوب میوزیك بهردهسته ، بۆیه ناتوانرێت له نیوپایپهوه داببهزێنرێت.</string>
|
<string name="youtube_music_premium_content">ئهم ڤیدیۆیه تهنیا له وهشانی نایابی یوتوب میوزیك بهردهسته ، بۆیه ناتوانرێت له نیوپایپهوه داببهزێنرێت.</string>
|
||||||
<string name="soundcloud_go_plus_content">ئهمه تراكی SoundCloud Go+ ه ، لانی كهم له وڵاتهكهی تۆدا، ناتوانرێت لهلایهن نیوپایپهوه داببهزێنرێت.</string>
|
<string name="soundcloud_go_plus_content">ئهمه تراكی SoundCloud Go+ ه ، لانی كهم له وڵاتهكهی تۆدا، ناتوانرێت لهلایهن نیوپایپهوه داببهزێنرێت.</string>
|
||||||
|
|
|
@ -587,7 +587,6 @@
|
||||||
<string name="description_select_disable">Vypnout výběr textu v popisu</string>
|
<string name="description_select_disable">Vypnout výběr textu v popisu</string>
|
||||||
<string name="description_select_enable">Zapnout výběr textu v popisu</string>
|
<string name="description_select_enable">Zapnout výběr textu v popisu</string>
|
||||||
<string name="description_select_note">Nyní můžete vybrat v popisu text. Pamatujte, že v režimu výběru může stránka blikat a odkazy nemusí reagovat na kliknutí.</string>
|
<string name="description_select_note">Nyní můžete vybrat v popisu text. Pamatujte, že v režimu výběru může stránka blikat a odkazy nemusí reagovat na kliknutí.</string>
|
||||||
<string name="service_provides_reason">%s udává teno důvod:</string>
|
|
||||||
<string name="account_terminated">Účet uzavřen</string>
|
<string name="account_terminated">Účet uzavřen</string>
|
||||||
<string name="feed_load_error_fast_unknown">Režim rychlého feedu o tom neposkytuje více informací.</string>
|
<string name="feed_load_error_fast_unknown">Režim rychlého feedu o tom neposkytuje více informací.</string>
|
||||||
<string name="feed_load_error_terminated">Autorův účet byl uzavřen.
|
<string name="feed_load_error_terminated">Autorův účet byl uzavřen.
|
||||||
|
|
|
@ -539,7 +539,6 @@
|
||||||
<string name="private_content">Dette indhold er privat, så det kan ikke streames eller hentes af NewPipe.</string>
|
<string name="private_content">Dette indhold er privat, så det kan ikke streames eller hentes af NewPipe.</string>
|
||||||
<string name="recently_added">Nyligt tilføjede</string>
|
<string name="recently_added">Nyligt tilføjede</string>
|
||||||
<string name="featured">Fremhævede</string>
|
<string name="featured">Fremhævede</string>
|
||||||
<string name="service_provides_reason">%s giver denne grund:</string>
|
|
||||||
<string name="msg_calculating_hash">Udregner hash</string>
|
<string name="msg_calculating_hash">Udregner hash</string>
|
||||||
<string name="recaptcha_solve">Løs</string>
|
<string name="recaptcha_solve">Løs</string>
|
||||||
<string name="feed_group_dialog_empty_selection">Ingen abonnementer valgt</string>
|
<string name="feed_group_dialog_empty_selection">Ingen abonnementer valgt</string>
|
||||||
|
|
|
@ -600,7 +600,6 @@
|
||||||
<string name="downloads_storage_ask_summary_no_saf_notice">Du wirst jedes Mal gefragt werden, wohin der Download gespeichert werden soll</string>
|
<string name="downloads_storage_ask_summary_no_saf_notice">Du wirst jedes Mal gefragt werden, wohin der Download gespeichert werden soll</string>
|
||||||
<string name="feed_load_error">Fehler beim Laden des Feeds</string>
|
<string name="feed_load_error">Fehler beim Laden des Feeds</string>
|
||||||
<string name="feed_load_error_account_info">Konnte Feed für \'%s\' nicht laden.</string>
|
<string name="feed_load_error_account_info">Konnte Feed für \'%s\' nicht laden.</string>
|
||||||
<string name="service_provides_reason">%s gibt diesen Grund an:</string>
|
|
||||||
<string name="on">An</string>
|
<string name="on">An</string>
|
||||||
<string name="tablet_mode_title">Tablet-Modus</string>
|
<string name="tablet_mode_title">Tablet-Modus</string>
|
||||||
<string name="off">Aus</string>
|
<string name="off">Aus</string>
|
||||||
|
|
|
@ -581,7 +581,6 @@
|
||||||
<string name="description_select_enable">Ενεργοποίηση επιλογής κειμένου στην περιγραφή</string>
|
<string name="description_select_enable">Ενεργοποίηση επιλογής κειμένου στην περιγραφή</string>
|
||||||
<string name="description_select_note">Τώρα μπορείτε να επιλέξετε κείμενο εντός της περιγραφής. Σημειώστε ότι, η σελίδα μπορεί να παρουσιάζει αστάθεια κατά τη διάρκεια της κατάστασης επιλογής κειμένου.</string>
|
<string name="description_select_note">Τώρα μπορείτε να επιλέξετε κείμενο εντός της περιγραφής. Σημειώστε ότι, η σελίδα μπορεί να παρουσιάζει αστάθεια κατά τη διάρκεια της κατάστασης επιλογής κειμένου.</string>
|
||||||
<string name="open_website_license">Ανοικτή ιστοσελίδα</string>
|
<string name="open_website_license">Ανοικτή ιστοσελίδα</string>
|
||||||
<string name="service_provides_reason">Το %s παρέχει αυτή την αιτία:</string>
|
|
||||||
<string name="account_terminated">Ο λογαριασμός διαγράφηκε</string>
|
<string name="account_terminated">Ο λογαριασμός διαγράφηκε</string>
|
||||||
<string name="feed_load_error_fast_unknown">Η κατάσταση γρήγορης τροφοδοσίας δεν παρέχει περισσότερες πληροφορίες.</string>
|
<string name="feed_load_error_fast_unknown">Η κατάσταση γρήγορης τροφοδοσίας δεν παρέχει περισσότερες πληροφορίες.</string>
|
||||||
<string name="feed_load_error_terminated">Ο λογαριασμός του δημιουργού έχει διαγραφεί.
|
<string name="feed_load_error_terminated">Ο λογαριασμός του δημιουργού έχει διαγραφεί.
|
||||||
|
|
|
@ -477,7 +477,6 @@
|
||||||
<string name="on">Ŝaltita</string>
|
<string name="on">Ŝaltita</string>
|
||||||
<string name="metadata_tags">Etikedoj</string>
|
<string name="metadata_tags">Etikedoj</string>
|
||||||
<string name="download_has_started">Elŝutado komenciĝis</string>
|
<string name="download_has_started">Elŝutado komenciĝis</string>
|
||||||
<string name="service_provides_reason">%s donas tiun kialon:</string>
|
|
||||||
<string name="georestricted_content">Tiu enaĵo ne disponeblas en via lando.</string>
|
<string name="georestricted_content">Tiu enaĵo ne disponeblas en via lando.</string>
|
||||||
<string name="recent">Freŝaj</string>
|
<string name="recent">Freŝaj</string>
|
||||||
<string name="video_detail_by">De %s</string>
|
<string name="video_detail_by">De %s</string>
|
||||||
|
|
|
@ -579,7 +579,6 @@
|
||||||
<string name="description_select_disable">Deshabilitar la selección de texto de la descripción</string>
|
<string name="description_select_disable">Deshabilitar la selección de texto de la descripción</string>
|
||||||
<string name="description_select_enable">Habilitar la selección de texto de la descripción</string>
|
<string name="description_select_enable">Habilitar la selección de texto de la descripción</string>
|
||||||
<string name="description_select_note">Ahora puede seleccionar el texto dentro de la descripción. Note que la página puede parpadear y los links no serán cliqueables mientras está en el modo de selección.</string>
|
<string name="description_select_note">Ahora puede seleccionar el texto dentro de la descripción. Note que la página puede parpadear y los links no serán cliqueables mientras está en el modo de selección.</string>
|
||||||
<string name="service_provides_reason">%s da esta razón:</string>
|
|
||||||
<string name="feed_load_error_account_info">No fue posible cargar el feed por \'%s\'.</string>
|
<string name="feed_load_error_account_info">No fue posible cargar el feed por \'%s\'.</string>
|
||||||
<string name="account_terminated">Cuenta cancelada</string>
|
<string name="account_terminated">Cuenta cancelada</string>
|
||||||
<string name="feed_load_error_fast_unknown">El modo de muro rápido no arroja más información sobre esto.</string>
|
<string name="feed_load_error_fast_unknown">El modo de muro rápido no arroja más información sobre esto.</string>
|
||||||
|
|
|
@ -535,7 +535,6 @@
|
||||||
<string name="show_thumbnail_title">Näita pisipilte</string>
|
<string name="show_thumbnail_title">Näita pisipilte</string>
|
||||||
<string name="show_thumbnail_summary">Kasuta pisipilti nii lukustusvaate kui teavituste taustana</string>
|
<string name="show_thumbnail_summary">Kasuta pisipilti nii lukustusvaate kui teavituste taustana</string>
|
||||||
<string name="account_terminated">Kasutajakonto on suletud</string>
|
<string name="account_terminated">Kasutajakonto on suletud</string>
|
||||||
<string name="service_provides_reason">%s toob põhjuseks:</string>
|
|
||||||
<string name="description_select_enable">Võimalda valida kirjelduse teksti</string>
|
<string name="description_select_enable">Võimalda valida kirjelduse teksti</string>
|
||||||
<string name="description_select_disable">Ära võimalda valida kirjelduse teksti</string>
|
<string name="description_select_disable">Ära võimalda valida kirjelduse teksti</string>
|
||||||
<string name="metadata_category">Kategooria</string>
|
<string name="metadata_category">Kategooria</string>
|
||||||
|
|
|
@ -588,7 +588,6 @@
|
||||||
<string name="downloads_storage_ask_summary_no_saf_notice">Non gorde galdetuko zaizu deskarga bakoitzean</string>
|
<string name="downloads_storage_ask_summary_no_saf_notice">Non gorde galdetuko zaizu deskarga bakoitzean</string>
|
||||||
<string name="no_dir_yet">Ez da deskargatzeko karpetarik ezarri oraindik, aukeratu lehenetsitako deskargatzeko karpeta orain</string>
|
<string name="no_dir_yet">Ez da deskargatzeko karpetarik ezarri oraindik, aukeratu lehenetsitako deskargatzeko karpeta orain</string>
|
||||||
<string name="metadata_privacy">Pribatutasuna</string>
|
<string name="metadata_privacy">Pribatutasuna</string>
|
||||||
<string name="service_provides_reason">%s arrazoi hau ematen du:</string>
|
|
||||||
<string name="account_terminated">Kontua ezabatu da</string>
|
<string name="account_terminated">Kontua ezabatu da</string>
|
||||||
<string name="feed_load_error_fast_unknown">Jario azkarrak ez du honi buruz informazio gehiagorik ematen.</string>
|
<string name="feed_load_error_fast_unknown">Jario azkarrak ez du honi buruz informazio gehiagorik ematen.</string>
|
||||||
<string name="metadata_age_limit">Adin muga</string>
|
<string name="metadata_age_limit">Adin muga</string>
|
||||||
|
|
|
@ -599,7 +599,6 @@
|
||||||
\nنیوپایپ قادر به بار کردن این خوراک در آینده نیست.
|
\nنیوپایپ قادر به بار کردن این خوراک در آینده نیست.
|
||||||
\nمیخواهید اشتراک این کانال را لغو کنید؟</string>
|
\nمیخواهید اشتراک این کانال را لغو کنید؟</string>
|
||||||
<string name="feed_load_error_fast_unknown">حالت خوراک سریع، اطَلاعات بیشتری در این باره نمیدهد.</string>
|
<string name="feed_load_error_fast_unknown">حالت خوراک سریع، اطَلاعات بیشتری در این باره نمیدهد.</string>
|
||||||
<string name="service_provides_reason">%s این دلیل را آورد:</string>
|
|
||||||
<string name="seekbar_preview_thumbnail_title">پیشنمایش بندانگشتی نوار جویش</string>
|
<string name="seekbar_preview_thumbnail_title">پیشنمایش بندانگشتی نوار جویش</string>
|
||||||
<string name="detail_heart_img_view_description">قلبشده به دست ایجادگر</string>
|
<string name="detail_heart_img_view_description">قلبشده به دست ایجادگر</string>
|
||||||
<string name="local_search_suggestions">پیشنهادهای جستوجوی محلّی</string>
|
<string name="local_search_suggestions">پیشنهادهای جستوجوی محلّی</string>
|
||||||
|
|
|
@ -564,7 +564,6 @@
|
||||||
<string name="night_theme_title">Yöteema</string>
|
<string name="night_theme_title">Yöteema</string>
|
||||||
<string name="description_select_disable">Poista käytöstä tekstinvalinta kuvauskentän sisältä</string>
|
<string name="description_select_disable">Poista käytöstä tekstinvalinta kuvauskentän sisältä</string>
|
||||||
<string name="description_select_note">Voit nyt valita tekstin kuvauskentän sisältä. Huomioithan, että valintatilan aikana sivu voi vilkkua ja linkit eivät ehkä ole klikattavia.</string>
|
<string name="description_select_note">Voit nyt valita tekstin kuvauskentän sisältä. Huomioithan, että valintatilan aikana sivu voi vilkkua ja linkit eivät ehkä ole klikattavia.</string>
|
||||||
<string name="service_provides_reason">%s tuo tämän syyn:</string>
|
|
||||||
<string name="seekbar_preview_thumbnail_title">Säätövivun kuvakkeen esikatselu</string>
|
<string name="seekbar_preview_thumbnail_title">Säätövivun kuvakkeen esikatselu</string>
|
||||||
<string name="disable_media_tunneling_summary">Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa.</string>
|
<string name="disable_media_tunneling_summary">Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa.</string>
|
||||||
<string name="disable_media_tunneling_title">Poista median tunnelointi käytöstä</string>
|
<string name="disable_media_tunneling_title">Poista median tunnelointi käytöstä</string>
|
||||||
|
|
|
@ -586,7 +586,6 @@
|
||||||
<string name="metadata_tags">Étiquettes</string>
|
<string name="metadata_tags">Étiquettes</string>
|
||||||
<string name="metadata_category">Catégorie</string>
|
<string name="metadata_category">Catégorie</string>
|
||||||
<string name="description_select_note">Vous pouvez maintenant sélectionner du texte à l’intérieur de la description. Notez que la page peut scintiller et que les liens peuvent ne pas être cliquables en mode sélection.</string>
|
<string name="description_select_note">Vous pouvez maintenant sélectionner du texte à l’intérieur de la description. Notez que la page peut scintiller et que les liens peuvent ne pas être cliquables en mode sélection.</string>
|
||||||
<string name="service_provides_reason">%s indique le motif :</string>
|
|
||||||
<string name="no_dir_yet">Aucun dossier de téléchargement n’est défini pour le moment, sélectionnez le dossier de téléchargement par défaut</string>
|
<string name="no_dir_yet">Aucun dossier de téléchargement n’est défini pour le moment, sélectionnez le dossier de téléchargement par défaut</string>
|
||||||
<string name="open_website_license">Ouvrir le site web</string>
|
<string name="open_website_license">Ouvrir le site web</string>
|
||||||
<string name="account_terminated">Compte résilié</string>
|
<string name="account_terminated">Compte résilié</string>
|
||||||
|
|
|
@ -525,7 +525,6 @@
|
||||||
<string name="description_select_note">Agora pode seleccionar o texto na descrición. Teña en conta que a páxina pode cintilar e as ligazóns poden non ser clicábeis no modo selección.</string>
|
<string name="description_select_note">Agora pode seleccionar o texto na descrición. Teña en conta que a páxina pode cintilar e as ligazóns poden non ser clicábeis no modo selección.</string>
|
||||||
<string name="auto_device_theme_title">Automático (Tema do dispositivo)</string>
|
<string name="auto_device_theme_title">Automático (Tema do dispositivo)</string>
|
||||||
<string name="radio">Radio</string>
|
<string name="radio">Radio</string>
|
||||||
<string name="service_provides_reason">%s dá este motivo:</string>
|
|
||||||
<string name="georestricted_content">Este contido non está dispoñíbel no seu país.</string>
|
<string name="georestricted_content">Este contido non está dispoñíbel no seu país.</string>
|
||||||
<string name="chapters">Capítulos</string>
|
<string name="chapters">Capítulos</string>
|
||||||
<string name="recent">Recentes</string>
|
<string name="recent">Recentes</string>
|
||||||
|
|
|
@ -593,7 +593,6 @@
|
||||||
\nל־NewPipe לא תהיה אפשרות להוריד את ההזנה הזאת בעתיד.
|
\nל־NewPipe לא תהיה אפשרות להוריד את ההזנה הזאת בעתיד.
|
||||||
\nלהסיר את המינוי מהערוץ הזה\?</string>
|
\nלהסיר את המינוי מהערוץ הזה\?</string>
|
||||||
<string name="open_website_license">פתיחת האתר</string>
|
<string name="open_website_license">פתיחת האתר</string>
|
||||||
<string name="service_provides_reason">%s מספק את הסיבה הבאה:</string>
|
|
||||||
<string name="account_terminated">החשבון הושמד</string>
|
<string name="account_terminated">החשבון הושמד</string>
|
||||||
<string name="feed_load_error_fast_unknown">מצב ההזנה המהירה לא מספק מידע נוסף על כך.</string>
|
<string name="feed_load_error_fast_unknown">מצב ההזנה המהירה לא מספק מידע נוסף על כך.</string>
|
||||||
<string name="feed_load_error_account_info">לא ניתן לטעון את ההזנה עבור ‚%s’.</string>
|
<string name="feed_load_error_account_info">לא ניתן לטעון את ההזנה עבור ‚%s’.</string>
|
||||||
|
|
|
@ -627,7 +627,6 @@
|
||||||
<string name="disable_media_tunneling_title">मीडिया टनलिंग अक्षम करें</string>
|
<string name="disable_media_tunneling_title">मीडिया टनलिंग अक्षम करें</string>
|
||||||
<string name="show_crash_the_player_title">\"क्रैश द प्लेयर\" दिखाएं</string>
|
<string name="show_crash_the_player_title">\"क्रैश द प्लेयर\" दिखाएं</string>
|
||||||
<string name="feed_subscription_not_loaded_count">लोड नहीं हुआ: %d</string>
|
<string name="feed_subscription_not_loaded_count">लोड नहीं हुआ: %d</string>
|
||||||
<string name="service_provides_reason">%s इसका कारण प्रदान करता है:</string>
|
|
||||||
<string name="metadata_tags">टैग</string>
|
<string name="metadata_tags">टैग</string>
|
||||||
<string name="metadata_licence">लाइसेंस</string>
|
<string name="metadata_licence">लाइसेंस</string>
|
||||||
<string name="faq_description">यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें!</string>
|
<string name="faq_description">यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें!</string>
|
||||||
|
|
|
@ -606,7 +606,6 @@
|
||||||
<string name="metadata_privacy_internal">Interno</string>
|
<string name="metadata_privacy_internal">Interno</string>
|
||||||
<string name="metadata_privacy">Privatnost</string>
|
<string name="metadata_privacy">Privatnost</string>
|
||||||
<string name="description_select_note">Sada možeš odabrati tekst u opisu. Napomena: stranica će možda treperiti i možda nećeš moći kliknuti poveznice u načinu rada za odabir teksta.</string>
|
<string name="description_select_note">Sada možeš odabrati tekst u opisu. Napomena: stranica će možda treperiti i možda nećeš moći kliknuti poveznice u načinu rada za odabir teksta.</string>
|
||||||
<string name="service_provides_reason">%s pruža ovaj razlog:</string>
|
|
||||||
<string name="processing_may_take_a_moment">Obrada u tijeku … Može malo potrajati</string>
|
<string name="processing_may_take_a_moment">Obrada u tijeku … Može malo potrajati</string>
|
||||||
<string name="main_page_content_swipe_remove">Za ukljanjanje stavki povuci ih</string>
|
<string name="main_page_content_swipe_remove">Za ukljanjanje stavki povuci ih</string>
|
||||||
<string name="show_image_indicators_title">Prikaži indikatore slike</string>
|
<string name="show_image_indicators_title">Prikaži indikatore slike</string>
|
||||||
|
|
|
@ -510,7 +510,6 @@
|
||||||
<string name="related_items_tab_description">Kapcsolódó elemek</string>
|
<string name="related_items_tab_description">Kapcsolódó elemek</string>
|
||||||
<string name="error_report_open_github_notice">Ellenőrizze, hogy létezik-e már olyan jegy, amely az összeomlásával foglalkozik. Ha duplikált jegyet ad fel, akkor olyan időt vesz el tőlünk, amelyet a hiba javítására tudnánk fordítani.</string>
|
<string name="error_report_open_github_notice">Ellenőrizze, hogy létezik-e már olyan jegy, amely az összeomlásával foglalkozik. Ha duplikált jegyet ad fel, akkor olyan időt vesz el tőlünk, amelyet a hiba javítására tudnánk fordítani.</string>
|
||||||
<string name="minimize_on_exit_title">Minimalizálás alkalmazásváltáskor</string>
|
<string name="minimize_on_exit_title">Minimalizálás alkalmazásváltáskor</string>
|
||||||
<string name="service_provides_reason">A(z) %s ezt az okot adta meg:</string>
|
|
||||||
<string name="local_search_suggestions">Helyi keresési javaslatok</string>
|
<string name="local_search_suggestions">Helyi keresési javaslatok</string>
|
||||||
<string name="remote_search_suggestions">Távoli keresési javaslatok</string>
|
<string name="remote_search_suggestions">Távoli keresési javaslatok</string>
|
||||||
<string name="start_main_player_fullscreen_title">A fő lejátszó teljes képernyős indítása</string>
|
<string name="start_main_player_fullscreen_title">A fő lejátszó teljes képernyős indítása</string>
|
||||||
|
|
|
@ -577,7 +577,6 @@
|
||||||
<string name="description_select_enable">Aktifkan dapat memilih teks pada deskripsi</string>
|
<string name="description_select_enable">Aktifkan dapat memilih teks pada deskripsi</string>
|
||||||
<string name="description_select_note">Anda sekarang dapat memilih teks di dalam deskripsi. Perhatikan bahwa halaman mungkin berkedip dan tautan tidak dapat diklik saat dalam mode pemilihan.</string>
|
<string name="description_select_note">Anda sekarang dapat memilih teks di dalam deskripsi. Perhatikan bahwa halaman mungkin berkedip dan tautan tidak dapat diklik saat dalam mode pemilihan.</string>
|
||||||
<string name="open_website_license">Buka situs web</string>
|
<string name="open_website_license">Buka situs web</string>
|
||||||
<string name="service_provides_reason">%s menyediakan alasan ini:</string>
|
|
||||||
<string name="account_terminated">Akun dinonaktifkan</string>
|
<string name="account_terminated">Akun dinonaktifkan</string>
|
||||||
<string name="feed_load_error_fast_unknown">Mode langganan cepat tidak menyediakan lebih banyak info tentang ini.</string>
|
<string name="feed_load_error_fast_unknown">Mode langganan cepat tidak menyediakan lebih banyak info tentang ini.</string>
|
||||||
<string name="feed_load_error_terminated">Akun kreator telah dinonaktifkan.
|
<string name="feed_load_error_terminated">Akun kreator telah dinonaktifkan.
|
||||||
|
|
|
@ -546,7 +546,6 @@
|
||||||
<string name="no_appropriate_file_manager_message_android_10">Enginn viðeigandi skráarstjóri fannst fyrir þessa aðgerð.
|
<string name="no_appropriate_file_manager_message_android_10">Enginn viðeigandi skráarstjóri fannst fyrir þessa aðgerð.
|
||||||
\nVinsamlegast settu upp skráarstjóra sem styður Geymsluaðgangsramma (SAF)</string>
|
\nVinsamlegast settu upp skráarstjóra sem styður Geymsluaðgangsramma (SAF)</string>
|
||||||
<string name="georestricted_content">Þetta efni er ekki fáanlegt í þínu landi.</string>
|
<string name="georestricted_content">Þetta efni er ekki fáanlegt í þínu landi.</string>
|
||||||
<string name="service_provides_reason">%s gefur þessa ástæðu:</string>
|
|
||||||
<string name="paid_content">Þetta efni er aðeins í boði fyrir notendur sem hafa greitt — það er ekki hægt að streyma því eða sækja með NewPipe.</string>
|
<string name="paid_content">Þetta efni er aðeins í boði fyrir notendur sem hafa greitt — það er ekki hægt að streyma því eða sækja með NewPipe.</string>
|
||||||
<string name="auto_device_theme_title">Sjálfvirk (þema tækis)</string>
|
<string name="auto_device_theme_title">Sjálfvirk (þema tækis)</string>
|
||||||
<string name="night_theme_summary">Veldu uppáhalds næturþemu þína — %s</string>
|
<string name="night_theme_summary">Veldu uppáhalds næturþemu þína — %s</string>
|
||||||
|
|
|
@ -587,7 +587,6 @@
|
||||||
<string name="description_select_enable">Attiva la selezione del testo nella descrizione</string>
|
<string name="description_select_enable">Attiva la selezione del testo nella descrizione</string>
|
||||||
<string name="description_select_note">È possibile selezionare il testo all\'interno della descrizione. In modalità selezione la pagina potrebbe sfarfallare e i collegamenti potrebbero non essere cliccabili.</string>
|
<string name="description_select_note">È possibile selezionare il testo all\'interno della descrizione. In modalità selezione la pagina potrebbe sfarfallare e i collegamenti potrebbero non essere cliccabili.</string>
|
||||||
<string name="open_website_license">Visita il sito</string>
|
<string name="open_website_license">Visita il sito</string>
|
||||||
<string name="service_provides_reason">%s fornisce questa motivazione:</string>
|
|
||||||
<string name="account_terminated">Account chiuso</string>
|
<string name="account_terminated">Account chiuso</string>
|
||||||
<string name="feed_load_error_fast_unknown">Il recupero veloce dei feed non fornisce ulteriori informazioni al riguardo.</string>
|
<string name="feed_load_error_fast_unknown">Il recupero veloce dei feed non fornisce ulteriori informazioni al riguardo.</string>
|
||||||
<string name="feed_load_error_terminated">L\'account dell\'autore è stato chiuso.
|
<string name="feed_load_error_terminated">L\'account dell\'autore è stato chiuso.
|
||||||
|
|
|
@ -590,7 +590,6 @@
|
||||||
<string name="off">オフ</string>
|
<string name="off">オフ</string>
|
||||||
<string name="on">オン</string>
|
<string name="on">オン</string>
|
||||||
<string name="tablet_mode_title">タブレットモード</string>
|
<string name="tablet_mode_title">タブレットモード</string>
|
||||||
<string name="service_provides_reason">%s がこの理由を提示:</string>
|
|
||||||
<string name="dont_show">表示しない</string>
|
<string name="dont_show">表示しない</string>
|
||||||
<string name="low_quality_smaller">低品質 (小)</string>
|
<string name="low_quality_smaller">低品質 (小)</string>
|
||||||
<string name="high_quality_larger">高品質 (大)</string>
|
<string name="high_quality_larger">高品質 (大)</string>
|
||||||
|
|
|
@ -518,7 +518,6 @@
|
||||||
<string name="georestricted_content">ეს ხელმიუწვდომელია თქვენი ქვეყნიდან.</string>
|
<string name="georestricted_content">ეს ხელმიუწვდომელია თქვენი ქვეყნიდან.</string>
|
||||||
<string name="private_content">ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>
|
<string name="private_content">ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>
|
||||||
<string name="account_terminated">ანგარიში შეწყვეტილია</string>
|
<string name="account_terminated">ანგარიში შეწყვეტილია</string>
|
||||||
<string name="service_provides_reason">%s იძლევა ამ მიზეზს:</string>
|
|
||||||
<string name="paid_content">ეს მასალა ხელმისაწვდომია მხოლოდ გადამხდელებისთვის, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>
|
<string name="paid_content">ეს მასალა ხელმისაწვდომია მხოლოდ გადამხდელებისთვის, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>
|
||||||
<string name="featured">გამორჩეული</string>
|
<string name="featured">გამორჩეული</string>
|
||||||
<string name="radio">რადიო</string>
|
<string name="radio">რადიო</string>
|
||||||
|
|
|
@ -623,7 +623,6 @@
|
||||||
<string name="chapters">챕터</string>
|
<string name="chapters">챕터</string>
|
||||||
<string name="recent">최근</string>
|
<string name="recent">최근</string>
|
||||||
<string name="account_terminated">계정이 해지됨</string>
|
<string name="account_terminated">계정이 해지됨</string>
|
||||||
<string name="service_provides_reason">%s은(는) 다음과 같은 이유를 제공:</string>
|
|
||||||
<string name="soundcloud_go_plus_content">이것은 적어도 귀하의 국가에서 SoundCloud Go+ 트랙이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다.</string>
|
<string name="soundcloud_go_plus_content">이것은 적어도 귀하의 국가에서 SoundCloud Go+ 트랙이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다.</string>
|
||||||
<string name="auto_device_theme_title">자동 (장치 테마)</string>
|
<string name="auto_device_theme_title">자동 (장치 테마)</string>
|
||||||
<string name="detail_pinned_comment_view_description">고정된 댓글</string>
|
<string name="detail_pinned_comment_view_description">고정된 댓글</string>
|
||||||
|
|
|
@ -591,7 +591,6 @@
|
||||||
<string name="description_select_enable">Įgalinti teksto pasirinkimą apraše</string>
|
<string name="description_select_enable">Įgalinti teksto pasirinkimą apraše</string>
|
||||||
<string name="description_select_disable">Neleisti pasirinkti teksto apraše</string>
|
<string name="description_select_disable">Neleisti pasirinkti teksto apraše</string>
|
||||||
<string name="description_select_note">Dabar apraše galite pasirinkti tekstą aprašyme. Atminkite, kad puslapis gali mirgėti, o nuorodos gali būti nespustelėjamos, kai veikia pasirinkimo režimas.</string>
|
<string name="description_select_note">Dabar apraše galite pasirinkti tekstą aprašyme. Atminkite, kad puslapis gali mirgėti, o nuorodos gali būti nespustelėjamos, kai veikia pasirinkimo režimas.</string>
|
||||||
<string name="service_provides_reason">%s pateikia šią priežastį:</string>
|
|
||||||
<string name="account_terminated">Paskyra anuliuota</string>
|
<string name="account_terminated">Paskyra anuliuota</string>
|
||||||
<string name="feed_load_error_fast_unknown">Greito srauto režimas nesuteikia daugiau informacijos apie tai.</string>
|
<string name="feed_load_error_fast_unknown">Greito srauto režimas nesuteikia daugiau informacijos apie tai.</string>
|
||||||
<string name="feed_load_error_terminated">Autoriaus paskyra anuliuota.
|
<string name="feed_load_error_terminated">Autoriaus paskyra anuliuota.
|
||||||
|
|
|
@ -599,7 +599,6 @@
|
||||||
\nNewPipe turpmāk nevarēs ielādēt šo plūsmu.
|
\nNewPipe turpmāk nevarēs ielādēt šo plūsmu.
|
||||||
\nVai vēlaties atteikties no šī kanāla abonēšanas\?</string>
|
\nVai vēlaties atteikties no šī kanāla abonēšanas\?</string>
|
||||||
<string name="feed_load_error_fast_unknown">Ātrās straumes režīms nesniedz vairāk informācijas par šo.</string>
|
<string name="feed_load_error_fast_unknown">Ātrās straumes režīms nesniedz vairāk informācijas par šo.</string>
|
||||||
<string name="service_provides_reason">%s dod šādu pamatojumu:</string>
|
|
||||||
<string name="description_select_disable">Izslēgt teksta atlasīšanu video aprakstā</string>
|
<string name="description_select_disable">Izslēgt teksta atlasīšanu video aprakstā</string>
|
||||||
<string name="metadata_privacy_internal">Iekšeji</string>
|
<string name="metadata_privacy_internal">Iekšeji</string>
|
||||||
<string name="detail_heart_img_view_description">Autors piekrīt</string>
|
<string name="detail_heart_img_view_description">Autors piekrīt</string>
|
||||||
|
|
|
@ -408,7 +408,6 @@
|
||||||
<string name="feed_load_error_account_info">Неуспешно вчитување на новинска лента за „%s“.</string>
|
<string name="feed_load_error_account_info">Неуспешно вчитување на новинска лента за „%s“.</string>
|
||||||
<string name="feed_show_hide_streams">Прикажи / скриј стримови</string>
|
<string name="feed_show_hide_streams">Прикажи / скриј стримови</string>
|
||||||
<string name="private_content">Оваа содржина е приватна, така што не може да биде емитувана или преземена од страна на NewPipe.</string>
|
<string name="private_content">Оваа содржина е приватна, така што не може да биде емитувана или преземена од страна на NewPipe.</string>
|
||||||
<string name="service_provides_reason">%s ја посочува следната причина:</string>
|
|
||||||
<string name="featured">Истакнато</string>
|
<string name="featured">Истакнато</string>
|
||||||
<string name="radio">Радио</string>
|
<string name="radio">Радио</string>
|
||||||
<string name="auto_device_theme_title">Автоматски (режим на уредот)</string>
|
<string name="auto_device_theme_title">Автоматски (режим на уредот)</string>
|
||||||
|
|
|
@ -586,7 +586,6 @@
|
||||||
<string name="metadata_tags">ടാഗുക്കൾ</string>
|
<string name="metadata_tags">ടാഗുക്കൾ</string>
|
||||||
<string name="metadata_category">വിഭാഗം</string>
|
<string name="metadata_category">വിഭാഗം</string>
|
||||||
<string name="description_select_note">താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം.</string>
|
<string name="description_select_note">താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം.</string>
|
||||||
<string name="service_provides_reason">ഇതിന്റെ കാരണം %s നൽകും:</string>
|
|
||||||
<string name="account_terminated">അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു</string>
|
<string name="account_terminated">അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു</string>
|
||||||
<string name="feed_load_error_fast_unknown">ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല.</string>
|
<string name="feed_load_error_fast_unknown">ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല.</string>
|
||||||
<string name="feed_load_error_terminated">സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു.
|
<string name="feed_load_error_terminated">സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു.
|
||||||
|
|
|
@ -573,7 +573,6 @@
|
||||||
\nØnsker du å oppheve ditt abonnement på denne kanalen\?</string>
|
\nØnsker du å oppheve ditt abonnement på denne kanalen\?</string>
|
||||||
<string name="description_select_disable">Skru av merking av tekst i beskrivelsen</string>
|
<string name="description_select_disable">Skru av merking av tekst i beskrivelsen</string>
|
||||||
<string name="description_select_enable">Skru på merking av tekst i beskrivelsen</string>
|
<string name="description_select_enable">Skru på merking av tekst i beskrivelsen</string>
|
||||||
<string name="service_provides_reason">%s oppgav denne grunnen:</string>
|
|
||||||
<string name="account_terminated">Konto terminert</string>
|
<string name="account_terminated">Konto terminert</string>
|
||||||
<string name="feed_load_error_account_info">Kunne ikke laste inn informasjonskanal for «%s».</string>
|
<string name="feed_load_error_account_info">Kunne ikke laste inn informasjonskanal for «%s».</string>
|
||||||
<string name="feed_load_error">Kunne ikke laste inn informasjonskanal</string>
|
<string name="feed_load_error">Kunne ikke laste inn informasjonskanal</string>
|
||||||
|
|
|
@ -585,7 +585,6 @@
|
||||||
<string name="on">Aan</string>
|
<string name="on">Aan</string>
|
||||||
<string name="tablet_mode_title">Tablet-modus</string>
|
<string name="tablet_mode_title">Tablet-modus</string>
|
||||||
<string name="open_website_license">Website openen</string>
|
<string name="open_website_license">Website openen</string>
|
||||||
<string name="service_provides_reason">%s geeft de volgende reden:</string>
|
|
||||||
<string name="account_terminated">Account getermineerd</string>
|
<string name="account_terminated">Account getermineerd</string>
|
||||||
<string name="feed_load_error_fast_unknown">De snelle feed mode levert hierover niet meer informatie.</string>
|
<string name="feed_load_error_fast_unknown">De snelle feed mode levert hierover niet meer informatie.</string>
|
||||||
<string name="feed_load_error_terminated">De account van de auteur is getermineerd.
|
<string name="feed_load_error_terminated">De account van de auteur is getermineerd.
|
||||||
|
|
|
@ -605,7 +605,6 @@
|
||||||
<string name="no_appropriate_file_manager_message_android_10">ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬.
|
<string name="no_appropriate_file_manager_message_android_10">ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬.
|
||||||
\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬</string>
|
\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬</string>
|
||||||
<string name="youtube_music_premium_content">ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ.</string>
|
<string name="youtube_music_premium_content">ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ.</string>
|
||||||
<string name="service_provides_reason">%s ߦߋ߫ ߞߎ߲߭ ߣߌ߲߬ ߠߋ߬ ߝߐ߫ ߟߊ߫:</string>
|
|
||||||
<string name="featured">ߛߊ߲ߞߊߥߟߌ</string>
|
<string name="featured">ߛߊ߲ߞߊߥߟߌ</string>
|
||||||
<string name="radio">ߥߎߢߊ߲ߓߍ߲</string>
|
<string name="radio">ߥߎߢߊ߲ߓߍ߲</string>
|
||||||
<string name="auto_device_theme_title">ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ)</string>
|
<string name="auto_device_theme_title">ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ)</string>
|
||||||
|
|
|
@ -480,7 +480,6 @@
|
||||||
<string name="feed_group_dialog_select_subscriptions">ସଦସ୍ୟତା ଚୟନ କରନ୍ତୁ</string>
|
<string name="feed_group_dialog_select_subscriptions">ସଦସ୍ୟତା ଚୟନ କରନ୍ତୁ</string>
|
||||||
<string name="feed_group_dialog_empty_selection">କୌଣସି ସଦସ୍ୟତା ଚୟନ ହୋଇନାହିଁ</string>
|
<string name="feed_group_dialog_empty_selection">କୌଣସି ସଦସ୍ୟତା ଚୟନ ହୋଇନାହିଁ</string>
|
||||||
<string name="feed_use_dedicated_fetch_method_enable_button">ଦ୍ରୁତ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ</string>
|
<string name="feed_use_dedicated_fetch_method_enable_button">ଦ୍ରୁତ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ</string>
|
||||||
<string name="service_provides_reason">%s ଏହି କାରଣ ପ୍ରଦାନ କରେ:</string>
|
|
||||||
<string name="detail_sub_channel_thumbnail_view_description">ଚ୍ୟାନେଲର ଅବତାର ଥମ୍ୱନେଲ୍</string>
|
<string name="detail_sub_channel_thumbnail_view_description">ଚ୍ୟାନେଲର ଅବତାର ଥମ୍ୱନେଲ୍</string>
|
||||||
<string name="featured">ବୈଶିଷ୍ଟ୍ୟ</string>
|
<string name="featured">ବୈଶିଷ୍ଟ୍ୟ</string>
|
||||||
<string name="radio">ରେଡିଓ</string>
|
<string name="radio">ରେଡିଓ</string>
|
||||||
|
|
|
@ -440,7 +440,6 @@
|
||||||
<string name="radio">ਰੇਡੀਓ</string>
|
<string name="radio">ਰੇਡੀਓ</string>
|
||||||
<string name="featured">ਫੀਚਰਡ</string>
|
<string name="featured">ਫੀਚਰਡ</string>
|
||||||
<string name="paid_content">ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
<string name="paid_content">ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
||||||
<string name="service_provides_reason">%s ਇਸਦਾ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ:</string>
|
|
||||||
<string name="account_terminated">ਖਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ</string>
|
<string name="account_terminated">ਖਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ</string>
|
||||||
<string name="youtube_music_premium_content">ਇਹ ਵੀਡੀਓ ਸਿਰਫ਼ ਯੂਟਿਊਬ ਮਿਊਜ਼ਿਕ ਦੇ ਪ੍ਰੀਮੀਅਮ ਮੈਂਬਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
<string name="youtube_music_premium_content">ਇਹ ਵੀਡੀਓ ਸਿਰਫ਼ ਯੂਟਿਊਬ ਮਿਊਜ਼ਿਕ ਦੇ ਪ੍ਰੀਮੀਅਮ ਮੈਂਬਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
||||||
<string name="private_content">ਇਹ ਸਮੱਗਰੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
<string name="private_content">ਇਹ ਸਮੱਗਰੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
||||||
|
|
|
@ -587,7 +587,6 @@
|
||||||
<string name="metadata_category">Kategoria</string>
|
<string name="metadata_category">Kategoria</string>
|
||||||
<string name="open_website_license">Otwórz stronę</string>
|
<string name="open_website_license">Otwórz stronę</string>
|
||||||
<string name="description_select_note">Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że w trybie zaznaczania strona może migotać i linki nie będą klikalne.</string>
|
<string name="description_select_note">Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że w trybie zaznaczania strona może migotać i linki nie będą klikalne.</string>
|
||||||
<string name="service_provides_reason">%s podaje ten powód:</string>
|
|
||||||
<string name="account_terminated">Konto zamknięte</string>
|
<string name="account_terminated">Konto zamknięte</string>
|
||||||
<string name="feed_load_error_fast_unknown">Tryb szybki dla ładowania kanału nie dostarcza więcej informacji na ten temat.</string>
|
<string name="feed_load_error_fast_unknown">Tryb szybki dla ładowania kanału nie dostarcza więcej informacji na ten temat.</string>
|
||||||
<string name="feed_load_error_terminated">Konto autora zostało zawieszone.
|
<string name="feed_load_error_terminated">Konto autora zostało zawieszone.
|
||||||
|
|
|
@ -587,7 +587,6 @@
|
||||||
<string name="description_select_enable">Ativar seleção de texto na descrição</string>
|
<string name="description_select_enable">Ativar seleção de texto na descrição</string>
|
||||||
<string name="description_select_note">Agora você pode selecionar o texto dentro da descrição. Note que a página pode piscar e os URL podem não ser clicáveis no modo de seleção.</string>
|
<string name="description_select_note">Agora você pode selecionar o texto dentro da descrição. Note que a página pode piscar e os URL podem não ser clicáveis no modo de seleção.</string>
|
||||||
<string name="open_website_license">Abrir site</string>
|
<string name="open_website_license">Abrir site</string>
|
||||||
<string name="service_provides_reason">%s fornece este motivo:</string>
|
|
||||||
<string name="account_terminated">Conta encerrada</string>
|
<string name="account_terminated">Conta encerrada</string>
|
||||||
<string name="feed_load_error_fast_unknown">O modo feed rápido não fornece mais informações sobre isso.</string>
|
<string name="feed_load_error_fast_unknown">O modo feed rápido não fornece mais informações sobre isso.</string>
|
||||||
<string name="feed_load_error_terminated">A conta do autor foi encerrada.
|
<string name="feed_load_error_terminated">A conta do autor foi encerrada.
|
||||||
|
|
|
@ -591,7 +591,6 @@
|
||||||
<string name="description_select_disable">Desativar seleção de texto na descrição</string>
|
<string name="description_select_disable">Desativar seleção de texto na descrição</string>
|
||||||
<string name="description_select_enable">Ativar seleção de texto na descrição</string>
|
<string name="description_select_enable">Ativar seleção de texto na descrição</string>
|
||||||
<string name="description_select_note">Agora pode selecionar o texto na descrição. Note que a página pode cintilar e as ligações podem não ser clicáveis enquanto estiver no modo de seleção.</string>
|
<string name="description_select_note">Agora pode selecionar o texto na descrição. Note que a página pode cintilar e as ligações podem não ser clicáveis enquanto estiver no modo de seleção.</string>
|
||||||
<string name="service_provides_reason">%s fornece este motivo:</string>
|
|
||||||
<string name="account_terminated">Conta encerrada</string>
|
<string name="account_terminated">Conta encerrada</string>
|
||||||
<string name="feed_load_error_fast_unknown">O modo de feed rápido não fornece mais informações sobre isto.</string>
|
<string name="feed_load_error_fast_unknown">O modo de feed rápido não fornece mais informações sobre isto.</string>
|
||||||
<string name="feed_load_error_terminated">A conta do autor foi encerrada.
|
<string name="feed_load_error_terminated">A conta do autor foi encerrada.
|
||||||
|
|
|
@ -573,7 +573,6 @@
|
||||||
<string name="disable_media_tunneling_title">Desativar túnel multimédia</string>
|
<string name="disable_media_tunneling_title">Desativar túnel multimédia</string>
|
||||||
<string name="downloads_storage_ask_summary_no_saf_notice">Sempre que descarregar um ficheiro, terá que indicar o local para o guardar</string>
|
<string name="downloads_storage_ask_summary_no_saf_notice">Sempre que descarregar um ficheiro, terá que indicar o local para o guardar</string>
|
||||||
<string name="no_dir_yet">Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar</string>
|
<string name="no_dir_yet">Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar</string>
|
||||||
<string name="service_provides_reason">%s fornece este motivo:</string>
|
|
||||||
<string name="account_terminated">Conta encerrada</string>
|
<string name="account_terminated">Conta encerrada</string>
|
||||||
<string name="feed_load_error_fast_unknown">O modo de fonte rápida não fornece mais informações sobre isto.</string>
|
<string name="feed_load_error_fast_unknown">O modo de fonte rápida não fornece mais informações sobre isto.</string>
|
||||||
<string name="feed_load_error_terminated">A conta do autor foi encerrada.
|
<string name="feed_load_error_terminated">A conta do autor foi encerrada.
|
||||||
|
|
|
@ -592,7 +592,6 @@
|
||||||
<string name="description_select_disable">Dezactivați selectarea textului în descriere</string>
|
<string name="description_select_disable">Dezactivați selectarea textului în descriere</string>
|
||||||
<string name="description_select_enable">Activați selectarea textului în descriere</string>
|
<string name="description_select_enable">Activați selectarea textului în descriere</string>
|
||||||
<string name="description_select_note">Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar linkurile să nu poată fi accesate în modul de selecție.</string>
|
<string name="description_select_note">Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar linkurile să nu poată fi accesate în modul de selecție.</string>
|
||||||
<string name="service_provides_reason">%s oferă acest motiv:</string>
|
|
||||||
<string name="account_terminated">Contul a fost închis</string>
|
<string name="account_terminated">Contul a fost închis</string>
|
||||||
<string name="feed_load_error_fast_unknown">Modul rapid nu furnizează mai multe informații în acest sens.</string>
|
<string name="feed_load_error_fast_unknown">Modul rapid nu furnizează mai multe informații în acest sens.</string>
|
||||||
<string name="feed_load_error_terminated">Contul autorului a fost închis.
|
<string name="feed_load_error_terminated">Contul autorului a fost închis.
|
||||||
|
|
|
@ -600,7 +600,6 @@
|
||||||
<string name="feed_load_error_account_info">Не удалось загрузить подписку \'%s\'.</string>
|
<string name="feed_load_error_account_info">Не удалось загрузить подписку \'%s\'.</string>
|
||||||
<string name="feed_load_error">Ошибка загрузки подписки</string>
|
<string name="feed_load_error">Ошибка загрузки подписки</string>
|
||||||
<string name="open_website_license">Открыть веб-сайт</string>
|
<string name="open_website_license">Открыть веб-сайт</string>
|
||||||
<string name="service_provides_reason">%s указывает следующую причину:</string>
|
|
||||||
<string name="account_terminated">Аккаунт отключён</string>
|
<string name="account_terminated">Аккаунт отключён</string>
|
||||||
<string name="downloads_storage_use_saf_summary_api_29">Начиная с Android 10 поддерживается только «Storage Access Framework»</string>
|
<string name="downloads_storage_use_saf_summary_api_29">Начиная с Android 10 поддерживается только «Storage Access Framework»</string>
|
||||||
<string name="downloads_storage_ask_summary_no_saf_notice">Спрашивать, куда сохранять каждую загрузку</string>
|
<string name="downloads_storage_ask_summary_no_saf_notice">Спрашивать, куда сохранять каждую загрузку</string>
|
||||||
|
|
|
@ -595,7 +595,6 @@
|
||||||
<string name="off">オフ</string>
|
<string name="off">オフ</string>
|
||||||
<string name="on">オン</string>
|
<string name="on">オン</string>
|
||||||
<string name="tablet_mode_title">タブレットモード</string>
|
<string name="tablet_mode_title">タブレットモード</string>
|
||||||
<string name="service_provides_reason">%sやしがくぬりゆうていじ:</string>
|
|
||||||
<string name="dont_show">ひょうじさん</string>
|
<string name="dont_show">ひょうじさん</string>
|
||||||
<string name="low_quality_smaller">ていふぃんしち(しょう)</string>
|
<string name="low_quality_smaller">ていふぃんしち(しょう)</string>
|
||||||
<string name="high_quality_larger">かんふぃんしち(だい)</string>
|
<string name="high_quality_larger">かんふぃんしち(だい)</string>
|
||||||
|
|
|
@ -328,7 +328,6 @@
|
||||||
<string name="chapters">ᱪᱮᱯᱴᱟᱨᱥ</string>
|
<string name="chapters">ᱪᱮᱯᱴᱟᱨᱥ</string>
|
||||||
<string name="no_appropriate_file_manager_message_android_10">ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱟᱢ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱟᱱᱮᱡᱚᱨ ᱤᱱᱥᱴᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱤᱴᱤᱝ ᱨᱮ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱨᱚᱵᱷᱟᱣ ᱢᱮ\"</string>
|
<string name="no_appropriate_file_manager_message_android_10">ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱟᱢ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱟᱱᱮᱡᱚᱨ ᱤᱱᱥᱴᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱤᱴᱤᱝ ᱨᱮ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱨᱚᱵᱷᱟᱣ ᱢᱮ\"</string>
|
||||||
<string name="youtube_music_premium_content">ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ ᱯᱨᱤᱢᱤᱭᱟᱢ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱫᱚ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱟᱨ ᱵᱟᱝ ᱰᱟᱩᱱᱞᱳᱰ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>
|
<string name="youtube_music_premium_content">ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ ᱯᱨᱤᱢᱤᱭᱟᱢ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱫᱚ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱟᱨ ᱵᱟᱝ ᱰᱟᱩᱱᱞᱳᱰ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>
|
||||||
<string name="service_provides_reason">%s ᱫᱚ ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ:</string>
|
|
||||||
<string name="auto_device_theme_title">ᱚᱴᱚᱢᱟᱴᱤᱠ (ᱰᱤᱵᱟᱤᱥ ᱛᱷᱮᱢ)</string>
|
<string name="auto_device_theme_title">ᱚᱴᱚᱢᱟᱴᱤᱠ (ᱰᱤᱵᱟᱤᱥ ᱛᱷᱮᱢ)</string>
|
||||||
<string name="night_theme_summary">ᱟᱢᱟᱜ ᱯᱩᱭᱞᱩ ᱧᱤᱫᱟᱹ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ⁇ %s</string>
|
<string name="night_theme_summary">ᱟᱢᱟᱜ ᱯᱩᱭᱞᱩ ᱧᱤᱫᱟᱹ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ⁇ %s</string>
|
||||||
<string name="select_night_theme_toast">ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱤᱫᱟᱹ ᱪᱮᱛᱟᱱ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ</string>
|
<string name="select_night_theme_toast">ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱤᱫᱟᱹ ᱪᱮᱛᱟᱱ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ</string>
|
||||||
|
|
|
@ -583,7 +583,6 @@
|
||||||
<string name="description_select_note">Como podes ischertare su testu in intro de sa descritzione. Ammenta·ti chi sa pàgina diat pòdere trèmere e sos ligàmenes si diant pòdere no abèrrere cando ses in modalidade de ischerta.</string>
|
<string name="description_select_note">Como podes ischertare su testu in intro de sa descritzione. Ammenta·ti chi sa pàgina diat pòdere trèmere e sos ligàmenes si diant pòdere no abèrrere cando ses in modalidade de ischerta.</string>
|
||||||
<string name="downloads_storage_use_saf_summary_api_29">Incumintzende dae Android 10 petzi sa \'Storage Access Framework\' (Istrutura de Atzessu a s\'Archiviatzione) est suportada</string>
|
<string name="downloads_storage_use_saf_summary_api_29">Incumintzende dae Android 10 petzi sa \'Storage Access Framework\' (Istrutura de Atzessu a s\'Archiviatzione) est suportada</string>
|
||||||
<string name="open_website_license">Aberi su situ web</string>
|
<string name="open_website_license">Aberi su situ web</string>
|
||||||
<string name="service_provides_reason">%s frunit custa resone:</string>
|
|
||||||
<string name="account_terminated">Contu serradu</string>
|
<string name="account_terminated">Contu serradu</string>
|
||||||
<string name="feed_load_error_fast_unknown">Su recùperu lestru de sos flussos non frunit àteras informatziones in subra de custu.</string>
|
<string name="feed_load_error_fast_unknown">Su recùperu lestru de sos flussos non frunit àteras informatziones in subra de custu.</string>
|
||||||
<string name="feed_load_error_terminated">Su contu de s\'autore l\'ant serradu.
|
<string name="feed_load_error_terminated">Su contu de s\'autore l\'ant serradu.
|
||||||
|
|
|
@ -586,7 +586,6 @@
|
||||||
<string name="description_select_enable">Povolenie výberu textu v popise</string>
|
<string name="description_select_enable">Povolenie výberu textu v popise</string>
|
||||||
<string name="description_select_note">Teraz môžete vybrať text vo vnútri popisu. Upozorňujeme, že stránka môže blikať a odkazy nemusia byť klikateľné, keď je v režime výberu.</string>
|
<string name="description_select_note">Teraz môžete vybrať text vo vnútri popisu. Upozorňujeme, že stránka môže blikať a odkazy nemusia byť klikateľné, keď je v režime výberu.</string>
|
||||||
<string name="open_website_license">Otvoriť webstránku</string>
|
<string name="open_website_license">Otvoriť webstránku</string>
|
||||||
<string name="service_provides_reason">%s uvádza tento dôvod:</string>
|
|
||||||
<string name="account_terminated">Účet bol zrušený</string>
|
<string name="account_terminated">Účet bol zrušený</string>
|
||||||
<string name="feed_load_error_fast_unknown">Tento rýchly režim neposkytuje viac informácií.</string>
|
<string name="feed_load_error_fast_unknown">Tento rýchly režim neposkytuje viac informácií.</string>
|
||||||
<string name="feed_load_error_terminated">Účet autora bol zrušený.
|
<string name="feed_load_error_terminated">Účet autora bol zrušený.
|
||||||
|
|
|
@ -581,7 +581,6 @@
|
||||||
<string name="description_select_disable">Xidh caalamadinta qoraalka</string>
|
<string name="description_select_disable">Xidh caalamadinta qoraalka</string>
|
||||||
<string name="description_select_enable">Fur caalamadinta qoraalka</string>
|
<string name="description_select_enable">Fur caalamadinta qoraalka</string>
|
||||||
<string name="description_select_note">Hadda waad dooran kartaa qoraalka ku dhexjira faahfaahinta. Ogow markaad caalamdinayso qoraalka boggu wuu boodboodi karaa tixraacyadana waxay noqon karaan kuwo aan lagu dhufan karin.</string>
|
<string name="description_select_note">Hadda waad dooran kartaa qoraalka ku dhexjira faahfaahinta. Ogow markaad caalamdinayso qoraalka boggu wuu boodboodi karaa tixraacyadana waxay noqon karaan kuwo aan lagu dhufan karin.</string>
|
||||||
<string name="service_provides_reason">%s wuxuu sheegayaa sababtan:</string>
|
|
||||||
<string name="account_terminated">Akoonka waa lajoojiyay</string>
|
<string name="account_terminated">Akoonka waa lajoojiyay</string>
|
||||||
<string name="feed_load_error_fast_unknown">Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan.</string>
|
<string name="feed_load_error_fast_unknown">Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan.</string>
|
||||||
<string name="feed_load_error_terminated">Akoonka soosaaraha waa la joojiyay.
|
<string name="feed_load_error_terminated">Akoonka soosaaraha waa la joojiyay.
|
||||||
|
|
|
@ -571,7 +571,6 @@
|
||||||
<string name="night_theme_summary">Zgjidhni temën tuaj të preferuar të natës - %s</string>
|
<string name="night_theme_summary">Zgjidhni temën tuaj të preferuar të natës - %s</string>
|
||||||
<string name="auto_device_theme_title">Automatike (tema e pajisjes)</string>
|
<string name="auto_device_theme_title">Automatike (tema e pajisjes)</string>
|
||||||
<string name="radio">Radio</string>
|
<string name="radio">Radio</string>
|
||||||
<string name="service_provides_reason">%s e jep këtë arsye:</string>
|
|
||||||
<string name="account_terminated">Llogaria është mbyllur</string>
|
<string name="account_terminated">Llogaria është mbyllur</string>
|
||||||
<string name="private_content">Kjo përmbajtje është private, kështu që nuk mund të luhet apo shkarkohet nga NewPipe.</string>
|
<string name="private_content">Kjo përmbajtje është private, kështu që nuk mund të luhet apo shkarkohet nga NewPipe.</string>
|
||||||
<string name="georestricted_content">Kjo përmbajtje nuk është e disponueshme në shtetin tuaj.</string>
|
<string name="georestricted_content">Kjo përmbajtje nuk është e disponueshme në shtetin tuaj.</string>
|
||||||
|
|
|
@ -587,7 +587,6 @@
|
||||||
<string name="description_select_enable">Омогући бирање текста унутар описа</string>
|
<string name="description_select_enable">Омогући бирање текста унутар описа</string>
|
||||||
<string name="description_select_disable">Онемогући бирање текста унутар описа</string>
|
<string name="description_select_disable">Онемогући бирање текста унутар описа</string>
|
||||||
<string name="description_select_note">Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора.</string>
|
<string name="description_select_note">Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора.</string>
|
||||||
<string name="service_provides_reason">%s даје овај разлог:</string>
|
|
||||||
<string name="account_terminated">Налог укинут</string>
|
<string name="account_terminated">Налог укинут</string>
|
||||||
<string name="feed_load_error_fast_unknown">Режим брзог фида не пружа више информација о овоме.</string>
|
<string name="feed_load_error_fast_unknown">Режим брзог фида не пружа више информација о овоме.</string>
|
||||||
<string name="feed_load_error_terminated">Налог аутора је укинут.
|
<string name="feed_load_error_terminated">Налог аутора је укинут.
|
||||||
|
|
|
@ -559,7 +559,6 @@
|
||||||
<string name="download_has_started">Hämtningen har startat</string>
|
<string name="download_has_started">Hämtningen har startat</string>
|
||||||
<string name="radio">Radio</string>
|
<string name="radio">Radio</string>
|
||||||
<string name="paid_content">Detta innehåll är endast tillgängligt för användare som har betalat för det, så det kan inte strömmas eller hämtas av NewPipe.</string>
|
<string name="paid_content">Detta innehåll är endast tillgängligt för användare som har betalat för det, så det kan inte strömmas eller hämtas av NewPipe.</string>
|
||||||
<string name="service_provides_reason">%s anger detta skäl:</string>
|
|
||||||
<string name="account_terminated">Kontot avslutat</string>
|
<string name="account_terminated">Kontot avslutat</string>
|
||||||
<string name="youtube_music_premium_content">Denna video är endast tillgänglig för YouTube Music Premium-medlemmar, så den kan inte strömmas eller hämtas av NewPipe.</string>
|
<string name="youtube_music_premium_content">Denna video är endast tillgänglig för YouTube Music Premium-medlemmar, så den kan inte strömmas eller hämtas av NewPipe.</string>
|
||||||
<string name="private_content">Detta innehåll är privat, så det kan inte strömmas eller hämtas av NewPipe.</string>
|
<string name="private_content">Detta innehåll är privat, så det kan inte strömmas eller hämtas av NewPipe.</string>
|
||||||
|
|
|
@ -407,7 +407,6 @@
|
||||||
<string name="enable_queue_limit">பதிவிறக்க வரிசையை கட்டுப்படுத்துங்கள்</string>
|
<string name="enable_queue_limit">பதிவிறக்க வரிசையை கட்டுப்படுத்துங்கள்</string>
|
||||||
<string name="enable_queue_limit_desc">ஒரு பதிவிறக்கம் ஒரே நேரத்தில் இயங்கும்</string>
|
<string name="enable_queue_limit_desc">ஒரு பதிவிறக்கம் ஒரே நேரத்தில் இயங்கும்</string>
|
||||||
<string name="no_app_to_open_intent">உங்கள் சாதனத்தில் எந்த பயன்பாடும் இதைத் திறக்க முடியாது</string>
|
<string name="no_app_to_open_intent">உங்கள் சாதனத்தில் எந்த பயன்பாடும் இதைத் திறக்க முடியாது</string>
|
||||||
<string name="service_provides_reason">%s இந்த காரணத்தை வழங்குகிறது:</string>
|
|
||||||
<string name="metadata_subchannel_avatars">துணை சேனல் அவதாரங்கள்</string>
|
<string name="metadata_subchannel_avatars">துணை சேனல் அவதாரங்கள்</string>
|
||||||
<string name="metadata_avatars">அவதாரங்கள்</string>
|
<string name="metadata_avatars">அவதாரங்கள்</string>
|
||||||
<string name="progressive_load_interval_exoplayer_default">எக்சோப்ளேயர் இயல்புநிலை</string>
|
<string name="progressive_load_interval_exoplayer_default">எக்சோப்ளேயர் இயல்புநிலை</string>
|
||||||
|
|
|
@ -581,7 +581,6 @@
|
||||||
<string name="description_select_enable">Açıklamadaki metni seçmeyi etkinleştir</string>
|
<string name="description_select_enable">Açıklamadaki metni seçmeyi etkinleştir</string>
|
||||||
<string name="description_select_note">Artık, açıklamadaki metni seçebilirsiniz. Seçim kipindeyken sayfanın titreyebileceğini ve bağlantıların tıklanamayacağını unutmayın.</string>
|
<string name="description_select_note">Artık, açıklamadaki metni seçebilirsiniz. Seçim kipindeyken sayfanın titreyebileceğini ve bağlantıların tıklanamayacağını unutmayın.</string>
|
||||||
<string name="open_website_license">Web sitesini aç</string>
|
<string name="open_website_license">Web sitesini aç</string>
|
||||||
<string name="service_provides_reason">%s şu nedeni sağlıyor:</string>
|
|
||||||
<string name="account_terminated">Hesap sonlandırıldı</string>
|
<string name="account_terminated">Hesap sonlandırıldı</string>
|
||||||
<string name="feed_load_error_fast_unknown">Hızlı besleme kipi bununla ilgili daha çok bilgi sağlamıyor.</string>
|
<string name="feed_load_error_fast_unknown">Hızlı besleme kipi bununla ilgili daha çok bilgi sağlamıyor.</string>
|
||||||
<string name="feed_load_error_terminated">Yazarın hesabı sonlandırılmış.
|
<string name="feed_load_error_terminated">Yazarın hesabı sonlandırılmış.
|
||||||
|
|
|
@ -592,7 +592,6 @@
|
||||||
<string name="description_select_disable">Заборонити виділення тексту в описі</string>
|
<string name="description_select_disable">Заборонити виділення тексту в описі</string>
|
||||||
<string name="description_select_enable">Дозволити виділяти текст в описі</string>
|
<string name="description_select_enable">Дозволити виділяти текст в описі</string>
|
||||||
<string name="description_select_note">Тепер можна виділяти текст в описі. Зауважте, що сторінка може мигати і посилання можуть не працювати в режимі виділення.</string>
|
<string name="description_select_note">Тепер можна виділяти текст в описі. Зауважте, що сторінка може мигати і посилання можуть не працювати в режимі виділення.</string>
|
||||||
<string name="service_provides_reason">%s подає таку причину:</string>
|
|
||||||
<string name="feed_load_error_account_info">Неможливо завантажити стрічку для «%s».</string>
|
<string name="feed_load_error_account_info">Неможливо завантажити стрічку для «%s».</string>
|
||||||
<string name="feed_load_error">Помилка завантаження стрічки</string>
|
<string name="feed_load_error">Помилка завантаження стрічки</string>
|
||||||
<string name="feed_load_error_terminated">Обліковий запис автора припинено.
|
<string name="feed_load_error_terminated">Обліковий запис автора припинено.
|
||||||
|
|
|
@ -580,7 +580,6 @@
|
||||||
<string name="description_select_disable">Tắt chọn văn bản trong mô tả</string>
|
<string name="description_select_disable">Tắt chọn văn bản trong mô tả</string>
|
||||||
<string name="description_select_enable">Bật chọn văn bản trong mô tả</string>
|
<string name="description_select_enable">Bật chọn văn bản trong mô tả</string>
|
||||||
<string name="description_select_note">Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn.</string>
|
<string name="description_select_note">Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn.</string>
|
||||||
<string name="service_provides_reason">%s cung cấp lý do này:</string>
|
|
||||||
<string name="account_terminated">Tài khoản đã bị chấm dứt</string>
|
<string name="account_terminated">Tài khoản đã bị chấm dứt</string>
|
||||||
<string name="feed_load_error_fast_unknown">Chế độ nạp nhanh không cung cấp thêm thông tin về điều này.</string>
|
<string name="feed_load_error_fast_unknown">Chế độ nạp nhanh không cung cấp thêm thông tin về điều này.</string>
|
||||||
<string name="feed_load_error_terminated">Tài khoản của tác giả đã bị chấm dứt.
|
<string name="feed_load_error_terminated">Tài khoản của tác giả đã bị chấm dứt.
|
||||||
|
|
|
@ -577,7 +577,6 @@
|
||||||
<string name="description_select_enable">启用简介中的文本选择功能</string>
|
<string name="description_select_enable">启用简介中的文本选择功能</string>
|
||||||
<string name="description_select_note">你现在可以选择简介中的文本,注意,在选择模式下,页面可能会闪烁,链接可能无法点击。</string>
|
<string name="description_select_note">你现在可以选择简介中的文本,注意,在选择模式下,页面可能会闪烁,链接可能无法点击。</string>
|
||||||
<string name="open_website_license">打开网站</string>
|
<string name="open_website_license">打开网站</string>
|
||||||
<string name="service_provides_reason">%s 提供这个原因:</string>
|
|
||||||
<string name="account_terminated">账号被终止</string>
|
<string name="account_terminated">账号被终止</string>
|
||||||
<string name="feed_load_error_fast_unknown">快速 Feed 模式不提供关于这个的更多信息。</string>
|
<string name="feed_load_error_fast_unknown">快速 Feed 模式不提供关于这个的更多信息。</string>
|
||||||
<string name="feed_load_error_terminated">作者账号已被终止。
|
<string name="feed_load_error_terminated">作者账号已被终止。
|
||||||
|
|
|
@ -463,7 +463,6 @@
|
||||||
<string name="content_not_supported">NewPipe 仲未支援到呢樣。
|
<string name="content_not_supported">NewPipe 仲未支援到呢樣。
|
||||||
\n
|
\n
|
||||||
\n希望未來會喺日後嘅版本支援啦。</string>
|
\n希望未來會喺日後嘅版本支援啦。</string>
|
||||||
<string name="service_provides_reason">%s 話理由如下:</string>
|
|
||||||
<string name="no_appropriate_file_manager_message">搵唔到合適嘅檔案總管進行呢個動作。
|
<string name="no_appropriate_file_manager_message">搵唔到合適嘅檔案總管進行呢個動作。
|
||||||
\n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」</string>
|
\n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」</string>
|
||||||
<string name="no_appropriate_file_manager_message_android_10">搵唔到合適嘅檔案總管進行呢個動作。
|
<string name="no_appropriate_file_manager_message_android_10">搵唔到合適嘅檔案總管進行呢個動作。
|
||||||
|
|
|
@ -576,7 +576,6 @@
|
||||||
<string name="description_select_enable">啟用選取描述中的文字</string>
|
<string name="description_select_enable">啟用選取描述中的文字</string>
|
||||||
<string name="description_select_note">您現在可以選取描述中的文字了。請注意,在選取模式下,頁面可能會閃爍,連結也可能無法點擊。</string>
|
<string name="description_select_note">您現在可以選取描述中的文字了。請注意,在選取模式下,頁面可能會閃爍,連結也可能無法點擊。</string>
|
||||||
<string name="open_website_license">開啟網站</string>
|
<string name="open_website_license">開啟網站</string>
|
||||||
<string name="service_provides_reason">%s 提供了這個理由:</string>
|
|
||||||
<string name="account_terminated">帳號已終止</string>
|
<string name="account_terminated">帳號已終止</string>
|
||||||
<string name="feed_load_error_fast_unknown">快速 feed 模式不會提供更多資訊。</string>
|
<string name="feed_load_error_fast_unknown">快速 feed 模式不會提供更多資訊。</string>
|
||||||
<string name="feed_load_error_terminated">作者的帳號已被終止。
|
<string name="feed_load_error_terminated">作者的帳號已被終止。
|
||||||
|
|
|
@ -257,6 +257,8 @@
|
||||||
<string name="restore_defaults">Restore defaults</string>
|
<string name="restore_defaults">Restore defaults</string>
|
||||||
<string name="restore_defaults_confirmation">Do you want to restore defaults?</string>
|
<string name="restore_defaults_confirmation">Do you want to restore defaults?</string>
|
||||||
<string name="permission_display_over_apps">Give permission to display over other apps</string>
|
<string name="permission_display_over_apps">Give permission to display over other apps</string>
|
||||||
|
<string name="permission_display_over_apps_message">In order to use the Popup Player, please select %1$s in the following Android settings menu and enable %2$s.</string>
|
||||||
|
<string name="permission_display_over_apps_permission_name">“Allow display over other apps”</string>
|
||||||
<!-- error activity -->
|
<!-- error activity -->
|
||||||
<string name="error_report_notification_title">NewPipe encountered an error, tap to report</string>
|
<string name="error_report_notification_title">NewPipe encountered an error, tap to report</string>
|
||||||
<string name="error_report_notification_toast">An error occurred, see the notification</string>
|
<string name="error_report_notification_toast">An error occurred, see the notification</string>
|
||||||
|
@ -344,6 +346,8 @@
|
||||||
<string name="pause">Pause</string>
|
<string name="pause">Pause</string>
|
||||||
<string name="create">Create</string>
|
<string name="create">Create</string>
|
||||||
<string name="delete">Delete</string>
|
<string name="delete">Delete</string>
|
||||||
|
<string name="delete_file">Delete file</string>
|
||||||
|
<string name="delete_entry">Delete entry</string>
|
||||||
<string name="checksum">Checksum</string>
|
<string name="checksum">Checksum</string>
|
||||||
<string name="dismiss">Dismiss</string>
|
<string name="dismiss">Dismiss</string>
|
||||||
<string name="rename">Rename</string>
|
<string name="rename">Rename</string>
|
||||||
|
@ -764,7 +768,7 @@
|
||||||
<string name="private_content">This content is private, so it cannot be streamed or downloaded by NewPipe.</string>
|
<string name="private_content">This content is private, so it cannot be streamed or downloaded by NewPipe.</string>
|
||||||
<string name="youtube_music_premium_content">This video is available only to YouTube Music Premium members, so it cannot be streamed or downloaded by NewPipe.</string>
|
<string name="youtube_music_premium_content">This video is available only to YouTube Music Premium members, so it cannot be streamed or downloaded by NewPipe.</string>
|
||||||
<string name="account_terminated">Account terminated</string>
|
<string name="account_terminated">Account terminated</string>
|
||||||
<string name="service_provides_reason">%s provides this reason:</string>
|
<string name="account_terminated_service_provides_reason">Account terminated\n\n%1$s provides this reason: %2$s</string>
|
||||||
<string name="paid_content">This content is only available to users who have paid, so it cannot be streamed or downloaded by NewPipe.</string>
|
<string name="paid_content">This content is only available to users who have paid, so it cannot be streamed or downloaded by NewPipe.</string>
|
||||||
<string name="featured">Featured</string>
|
<string name="featured">Featured</string>
|
||||||
<string name="radio">Radio</string>
|
<string name="radio">Radio</string>
|
||||||
|
@ -883,4 +887,10 @@
|
||||||
<string name="trending_podcasts">Trending podcasts</string>
|
<string name="trending_podcasts">Trending podcasts</string>
|
||||||
<string name="trending_movies">Trending movies and shows</string>
|
<string name="trending_movies">Trending movies and shows</string>
|
||||||
<string name="trending_music">Trending music</string>
|
<string name="trending_music">Trending music</string>
|
||||||
|
<string name="entry_deleted">Entry deleted</string>
|
||||||
|
<string name="player_http_403">HTTP error 403 received from server while playing, likely caused by streaming URL expiration or an IP ban</string>
|
||||||
|
<string name="player_http_invalid_status">HTTP error %1$s received from server while playing</string>
|
||||||
|
<string name="youtube_player_http_403">HTTP error 403 received from server while playing, likely caused by an IP ban or streaming URL deobfuscation issues</string>
|
||||||
|
<string name="sign_in_confirm_not_bot_error">%1$s refused to provide data, asking for a login to confirm the requester is not a bot.\n\nYour IP might have been temporarily banned by %1$s, you can wait some time or switch to a different IP (for example by turning on/off a VPN, or by switching from WiFi to mobile data).</string>
|
||||||
|
<string name="unsupported_content_in_country">This content is not available for the currently selected content country.\n\nChange your selection from \"Settings > Content > Default content country\".</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue