mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2025-10-03 01:39:38 +02:00
Merge pull request #12578 from Stypox/better-error-messages
This commit is contained in:
commit
a3ddd616f9
74 changed files with 217 additions and 208 deletions
|
@ -214,7 +214,7 @@ dependencies {
|
|||
// 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)
|
||||
// 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'
|
||||
|
||||
/** Checkstyle **/
|
||||
|
|
|
@ -12,6 +12,7 @@ import org.schabi.newpipe.extractor.ServiceList;
|
|||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
@ -23,8 +24,23 @@ import static org.junit.Assert.assertTrue;
|
|||
@LargeTest
|
||||
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
|
||||
public void errorInfoTestParcelable() {
|
||||
public void errorInfoTestParcelable() throws NoSuchFieldException, IllegalAccessException {
|
||||
final ErrorInfo info = new ErrorInfo(new ParsingException("Hello"),
|
||||
UserAction.USER_REPORT, "request", ServiceList.YouTube.getServiceId());
|
||||
// Obtain a Parcel object and write the parcelable object to it:
|
||||
|
@ -39,7 +55,7 @@ public class ErrorInfoTest {
|
|||
assertEquals(ServiceList.YouTube.getServiceInfo().getName(),
|
||||
infoFromParcel.getServiceName());
|
||||
assertEquals("request", infoFromParcel.getRequest());
|
||||
assertEquals(R.string.parsing_error, infoFromParcel.getMessageStringId());
|
||||
assertEquals(R.string.parsing_error, getMessageFromErrorInfo(infoFromParcel));
|
||||
|
||||
parcel.recycle();
|
||||
}
|
||||
|
|
|
@ -58,20 +58,13 @@ import org.schabi.newpipe.extractor.NewPipe;
|
|||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.StreamingService.LinkType;
|
||||
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.ContentNotSupportedException;
|
||||
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.SoundCloudGoPlusContentException;
|
||||
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException;
|
||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.ktx.ExceptionUtils;
|
||||
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
||||
import org.schabi.newpipe.player.PlayerType;
|
||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||
|
@ -279,28 +272,11 @@ public class RouterActivity extends AppCompatActivity {
|
|||
final Intent intent = new Intent(context, ReCaptchaActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(intent);
|
||||
} else if (errorInfo.getThrowable() != null
|
||||
&& ExceptionUtils.isNetworkRelated(errorInfo.getThrowable())) {
|
||||
Toast.makeText(context, R.string.network_error, Toast.LENGTH_LONG).show();
|
||||
} else if (errorInfo.getThrowable() instanceof AgeRestrictedContentException) {
|
||||
Toast.makeText(context, R.string.restricted_video_no_stream,
|
||||
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 if (errorInfo.getThrowable() instanceof ContentNotAvailableException
|
||||
|| errorInfo.getThrowable() instanceof ContentNotSupportedException) {
|
||||
// this exception does not usually indicate a problem that should be reported,
|
||||
// so just show a toast instead of the notification
|
||||
Toast.makeText(context, errorInfo.getMessage(context), Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
ErrorUtil.createNotification(context, errorInfo);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ public class AcraReportSender implements ReportSender {
|
|||
ErrorUtil.openActivity(context, new ErrorInfo(
|
||||
new String[]{report.getString(ReportField.STACK_TRACE)},
|
||||
UserAction.UI_ERROR,
|
||||
ErrorInfo.SERVICE_NONE,
|
||||
null,
|
||||
"ACRA report",
|
||||
R.string.app_ui_crash));
|
||||
}
|
||||
|
|
|
@ -115,7 +115,7 @@ public class ErrorActivity extends AppCompatActivity {
|
|||
|
||||
// normal bugreport
|
||||
buildInfo(errorInfo);
|
||||
activityErrorBinding.errorMessageView.setText(errorInfo.getMessageStringId());
|
||||
activityErrorBinding.errorMessageView.setText(errorInfo.getMessage(this));
|
||||
activityErrorBinding.errorView.setText(formErrorText(errorInfo.getStackTraces()));
|
||||
|
||||
// print stack trace once again for debugging:
|
||||
|
|
|
@ -1,26 +1,42 @@
|
|||
package org.schabi.newpipe.error
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Parcelable
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.content.ContextCompat
|
||||
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.Parcelize
|
||||
import org.schabi.newpipe.R
|
||||
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.AgeRestrictedContentException
|
||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
||||
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException
|
||||
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.util.ServiceHelper
|
||||
import org.schabi.newpipe.player.mediasource.FailedMediaSource
|
||||
import org.schabi.newpipe.player.resolver.PlaybackResolver
|
||||
|
||||
@Parcelize
|
||||
class ErrorInfo(
|
||||
class ErrorInfo private constructor(
|
||||
val stackTraces: Array<String>,
|
||||
val userAction: UserAction,
|
||||
val serviceName: String,
|
||||
val serviceId: Int?,
|
||||
val request: String,
|
||||
val messageStringId: Int
|
||||
private val message: ErrorMessage,
|
||||
) : Parcelable {
|
||||
|
||||
// no need to store throwable, all data for report is in other variables
|
||||
|
@ -31,14 +47,14 @@ class ErrorInfo(
|
|||
private constructor(
|
||||
throwable: Throwable,
|
||||
userAction: UserAction,
|
||||
serviceName: String,
|
||||
serviceId: Int?,
|
||||
request: String
|
||||
) : this(
|
||||
throwableToStringList(throwable),
|
||||
userAction,
|
||||
serviceName,
|
||||
serviceId,
|
||||
request,
|
||||
getMessageStringId(throwable, userAction)
|
||||
getMessage(throwable, userAction, serviceId)
|
||||
) {
|
||||
this.throwable = throwable
|
||||
}
|
||||
|
@ -46,70 +62,176 @@ class ErrorInfo(
|
|||
private constructor(
|
||||
throwable: List<Throwable>,
|
||||
userAction: UserAction,
|
||||
serviceName: String,
|
||||
serviceId: Int?,
|
||||
request: String
|
||||
) : this(
|
||||
throwableListToStringList(throwable),
|
||||
userAction,
|
||||
serviceName,
|
||||
serviceId,
|
||||
request,
|
||||
getMessageStringId(throwable.firstOrNull(), userAction)
|
||||
getMessage(throwable.firstOrNull(), userAction, serviceId)
|
||||
) {
|
||||
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
|
||||
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) :
|
||||
this(throwable, userAction, ServiceHelper.getNameOfServiceById(serviceId), request)
|
||||
this(throwable, userAction, serviceId, request)
|
||||
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
|
||||
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) :
|
||||
this(throwable, userAction, ServiceHelper.getNameOfServiceById(serviceId), request)
|
||||
this(throwable, userAction, serviceId, request)
|
||||
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 {
|
||||
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 throwableListToStringList(throwableList: List<Throwable>) =
|
||||
throwableList.map { it.stackTraceToString() }.toTypedArray()
|
||||
|
||||
private fun getInfoServiceName(info: Info?) =
|
||||
if (info == null) SERVICE_NONE else ServiceHelper.getNameOfServiceById(info.serviceId)
|
||||
|
||||
@StringRes
|
||||
private fun getMessageStringId(
|
||||
fun getMessage(
|
||||
throwable: Throwable?,
|
||||
action: UserAction
|
||||
): Int {
|
||||
action: UserAction?,
|
||||
serviceId: Int?,
|
||||
): ErrorMessage {
|
||||
return when {
|
||||
throwable is AccountTerminatedException -> R.string.account_terminated
|
||||
throwable is ContentNotAvailableException -> R.string.content_not_available
|
||||
throwable != null && throwable.isNetworkRelated -> R.string.network_error
|
||||
throwable is ContentNotSupportedException -> R.string.content_not_supported
|
||||
throwable is ExtractionException -> R.string.parsing_error
|
||||
// player exceptions
|
||||
// some may be IOException, so do these checks before isNetworkRelated!
|
||||
throwable is ExoPlaybackException -> {
|
||||
when (throwable.type) {
|
||||
ExoPlaybackException.TYPE_SOURCE -> R.string.player_stream_failure
|
||||
ExoPlaybackException.TYPE_UNEXPECTED -> R.string.player_recoverable_failure
|
||||
else -> R.string.player_unrecoverable_failure
|
||||
val cause = throwable.cause
|
||||
when {
|
||||
cause is HttpDataSource.InvalidResponseCodeException -> {
|
||||
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())
|
||||
}
|
||||
}
|
||||
cause is Loader.UnexpectedLoaderException && cause.cause is ExtractionException ->
|
||||
getMessage(throwable, action, serviceId)
|
||||
throwable.type == ExoPlaybackException.TYPE_SOURCE ->
|
||||
ErrorMessage(R.string.player_stream_failure)
|
||||
throwable.type == ExoPlaybackException.TYPE_UNEXPECTED ->
|
||||
ErrorMessage(R.string.player_recoverable_failure)
|
||||
else ->
|
||||
ErrorMessage(R.string.player_unrecoverable_failure)
|
||||
}
|
||||
}
|
||||
action == UserAction.UI_ERROR -> R.string.app_ui_crash
|
||||
action == UserAction.REQUESTED_COMMENTS -> R.string.error_unable_to_load_comments
|
||||
action == UserAction.SUBSCRIPTION_CHANGE -> R.string.subscription_change_failed
|
||||
action == UserAction.SUBSCRIPTION_UPDATE -> R.string.subscription_update_failed
|
||||
action == UserAction.LOAD_IMAGE -> R.string.could_not_load_thumbnails
|
||||
action == UserAction.DOWNLOAD_OPEN_DIALOG -> R.string.could_not_setup_download_menu
|
||||
else -> R.string.general_error
|
||||
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 org.schabi.newpipe.MainActivity
|
||||
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.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.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.isInterruptedCaused
|
||||
import org.schabi.newpipe.ktx.isNetworkRelated
|
||||
import org.schabi.newpipe.util.ServiceHelper
|
||||
import org.schabi.newpipe.util.external_communication.ShareUtils
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
|
@ -106,20 +96,6 @@ class ErrorPanelHelper(
|
|||
|
||||
errorRetryButton.isVisible = retryShouldBeShown
|
||||
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 {
|
||||
showAndSetErrorButtonAction(
|
||||
R.string.error_snackbar_action
|
||||
|
@ -127,7 +103,7 @@ class ErrorPanelHelper(
|
|||
ErrorUtil.openActivity(context, errorInfo)
|
||||
}
|
||||
|
||||
errorTextView.setText(getExceptionDescription(errorInfo.throwable))
|
||||
errorTextView.text = errorInfo.getMessage(context)
|
||||
|
||||
if (errorInfo.throwable !is ContentNotAvailableException &&
|
||||
errorInfo.throwable !is ContentNotSupportedException
|
||||
|
@ -192,27 +168,5 @@ class ErrorPanelHelper(
|
|||
companion object {
|
||||
val TAG: String = ErrorPanelHelper::class.simpleName!!
|
||||
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)
|
||||
.setContentTitle(context.getString(R.string.error_report_notification_title))
|
||||
.setContentText(context.getString(errorInfo.messageStringId))
|
||||
.setContentText(errorInfo.getMessage(context))
|
||||
.setAutoCancel(true)
|
||||
.setContentIntent(
|
||||
PendingIntentCompat.getActivity(
|
||||
|
@ -156,10 +156,10 @@ class ErrorUtil {
|
|||
// fallback to showing a notification if no root view is available
|
||||
createNotification(context, errorInfo)
|
||||
} else {
|
||||
Snackbar.make(rootView, R.string.error_snackbar_message, Snackbar.LENGTH_LONG)
|
||||
Snackbar.make(rootView, errorInfo.getMessage(context), Snackbar.LENGTH_LONG)
|
||||
.setActionTextColor(Color.YELLOW)
|
||||
.setAction(context.getString(R.string.error_snackbar_action).uppercase()) {
|
||||
openActivity(context, errorInfo)
|
||||
context.startActivity(getErrorActivityIntent(context, errorInfo))
|
||||
}.show()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,7 +33,9 @@ public enum UserAction {
|
|||
SHARE_TO_NEWPIPE("share to newpipe"),
|
||||
CHECK_FOR_NEW_APP_VERSION("check for new app version"),
|
||||
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;
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ public class SubscriptionsImportFragment extends BaseFragment {
|
|||
if (supportedSources.isEmpty() && currentServiceId != Constants.NO_SERVICE_ID) {
|
||||
ErrorUtil.showSnackbar(activity,
|
||||
new ErrorInfo(new String[]{}, UserAction.SUBSCRIPTION_IMPORT_EXPORT,
|
||||
ServiceHelper.getNameOfServiceById(currentServiceId),
|
||||
currentServiceId,
|
||||
"Service does not support importing subscriptions",
|
||||
R.string.general_error));
|
||||
activity.finish();
|
||||
|
|
|
@ -17,6 +17,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers
|
|||
import org.schabi.newpipe.MainActivity
|
||||
import org.schabi.newpipe.NewPipeDatabase
|
||||
import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.error.ErrorInfo
|
||||
import org.schabi.newpipe.extractor.InfoItem.InfoType
|
||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException
|
||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler
|
||||
|
@ -84,7 +85,7 @@ class MediaBrowserPlaybackPreparer(
|
|||
},
|
||||
{ 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(
|
||||
ContextCompat.getString(context, R.string.error_snackbar_message),
|
||||
ErrorInfo.getMessage(throwable, null, null).getString(context),
|
||||
PlaybackStateCompat.ERROR_CODE_APP_ERROR
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
package org.schabi.newpipe.util.text;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import org.schabi.newpipe.MainActivity;
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.error.ErrorPanelHelper;
|
||||
import org.schabi.newpipe.error.ErrorInfo;
|
||||
import org.schabi.newpipe.error.ErrorUtil;
|
||||
import org.schabi.newpipe.error.UserAction;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||
|
@ -158,19 +157,13 @@ public final class InternalUrlsHandler {
|
|||
disposables.add(single.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(info -> {
|
||||
final PlayQueue playQueue =
|
||||
new SinglePlayQueue(info, seconds * 1000L);
|
||||
final PlayQueue playQueue = new SinglePlayQueue(info, seconds * 1000L);
|
||||
NavigationHelper.playOnPopupPlayer(context, playQueue, false);
|
||||
}, throwable -> {
|
||||
if (DEBUG) {
|
||||
Log.e(TAG, "Could not play on popup: " + url, throwable);
|
||||
}
|
||||
new AlertDialog.Builder(context)
|
||||
.setTitle(R.string.player_stream_failure)
|
||||
.setMessage(
|
||||
ErrorPanelHelper.Companion.getExceptionDescription(throwable))
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.show();
|
||||
final var errorInfo = new ErrorInfo(throwable, UserAction.PLAY_ON_POPUP, url);
|
||||
// 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.
|
||||
ErrorUtil.showSnackbar(context, errorInfo);
|
||||
}));
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -563,11 +563,11 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
|||
}
|
||||
request.append("]");
|
||||
|
||||
String service;
|
||||
Integer service;
|
||||
try {
|
||||
service = NewPipe.getServiceByUrl(mission.source).getServiceInfo().getName();
|
||||
service = NewPipe.getServiceByUrl(mission.source).getServiceId();
|
||||
} catch (Exception e) {
|
||||
service = ErrorInfo.SERVICE_NONE;
|
||||
service = null;
|
||||
}
|
||||
|
||||
ErrorUtil.createNotification(mContext,
|
||||
|
|
|
@ -641,7 +641,6 @@
|
|||
<string name="play_queue_audio_track">الصوت : %s</string>
|
||||
<string name="playback_step">خطوة</string>
|
||||
<string name="recaptcha_solve">حل</string>
|
||||
<string name="service_provides_reason">%s يقدم هذا السبب:</string>
|
||||
<string name="selected_stream_external_player_not_supported">الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون</string>
|
||||
<string name="title_activity_about">عن تطبيق نيوپايپ</string>
|
||||
<string name="seek_duration_title">تسريع إلى الأمام/-ترجيع وقت البحث</string>
|
||||
|
|
|
@ -649,7 +649,6 @@
|
|||
<string name="description_select_enable">تمكين تحديد نص في الوصف</string>
|
||||
<string name="description_select_note">يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد.</string>
|
||||
<string name="open_website_license">فتح الموقع</string>
|
||||
<string name="service_provides_reason">%s يقدم هذا السبب:</string>
|
||||
<string name="account_terminated">تم إنهاء الحساب</string>
|
||||
<string name="feed_load_error_fast_unknown">لا يوفر وضع التغذية السريعة مزيدًا من المعلومات حول هذا الموضوع.</string>
|
||||
<string name="feed_load_error_terminated">حساب منشئ المحتوى قد تم إنهائه.
|
||||
|
|
|
@ -501,7 +501,6 @@
|
|||
<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="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="description_select_disable">Açıqlamadakı mətni seçməyi qeyri-aktiv et</string>
|
||||
<string name="metadata_category">Kateqoriya</string>
|
||||
|
|
|
@ -704,7 +704,6 @@
|
|||
<string name="private_content">Гэта змесціва з\'яўляецца прыватным, таму NewPipe не можа яго трансляваць або спампоўваць.</string>
|
||||
<string name="youtube_music_premium_content">Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго трансляваць або спампоўваць.</string>
|
||||
<string name="account_terminated">Уліковы запіс спынены</string>
|
||||
<string name="service_provides_reason">%s дае наступную прычыну:</string>
|
||||
<string name="featured">Вартае ўвагі</string>
|
||||
<string name="metadata_privacy_internal">Унутраная</string>
|
||||
<string name="feed_show_watched">Прагледжаныя цалкам</string>
|
||||
|
|
|
@ -416,7 +416,6 @@
|
|||
<string name="playlist_page_summary">Страница на плейлиста</string>
|
||||
<string name="chapters">Глави</string>
|
||||
<string name="metadata_licence">Лиценз</string>
|
||||
<string name="service_provides_reason">%s посочва следната причина:</string>
|
||||
<string name="metadata_tags">Маркери</string>
|
||||
<string name="metadata_privacy">Поверителност</string>
|
||||
<string name="metadata_language">Език</string>
|
||||
|
|
|
@ -540,7 +540,6 @@
|
|||
<string name="feed_load_error_account_info">\'%s\' এর জন্য ফিড প্রক্রিয়া করা যাচ্ছে না।</string>
|
||||
<string name="description_select_disable">বর্ণনার লেখা নির্বাচন করা নিষ্ক্রিয় করো</string>
|
||||
<string name="description_select_enable">বর্ণনার লেখা নির্বাচন করা সক্ষম করো</string>
|
||||
<string name="service_provides_reason">%s এই কারণ বলছে:</string>
|
||||
<string name="feed_load_error">প্রক্রিয়াকরণ ফিডে ত্রুটি</string>
|
||||
<string name="open_website_license">ওয়েবসাইট খুলুন</string>
|
||||
<string name="account_terminated">অ্যাকাউন্ট ধ্বংসকৃত</string>
|
||||
|
|
|
@ -612,7 +612,6 @@
|
|||
<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="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="feed_load_error_terminated">El compte de l\'autor ha estat esborrat.
|
||||
\nNewPipe no serà capaç de carregar aquest fil en el futur.
|
||||
|
|
|
@ -596,7 +596,6 @@
|
|||
<string name="radio">ڕادیۆ</string>
|
||||
<string name="featured">تایبەتکراو</string>
|
||||
<string name="paid_content">ئهم بابهته تهنیا بۆ ئهو كهسانه بهردهسته كه پارهیان داوه ، بۆیه ناتوانرێت له نیوپایپهوه داببهزێنرێت.</string>
|
||||
<string name="service_provides_reason">%s ئهم هۆكاره دابین دهكات:</string>
|
||||
<string name="account_terminated">ههژمار لهناوبراوه</string>
|
||||
<string name="youtube_music_premium_content">ئهم ڤیدیۆیه تهنیا له وهشانی نایابی یوتوب میوزیك بهردهسته ، بۆیه ناتوانرێت له نیوپایپهوه داببهزێنرێت.</string>
|
||||
<string name="soundcloud_go_plus_content">ئهمه تراكی SoundCloud Go+ ه ، لانی كهم له وڵاتهكهی تۆدا، ناتوانرێت لهلایهن نیوپایپهوه داببهزێنرێت.</string>
|
||||
|
|
|
@ -619,7 +619,6 @@
|
|||
<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_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="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.
|
||||
|
|
|
@ -554,7 +554,6 @@
|
|||
<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="featured">Fremhævede</string>
|
||||
<string name="service_provides_reason">%s giver denne grund:</string>
|
||||
<plurals name="listening">
|
||||
<item quantity="one">%s lytter</item>
|
||||
<item quantity="other">%s lyttere</item>
|
||||
|
|
|
@ -627,7 +627,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="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="service_provides_reason">%s gibt diesen Grund an:</string>
|
||||
<string name="on">An</string>
|
||||
<string name="tablet_mode_title">Tablet-Modus</string>
|
||||
<string name="off">Aus</string>
|
||||
|
|
|
@ -608,7 +608,6 @@
|
|||
<string name="description_select_enable">Ενεργοποίηση επιλογής κειμένου στην περιγραφή</string>
|
||||
<string name="description_select_note">Τώρα μπορείτε να επιλέξετε κείμενο εντός της περιγραφής. Σημειώστε ότι, η σελίδα μπορεί να παρουσιάζει αστάθεια κατά τη διάρκεια της κατάστασης επιλογής κειμένου.</string>
|
||||
<string name="open_website_license">Ανοικτή ιστοσελίδα</string>
|
||||
<string name="service_provides_reason">Το %s παρέχει αυτή την αιτία:</string>
|
||||
<string name="account_terminated">Ο λογαριασμός διαγράφηκε</string>
|
||||
<string name="feed_load_error_fast_unknown">Η κατάσταση γρήγορης τροφοδοσίας δεν παρέχει περισσότερες πληροφορίες.</string>
|
||||
<string name="feed_load_error_terminated">Ο λογαριασμός του δημιουργού έχει διαγραφεί.
|
||||
|
|
|
@ -504,7 +504,6 @@
|
|||
<string name="on">Ŝaltita</string>
|
||||
<string name="metadata_tags">Etikedoj</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="recent">Freŝaj</string>
|
||||
<string name="video_detail_by">De %s</string>
|
||||
|
|
|
@ -611,7 +611,6 @@
|
|||
<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_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="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>
|
||||
|
|
|
@ -562,7 +562,6 @@
|
|||
<string name="show_thumbnail_title">Näita pisipilte</string>
|
||||
<string name="show_thumbnail_summary">Kasuta pisipilti nii lukustusvaate kui teavituste taustana</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_disable">Ära võimalda valida kirjelduse teksti</string>
|
||||
<string name="metadata_category">Kategooria</string>
|
||||
|
|
|
@ -615,7 +615,6 @@
|
|||
<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="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="feed_load_error_fast_unknown">Jario azkarrak ez du honi buruz informazio gehiagorik ematen.</string>
|
||||
<string name="metadata_age_limit">Adin muga</string>
|
||||
|
|
|
@ -626,7 +626,6 @@
|
|||
\nنیوپایپ قادر به بار کردن این خوراک در آینده نیست.
|
||||
\nمیخواهید اشتراک این کانال را لغو کنید؟</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="detail_heart_img_view_description">قلبشده به دست ایجادگر</string>
|
||||
<string name="local_search_suggestions">پیشنهادهای جستوجوی محلّی</string>
|
||||
|
|
|
@ -592,7 +592,6 @@
|
|||
<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_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="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>
|
||||
|
|
|
@ -620,7 +620,6 @@
|
|||
<string name="metadata_tags">Étiquettes</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="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="open_website_license">Ouvrir le site web</string>
|
||||
<string name="account_terminated">Compte résilié</string>
|
||||
|
|
|
@ -554,7 +554,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="auto_device_theme_title">Automático (Tema do dispositivo)</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="chapters">Capítulos</string>
|
||||
<string name="recent">Recentes</string>
|
||||
|
|
|
@ -632,7 +632,6 @@
|
|||
\nל־NewPipe לא תהיה אפשרות להוריד את ההזנה הזאת בעתיד.
|
||||
\nלהסיר את המינוי מהערוץ הזה\?</string>
|
||||
<string name="open_website_license">פתיחת האתר</string>
|
||||
<string name="service_provides_reason">%s מספק את הסיבה הבאה:</string>
|
||||
<string name="account_terminated">החשבון הושמד</string>
|
||||
<string name="feed_load_error_fast_unknown">מצב ההזנה המהירה לא מספק מידע נוסף על כך.</string>
|
||||
<string name="feed_load_error_account_info">לא ניתן לטעון את ההזנה עבור ‚%s’.</string>
|
||||
|
|
|
@ -655,7 +655,6 @@
|
|||
<string name="disable_media_tunneling_title">मीडिया टनलिंग अक्षम करें</string>
|
||||
<string name="show_crash_the_player_title">\"क्रैश द प्लेयर\" दिखाएं</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_licence">लाइसेंस</string>
|
||||
<string name="faq_description">यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें!</string>
|
||||
|
|
|
@ -639,7 +639,6 @@
|
|||
<string name="metadata_privacy_internal">Interno</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="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="main_page_content_swipe_remove">Za ukljanjanje stavki povuci ih</string>
|
||||
<string name="show_image_indicators_title">Prikaži indikatore slike</string>
|
||||
|
|
|
@ -537,7 +537,6 @@
|
|||
<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="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="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>
|
||||
|
|
|
@ -599,7 +599,6 @@
|
|||
<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="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="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.
|
||||
|
|
|
@ -573,7 +573,6 @@
|
|||
<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>
|
||||
<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="auto_device_theme_title">Sjálfvirk (þema tækis)</string>
|
||||
<string name="night_theme_summary">Veldu uppáhalds næturþemu þína — %s</string>
|
||||
|
|
|
@ -619,7 +619,6 @@
|
|||
<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="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="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.
|
||||
|
|
|
@ -612,7 +612,6 @@
|
|||
<string name="off">オフ</string>
|
||||
<string name="on">オン</string>
|
||||
<string name="tablet_mode_title">タブレットモード</string>
|
||||
<string name="service_provides_reason">%s がこの理由を提示:</string>
|
||||
<string name="dont_show">表示しない</string>
|
||||
<string name="low_quality_smaller">低品質 (小)</string>
|
||||
<string name="high_quality_larger">高品質 (大)</string>
|
||||
|
|
|
@ -545,7 +545,6 @@
|
|||
<string name="georestricted_content">ეს ხელმიუწვდომელია თქვენი ქვეყნიდან.</string>
|
||||
<string name="private_content">ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>
|
||||
<string name="account_terminated">ანგარიში შეწყვეტილია</string>
|
||||
<string name="service_provides_reason">%s იძლევა ამ მიზეზს:</string>
|
||||
<string name="paid_content">ეს მასალა ხელმისაწვდომია მხოლოდ გადამხდელებისთვის, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>
|
||||
<string name="featured">გამორჩეული</string>
|
||||
<string name="radio">რადიო</string>
|
||||
|
|
|
@ -645,7 +645,6 @@
|
|||
<string name="chapters">챕터</string>
|
||||
<string name="recent">최근</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="auto_device_theme_title">자동 (장치 테마)</string>
|
||||
<string name="detail_pinned_comment_view_description">고정된 댓글</string>
|
||||
|
|
|
@ -623,7 +623,6 @@
|
|||
<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_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="feed_load_error_fast_unknown">Greito srauto režimas nesuteikia daugiau informacijos apie tai.</string>
|
||||
<string name="feed_load_error_terminated">Autoriaus paskyra anuliuota.
|
||||
|
|
|
@ -631,7 +631,6 @@
|
|||
\nNewPipe turpmāk nevarēs ielādēt šo plūsmu.
|
||||
\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="service_provides_reason">%s dod šādu pamatojumu:</string>
|
||||
<string name="description_select_disable">Izslēgt teksta atlasīšanu video aprakstā</string>
|
||||
<string name="metadata_privacy_internal">Iekšeji</string>
|
||||
<string name="detail_heart_img_view_description">Autors piekrīt</string>
|
||||
|
|
|
@ -431,7 +431,6 @@
|
|||
<string name="feed_load_error_account_info">Неуспешно вчитување на новинска лента за „%s“.</string>
|
||||
<string name="feed_show_hide_streams">Прикажи / скриј стримови</string>
|
||||
<string name="private_content">Оваа содржина е приватна, така што не може да биде емитувана или преземена од страна на NewPipe.</string>
|
||||
<string name="service_provides_reason">%s ја посочува следната причина:</string>
|
||||
<string name="featured">Истакнато</string>
|
||||
<string name="radio">Радио</string>
|
||||
<string name="auto_device_theme_title">Автоматски (режим на уредот)</string>
|
||||
|
|
|
@ -613,7 +613,6 @@
|
|||
<string name="metadata_tags">ടാഗുക്കൾ</string>
|
||||
<string name="metadata_category">വിഭാഗം</string>
|
||||
<string name="description_select_note">താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം.</string>
|
||||
<string name="service_provides_reason">ഇതിന്റെ കാരണം %s നൽകും:</string>
|
||||
<string name="account_terminated">അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു</string>
|
||||
<string name="feed_load_error_fast_unknown">ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല.</string>
|
||||
<string name="feed_load_error_terminated">സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു.
|
||||
|
|
|
@ -600,7 +600,6 @@
|
|||
\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_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="feed_load_error_account_info">Kunne ikke laste inn informasjonskanal for «%s».</string>
|
||||
<string name="feed_load_error">Kunne ikke laste inn informasjonskanal</string>
|
||||
|
|
|
@ -612,7 +612,6 @@
|
|||
<string name="on">Aan</string>
|
||||
<string name="tablet_mode_title">Tablet-modus</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="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.
|
||||
|
|
|
@ -627,7 +627,6 @@
|
|||
<string name="no_appropriate_file_manager_message_android_10">ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬.
|
||||
\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬</string>
|
||||
<string name="youtube_music_premium_content">ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ.</string>
|
||||
<string name="service_provides_reason">%s ߦߋ߫ ߞߎ߲߭ ߣߌ߲߬ ߠߋ߬ ߝߐ߫ ߟߊ߫:</string>
|
||||
<string name="featured">ߛߊ߲ߞߊߥߟߌ</string>
|
||||
<string name="radio">ߥߎߢߊ߲ߓߍ߲</string>
|
||||
<string name="auto_device_theme_title">ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ)</string>
|
||||
|
|
|
@ -486,7 +486,6 @@
|
|||
<string name="feed_group_dialog_select_subscriptions">ସଦସ୍ୟତା ଚୟନ କରନ୍ତୁ</string>
|
||||
<string name="feed_group_dialog_empty_selection">କୌଣସି ସଦସ୍ୟତା ଚୟନ ହୋଇନାହିଁ</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="featured">ବୈଶିଷ୍ଟ୍ୟ</string>
|
||||
<string name="radio">ରେଡିଓ</string>
|
||||
|
|
|
@ -455,7 +455,6 @@
|
|||
<string name="radio">ਰੇਡੀਓ</string>
|
||||
<string name="featured">ਫੀਚਰਡ</string>
|
||||
<string name="paid_content">ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
||||
<string name="service_provides_reason">%s ਇਸਦਾ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ:</string>
|
||||
<string name="account_terminated">ਖਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ</string>
|
||||
<string name="youtube_music_premium_content">ਇਹ ਵੀਡੀਓ ਸਿਰਫ਼ ਯੂਟਿਊਬ ਮਿਊਜ਼ਿਕ ਦੇ ਪ੍ਰੀਮੀਅਮ ਮੈਂਬਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
||||
<string name="private_content">ਇਹ ਸਮੱਗਰੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>
|
||||
|
|
|
@ -623,7 +623,6 @@
|
|||
<string name="metadata_category">Kategoria</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="service_provides_reason">%s podaje ten powód:</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_terminated">Konto autora zostało zawieszone.
|
||||
|
|
|
@ -619,7 +619,6 @@
|
|||
<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="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="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.
|
||||
|
|
|
@ -623,7 +623,6 @@
|
|||
<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_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="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.
|
||||
|
|
|
@ -605,7 +605,6 @@
|
|||
<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="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="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.
|
||||
|
|
|
@ -624,7 +624,6 @@
|
|||
<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_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="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.
|
||||
|
|
|
@ -633,7 +633,6 @@
|
|||
<string name="feed_load_error_account_info">Не удалось загрузить подписку \'%s\'.</string>
|
||||
<string name="feed_load_error">Ошибка загрузки подписки</string>
|
||||
<string name="open_website_license">Открыть веб-сайт</string>
|
||||
<string name="service_provides_reason">%s указывает следующую причину:</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_ask_summary_no_saf_notice">Спрашивать, куда сохранять каждую загрузку</string>
|
||||
|
|
|
@ -622,7 +622,6 @@
|
|||
<string name="off">オフ</string>
|
||||
<string name="on">オン</string>
|
||||
<string name="tablet_mode_title">タブレットモード</string>
|
||||
<string name="service_provides_reason">%sやしがくぬりゆうていじ:</string>
|
||||
<string name="dont_show">ひょうじさん</string>
|
||||
<string name="low_quality_smaller">ていふぃんしち(しょう)</string>
|
||||
<string name="high_quality_larger">かんふぃんしち(だい)</string>
|
||||
|
|
|
@ -331,7 +331,6 @@
|
|||
<string name="chapters">ᱪᱮᱯᱴᱟᱨᱥ</string>
|
||||
<string name="no_appropriate_file_manager_message_android_10">ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱟᱢ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱟᱱᱮᱡᱚᱨ ᱤᱱᱥᱴᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱤᱴᱤᱝ ᱨᱮ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱨᱚᱵᱷᱟᱣ ᱢᱮ\"</string>
|
||||
<string name="youtube_music_premium_content">ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ ᱯᱨᱤᱢᱤᱭᱟᱢ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱫᱚ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱟᱨ ᱵᱟᱝ ᱰᱟᱩᱱᱞᱳᱰ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>
|
||||
<string name="service_provides_reason">%s ᱫᱚ ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ:</string>
|
||||
<string name="auto_device_theme_title">ᱚᱴᱚᱢᱟᱴᱤᱠ (ᱰᱤᱵᱟᱤᱥ ᱛᱷᱮᱢ)</string>
|
||||
<string name="night_theme_summary">ᱟᱢᱟᱜ ᱯᱩᱭᱞᱩ ᱧᱤᱫᱟᱹ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ⁇ %s</string>
|
||||
<string name="select_night_theme_toast">ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱤᱫᱟᱹ ᱪᱮᱛᱟᱱ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ</string>
|
||||
|
|
|
@ -610,7 +610,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="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="service_provides_reason">%s frunit custa resone:</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_terminated">Su contu de s\'autore l\'ant serradu.
|
||||
|
|
|
@ -618,7 +618,6 @@
|
|||
<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="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="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ý.
|
||||
|
|
|
@ -608,7 +608,6 @@
|
|||
<string name="description_select_disable">Xidh 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="service_provides_reason">%s wuxuu sheegayaa sababtan:</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_terminated">Akoonka soosaaraha waa la joojiyay.
|
||||
|
|
|
@ -598,7 +598,6 @@
|
|||
<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="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="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>
|
||||
|
|
|
@ -619,7 +619,6 @@
|
|||
<string name="description_select_enable">Омогући бирање текста унутар описа</string>
|
||||
<string name="description_select_disable">Онемогући бирање текста унутар описа</string>
|
||||
<string name="description_select_note">Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора.</string>
|
||||
<string name="service_provides_reason">%s даје овај разлог:</string>
|
||||
<string name="account_terminated">Налог укинут</string>
|
||||
<string name="feed_load_error_fast_unknown">Режим брзог фида не пружа више информација о овоме.</string>
|
||||
<string name="feed_load_error_terminated">Налог аутора је укинут.
|
||||
|
|
|
@ -586,7 +586,6 @@
|
|||
<string name="download_has_started">Hämtningen har startat</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="service_provides_reason">%s anger detta skäl:</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="private_content">Detta innehåll är privat, så det kan inte strömmas eller hämtas av NewPipe.</string>
|
||||
|
|
|
@ -428,7 +428,6 @@
|
|||
<string name="enable_queue_limit">பதிவிறக்க வரிசையை கட்டுப்படுத்துங்கள்</string>
|
||||
<string name="enable_queue_limit_desc">ஒரு பதிவிறக்கம் ஒரே நேரத்தில் இயங்கும்</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_avatars">அவதாரங்கள்</string>
|
||||
<string name="progressive_load_interval_exoplayer_default">எக்சோப்ளேயர் இயல்புநிலை</string>
|
||||
|
|
|
@ -608,7 +608,6 @@
|
|||
<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="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="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ış.
|
||||
|
|
|
@ -624,7 +624,6 @@
|
|||
<string name="description_select_disable">Заборонити виділення тексту в описі</string>
|
||||
<string name="description_select_enable">Дозволити виділяти текст в описі</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">Помилка завантаження стрічки</string>
|
||||
<string name="feed_load_error_terminated">Обліковий запис автора припинено.
|
||||
|
|
|
@ -602,7 +602,6 @@
|
|||
<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_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="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.
|
||||
|
|
|
@ -599,7 +599,6 @@
|
|||
<string name="description_select_enable">启用简介中的文本选择功能</string>
|
||||
<string name="description_select_note">你现在可以选择简介中的文本,注意,在选择模式下,页面可能会闪烁,链接可能无法点击。</string>
|
||||
<string name="open_website_license">打开网站</string>
|
||||
<string name="service_provides_reason">%s 提供这个原因:</string>
|
||||
<string name="account_terminated">账号被终止</string>
|
||||
<string name="feed_load_error_fast_unknown">快速 Feed 模式不提供关于这个的更多信息。</string>
|
||||
<string name="feed_load_error_terminated">作者账号已被终止。
|
||||
|
|
|
@ -486,7 +486,6 @@
|
|||
<string name="content_not_supported">NewPipe 仲未支援到呢樣。
|
||||
\n
|
||||
\n希望未來會喺日後嘅版本支援啦。</string>
|
||||
<string name="service_provides_reason">%s 話理由如下:</string>
|
||||
<string name="no_appropriate_file_manager_message">搵唔到合適嘅檔案總管進行呢個動作。
|
||||
\n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」</string>
|
||||
<string name="no_appropriate_file_manager_message_android_10">搵唔到合適嘅檔案總管進行呢個動作。
|
||||
|
|
|
@ -599,7 +599,6 @@
|
|||
<string name="description_select_enable">啟用選取描述中的文字</string>
|
||||
<string name="description_select_note">您現在可以選取描述中的文字了。請注意,在選取模式下,頁面可能會閃爍,連結也可能無法點擊。</string>
|
||||
<string name="open_website_license">開啟網站</string>
|
||||
<string name="service_provides_reason">%s 提供了這個理由:</string>
|
||||
<string name="account_terminated">帳號已終止</string>
|
||||
<string name="feed_load_error_fast_unknown">快速 feed 模式不會提供更多資訊。</string>
|
||||
<string name="feed_load_error_terminated">作者的帳號已被終止。
|
||||
|
|
|
@ -757,7 +757,7 @@
|
|||
<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="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="featured">Featured</string>
|
||||
<string name="radio">Radio</string>
|
||||
|
@ -877,4 +877,9 @@
|
|||
<string name="trending_movies">Trending movies and shows</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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue