1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-11-04 09:13:00 +00:00

Merge branch 'master' into dev

This commit is contained in:
Stypox
2023-02-08 22:48:14 +01:00
142 changed files with 1736 additions and 521 deletions

View File

@@ -11,6 +11,14 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- We need to be able to open links in the browser on API 30+ -->
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="http|https|market" />
</intent>
</queries>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
@@ -165,6 +173,7 @@
<data android:pathPrefix="/watch" />
<data android:pathPrefix="/attribution_link" />
<data android:pathPrefix="/shorts/" />
<data android:pathPrefix="/live/" />
<!-- channel prefix -->
<data android:pathPrefix="/channel/" />
<data android:pathPrefix="/user/" />

View File

@@ -4,6 +4,7 @@ import static android.text.TextUtils.isEmpty;
import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
import static org.schabi.newpipe.util.Localization.getAppLocale;
import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -112,7 +113,10 @@ public class DescriptionFragment extends BaseFragment {
private void disableDescriptionSelection() {
// show description content again, otherwise some links are not clickable
loadDescriptionContent();
TextLinkifier.fromDescription(binding.detailDescriptionView,
streamInfo.getDescription(), HtmlCompat.FROM_HTML_MODE_LEGACY,
streamInfo.getService(), streamInfo.getUrl(),
descriptionDisposables, SET_LINK_MOVEMENT_METHOD);
binding.detailDescriptionNoteView.setVisibility(View.GONE);
binding.detailDescriptionView.setTextIsSelectable(false);
@@ -123,27 +127,6 @@ public class DescriptionFragment extends BaseFragment {
binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_select_all);
}
private void loadDescriptionContent() {
final Description description = streamInfo.getDescription();
switch (description.getType()) {
case Description.HTML:
TextLinkifier.createLinksFromHtmlBlock(binding.detailDescriptionView,
description.getContent(), HtmlCompat.FROM_HTML_MODE_LEGACY, streamInfo,
descriptionDisposables);
break;
case Description.MARKDOWN:
TextLinkifier.createLinksFromMarkdownText(binding.detailDescriptionView,
description.getContent(), streamInfo, descriptionDisposables);
break;
case Description.PLAIN_TEXT:
default:
TextLinkifier.createLinksFromPlainText(binding.detailDescriptionView,
description.getContent(), streamInfo, descriptionDisposables);
break;
}
}
private void setupMetadata(final LayoutInflater inflater,
final LinearLayout layout) {
addMetadataItem(inflater, layout, false, R.string.metadata_category,
@@ -193,8 +176,8 @@ public class DescriptionFragment extends BaseFragment {
});
if (linkifyContent) {
TextLinkifier.createLinksFromPlainText(itemBinding.metadataContentView, content,
null, descriptionDisposables);
TextLinkifier.fromPlainText(itemBinding.metadataContentView, content, null, null,
descriptionDisposables, SET_LINK_MOVEMENT_METHOD);
} else {
itemBinding.metadataContentView.setText(content);
}

View File

@@ -865,7 +865,8 @@ public final class VideoDetailFragment
if (playQueue == null) {
playQueue = new SinglePlayQueue(result);
}
if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(playQueue)) {
if (stack.isEmpty() || !stack.peek().getPlayQueue()
.equalStreams(playQueue)) {
stack.push(new StackItem(serviceId, url, title, playQueue));
}
}
@@ -1779,7 +1780,7 @@ public final class VideoDetailFragment
// deleted/added items inside Channel/Playlist queue and makes possible to have
// a history of played items
@Nullable final StackItem stackPeek = stack.peek();
if (stackPeek != null && !stackPeek.getPlayQueue().equals(queue)) {
if (stackPeek != null && !stackPeek.getPlayQueue().equalStreams(queue)) {
@Nullable final PlayQueueItem playQueueItem = queue.getItem();
if (playQueueItem != null) {
stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(),
@@ -1845,7 +1846,7 @@ public final class VideoDetailFragment
// They are not equal when user watches something in popup while browsing in fragment and
// then changes screen orientation. In that case the fragment will set itself as
// a service listener and will receive initial call to onMetadataUpdate()
if (!queue.equals(playQueue)) {
if (!queue.equalStreams(playQueue)) {
return;
}
@@ -2102,7 +2103,7 @@ public final class VideoDetailFragment
final Iterator<StackItem> iterator = stack.descendingIterator();
while (iterator.hasNext()) {
final StackItem next = iterator.next();
if (next.getPlayQueue().equals(queue)) {
if (next.getPlayQueue().equalStreams(queue)) {
item = next;
break;
}
@@ -2117,7 +2118,7 @@ public final class VideoDetailFragment
if (isClearingQueueConfirmationRequired(activity)
&& playerIsNotStopped()
&& activeQueue != null
&& !activeQueue.equals(playQueue)) {
&& !activeQueue.equalStreams(playQueue)) {
showClearingQueueConfirmation(onAllow);
} else {
onAllow.run();

View File

@@ -1,9 +1,10 @@
package org.schabi.newpipe.info_list.holder;
import android.graphics.Paint;
import android.text.Layout;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -11,27 +12,36 @@ import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.text.util.LinkifyCompat;
import androidx.core.text.HtmlCompat;
import org.schabi.newpipe.R;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.stream.Description;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.text.CommentTextOnTouchListener;
import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.PicassoHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import org.schabi.newpipe.util.text.TimestampExtractor;
import org.schabi.newpipe.util.text.CommentTextOnTouchListener;
import org.schabi.newpipe.util.text.TextLinkifier;
import java.util.Objects;
import java.util.function.Consumer;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
public class CommentsMiniInfoItemHolder extends InfoItemHolder {
private static final String TAG = "CommentsMiniIIHolder";
private static final String ELLIPSIS = "";
private static final int COMMENT_DEFAULT_LINES = 2;
private static final int COMMENT_EXPANDED_LINES = 1000;
@@ -39,13 +49,18 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
private final int commentHorizontalPadding;
private final int commentVerticalPadding;
private final Paint paintAtContentSize;
private final float ellipsisWidthPx;
private final RelativeLayout itemRoot;
private final ImageView itemThumbnailView;
private final TextView itemContentView;
private final TextView itemLikesCountView;
private final TextView itemPublishedTime;
private String commentText;
private final CompositeDisposable disposables = new CompositeDisposable();
private Description commentText;
private StreamingService streamService;
private String streamUrl;
CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,
@@ -62,6 +77,10 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
.getResources().getDimension(R.dimen.comments_horizontal_padding);
commentVerticalPadding = (int) infoItemBuilder.getContext()
.getResources().getDimension(R.dimen.comments_vertical_padding);
paintAtContentSize = new Paint();
paintAtContentSize.setTextSize(itemContentView.getTextSize());
ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS);
}
public CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,
@@ -91,18 +110,20 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item));
streamUrl = item.getUrl();
itemContentView.setLines(COMMENT_DEFAULT_LINES);
commentText = item.getCommentText();
itemContentView.setText(commentText, TextView.BufferType.SPANNABLE);
itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
if (itemContentView.getLineCount() == 0) {
itemContentView.post(this::ellipsize);
} else {
ellipsize();
try {
streamService = NewPipe.getService(item.getServiceId());
} catch (final ExtractionException e) {
// should never happen
ErrorUtil.showUiErrorSnackbar(itemBuilder.getContext(), "Getting StreamingService", e);
Log.w(TAG, "Cannot obtain service from comment service id, defaulting to YouTube", e);
streamService = ServiceList.YouTube;
}
streamUrl = item.getUrl();
commentText = item.getCommentText();
ellipsize();
//noinspection ClickableViewAccessibility
itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
if (item.getLikeCount() >= 0) {
itemLikesCountView.setText(
@@ -132,7 +153,8 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
if (DeviceUtils.isTv(itemBuilder.getContext())) {
openCommentAuthor(item);
} else {
ShareUtils.copyToClipboard(itemBuilder.getContext(), commentText);
ShareUtils.copyToClipboard(itemBuilder.getContext(),
itemContentView.getText().toString());
}
return true;
});
@@ -172,7 +194,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
return urls != null && urls.length != 0;
}
private void determineLinkFocus() {
private void determineMovementMethod() {
if (shouldFocusLinks()) {
allowLinkFocus();
} else {
@@ -181,63 +203,73 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
}
private void ellipsize() {
boolean hasEllipsis = false;
itemContentView.setMaxLines(COMMENT_EXPANDED_LINES);
linkifyCommentContentView(v -> {
boolean hasEllipsis = false;
if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
final int endOfLastLine = itemContentView
.getLayout()
.getLineEnd(COMMENT_DEFAULT_LINES - 1);
int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine - 2);
if (end == -1) {
end = Math.max(endOfLastLine - 2, 0);
if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
// Note that converting to String removes spans (i.e. links), but that's something
// we actually want since when the text is ellipsized we want all clicks on the
// comment to expand the comment, not to open links.
final String text = itemContentView.getText().toString();
final Layout layout = itemContentView.getLayout();
final float lineWidth = layout.getLineWidth(COMMENT_DEFAULT_LINES - 1);
final float layoutWidth = layout.getWidth();
final int lineStart = layout.getLineStart(COMMENT_DEFAULT_LINES - 1);
final int lineEnd = layout.getLineEnd(COMMENT_DEFAULT_LINES - 1);
// remove characters up until there is enough space for the ellipsis
// (also summing 2 more pixels, just to be sure to avoid float rounding errors)
int end = lineEnd;
float removedCharactersWidth = 0.0f;
while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth
&& end >= lineStart) {
end -= 1;
// recalculate each time to account for ligatures or other similar things
removedCharactersWidth = paintAtContentSize.measureText(
text.substring(end, lineEnd));
}
// remove trailing spaces and newlines
while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) {
end -= 1;
}
final String newVal = text.substring(0, end) + ELLIPSIS;
itemContentView.setText(newVal);
hasEllipsis = true;
}
final String newVal = itemContentView.getText().subSequence(0, end) + "";
itemContentView.setText(newVal);
hasEllipsis = true;
}
linkify();
if (hasEllipsis) {
denyLinkFocus();
} else {
determineLinkFocus();
}
itemContentView.setMaxLines(COMMENT_DEFAULT_LINES);
if (hasEllipsis) {
denyLinkFocus();
} else {
determineMovementMethod();
}
});
}
private void toggleEllipsize() {
if (itemContentView.getText().toString().equals(commentText)) {
if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
ellipsize();
}
} else {
final CharSequence text = itemContentView.getText();
if (text.charAt(text.length() - 1) == ELLIPSIS.charAt(0)) {
expand();
} else if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
ellipsize();
}
}
private void expand() {
itemContentView.setMaxLines(COMMENT_EXPANDED_LINES);
itemContentView.setText(commentText);
linkify();
determineLinkFocus();
linkifyCommentContentView(v -> determineMovementMethod());
}
private void linkify() {
LinkifyCompat.addLinks(itemContentView, Linkify.WEB_URLS);
LinkifyCompat.addLinks(itemContentView, TimestampExtractor.TIMESTAMPS_PATTERN, null, null,
(match, url) -> {
try {
final var timestampMatch = TimestampExtractor
.getTimestampFromMatcher(match, commentText);
if (timestampMatch == null) {
return url;
}
return streamUrl + url.replace(Objects.requireNonNull(match.group(0)),
"#timestamp=" + timestampMatch.seconds());
} catch (final Exception ex) {
Log.e(TAG, "Unable to process url='" + url + "' as timestampLink", ex);
return url;
}
});
private void linkifyCommentContentView(@Nullable final Consumer<TextView> onCompletion) {
disposables.clear();
if (commentText != null) {
TextLinkifier.fromDescription(itemContentView, commentText,
HtmlCompat.FROM_HTML_MODE_LEGACY, streamService, streamUrl, disposables,
onCompletion);
}
}
}

View File

@@ -348,7 +348,7 @@ public final class Player implements PlaybackListener, Listener {
final boolean playbackSkipSilence = getPrefs().getBoolean(getContext().getString(
R.string.playback_skip_silence_key), getPlaybackSkipSilence());
final boolean samePlayQueue = playQueue != null && playQueue.equals(newQueue);
final boolean samePlayQueue = playQueue != null && playQueue.equalStreamsAndIndex(newQueue);
final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode());
final boolean playWhenReady = intent.getBooleanExtra(PLAY_WHEN_READY, true);
final boolean isMuted = intent.getBooleanExtra(IS_MUTED, isMuted());

View File

@@ -1,21 +1,27 @@
package org.schabi.newpipe.player.mediasource;
import androidx.annotation.NonNull;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.CompositeMediaSource;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.WrappingMediaSource;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.TransferListener;
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
public class LoadedMediaSource extends WrappingMediaSource implements ManagedMediaSource {
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class LoadedMediaSource extends CompositeMediaSource<Integer> implements ManagedMediaSource {
private final MediaSource source;
private final PlayQueueItem stream;
private final MediaItem mediaItem;
private final long expireTimestamp;
/**
* Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource}
* Uses a {@link CompositeMediaSource} to wrap one or more child {@link MediaSource}s
* containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration
* timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under
* {@link ManagedMediaSourcePlaylist}.
@@ -30,7 +36,7 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed
@NonNull final MediaItemTag tag,
@NonNull final PlayQueueItem stream,
final long expireTimestamp) {
super(source);
this.source = source;
this.stream = stream;
this.expireTimestamp = expireTimestamp;
@@ -45,6 +51,51 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed
return System.currentTimeMillis() >= expireTimestamp;
}
/**
* Delegates the preparation of child {@link MediaSource}s to the
* {@link CompositeMediaSource} wrapper. Since all {@link LoadedMediaSource}s use only
* a single child media, the child id of 0 is always used (sonar doesn't like null as id here).
*
* @param mediaTransferListener A data transfer listener that will be registered by the
* {@link CompositeMediaSource} for child source preparation.
*/
@Override
protected void prepareSourceInternal(@Nullable final TransferListener mediaTransferListener) {
super.prepareSourceInternal(mediaTransferListener);
prepareChildSource(0, source);
}
/**
* When any child {@link MediaSource} is prepared, the refreshed {@link Timeline} can
* be listened to here. But since {@link LoadedMediaSource} has only a single child source,
* this method is called only once until {@link #releaseSourceInternal()} is called.
* <br><br>
* On refresh, the {@link CompositeMediaSource} delegate will be notified with the
* new {@link Timeline}, otherwise {@link #createPeriod(MediaPeriodId, Allocator, long)}
* will not be called and playback may be stalled.
*
* @param id The unique id used to prepare the child source.
* @param mediaSource The child source whose source info has been refreshed.
* @param timeline The new timeline of the child source.
*/
@Override
protected void onChildSourceInfoRefreshed(final Integer id,
final MediaSource mediaSource,
final Timeline timeline) {
refreshSourceInfo(timeline);
}
@Override
public MediaPeriod createPeriod(final MediaPeriodId id, final Allocator allocator,
final long startPositionUs) {
return source.createPeriod(id, allocator, startPositionUs);
}
@Override
public void releasePeriod(final MediaPeriod mediaPeriod) {
source.releasePeriod(mediaPeriod);
}
@NonNull
@Override
public MediaItem getMediaItem() {

View File

@@ -518,12 +518,10 @@ public abstract class PlayQueue implements Serializable {
* This method also gives a chance to track history of items in a queue in
* VideoDetailFragment without duplicating items from two identical queues
*/
@Override
public boolean equals(@Nullable final Object obj) {
if (!(obj instanceof PlayQueue)) {
public boolean equalStreams(@Nullable final PlayQueue other) {
if (other == null) {
return false;
}
final PlayQueue other = (PlayQueue) obj;
if (size() != other.size()) {
return false;
}
@@ -539,9 +537,11 @@ public abstract class PlayQueue implements Serializable {
return true;
}
@Override
public int hashCode() {
return streams.hashCode();
public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) {
if (equalStreams(other)) {
return other.getIndex() == getIndex();
}
return false;
}
public boolean isDisposed() {

View File

@@ -20,6 +20,7 @@
package org.schabi.newpipe.util;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD;
import android.content.Context;
import android.util.Log;
@@ -319,8 +320,9 @@ public final class ExtractorHelper {
}
metaInfoSeparator.setVisibility(View.VISIBLE);
TextLinkifier.createLinksFromHtmlBlock(metaInfoTextView, stringBuilder.toString(),
HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, disposables);
TextLinkifier.fromHtml(metaInfoTextView, stringBuilder.toString(),
HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, null, disposables,
SET_LINK_MOVEMENT_METHOD);
}
}

View File

@@ -90,19 +90,16 @@ public final class ShareUtils {
// No browser set as default (doesn't work on some devices)
openAppChooser(context, intent, true);
} else {
if (defaultPackageName.isEmpty()) {
// No app installed to open a web url
Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show();
return false;
} else {
try {
try {
// will be empty on Android 12+
if (!defaultPackageName.isEmpty()) {
intent.setPackage(defaultPackageName);
context.startActivity(intent);
} catch (final ActivityNotFoundException e) {
// Not a browser but an app chooser because of OEMs changes
intent.setPackage(null);
openAppChooser(context, intent, true);
}
context.startActivity(intent);
} catch (final ActivityNotFoundException e) {
// Not a browser but an app chooser because of OEMs changes
intent.setPackage(null);
openAppChooser(context, intent, true);
}
}

View File

@@ -2,51 +2,37 @@ package org.schabi.newpipe.util.text;
import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine;
import android.text.Selection;
import android.text.Spannable;
import android.annotation.SuppressLint;
import android.text.Spanned;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
public class CommentTextOnTouchListener implements View.OnTouchListener {
public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener();
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(final View v, final MotionEvent event) {
if (!(v instanceof TextView)) {
return false;
}
final TextView widget = (TextView) v;
final Object text = widget.getText();
final CharSequence text = widget.getText();
if (text instanceof Spanned) {
final Spannable buffer = (Spannable) text;
final Spanned buffer = (Spanned) text;
final int action = event.getAction();
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
final int offset = getOffsetForHorizontalLine(widget, event);
final ClickableSpan[] link = buffer.getSpans(offset, offset, ClickableSpan.class);
final ClickableSpan[] links = buffer.getSpans(offset, offset, ClickableSpan.class);
if (link.length != 0) {
if (links.length != 0) {
if (action == MotionEvent.ACTION_UP) {
if (link[0] instanceof URLSpan) {
final String url = ((URLSpan) link[0]).getURL();
if (!InternalUrlsHandler.handleUrlCommentsTimestamp(
new CompositeDisposable(), v.getContext(), url)) {
ShareUtils.openUrlInBrowser(v.getContext(), url, false);
}
}
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer, buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
links[0].onClick(widget);
}
// we handle events that intersect links, so return true
return true;
}
}

View File

@@ -5,7 +5,6 @@ import android.view.View;
import androidx.annotation.NonNull;
import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
@@ -15,20 +14,19 @@ final class HashtagLongPressClickableSpan extends LongPressClickableSpan {
private final Context context;
@NonNull
private final String parsedHashtag;
@NonNull
private final Info relatedInfo;
private final int relatedInfoServiceId;
HashtagLongPressClickableSpan(@NonNull final Context context,
@NonNull final String parsedHashtag,
@NonNull final Info relatedInfo) {
final int relatedInfoServiceId) {
this.context = context;
this.parsedHashtag = parsedHashtag;
this.relatedInfo = relatedInfo;
this.relatedInfoServiceId = relatedInfoServiceId;
}
@Override
public void onClick(@NonNull final View view) {
NavigationHelper.openSearch(context, relatedInfo.getServiceId(), parsedHashtag);
NavigationHelper.openSearch(context, relatedInfoServiceId, parsedHashtag);
}
@Override

View File

@@ -12,11 +12,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.text.HtmlCompat;
import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.stream.Description;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -33,88 +34,155 @@ public final class TextLinkifier {
// Looks for hashtags with characters from any language (\p{L}), numbers, or underscores
private static final Pattern HASHTAGS_PATTERN = Pattern.compile("(#[\\p{L}0-9_]+)");
public static final Consumer<TextView> SET_LINK_MOVEMENT_METHOD =
v -> v.setMovementMethod(LongPressLinkMovementMethod.getInstance());
private TextLinkifier() {
}
/**
* Create links for contents with an {@link Description} in the various possible formats.
* <p>
* This will call one of these three functions based on the format: {@link #fromHtml},
* {@link #fromMarkdown} or {@link #fromPlainText}.
*
* @param textView the TextView to set the htmlBlock linked
* @param description the htmlBlock to be linked
* @param htmlCompatFlag the int flag to be set if {@link HtmlCompat#fromHtml(String, int)}
* will be called (not used for formats different than HTML)
* @param relatedInfoService if given, handle hashtags to search for the term in the correct
* service
* @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle
* timestamps to open the stream in the popup player at the specific
* time
* @param disposables disposables created by the method are added here and their
* lifecycle should be handled by the calling class
* @param onCompletion will be run when setting text to the textView completes; use {@link
* #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
*/
public static void fromDescription(@NonNull final TextView textView,
@NonNull final Description description,
final int htmlCompatFlag,
@Nullable final StreamingService relatedInfoService,
@Nullable final String relatedStreamUrl,
@NonNull final CompositeDisposable disposables,
@Nullable final Consumer<TextView> onCompletion) {
switch (description.getType()) {
case Description.HTML:
TextLinkifier.fromHtml(textView, description.getContent(), htmlCompatFlag,
relatedInfoService, relatedStreamUrl, disposables, onCompletion);
break;
case Description.MARKDOWN:
TextLinkifier.fromMarkdown(textView, description.getContent(),
relatedInfoService, relatedStreamUrl, disposables, onCompletion);
break;
case Description.PLAIN_TEXT: default:
TextLinkifier.fromPlainText(textView, description.getContent(),
relatedInfoService, relatedStreamUrl, disposables, onCompletion);
break;
}
}
/**
* Create links for contents with an HTML description.
*
* <p>
* This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info,
* CompositeDisposable)} after having linked the URLs with
* This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,
* String, CompositeDisposable, Consumer)} after having linked the URLs with
* {@link HtmlCompat#fromHtml(String, int)}.
* </p>
*
* @param textView the {@link TextView} to set the the HTML string block linked
* @param htmlBlock the HTML string block to be linked
* @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, int)}
* will be called
* @param relatedInfo if given, handle timestamps to open the stream in the popup player at
* the specific time, and hashtags to search for the term in the correct
* service
* @param disposables disposables created by the method are added here and their lifecycle
* should be handled by the calling class
* @param textView the {@link TextView} to set the the HTML string block linked
* @param htmlBlock the HTML string block to be linked
* @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String,
* int)} will be called
* @param relatedInfoService if given, handle hashtags to search for the term in the correct
* service
* @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle
* timestamps to open the stream in the popup player at the specific
* time
* @param disposables disposables created by the method are added here and their
* lifecycle should be handled by the calling class
* @param onCompletion will be run when setting text to the textView completes; use {@link
* #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
*/
public static void createLinksFromHtmlBlock(@NonNull final TextView textView,
@NonNull final String htmlBlock,
final int htmlCompatFlag,
@Nullable final Info relatedInfo,
@NonNull final CompositeDisposable disposables) {
changeIntentsOfDescriptionLinks(textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag),
relatedInfo, disposables);
public static void fromHtml(@NonNull final TextView textView,
@NonNull final String htmlBlock,
final int htmlCompatFlag,
@Nullable final StreamingService relatedInfoService,
@Nullable final String relatedStreamUrl,
@NonNull final CompositeDisposable disposables,
@Nullable final Consumer<TextView> onCompletion) {
changeLinkIntents(
textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfoService,
relatedStreamUrl, disposables, onCompletion);
}
/**
* Create links for contents with a plain text description.
*
* <p>
* This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info,
* CompositeDisposable)} after having linked the URLs with {@link TextView#setAutoLinkMask(int)}
* and {@link TextView#setText(CharSequence, TextView.BufferType)}.
* This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,
* String, CompositeDisposable, Consumer)} after having linked the URLs with
* {@link TextView#setAutoLinkMask(int)} and
* {@link TextView#setText(CharSequence, TextView.BufferType)}.
* </p>
*
* @param textView the {@link TextView} to set the plain text block linked
* @param plainTextBlock the block of plain text to be linked
* @param relatedInfo if given, handle timestamps to open the stream in the popup player, at
* the specified time, and hashtags to search for the term in the correct
* service
* @param disposables disposables created by the method are added here and their lifecycle
* should be handled by the calling class
* @param textView the {@link TextView} to set the plain text block linked
* @param plainTextBlock the block of plain text to be linked
* @param relatedInfoService if given, handle hashtags to search for the term in the correct
* service
* @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle
* timestamps to open the stream in the popup player at the specific
* time
* @param disposables disposables created by the method are added here and their
* lifecycle should be handled by the calling class
* @param onCompletion will be run when setting text to the textView completes; use {@link
* #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
*/
public static void createLinksFromPlainText(@NonNull final TextView textView,
@NonNull final String plainTextBlock,
@Nullable final Info relatedInfo,
@NonNull final CompositeDisposable disposables) {
public static void fromPlainText(@NonNull final TextView textView,
@NonNull final String plainTextBlock,
@Nullable final StreamingService relatedInfoService,
@Nullable final String relatedStreamUrl,
@NonNull final CompositeDisposable disposables,
@Nullable final Consumer<TextView> onCompletion) {
textView.setAutoLinkMask(Linkify.WEB_URLS);
textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE);
changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables);
changeLinkIntents(textView, textView.getText(), relatedInfoService,
relatedStreamUrl, disposables, onCompletion);
}
/**
* Create links for contents with a markdown description.
*
* <p>
* This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info,
* CompositeDisposable)} after creating a {@link Markwon} object and using
* This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,
* String, CompositeDisposable, Consumer)} after creating a {@link Markwon} object and using
* {@link Markwon#setMarkdown(TextView, String)}.
* </p>
*
* @param textView the {@link TextView} to set the plain text block linked
* @param markdownBlock the block of markdown text to be linked
* @param relatedInfo if given, handle timestamps to open the stream in the popup player at
* the specific time, and hashtags to search for the term in the correct
* service
* @param disposables disposables created by the method are added here and their lifecycle
* should be handled by the calling class
* @param textView the {@link TextView} to set the plain text block linked
* @param markdownBlock the block of markdown text to be linked
* @param relatedInfoService if given, handle hashtags to search for the term in the correct
* service
* @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle
* timestamps to open the stream in the popup player at the specific
* time
* @param disposables disposables created by the method are added here and their
* lifecycle should be handled by the calling class
* @param onCompletion will be run when setting text to the textView completes; use {@link
* #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
*/
public static void createLinksFromMarkdownText(@NonNull final TextView textView,
final String markdownBlock,
@Nullable final Info relatedInfo,
final CompositeDisposable disposables) {
public static void fromMarkdown(@NonNull final TextView textView,
@NonNull final String markdownBlock,
@Nullable final StreamingService relatedInfoService,
@Nullable final String relatedStreamUrl,
@NonNull final CompositeDisposable disposables,
@Nullable final Consumer<TextView> onCompletion) {
final Markwon markwon = Markwon.builder(textView.getContext())
.usePlugin(LinkifyPlugin.create()).build();
changeIntentsOfDescriptionLinks(textView, markwon.toMarkdown(markdownBlock), relatedInfo,
disposables);
changeLinkIntents(textView, markwon.toMarkdown(markdownBlock),
relatedInfoService, relatedStreamUrl, disposables, onCompletion);
}
/**
@@ -131,9 +199,9 @@ public final class TextLinkifier {
* This method will also add click listeners on timestamps in this description, which will play
* the content in the popup player at the time indicated in the timestamp, by using
* {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder,
* StreamInfo, CompositeDisposable)} method and click listeners on hashtags, by using
* {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, Info)})},
* which will open a search on the current service with the hashtag.
* StreamingService, String, CompositeDisposable)} method and click listeners on hashtags, by
* using {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder,
* StreamingService)}, which will open a search on the current service with the hashtag.
* </p>
*
* <p>
@@ -141,20 +209,25 @@ public final class TextLinkifier {
* before opening a web link.
* </p>
*
* @param textView the {@link TextView} in which the converted {@link CharSequence} will be
* applied
* @param chars the {@link CharSequence} to be parsed
* @param relatedInfo if given, handle timestamps to open the stream in the popup player at the
* specific time, and hashtags to search for the term in the correct service
* @param disposables disposables created by the method are added here and their lifecycle
* should be handled by the calling class
* @param textView the {@link TextView} to which the converted {@link CharSequence}
* will be applied
* @param chars the {@link CharSequence} to be parsed
* @param relatedInfoService if given, handle hashtags to search for the term in the correct
* service
* @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle
* timestamps to open the stream in the popup player at the specific
* time
* @param disposables disposables created by the method are added here and their
* lifecycle should be handled by the calling class
* @param onCompletion will be run when setting text to the textView completes; use {@link
* #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
*/
private static void changeIntentsOfDescriptionLinks(
@NonNull final TextView textView,
@NonNull final CharSequence chars,
@Nullable final Info relatedInfo,
@NonNull final CompositeDisposable disposables) {
textView.setMovementMethod(LongPressLinkMovementMethod.getInstance());
private static void changeLinkIntents(@NonNull final TextView textView,
@NonNull final CharSequence chars,
@Nullable final StreamingService relatedInfoService,
@Nullable final String relatedStreamUrl,
@NonNull final CompositeDisposable disposables,
@Nullable final Consumer<TextView> onCompletion) {
disposables.add(Single.fromCallable(() -> {
final Context context = textView.getContext();
@@ -176,26 +249,26 @@ public final class TextLinkifier {
textBlockLinked.removeSpan(span);
}
if (relatedInfo != null) {
// add click actions on plain text timestamps only for description of
// contents, unneeded for meta-info or other TextViews
if (relatedInfo instanceof StreamInfo) {
// add click actions on plain text timestamps only for description of contents,
// unneeded for meta-info or other TextViews
if (relatedInfoService != null) {
if (relatedStreamUrl != null) {
addClickListenersOnTimestamps(context, textBlockLinked,
(StreamInfo) relatedInfo, disposables);
relatedInfoService, relatedStreamUrl, disposables);
}
addClickListenersOnHashtags(context, textBlockLinked, relatedInfo);
addClickListenersOnHashtags(context, textBlockLinked, relatedInfoService);
}
return textBlockLinked;
}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
textBlockLinked -> setTextViewCharSequence(textView, textBlockLinked),
textBlockLinked ->
setTextViewCharSequence(textView, textBlockLinked, onCompletion),
throwable -> {
Log.e(TAG, "Unable to linkify text", throwable);
// this should never happen, but if it does, just fallback to it
setTextViewCharSequence(textView, chars);
setTextViewCharSequence(textView, chars, onCompletion);
}));
}
@@ -213,12 +286,12 @@ public final class TextLinkifier {
* @param context the {@link Context} to use
* @param spannableDescription the {@link SpannableStringBuilder} with the text of the
* content description
* @param relatedInfo used to search for the term in the correct service
* @param relatedInfoService used to search for the term in the correct service
*/
private static void addClickListenersOnHashtags(
@NonNull final Context context,
@NonNull final SpannableStringBuilder spannableDescription,
@NonNull final Info relatedInfo) {
@NonNull final StreamingService relatedInfoService) {
final String descriptionText = spannableDescription.toString();
final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText);
@@ -231,8 +304,9 @@ public final class TextLinkifier {
// of an URL, already parsed before
if (spannableDescription.getSpans(hashtagStart, hashtagEnd,
LongPressClickableSpan.class).length == 0) {
final int serviceId = relatedInfoService.getServiceId();
spannableDescription.setSpan(
new HashtagLongPressClickableSpan(context, parsedHashtag, relatedInfo),
new HashtagLongPressClickableSpan(context, parsedHashtag, serviceId),
hashtagStart, hashtagEnd, 0);
}
}
@@ -251,14 +325,16 @@ public final class TextLinkifier {
* @param context the {@link Context} to use
* @param spannableDescription the {@link SpannableStringBuilder} with the text of the
* content description
* @param streamInfo what to open in the popup player when timestamps are clicked
* @param relatedInfoService the service of the {@code relatedStreamUrl}
* @param relatedStreamUrl what to open in the popup player when timestamps are clicked
* @param disposables disposables created by the method are added here and their
* lifecycle should be handled by the calling class
*/
private static void addClickListenersOnTimestamps(
@NonNull final Context context,
@NonNull final SpannableStringBuilder spannableDescription,
@NonNull final StreamInfo streamInfo,
@NonNull final StreamingService relatedInfoService,
@NonNull final String relatedStreamUrl,
@NonNull final CompositeDisposable disposables) {
final String descriptionText = spannableDescription.toString();
final Matcher timestampsMatches = TimestampExtractor.TIMESTAMPS_PATTERN.matcher(
@@ -272,8 +348,9 @@ public final class TextLinkifier {
continue;
}
spannableDescription.setSpan(new TimestampLongPressClickableSpan(
context, descriptionText, disposables, streamInfo, timestampMatchDTO),
spannableDescription.setSpan(
new TimestampLongPressClickableSpan(context, descriptionText, disposables,
relatedInfoService, relatedStreamUrl, timestampMatchDTO),
timestampMatchDTO.timestampStart(),
timestampMatchDTO.timestampEnd(),
0);
@@ -281,8 +358,12 @@ public final class TextLinkifier {
}
private static void setTextViewCharSequence(@NonNull final TextView textView,
@Nullable final CharSequence charSequence) {
@Nullable final CharSequence charSequence,
@Nullable final Consumer<TextView> onCompletion) {
textView.setText(charSequence);
textView.setVisibility(View.VISIBLE);
if (onCompletion != null) {
onCompletion.accept(textView);
}
}
}

View File

@@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
@@ -23,7 +22,9 @@ final class TimestampLongPressClickableSpan extends LongPressClickableSpan {
@NonNull
private final CompositeDisposable disposables;
@NonNull
private final StreamInfo streamInfo;
private final StreamingService relatedInfoService;
@NonNull
private final String relatedStreamUrl;
@NonNull
private final TimestampExtractor.TimestampMatchDTO timestampMatchDTO;
@@ -31,41 +32,43 @@ final class TimestampLongPressClickableSpan extends LongPressClickableSpan {
@NonNull final Context context,
@NonNull final String descriptionText,
@NonNull final CompositeDisposable disposables,
@NonNull final StreamInfo streamInfo,
@NonNull final StreamingService relatedInfoService,
@NonNull final String relatedStreamUrl,
@NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) {
this.context = context;
this.descriptionText = descriptionText;
this.disposables = disposables;
this.streamInfo = streamInfo;
this.relatedInfoService = relatedInfoService;
this.relatedStreamUrl = relatedStreamUrl;
this.timestampMatchDTO = timestampMatchDTO;
}
@Override
public void onClick(@NonNull final View view) {
playOnPopup(context, streamInfo.getUrl(), streamInfo.getService(),
playOnPopup(context, relatedStreamUrl, relatedInfoService,
timestampMatchDTO.seconds(), disposables);
}
@Override
public void onLongClick(@NonNull final View view) {
ShareUtils.copyToClipboard(context,
getTimestampTextToCopy(streamInfo, descriptionText, timestampMatchDTO));
ShareUtils.copyToClipboard(context, getTimestampTextToCopy(
relatedInfoService, relatedStreamUrl, descriptionText, timestampMatchDTO));
}
@NonNull
private static String getTimestampTextToCopy(
@NonNull final StreamInfo relatedInfo,
@NonNull final StreamingService relatedInfoService,
@NonNull final String relatedStreamUrl,
@NonNull final String descriptionText,
@NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) {
// TODO: use extractor methods to get timestamps when this feature will be implemented in it
final StreamingService streamingService = relatedInfo.getService();
if (streamingService == ServiceList.YouTube) {
return relatedInfo.getUrl() + "&t=" + timestampMatchDTO.seconds();
} else if (streamingService == ServiceList.SoundCloud
|| streamingService == ServiceList.MediaCCC) {
return relatedInfo.getUrl() + "#t=" + timestampMatchDTO.seconds();
} else if (streamingService == ServiceList.PeerTube) {
return relatedInfo.getUrl() + "?start=" + timestampMatchDTO.seconds();
if (relatedInfoService == ServiceList.YouTube) {
return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds();
} else if (relatedInfoService == ServiceList.SoundCloud
|| relatedInfoService == ServiceList.MediaCCC) {
return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds();
} else if (relatedInfoService == ServiceList.PeerTube) {
return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds();
}
// Return timestamp text for other services

View File

@@ -782,4 +782,6 @@
<string name="unset_playlist_thumbnail">إلغاء تعيين الصورة المصغرة الدائمة</string>
<string name="msg_failed_to_copy">فشل النسخ إلى الحافظة</string>
<string name="card">البطاقة</string>
<string name="playlist_add_stream_success_duplicate">تمت إضافة وقت (أوقات) مكررة %d</string>
<string name="duplicate_in_playlist">تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر.</string>
</resources>

View File

@@ -3,7 +3,7 @@
<string name="main_bg_subtitle">Başlamaq üçün böyüdücü güzgüyə toxun.</string>
<string name="upload_date_text">%1$s tarixində yayımlanıb</string>
<string name="no_player_found">Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\?</string>
<string name="no_player_found_toast">Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC\'ni quraşdıra bilərsiniz).</string>
<string name="no_player_found_toast">Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz).</string>
<string name="install">Yüklə</string>
<string name="cancel">Ləğv et</string>
<string name="open_in_browser">Brauzerdə aç</string>
@@ -12,59 +12,59 @@
<string name="controls_download_desc">Yayım faylını endir</string>
<string name="search">Axtarış</string>
<string name="settings">Tənzimləmələr</string>
<string name="did_you_mean">Bunu nəzərdə tuturdunuz: \"%1$s\"\?</string>
<string name="did_you_mean">Bunu demək istəyirdiniz: \"%1$s\"\?</string>
<string name="share_dialog_title">ilə paylaş</string>
<string name="use_external_video_player_title">Xarici video oynadıcı istifadə et</string>
<string name="use_external_video_player_summary">Bəzi qətnamələrdə səsi silir</string>
<string name="use_external_video_player_summary">Bəzi ayırdetmələrdə səsi silir</string>
<string name="use_external_audio_player_title">Xarici səs oynadıcı istifadə et</string>
<string name="subscribe_button_title">Abunə Ol</string>
<string name="subscribed_button_title">Abunə olundu</string>
<string name="channel_unsubscribed">Kanal abunəliyi ləğv edildi</string>
<string name="show_info">Məlumat göstər</string>
<string name="tab_subscriptions">Abunəliklər</string>
<string name="tab_subscriptions">Abunələr</string>
<string name="tab_bookmarks">Əlfəcinlənmiş Pleylistlər</string>
<string name="fragment_feed_title">Yeniliklər</string>
<string name="controls_background_title">Fon</string>
<string name="download_path_title">Video endirmə qovluğu</string>
<string name="download_path_summary">Endirilmiş video fayllar burada saxlanılır</string>
<string name="download_path_dialog_title">Video faylları üçün endirmə qovluğunu seç</string>
<string name="download_path_dialog_title">Video fayllar üçün endirmə qovluğu seç</string>
<string name="download_path_audio_title">Səs endirmə qovluğu</string>
<string name="download_path_audio_summary">Endirilmiş səs faylları burada saxlanılır</string>
<string name="download_path_audio_dialog_title">Səs faylları üçün endirmə qovluğu seç</string>
<string name="default_resolution_title">Defolt keyfiyyət</string>
<string name="show_higher_resolutions_title">Daha böyük keyfiyyət seçimləri göstər</string>
<string name="default_resolution_title">Standart ayırdetmə</string>
<string name="show_higher_resolutions_title">Daha böyük ayırdetmələr göstər</string>
<string name="play_with_kodi_title">\"Kodi\" ilə Oynat</string>
<string name="kore_not_found">Çatışmayan \"Kore\" tətbiqi yüklənilsin\?</string>
<string name="show_play_with_kodi_title">\"Kodi ilə Oynat\" seçimini göstər</string>
<string name="show_play_with_kodi_summary">Videonu Kodi media mərkəzi ilə oynatmaq üçün seçim göstər</string>
<string name="show_play_with_kodi_summary">Kodi media mərkəzindən video oynatmaq üçün seçim göstər</string>
<string name="play_audio">Səs</string>
<string name="default_audio_format_title">Defolt səs formatı</string>
<string name="default_video_format_title">Defolt video formatı</string>
<string name="default_audio_format_title">Standart səs formatı</string>
<string name="default_video_format_title">Standart video formatı</string>
<string name="theme_title">Tema</string>
<string name="light_theme_title">İşıqlı</string>
<string name="dark_theme_title">Qaranlıq</string>
<string name="black_theme_title">Qara</string>
<string name="unsubscribe">Abunəlikdən çıxın</string>
<string name="unsubscribe">Abunə olma</string>
<string name="open_in_popup_mode">Ani görüntü rejimində aç</string>
<string name="autoplay_title">Avtomatik oynat</string>
<string name="download_dialog_title">Endir</string>
<string name="resume_on_audio_focus_gain_summary">Fasilələrdən sonra (məsələn, telefon zəngləri) oynatmağa davam etdir</string>
<string name="download_dialog_title">Yüklə</string>
<string name="resume_on_audio_focus_gain_summary">Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam etdir</string>
<string name="resume_on_audio_focus_gain_title">Oynatmanı davam etdir</string>
<string name="enable_watch_history_summary">Baxılmış videoların saxlanılması</string>
<string name="settings_category_clear_data_title">Məlumat təmizlə</string>
<string name="enable_playback_state_lists_summary">Siyahılarda oynatma mövqelərini göstər</string>
<string name="enable_playback_state_lists_summary">Siyahılarda oynatma mövqe göstəricilərini göstər</string>
<string name="enable_playback_state_lists_title">Siyahılardakı mövqelər</string>
<string name="enable_playback_resume_summary">Son oynatma mövqeyini qaytar</string>
<string name="enable_playback_resume_title">Oynatmanı davam etdir</string>
<string name="enable_watch_history_title">Baxış tarixçəsi</string>
<string name="enable_search_history_summary">Axtarış sorğularını yerli olaraq saxla</string>
<string name="enable_search_history_title">Axtarış tarixçəsi</string>
<string name="show_search_suggestions_summary">Axtarış edərkən göstəriləcək təklifləri seç</string>
<string name="show_search_suggestions_summary">Axtarış zamanı göstərmək üçün təklifləri seç</string>
<string name="show_search_suggestions_title">Axtarış təklifləri</string>
<string name="brightness_gesture_control_summary">Oynadıcının parlaqlığını nizamlamaq üçün jestləri istifadə et</string>
<string name="brightness_gesture_control_title">Parlaqlığı jestlə nizamlamaq</string>
<string name="volume_gesture_control_summary">Oynadıcı səsini nizamlamaq üçün jestləri istifadə et</string>
<string name="volume_gesture_control_title">Səsi jest idarə etmək</string>
<string name="brightness_gesture_control_summary">Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et</string>
<string name="brightness_gesture_control_title">Parlaqlıq jesti idarəetməsi</string>
<string name="volume_gesture_control_summary">Oynadıcı səsini nizamlamaq üçün jestlər istifadə et</string>
<string name="volume_gesture_control_title">Səs səviyyəsi jesti idarəetməsi</string>
<string name="auto_queue_toggle">Avto-növbələ</string>
<string name="auto_queue_title">Növbəti Yayımı Avto-növbələ</string>
<string name="metadata_cache_wipe_complete_notice">Üst məlumat keşi silindi</string>
@@ -73,10 +73,10 @@
<string name="thumbnail_cache_wipe_complete_notice">Şəkil keşi silindi</string>
<string name="show_comments_summary">Şərhləri gizlətmək üçün bağla</string>
<string name="show_comments_title">Şərhləri göstər</string>
<string name="clear_queue_confirmation_description">Aktiv oynadıcının növbəsi dəyişdiriləcək</string>
<string name="clear_queue_confirmation_description">Aktiv oynadıcı növbəsi dəyişdiriləcək</string>
<string name="clear_queue_confirmation_summary">Bir oynadıcıdan digərinə keçid növbənizi dəyişdirə bilər</string>
<string name="clear_queue_confirmation_title">Növbəni təmizləməzdən əvvəl təsdiq üçün soruş</string>
<string name="use_inexact_seek_title">Sürətli qeyri-dəqiq axtarışdan istifadə et</string>
<string name="use_inexact_seek_title">Sürətli qeyri-dəqiq axtarış istifadə et</string>
<string name="use_inexact_seek_summary">Qeyri-dəqiq axtarış oynadıcıya azaldılmış dəqiqliklə mövqeləri daha sürətli axtarmağa imkan verir. 5, 15 və ya 25 saniyəlik axtarış bununla işləmir</string>
<string name="seek_duration_title">Sürətli irəli/geri çəkmə axtarış müddəti</string>
<string name="notification_action_nothing">Heç nə</string>
@@ -89,9 +89,9 @@
<string name="notification_action_1_title">İkinci fəaliyyət düyməsi</string>
<string name="notification_action_0_title">Birinci fəaliyyət düyməsi</string>
<string name="show_higher_resolutions_summary">Yalnız bəzi cihazlar 2K/4K videoları oynada bilir</string>
<string name="default_popup_resolution_title">Defolt ani pəncərə keyfiyyəti</string>
<string name="default_popup_resolution_title">Standart ani görüntü ayırdetməsi</string>
<string name="controls_add_to_playlist_title">Əlavə Et</string>
<string name="controls_popup_title">Ani Pəncərə</string>
<string name="controls_popup_title">Ani Görüntü</string>
<string name="tab_choose">Paneli Seç</string>
<string name="subscription_update_failed">Abunəliyi yeniləmək alınmadı</string>
<string name="subscription_change_failed">Abunəliyi dəyişmək alınmadı</string>
@@ -102,7 +102,7 @@
<string name="show_age_restricted_content_summary">Yaş həddi səbəbiylə (məsələn, 18+) uşaqlar üçün uyğun olmayan məzmunu göstər</string>
<string name="show_age_restricted_content_title">Yaş məhdudiyyətli məzmunu göstər</string>
<string name="content">Məzmun</string>
<string name="popup_playing_toast">Ani pəncərə rejimində oynadılır</string>
<string name="popup_playing_toast">Ani görüntü rejimində oynadılır</string>
<string name="background_player_playing_toast">Fonda oynadılır</string>
<string name="settings_category_updates_title">Yeniləmələr</string>
<string name="settings_category_debug_title">Sazlama</string>
@@ -111,23 +111,23 @@
<string name="settings_category_video_audio_title">Video və səs</string>
<string name="settings_category_player_behavior_title">Davranış</string>
<string name="settings_category_player_title">Oynadıcı</string>
<string name="content_language_title">Defolt məzmun dili</string>
<string name="default_content_country_title">Defolt məzmun ölkəsi</string>
<string name="content_language_title">Cari məzmun dili</string>
<string name="default_content_country_title">Cari məzmun ölkəsi</string>
<string name="unsupported_url_dialog_message">URL\'i tanımaq olmadı. Başqa tətbiqlə açılsın\?</string>
<string name="unsupported_url">Dəstəklənməyən URL\'i</string>
<string name="show_hold_to_append_title">\"Növbələmək üçün basılı saxla\" tövsiyəsin göstər</string>
<string name="show_next_and_similar_title">\"Növbəti\" və \"Bənzər\" videoları göstər</string>
<string name="export_data_summary">Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac edin</string>
<string name="export_data_summary">Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac et</string>
<string name="import_data_summary">Cari tarixçənizi, abunəliklərinizi, pleylistlərinizi və (könüllü) tənzimləmələrinizi etibarsız edir</string>
<string name="recaptcha_cookies_cleared">reCAPTCHA kukiləri təmizləndi</string>
<string name="clear_cookie_title">reCAPTCHA kukilərini təmizlə</string>
<string name="recaptcha_cookies_cleared">reCAPTCHA bazaları təmizləndi</string>
<string name="clear_cookie_title">reCAPTCHA bazalarını təmizlə</string>
<string name="export_data_title">Məlumat bazasını ixrac et</string>
<string name="import_data_title">Məlumat bazasını idxal et</string>
<string name="switch_to_main">Əsas Görünüşə Keçid</string>
<string name="switch_to_popup">Ani Pəncərəyə Keçid</string>
<string name="switch_to_popup">Ani Görüntüyə Keçid</string>
<string name="switch_to_background">Fona Keçid</string>
<string name="unknown_content">[Naməlum]</string>
<string name="app_update_notification_channel_description">Yeni \"NewPipe\" versiyası üçün bildirişlər</string>
<string name="app_update_notification_channel_description">Yeni \"NewPipe\" versiyaları üçün bildirişlər</string>
<string name="app_update_notification_channel_name">Tətbiq yeniləmə bildirişi</string>
<string name="notification_channel_description">NewPipe oynadıcısı üçün bildirişlər</string>
<string name="all">Hamısı</string>
@@ -141,7 +141,7 @@
<string name="youtube_restricted_mode_enabled_summary">YouTube potensial yetkin məzmunu gizlədən \"Məhdud Rejim\" təmin edir</string>
<string name="peertube_instance_url_title">\"PeerTube\" nümunələri</string>
<string name="download_thumbnail_title">Miniatürləri yüklə</string>
<string name="notification_actions_at_most_three">Siz yığcam bildirişdə göstərilməsi üçün ən çoxu üç fəaliyyət seçə bilərsiniz!</string>
<string name="notification_actions_at_most_three">Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz!</string>
<string name="feed_update_threshold_option_always_update">Həmişə yenilə</string>
<string name="settings_category_feed_title">Axın</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Yalnız qruplaşdırılmamış abunəlikləri göstər</string>
@@ -153,7 +153,7 @@
<item quantity="other">%d seçildi</item>
</plurals>
<string name="feed_group_dialog_empty_selection">Abunəlik seçilməyib</string>
<string name="feed_group_dialog_select_subscriptions">Abunəlikləri seçin</string>
<string name="feed_group_dialog_select_subscriptions">Abunəlikləri seç</string>
<string name="feed_processing_message">Axın emal edilir…</string>
<string name="feed_notification_loading">Axın yüklənir…</string>
<string name="feed_subscription_not_loaded_count">Yüklənmədi: %d</string>
@@ -179,8 +179,8 @@
<string name="general_error">Xəta</string>
<string name="search_history_deleted">Axtarış tarixçəsi silindi</string>
<string name="delete_search_history_alert">Bütün axtarış tarixçəsi silinsin\?</string>
<string name="clear_search_history_summary">Açar sözləri axtarışının tarixçəsini silir</string>
<string name="clear_search_history_title">Axtarış tarixçəsini silin</string>
<string name="clear_search_history_summary">Açar sözləri axtarışı tarixçəsini silir</string>
<string name="clear_search_history_title">Axtarış tarixçəsini sil</string>
<string name="watch_history_states_deleted">Oynatma mövqeləri silindi</string>
<string name="delete_playback_states_alert">Bütün oynatma mövqeləri silinsin\?</string>
<string name="clear_playback_states_summary">Bütün oynatma mövqelərini silir</string>
@@ -188,7 +188,7 @@
<string name="watch_history_deleted">Baxış tarixçəsi silindi</string>
<string name="delete_view_history_alert">Bütün baxış tarixçəsi silinsin\?</string>
<string name="clear_views_history_title">Baxış tarixçəsini təmizlə</string>
<string name="clear_cookie_summary">reCAPTCHA həll edərkən NewPipe\'ın saxladığı kukiləri silin</string>
<string name="clear_cookie_summary">reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil</string>
<string name="channel_created_by">%s tərəfindən yaradıldı</string>
<string name="resize_zoom">Yaxınlaşdır</string>
<string name="resize_fill">Doldur</string>
@@ -198,22 +198,22 @@
<string name="no_channel_subscribed_yet">Hələ ki, kanal abunəliyi yoxdur</string>
<string name="select_a_channel">Kanal seç</string>
<string name="channel_page_summary">Kanal Səhifəsi</string>
<string name="default_kiosk_page_summary">Defolt Köşk</string>
<string name="kiosk_page_summary">Köşk Səhifəsi</string>
<string name="default_kiosk_page_summary">Standart Köşk</string>
<string name="kiosk_page_summary">Köşk Səhifə</string>
<string name="blank_page_summary">Boş Səhifə</string>
<string name="main_page_content_summary">Əsas səhifədə hansı tablar göstərilir</string>
<string name="main_page_content">Əsas səhifənin məzmunu</string>
<string name="main_page_content">Əsas səhifə məzmunu</string>
<string name="updates_setting_description">Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər</string>
<string name="updates_setting_title">Yeniləmələr</string>
<string name="limit_mobile_data_usage_title">Mobil internet istifadə edərkən görüntü keyfiyyətini məhdudlaşdır</string>
<string name="limit_mobile_data_usage_title">Mobil internet istifadə edərkən ayırdetməni məhdudlaşdır</string>
<string name="limit_data_usage_none_description">Limitsiz</string>
<string name="one_item_deleted">1 element silindi.</string>
<string name="peertube_instance_add_title">Nümunə əlavə et</string>
<string name="peertube_instance_url_summary">Sevimli \"PeerTube\" nümunələrinizi seçin</string>
<string name="delete_downloaded_files">Endirilmiş faylları silin</string>
<string name="confirm_prompt">Endirmə tarixçənizi təmizləmək və ya endirilmiş bütün faylları silmək istəyirsiniz\?</string>
<string name="delete_downloaded_files">Endirilmiş faylları sil</string>
<string name="confirm_prompt">Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz\?</string>
<string name="clear_download_history">Endirmə tarixçəsini təmizlə</string>
<string name="start_downloads">Endirmələrə başla</string>
<string name="start_downloads">Endirmələri başlat</string>
<string name="pause_downloads">Endirmələri dayandır</string>
<string name="downloads_storage_ask_title">Haraya endiriləcəyini soruş</string>
<string name="downloads_storage_ask_summary">Sizdən hər endirmənin harada saxlanılacağı soruşulacaq.
@@ -241,13 +241,13 @@
<string name="feed_update_threshold_title">Axın yeniləmə astanası</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Sürətli rejimi aktivləşdir</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Sürətli rejimi deaktiv et</string>
<string name="feed_use_dedicated_fetch_method_help_text">Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdən dəyişə və ya aşağıdakı düyməni basa bilərsiniz).
<string name="feed_use_dedicated_fetch_method_help_text">Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdə dəyişə və ya aşağıdakı düyməni basa bilərsiniz).
\n
\nNewPipe axını yükləmək üçün 2 metod təklif edir:
\n• Bütün abunəlik kanallarını gətirtmək, bu yavaş olsa da tamdır;
\n• Ayrılmış xidmət uc nöqtəsi istifadə etmək, bu sürətlidir, amma tam deyil.
\n
\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az element gətirir.
\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az elementlər gətirir.
\n
\nYouTube öz RSS axını ilə bu sürətli metodu təklif edən xidmətlərdən biridir.
\n
@@ -262,9 +262,9 @@
<string name="download_to_sdcard_error_title">Xarici yaddaş əlçatan deyil</string>
<string name="clear_views_history_summary">Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir</string>
<string name="show_meta_info_title">Üst məlumatı göstər</string>
<string name="show_description_summary">Video açıqlamasını və əlavə məlumatı gizlətmək üçün bağla</string>
<string name="show_description_summary">Video açıqlamanı və əlavə məlumatı gizlətmək üçün bağla</string>
<string name="show_description_title">ıqlamanı göstər</string>
<string name="notification_colorize_title">Bildirişi rəngləndir</string>
<string name="notification_colorize_title">Bildirişi rənglə</string>
<string name="invalid_directory">Belə qovluq yoxdur</string>
<string name="start_main_player_fullscreen_title">Əsas oynadıcını tam ekranda başlat</string>
<string name="external_player_unsupported_link_type">Xarici oynadıcılar bu cür linkləri dəstəkləmir</string>
@@ -281,7 +281,7 @@
<string name="description_tab_description">ıqlama</string>
<string name="empty_list_subtitle">Burada kriketlərdən başqa heç nə yoxdur</string>
<string name="search_no_results">Nəticə yoxdur</string>
<string name="restore_defaults">İlkin tənzimləmələri qaytar</string>
<string name="restore_defaults">Standartları qaytar</string>
<string name="missing_file">Fayl köçürüldü və ya silindi</string>
<string name="player_recoverable_failure">Oynadıcı xətası bərpa edilir</string>
<string name="player_unrecoverable_failure">Bərpa olunmayan oynatma xətası baş verdi</string>
@@ -291,28 +291,28 @@
<string name="audio_streams_empty">Səs yayımı tapılmadı</string>
<string name="permission_display_over_apps">Digər tətbiqlərin üzərində göstərməyə icazə ver</string>
<string name="restore_defaults_confirmation">İlkin tənzimləmələri qaytarmaq istəyirsiniz\?</string>
<string name="download_thumbnail_summary">Miniatürlərin yüklənsini, dataya qənaət etmək və yaddaşdan istifadəni azaltmaq üçün söndürün. Dəyişikliklər həm yaddaşdaxili, həm də diskdə olan təsvir keşini təmizləyir</string>
<string name="download_thumbnail_summary">Miniatürləri yükləməyi, məlumata qənaət və yaddaş istifadəsin azaltmaq üçün söndür. Dəyişikliklər həm yaddaşdaxilində, həm də diskdə təsvir keşini təmizləyir</string>
<string name="enqueue_next_stream">Növbətini növbələ</string>
<string name="retry">Yenidən Cəhd Et</string>
<string name="retry">Təkrar Cəhd Et</string>
<string name="settings_category_player_notification_summary">Cari oynatma yayımı bildirişini konfiqurasiya et</string>
<string name="notifications">Bildirişlər</string>
<string name="hash_channel_name">Video fayl xülasəsi bildirişi</string>
<string name="streams_notification_channel_description">Abunəliklər üçün yeni yayımlar haqqında bildirişlər</string>
<string name="error_report_channel_description">Xəta hesabatları üçün bildirişlər</string>
<string name="file_name_empty_error">Fayl adı boş ola bilməz</string>
<string name="saved_tabs_invalid_json">Yadda saxlanmış tabları oxumaq mümkün olmadı, buna görə defolt tablardan istifadə edin</string>
<string name="saved_tabs_invalid_json">Saxlanmış tabları oxumaq mümkün olmadı, buna görə standart tabları istifadə et</string>
<string name="error_report_notification_title">NewPipe xəta ilə qarşılaşdı, bildirmək üçün toxun</string>
<string name="sorry_string">Bağışlayın, o baş verməməli idi.</string>
<string name="error_report_button_text">Bu xətanı e-poçt vasitəsilə bildirin</string>
<string name="error_report_open_issue_button_text">GitHub\'da Hesabat Ver</string>
<string name="sorry_string">Bağışla, o baş verməməli idi.</string>
<string name="error_report_button_text">Bu xətanı e-poçt-dan bildir</string>
<string name="error_report_open_issue_button_text">GitHub\'da Məlumat Ver</string>
<string name="error_report_open_github_notice">Zəhmət olmasa, xətanızı müzakirə edən məsələnin mövcud olub-olmadığını yoxlayın. Dublikat biletləri yaradarkən, bizdən faktiki səhvi düzəltməyə sərf edəcəyimiz vaxt alırsınız.</string>
<string name="error_snackbar_action">Hesabat Bildir</string>
<string name="error_snackbar_action">Məlumat Ver</string>
<string name="what_device_headline">Məlumat:</string>
<string name="what_happened_headline">Nə baş verdi:</string>
<string name="detail_uploader_thumbnail_view_description">Yükləyənin avatar miniatürü</string>
<string name="detail_likes_img_view_description">Bəyən</string>
<string name="detail_dislikes_img_view_description">Bəyənmə</string>
<string name="detail_drag_description">Yenidən sıralamaq üçün sürüşdür</string>
<string name="detail_drag_description">Yenidən sıralamaq üçün sürüklə</string>
<string name="short_thousand">min</string>
<string name="short_million">Mln</string>
<string name="short_billion">Mlrd</string>
@@ -324,13 +324,13 @@
<string name="no_videos">Video yoxdur</string>
<string name="comments_are_disabled">Şərhlər qeyri-aktivdir</string>
<string name="start">Başlat</string>
<string name="pause">Fasilə</string>
<string name="pause">Dayandır</string>
<string name="checksum">Təsdiqləmə</string>
<string name="dismiss">İmtina</string>
<string name="msg_error">Xəta</string>
<string name="msg_running_detail">Detallar üçün toxun</string>
<string name="msg_wait">Zəhmət olmasa, gözləyin…</string>
<string name="no_dir_yet">Hələ endirmə qovluğu təyin edilməyib, indi defolt endirmə qovluğunu seç</string>
<string name="no_dir_yet">Hələ endirmə qovluğu təyin edilməyib, indi standart endirmə qovluğu seç</string>
<string name="title_activity_recaptcha">reCAPTCHA çağırışı</string>
<string name="recaptcha_request_toast">reCAPTCHA sorğusu göndərildi</string>
<string name="recaptcha_done_button">Bitdi</string>
@@ -340,15 +340,15 @@
<string name="title_licenses">Üçüncü Tərəf Lisenziyaları</string>
<string name="tab_about">Haqqında &amp; T-TSS</string>
<string name="contribution_title">Töhfə Ver</string>
<string name="contribution_encouragement">Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kodun təmizlənməsi və ya real ağırlıqlı kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar!</string>
<string name="contribution_encouragement">Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kod təmizlənməsi və ya real ağır kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar!</string>
<string name="give_back">İanə Et</string>
<string name="website_title">Veb sayt</string>
<string name="website_encouragement">Əlavə məlumat və xəbərlər üçün NewPipe Veb saytına daxil olun.</string>
<string name="privacy_policy_title">NewPipe\'ın Məxfilik Siyasəti</string>
<string name="privacy_policy_encouragement">NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Buna görə də, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır.
\nNewPipe\'ın məxfilik siyasəti qəza hesabatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir.</string>
<string name="read_privacy_policy">Məxfilik siyasətini oxu</string>
<string name="app_license_title">NewPipe\'ın Lisenziyası</string>
<string name="website_encouragement">Əlavə məlumat və xəbərlər üçün NewPipe Veb saytını ziyarət et.</string>
<string name="privacy_policy_title">NewPipe Məxfilik Siyasəti</string>
<string name="privacy_policy_encouragement">NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Nəticə etibarı ilə, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır.
\nNewPipe məxfilik siyasəti xəta məlumatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir.</string>
<string name="read_privacy_policy">Məxfilik Siyasətini Oxu</string>
<string name="app_license_title">NewPipe Lisenziyası</string>
<string name="action_history">Tarixçə</string>
<string name="delete_item_search_history">Bu elementi axtarış tarixçəsindən silmək istəyirsiniz\?</string>
<string name="title_last_played">Son Oynadılan</string>
@@ -367,7 +367,7 @@
<string name="title_activity_play_queue">Oynatma növbəsi</string>
<string name="play_queue_stream_detail">Detallar</string>
<string name="show_channel_details">Kanal təfərrüatlarını göstər</string>
<string name="start_here_on_popup">Ani pəncərədə oynatmağa başla</string>
<string name="start_here_on_popup">Ani görüntüdə oynatmağa başla</string>
<string name="preferred_open_action_settings_title">\"Açıq\" fəaliyyətə üstünlük verilir</string>
<string name="background_player">Fon oynadıcı</string>
<string name="always_ask_open_action">Həmişə soruş</string>
@@ -403,7 +403,7 @@
\nDavam etmək istəyirsiniz\?</string>
<string name="skip_silence_checkbox">Səssizlik zamanı sürətlə irəli</string>
<string name="enable_streams_notifications_title">Yeni yayım bildirişləri</string>
<string name="enable_streams_notifications_summary">Abunəliklərdən yeni yayımlar haqqında bildiriş göndər</string>
<string name="enable_streams_notifications_summary">Abunəliklərdən yeni yayımlar haqqında bildir</string>
<string name="streams_notifications_interval_title">Yoxlama tezliyi</string>
<string name="streams_notifications_network_title">Tələb olunan şəbəkə bağlantısı</string>
<string name="any_network">İstənilən şəbəkə</string>
@@ -426,7 +426,7 @@
<string name="content_not_supported">Bu məzmun hələ NewPipe tərəfindən dəstəklənmir.
\n
\nÜmid edirik ki, gələcək versiyada dəstəklənəcək.</string>
<string name="show_thumbnail_summary">Həm kilid ekranı fonu, həm də bildirişlər üçün miniatürdən istifadə et</string>
<string name="show_thumbnail_summary">Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et</string>
<string name="recent">Ən Yeni</string>
<string name="georestricted_content">Bu məzmun ölkənizdə mövcud deyil.</string>
<string name="paid_content">Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlana və ya endirilə bilməz.</string>
@@ -468,10 +468,10 @@
<string name="notification_colorize_summary">Android\'in bildiriş rəngini miniatürdəki əsas rəngə uyğun fərdiləşdirməsini təmin et (qeyd edək ki, bu, bütün cihazlarda mövcud deyil)</string>
<string name="view_on_github">GitHub\'da Bax</string>
<string name="donation_title">İanə Et</string>
<string name="donation_encouragement">NewPipe, sizə ən yaxşı istifadəçi təcrübəsini göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin.</string>
<string name="donation_encouragement">NewPipe, sizə ən yaxşı istifadəçi təcrübəsi göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin.</string>
<string name="most_liked">Ən çox bəyənildi</string>
<string name="enqueued">Növbəyə salındı</string>
<string name="preferred_open_action_settings_summary">Məzmunu açarkən defolt hərəkət — %s</string>
<string name="preferred_open_action_settings_summary">Məzmunu açarkən standart hərəkət — %s</string>
<string name="name">Ad</string>
<string name="set_as_playlist_thumbnail">Pleylist miniatürü kimi təyin et</string>
<string name="wifi_only">Yalnız Wi-Fi\'da</string>
@@ -488,7 +488,7 @@
<string name="metadata_licence">Lisenziya</string>
<string name="feed_load_error_terminated">Müəllifin hesabı bağlanıb.
\nNewPipe gələcəkdə bu axını yükləyə bilməyəcək.
\nBu kanala abunəlikdən çıxmaq istəyirsiniz\?</string>
\nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\?</string>
<string name="feed_toggle_show_played_items">Baxılan elementləri göstər</string>
<string name="featured">Seçilmiş</string>
<string name="drawer_close">Çəkməcəni Bağla</string>
@@ -496,12 +496,12 @@
<string name="hash_channel_description">Video fayl xülasəsi prosesi üçün bildirişlər</string>
<string name="on"></string>
<string name="notification_scale_to_square_image_title">Miniatürü 1:1 görünüş nisbətinə kəs</string>
<string name="progressive_load_interval_summary">Yükləmə intervalının həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcının yenidən başladılmasını tələb edir</string>
<string name="show_meta_info_summary">Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndürün</string>
<string name="progressive_load_interval_summary">Yükləmə intervalı həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcını yenidən başlatmağı tələb edir</string>
<string name="show_meta_info_summary">Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndür</string>
<string name="auto_queue_summary">Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir</string>
<string name="remote_search_suggestions">Kənar axtarış təklifləri</string>
<string name="peertube_instance_add_exists">Nümunə artıq mövcuddur</string>
<string name="start_main_player_fullscreen_summary">Videoları mini oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz</string>
<string name="start_main_player_fullscreen_summary">Videoları kiçik oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz</string>
<string name="more_than_100_videos">100+ video</string>
<string name="infinite_videos">∞ video</string>
<string name="no_comments">Şərhlər yoxdur</string>
@@ -532,7 +532,7 @@
<string name="metadata_tags">Etiketlər</string>
<string name="tablet_mode_title">Planşet rejimi</string>
<string name="off">Bağla</string>
<string name="detail_heart_img_view_description">Müəllifə ürəkləndi</string>
<string name="detail_heart_img_view_description">Müəllifdən ürəkləndi</string>
<string name="open_website_license">Veb saytı</string>
<plurals name="views">
<item quantity="one">%s baxış</item>
@@ -550,11 +550,11 @@
<item quantity="one">Endirmə tamamlandı</item>
<item quantity="other">%s endirmə tamamlandı</item>
</plurals>
<string name="progressive_load_interval_exoplayer_default">Defolt ExoPlayer</string>
<string name="progressive_load_interval_exoplayer_default">Standart ExoPlayer</string>
<string name="feed_use_dedicated_fetch_method_title">Mövcud olduqda xüsusi axından al</string>
<string name="remove_watched_popup_title">Baxılmış videolar silinsin\?</string>
<string name="remove_watched">İzləniləni sil</string>
<string name="downloads_storage_use_saf_title">Sistem qovluğu seçicisini (SAF) istifadə edin</string>
<string name="downloads_storage_use_saf_title">Sistem qovluğu seçicisini (SAF) istifadə et</string>
<string name="error_timeout">Bağlantı fasiləsi</string>
<string name="error_insufficient_storage">Cihazda yer qalmayıb</string>
<string name="error_postprocessing_stopped">Fayl üzərində işləyərkən NewPipe bağlandı</string>
@@ -582,7 +582,7 @@
<string name="import_ongoing">İdxal edilir…</string>
<string name="playlist_add_stream_success">Pleylistə salındı</string>
<string name="mute">Səsi bağla</string>
<string name="popup_player">Ani pəncərə oynadıcı</string>
<string name="popup_player">Ani görüntü oynadıcı</string>
<string name="drawer_open">Çəkməcəni Aç</string>
<string name="hold_to_append">Növbələşdirmək üçün basılı tut</string>
<string name="play_queue_remove">Sil</string>
@@ -590,7 +590,7 @@
<string name="copyright">© %1$s, %2$s tərəfindən %3$s altında</string>
<string name="toast_no_player">Bu faylı oynatmaq üçün heç bir tətbiq quraşdırılmayıb</string>
<string name="settings_category_downloads_title">Endirmə</string>
<string name="msg_popup_permission">Bu icazə, ani pəncərə rejimində
<string name="msg_popup_permission">Bu icazə, ani görüntü rejimində
\naçmaq üçün lazımdır</string>
<string name="msg_copied">Buferə kopyalandı</string>
<string name="msg_threads">Parçalar</string>
@@ -608,22 +608,22 @@
<string name="peertube_instance_add_help">Nümunə URL\'sini daxil et</string>
<string name="peertube_instance_add_fail">Nümunəni doğrulamaq mümkün olmadı</string>
<string name="peertube_instance_url_help">%s-də bəyəndiyiniz nümunələri tapın</string>
<string name="show_hold_to_append_summary">Video \"Təfsilatlar:\"səhifəsində fon və ya ani pəncərə düyməsini basarkən ipucu göstər</string>
<string name="caption_setting_description">Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdirin. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur</string>
<string name="show_hold_to_append_summary">Video \"Təfsilatlar:\"səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər</string>
<string name="caption_setting_description">Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur</string>
<string name="error_occurred_detail">Xəta baş verdi: %1$s</string>
<string name="invalid_file">Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur</string>
<string name="parsing_error">Veb saytı təhlil etmək alınmadı</string>
<string name="playback_pitch">Ucalıq</string>
<string name="radio">Radio</string>
<string name="show_crash_the_player_title">\"Oynadıcını çökdür\" Göstər</string>
<string name="show_crash_the_player_summary">Oynadıcıdan istifadə edərkən çökdürmə seçimini göstər</string>
<string name="show_crash_the_player_summary">Oynadıcını istifadə edərkən çökdürmə seçimini göstər</string>
<string name="show_error_snackbar">Xəta balonu göstər</string>
<string name="create_error_notification">Xəta bildirişi yarat</string>
<string name="import_from">Burdan idxal edin</string>
<string name="export_to">Bura ixrac edin</string>
<string name="import_from">Burdan idxal et</string>
<string name="export_to">Bura ixrac et</string>
<string name="import_file_title">Faylı idxal et</string>
<string name="subscriptions_import_unsuccessful">Abunəlikləri idxal etmək mümkün olmadı</string>
<string name="start_accept_privacy_policy">Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe\'ın məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatını bizə göndərmək üçün onu qəbul etməlisiniz.</string>
<string name="start_accept_privacy_policy">Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatın bizə göndərmək üçün qəbul etməlisiniz.</string>
<string name="overwrite_unrelated_warning">Bu adda fayl artıq mövcuddur</string>
<string name="download_already_pending">Bu adla gözlənilən bir endirmə var</string>
<string name="error_path_creation">Təyinat qovluğu yaradıla bilməz</string>
@@ -643,7 +643,7 @@
<string name="metadata_language">Dil</string>
<string name="metadata_privacy_public">İctimai</string>
<string name="subscribers_count_not_available">Abunəçi sayı əlçatan deyil</string>
<string name="read_full_license">Lisenziyanı oxuyun</string>
<string name="read_full_license">Lisenziyanı Oxu</string>
<string name="title_activity_history">Tarixçə</string>
<string name="charset_letters_and_digits">Hərflər və rəqəmlər</string>
<string name="crash_the_player">Oynadıcını çökdür</string>
@@ -651,18 +651,18 @@
<string name="settings_category_player_notification_title">Oynadıcı bildirişi</string>
<string name="streams_notification_channel_name">Yeni yayımlar</string>
<string name="error_report_channel_name">Xəta hesabatı bildirişi</string>
<string name="youtube_signature_deobfuscation_error">Video URL\'i imzasının şifrəsi qırılmadı</string>
<string name="no_streams_available_download">Endirmək üçün heç bir yayım yoxdur</string>
<string name="error_report_notification_toast">Xəta baş verdi, bildirişə baxın</string>
<string name="youtube_signature_deobfuscation_error">Video URL\'i imzası şifrəsi qırılmadı</string>
<string name="no_streams_available_download">Endirmək üçün yayım mövcud deyil</string>
<string name="error_report_notification_toast">Xəta baş verdi, bildirişi gör</string>
<string name="your_comment">Şərhiniz (İngiliscə):</string>
<string name="detail_thumbnail_view_description">Video oynat, müddət:</string>
<string name="no_available_dir">Zəhmət olmasa, daha sonra tənzimləmələrdə endirmə qovluğunu təyin et</string>
<string name="no_available_dir">Zəhmət olmasa, endirmə qovluğunu daha sonra tənzimləmələrdə təyin et</string>
<string name="msg_running">NewPipe Endirilir</string>
<string name="msg_calculating_hash">Hash hesablanır</string>
<string name="settings_file_charset_title">Fayl adlarında icazə verilən simvollar</string>
<string name="title_activity_about">NewPipe Haqqında</string>
<string name="tab_licenses">Lisenziyalar</string>
<string name="app_license">NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziyanın şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz.</string>
<string name="app_license">NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziya şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz.</string>
<string name="export_complete_toast">İxrac edildi</string>
<string name="main_page_content_swipe_remove">Elementləri silmək üçün sürüşdür</string>
<string name="no_playlist_bookmarked_yet">Hələ,əlfəcinlənmiş pleylistlər yoxdur</string>
@@ -705,7 +705,7 @@
<string name="youtube_music_premium_content">Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil.</string>
<string name="description_select_note">İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və keçidlər kliklənməyə bilər.</string>
<string name="notification_scale_to_square_image_summary">Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs</string>
<string name="notification_actions_summary">Aşağıdakı bildiriş fəaliyyətini hər birinin üzərinə toxunaraq redaktə edin. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərilməsi üçün onların üçə qədərini seç</string>
<string name="notification_actions_summary">Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç</string>
<string name="invalid_source">Belə fayl/məzmun mənbəyi yoxdur</string>
<string name="selected_stream_external_player_not_supported">Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir</string>
<string name="streams_not_yet_supported_removed">Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir</string>
@@ -718,7 +718,7 @@
<string name="feed_toggle_show_future_items">Gələcək elementləri göstər</string>
<string name="feed_toggle_hide_played_items">Baxılan elementləri gizlət</string>
<string name="feed_toggle_hide_future_items">Gələcək elementləri gizlət</string>
<string name="faq_description">Tətbiqdən istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabların yoxlanıldığına əmin olun!</string>
<string name="faq_description">Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun!</string>
<string name="faq_title">Tez-tez soruşulan suallar</string>
<string name="faq">Veb Saytında bax</string>
<string name="sort">Çeşidlə</string>
@@ -730,4 +730,6 @@
<string name="unset_playlist_thumbnail">Daimi miniatürü ləğv et</string>
<string name="card">Kart</string>
<string name="msg_failed_to_copy">Buferə kopyalamaq alınmadı</string>
<string name="duplicate_in_playlist">Boz rəngdə olan pleylistlərdə artıq bu element var.</string>
<string name="playlist_add_stream_success_duplicate">Dublikat %d dəfə əlavə edildi</string>
</resources>

View File

@@ -11,16 +11,16 @@
<string name="settings">Nastavení</string>
<string name="did_you_mean">Mysleli jste „%1$s“\?</string>
<string name="share_dialog_title">Sdílet s</string>
<string name="use_external_video_player_title">Použít externí video přehrávač</string>
<string name="use_external_video_player_title">Použít externí přehrávač videí</string>
<string name="use_external_audio_player_title">Použít externí audio přehrávač</string>
<string name="download_path_audio_summary">Stažené audio je uloženo zde</string>
<string name="download_path_audio_summary">Sem bude ukládáno stažené audio</string>
<string name="download_path_audio_dialog_title">Zvolte adresář pro stažené audio soubory</string>
<string name="download_path_audio_title">Adresář pro stažené audio</string>
<string name="default_resolution_title">Výchozí rozlišení</string>
<string name="play_with_kodi_title">Přehrát pomocí Kodi</string>
<string name="kore_not_found">Nainstalovat chybějící aplikaci Kore\?</string>
<string name="download_path_title">Adresář pro stažená videa</string>
<string name="download_path_summary">Stažená videa jsou uložena tady</string>
<string name="download_path_summary">Sem budou ukládána stažená videa</string>
<string name="download_path_dialog_title">Zvolte adresář pro stažená videa</string>
<string name="show_play_with_kodi_title">Zobrazit možnost „Přehrát pomocí Kodi“</string>
<string name="show_play_with_kodi_summary">Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi</string>
@@ -213,7 +213,7 @@
<string name="no_valid_zip_file">Žádný platný soubor ZIP</string>
<string name="could_not_import_all_files">Upozornění: Nelze importovat všechny soubory.</string>
<string name="override_current_data">Tímto se anuluje vaše aktuální nastavení.</string>
<string name="video_player">Video přehrávač</string>
<string name="video_player">Přehrávač videa</string>
<string name="background_player">Přehrávač na pozadí</string>
<string name="popup_player">Přehrávač v okně</string>
<string name="preferred_player_fetcher_notification_title">Získávám informace…</string>
@@ -298,7 +298,7 @@
<string name="playback_pitch">Výška tónu</string>
<string name="unhook_checkbox">Odpojit (může způsobit zkreslení)</string>
<string name="no_streams_available_download">Ke stažení nejsou dostupné žádné streamy</string>
<string name="preferred_open_action_settings_title">Preferovaná \'otevřít\' akce</string>
<string name="preferred_open_action_settings_title">Preferovaná akce „otevření“</string>
<string name="preferred_open_action_settings_summary">Výchozí chování při otevírání obsahu — %s</string>
<string name="caption_setting_title">Titulky</string>
<string name="caption_setting_description">Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace</string>
@@ -550,7 +550,7 @@
<string name="search_showing_result_for">Ukazuji výsledky pro: %s</string>
<string name="never">Nikdy</string>
<string name="wifi_only">Pouze na Wi-Fi</string>
<string name="autoplay_summary">Zahájit playback automaticky — %s</string>
<string name="autoplay_summary">Automaticky zahájit přehrávání — %s</string>
<string name="title_activity_play_queue">Přehrát frontu</string>
<string name="unsupported_url_dialog_message">Nelze rozpoznat zadané URL. Otevřít pomocí jiné aplikace\?</string>
<string name="auto_queue_toggle">Auto-fronta</string>
@@ -668,7 +668,7 @@
<string name="show_image_indicators_title">Ukázat indikátory obrázků</string>
<string name="remote_search_suggestions">Vzdálené návrhy vyhledávání</string>
<string name="local_search_suggestions">Lokální návrhy vyhledávání</string>
<string name="start_main_player_fullscreen_summary">Pokud je vypnuté automatické otáčení, nespouštějte video v mini přehrávači, ale přepněte se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky</string>
<string name="start_main_player_fullscreen_summary">Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky</string>
<string name="enqueued_next">Další ve frontě</string>
<string name="enqueue_next_stream">Přidat do fronty (další)</string>
<string name="main_page_content_swipe_remove">Tažením položky odstraníte</string>
@@ -728,7 +728,7 @@
<string name="feed_toggle_show_future_items">Zobrazit nadcházející položky</string>
<string name="streams_not_yet_supported_removed">Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny</string>
<string name="select_quality_external_players">Vyberte kvalitu pro externí přehrávače</string>
<string name="no_video_streams_available_for_external_players">U externích přehrávačů nejsou dostupné žádné video streamy</string>
<string name="no_video_streams_available_for_external_players">U externích přehrávačů nejsou k dispozici žádné videostreamy</string>
<string name="feed_toggle_hide_played_items">Skrýt zhlédnuté položky</string>
<string name="feed_toggle_hide_future_items">Skrýt nadcházející položky</string>
<string name="faq_title">Často kladené dotazy</string>
@@ -743,4 +743,6 @@
<string name="unset_playlist_thumbnail">Zrušení nastavení trvalého náhledu</string>
<string name="card">Karta</string>
<string name="msg_failed_to_copy">Kopírování do schránky se nezdařilo</string>
<string name="duplicate_in_playlist">Zašedlé playlisty již obsahují tuto položku.</string>
<string name="playlist_add_stream_success_duplicate">Duplikát přidán %dkrát</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="unset_playlist_thumbnail">Dauerhaftes Vorschaubild aufheben</string>
<string name="msg_failed_to_copy">Kopieren in die Zwischenablage fehlgeschlagen</string>
<string name="card">Karte</string>
<string name="playlist_add_stream_success_duplicate">Duplikat %d mal hinzugefügt</string>
<string name="duplicate_in_playlist">Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits.</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="unset_playlist_thumbnail">Κατάργηση μόνιμης μικρογραφίας</string>
<string name="msg_failed_to_copy">Αποτυχία αντιγραφής στο πρόχειρο</string>
<string name="card">Κάρτα</string>
<string name="duplicate_in_playlist">Οι λίστες αναπαραγωγής που είναι γκριζαρισμένες περιέχουν ήδη αυτό το στοιχείο.</string>
<string name="playlist_add_stream_success_duplicate">Προστέθηκε διπλότυπο %d φορά(ες)</string>
</resources>

View File

@@ -746,4 +746,6 @@
<string name="unset_playlist_thumbnail">Desactivar las miniaturas permanente</string>
<string name="msg_failed_to_copy">Error al copiar al portapapeles</string>
<string name="card">Tarjeta</string>
<string name="playlist_add_stream_success_duplicate">Duplicado añadido %d vez/veces</string>
<string name="duplicate_in_playlist">Las listas de reproducción que están en gris ya contienen este elemento.</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="msg_failed_to_copy">Lõikelauale kopeerimine ei õnnestunud</string>
<string name="unset_playlist_thumbnail">Eemalda püsiv pisipilt</string>
<string name="card">Kaart</string>
<string name="duplicate_in_playlist">Hallina kuvatud esitusloendid juba sisaldavad seda kirjet.</string>
<string name="playlist_add_stream_success_duplicate">Topeltkirje lisatud %d kord(a)</string>
</resources>

View File

@@ -108,7 +108,7 @@
<string name="title_activity_about">NewPipe aplikazioari buruz</string>
<string name="title_licenses">Hirugarrengoen lizentziak</string>
<string name="copyright" formatted="true">© %1$s %2$s. %3$s</string>
<string name="tab_about">Honi buruz</string>
<string name="tab_about">Honi buruz eta ohiko galderak</string>
<string name="tab_licenses">Lizentziak</string>
<string name="app_description">Androiderako streaming libre eta arina.</string>
<string name="view_on_github">Ikusi GitHub zerbitzarian</string>
@@ -718,4 +718,18 @@
<string name="select_quality_external_players">Hautatu kanpoko erreproduzigailuen kalitatea</string>
<string name="feed_toggle_hide_future_items">Ezkutatu etorkizuneko elementuak</string>
<string name="feed_toggle_hide_played_items">Ezkutatu ikusitako elementuak</string>
<string name="duplicate_in_playlist">Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau.</string>
<string name="faq">Webgunean ikusi</string>
<string name="msg_failed_to_copy">Akatsa arbelera kopiatzean</string>
<string name="faq_description">Arazoren bat baduzu aplikazioa erabiltzerakoan, irakur itzazu ohiko galdera hauen erantzunak!</string>
<string name="unset_playlist_thumbnail">Betiko miniatura kendu</string>
<string name="app_update_unavailable_toast">NewPipe-en azken bertsioa erabiltzen ari zara</string>
<string name="app_update_available_notification_text">Sakatu %s deskargatzeko</string>
<string name="playlist_add_stream_success_duplicate">Kopia %d behin/aldiz gehitua</string>
<string name="card">Txartela</string>
<string name="night_theme_available">Aukera hau Gaiarako %s aukeratua badago soilik dago erabilgarri</string>
<string name="sort">Ordenatu</string>
<string name="fast_mode">Modu azkarra</string>
<string name="import_subscriptions_hint">Hiru-puntutako menutik harpidetzak inportatu edo esportatu</string>
<string name="faq_title">Maiz galdetutako galderak</string>
</resources>

View File

@@ -743,4 +743,6 @@
<string name="app_update_available_notification_text">Appuyez pour télécharger %s</string>
<string name="msg_failed_to_copy">Échec de la copie dans le presse-papiers</string>
<string name="night_theme_available">Cette option est disponible seulement si %s est sélectionné pour le thème</string>
<string name="duplicate_in_playlist">Les listes de lecture grisées contiennent déjà cet élément.</string>
<string name="card">Carte</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="msg_failed_to_copy">Produciuse un erro ao copiar no portapapeis</string>
<string name="unset_playlist_thumbnail">Desactivala miniatura permanente</string>
<string name="card">Tarxeta</string>
<string name="duplicate_in_playlist">As listas de reprodución que se atopan atenuadas xa conteñen este elemento.</string>
<string name="playlist_add_stream_success_duplicate">Duplicado engadido %d vez/veces</string>
</resources>

View File

@@ -756,4 +756,6 @@
<string name="unset_playlist_thumbnail">ביטול הגדרת תמונה ייצוגית קבועה</string>
<string name="card">כרטיס</string>
<string name="msg_failed_to_copy">ההעתקה ללוח הגזירים נכשלה</string>
<string name="duplicate_in_playlist">רשימות הנגינה שבוטלו וסומנו באפור כבר מכילות את הפריט הזה.</string>
<string name="playlist_add_stream_success_duplicate">הכפיל נוסף %d פעמים</string>
</resources>

View File

@@ -717,4 +717,6 @@
<string name="unset_playlist_thumbnail">Batalkan penetapan gambar kecil permanen</string>
<string name="msg_failed_to_copy">Gagal menyalin ke papan klip</string>
<string name="card">Kartu</string>
<string name="duplicate_in_playlist">Daftar putar yang bewarna abu-abu sudah berisi item ini.</string>
<string name="playlist_add_stream_success_duplicate">Duplikat ditambahkan %d kali</string>
</resources>

View File

@@ -742,5 +742,7 @@
<string name="night_theme_available">Questa opzione è disponibile solo se %s è selezionato come Tema</string>
<string name="msg_failed_to_copy">Copia negli appunti non riuscita</string>
<string name="card">Schede</string>
<string name="unset_playlist_thumbnail">Disattiva la miniatura permanente</string>
<string name="unset_playlist_thumbnail">Disattiva copertina permanente</string>
<string name="duplicate_in_playlist">Le playlist in grigio contengono già questo elemento.</string>
<string name="playlist_add_stream_success_duplicate">Doppione aggiunto %d volta/e</string>
</resources>

View File

@@ -716,4 +716,6 @@
<string name="import_subscriptions_hint">3 点メニューから登録チャンネルをインポートまたはエクスポートします</string>
<string name="card">カード</string>
<string name="msg_failed_to_copy">クリップボードへのコピーに失敗しました</string>
<string name="duplicate_in_playlist">灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。</string>
<string name="playlist_add_stream_success_duplicate">%d 回重複追加されました</string>
</resources>

View File

@@ -715,4 +715,8 @@
<string name="app_update_available_notification_text">%s를 다운로드하려면 탭하세요.</string>
<string name="unset_playlist_thumbnail">영구 썸네일 설정 해제</string>
<string name="night_theme_available">이 옵션은 테마로 %s를 선택한 경우에만 사용할 수 있음</string>
<string name="playlist_add_stream_success_duplicate">중복 추가 %d 번</string>
<string name="duplicate_in_playlist">회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다.</string>
<string name="card">카드</string>
<string name="msg_failed_to_copy">클립보드 복사 실패</string>
</resources>

View File

@@ -21,18 +21,18 @@
<string name="download_path_audio_dialog_title">Velg nedlastingsmappe for lydfiler</string>
<string name="default_resolution_title">Forvalgt oppløsning</string>
<string name="play_with_kodi_title">Spill av med Kodi</string>
<string name="kore_not_found">Installer manglende Kore-program\?</string>
<string name="kore_not_found">Installer manglende Kore-app\?</string>
<string name="show_play_with_kodi_title">Vis \"Spill av med Kodi\"-valg</string>
<string name="show_play_with_kodi_summary">Vis valg for avspilling via Kodi mediasenter</string>
<string name="play_audio">Lyd</string>
<string name="default_audio_format_title">Forvalgt lydformat</string>
<string name="theme_title">Drakt</string>
<string name="theme_title">Tema</string>
<string name="dark_theme_title">Mørk</string>
<string name="light_theme_title">Lys</string>
<string name="download_dialog_title">Last ned</string>
<string name="show_next_and_similar_title">Vis \"Neste\" og \"Lignende\" -videoer</string>
<string name="unsupported_url">Nettadressen støttes ikke</string>
<string name="content_language_title">Foretrukket innholdsspråk</string>
<string name="content_language_title">Forvalgt innholdsspråk</string>
<string name="settings_category_video_audio_title">Video og lyd</string>
<string name="settings_category_appearance_title">Utseende</string>
<string name="background_player_playing_toast">Spiller i bakgrunnen</string>
@@ -65,7 +65,7 @@
<string name="downloads">Nedlastinger</string>
<string name="downloads_title">Nedlastinger</string>
<string name="error_report_title">Feilrapport</string>
<string name="app_ui_crash">Program/brukergrensesnitt krasjet</string>
<string name="app_ui_crash">App/brukergrensesnitt krasjet</string>
<string name="pause">Pause</string>
<string name="delete">Slett</string>
<string name="checksum">Sjekksum</string>
@@ -77,7 +77,7 @@
<string name="msg_running_detail">Trykk for detaljer</string>
<string name="msg_wait">Vent…</string>
<string name="msg_copied">Kopiert til utklippstavle</string>
<string name="info_labels">Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nProgramspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon:</string>
<string name="info_labels">Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nAppspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon:</string>
<string name="start">Start</string>
<string name="no_available_dir">Definer en nedlastingsmappe senere i innstillingene</string>
<string name="title_activity_recaptcha">reCAPTCHA-oppgave</string>
@@ -241,15 +241,15 @@
<string name="resize_fit">Tilpass</string>
<string name="resize_fill">Fyll</string>
<string name="resize_zoom">Forstørr</string>
<string name="use_inexact_seek_title">Bruk rask unøyaktig blafring</string>
<string name="settings_category_debug_title">Feilretting</string>
<string name="use_inexact_seek_title">Bruk rask unøyaktig spoling</string>
<string name="settings_category_debug_title">Feilsøking</string>
<string name="file">Fil</string>
<string name="invalid_directory">Ingen slik mappe</string>
<string name="invalid_source">Ingen slik fil/innholdskilde</string>
<string name="invalid_file">Filen finnes ikke eller så har du ikke tilgang til å lese eller skrive til den</string>
<string name="file_name_empty_error">Filnavn kan ikke være tomt</string>
<string name="error_occurred_detail">En feil inntraff: %1$s</string>
<string name="caption_auto_generated">Auto-generert</string>
<string name="caption_auto_generated">Autogenerert</string>
<string name="import_title">Importer</string>
<string name="import_from">Importer fra</string>
<string name="export_to">Eksporter til</string>
@@ -282,10 +282,10 @@
<string name="delete_search_history_alert">Slett hele søkehistorikken\?</string>
<string name="search_history_deleted">Søkehistorikken er slettet</string>
<string name="one_item_deleted">Ett element slettet.</string>
<string name="toast_no_player">Inget program installert for avspilling av denne filen</string>
<string name="toast_no_player">Ingen app installert for å spille av denne filen</string>
<string name="caption_setting_title">Undertekster</string>
<string name="caption_setting_description">Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft</string>
<string name="app_license">NewPipe er copyleft-fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon.</string>
<string name="app_license">NewPipe er copyleft fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon.</string>
<string name="import_settings">Ønsker du også å importere innstillinger?</string>
<string name="subscriptions_import_unsuccessful">Kunne ikke importere abonnementer</string>
<string name="subscriptions_export_unsuccessful">Kunne ikke eksportere abonnementer</string>
@@ -295,7 +295,7 @@
\n2. Logg inn når forespurt
\n3. Klikk på \"All data inkludert\", så på \"Fjern merket for alle\", så på kun \"Abonnementer\", og klikk så \"OK\"
\n4. Klikk på \"Neste steg\" og så på \"Opprett eksport\"
\n5. Klikk på \"Last ned\"-knappen etter den vises%1$s
\n5. Klikk på \"Last ned\"-knappen etter den vises
\n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen
\n7. [Dersom .zip importen feiler] Pakk ut .csv filen (vanligvis under \"YouTube og YouTube Music/subscriptions/subscriptions.csv\"), klikk på IMPORTER FIL under og velg den utpakkede csv filen</string>
<string name="import_soundcloud_instructions">Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID:
@@ -304,15 +304,15 @@
\n2. Gå til denne nettadressen: %1$s
\n3. Logg inn når forespurt
\n4. Kopier profil-nettadressen du ble videresendt til.</string>
<string name="use_inexact_seek_summary">Unøyaktig blafring lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette</string>
<string name="use_inexact_seek_summary">Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette</string>
<string name="download_thumbnail_summary">Skru av for å stoppe innlasting av miniatyrbilder, noe som sparer data- og minnebruk. Endring av dette vil tømme både disk- og minne-hurtiglager</string>
<string name="auto_queue_summary">Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm</string>
<string name="enable_leak_canary_summary">Minnelekkasjeoppsyn kan forårsake programmet å opptre uresponsivt under haugdumping</string>
<string name="enable_leak_canary_summary">Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping</string>
<string name="enable_disposed_exceptions_title">Rapporter feil utenfor livssyklusen</string>
<string name="enable_disposed_exceptions_summary">Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse</string>
<string name="unhook_checkbox">Avhekt (kan forårsake forvrenging)</string>
<string name="privacy_policy_title">NewPipes personvernspraksis</string>
<string name="privacy_policy_encouragement">NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke programmet inn data uten ditt samtykke.
<string name="privacy_policy_encouragement">NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke appen inn data uten ditt samtykke.
\nNewPipes personvernspraksis forklarer i detalj hvilken data som sendes og lagres når du sender en krasjrapport.</string>
<string name="read_privacy_policy">Les personvernspraksis</string>
<string name="start_accept_privacy_policy">For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye.
@@ -321,8 +321,8 @@
<string name="decline">Avslå</string>
<string name="limit_data_usage_none_description">Ubegrenset</string>
<string name="limit_mobile_data_usage_title">Begrens oppløsning når mobildata brukes</string>
<string name="minimize_on_exit_title">Minimer ved programbytte</string>
<string name="minimize_on_exit_summary">Handling ved bytting til annet program fra hovedspiller — %s</string>
<string name="minimize_on_exit_title">Minimer ved appbytte</string>
<string name="minimize_on_exit_summary">Handling ved bytting til annen app fra hovedspiller — %s</string>
<string name="minimize_on_exit_none_description">Ingen</string>
<string name="minimize_on_exit_background_description">Minimer til bakgrunnsspiller</string>
<string name="minimize_on_exit_popup_description">Minimer til oppsprettsspiller</string>
@@ -342,7 +342,7 @@
<string name="settings_category_updates_title">Oppdateringer</string>
<string name="events">Hendelser</string>
<string name="file_deleted">Fil slettet</string>
<string name="app_update_notification_channel_name">Programoppgraderingsmerknad</string>
<string name="app_update_notification_channel_name">Varsel om appoppdatering</string>
<string name="app_update_notification_channel_description">Merknader for nye NewPipe-versjoner</string>
<string name="download_to_sdcard_error_title">Ekstern lagring utilgjengelig</string>
<string name="download_to_sdcard_error_message">Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\?</string>
@@ -353,11 +353,11 @@
<string name="main_page_content_summary">Hvilke faner vises på hovedsiden</string>
<string name="conferences">Konferanser</string>
<string name="updates_setting_title">Oppdatering</string>
<string name="updates_setting_description">Varsle om programoppdatering når en ny versjon er tilgjengelig</string>
<string name="list_view_mode">Listevisningmodus</string>
<string name="updates_setting_description">Vis varsel om appoppdatering når en ny versjon er tilgjengelig</string>
<string name="list_view_mode">Listevisningsmodus</string>
<string name="list">Liste</string>
<string name="grid">Rutenett</string>
<string name="auto">Auto</string>
<string name="auto">Automatisk</string>
<string name="app_update_available_notification_title">Ny NewPipe-versjon er tilgjengelig!</string>
<string name="missions_header_finished">Fullført</string>
<string name="paused">pauset</string>
@@ -430,7 +430,7 @@
<item quantity="one">%s lytter</item>
<item quantity="other">%s lyttere</item>
</plurals>
<string name="localization_changes_requires_app_restart">Språket vil først bli endret etter at programmet har blitt omstartet</string>
<string name="localization_changes_requires_app_restart">Språket vil endres etter at appen har startet på nytt</string>
<string name="default_kiosk_page_summary">Standard kiosk</string>
<string name="peertube_instance_url_title">PeerTube-instanser</string>
<string name="local">Lokal</string>
@@ -449,7 +449,7 @@
<string name="playlist_no_uploader">Autogenerert (fant ingen opplaster)</string>
<string name="recovering">gjenoppretter</string>
<string name="error_download_resource_gone">Kan ikke gjenopprette denne nedlastingen</string>
<string name="seek_duration_title">Hurtigframoverspoling/-tilbakeblafringsvarighet</string>
<string name="seek_duration_title">Hurtigframoverspoling/-tilbakespolingsvarighet</string>
<string name="permission_display_over_apps">Gi tillatelse til å vise over andre apper</string>
<string name="app_language_title">Programspråk</string>
<string name="systems_language">Systemforvalg</string>
@@ -486,7 +486,7 @@
<string name="feed_group_dialog_empty_selection">Ingen abonnement valgt</string>
<string name="feed_group_dialog_select_subscriptions">Velg abonnementer</string>
<string name="feed_groups_header_title">Kanalgrupper</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Skru av raskt modus</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Skru av hurtigmodus</string>
<string name="feed_update_threshold_title">Strømoppdateringsterskel</string>
<string name="settings_category_feed_title">Strøm</string>
<string name="feed_processing_message">Behandler strøm…</string>
@@ -505,7 +505,7 @@
<string name="remove_watched">Fjern sette</string>
<string name="channel_created_by">Opprettet av %s</string>
<string name="video_detail_by">Av %s</string>
<string name="youtube_restricted_mode_enabled_title">Slå på YouTubes \"begrensede modus\"</string>
<string name="youtube_restricted_mode_enabled_title">Slå på YouTubes \"Begrenset modus\"</string>
<string name="never">Aldri</string>
<string name="wifi_only">Kun på Wi-Fi</string>
<string name="select_a_playlist">Velg en spilleliste</string>
@@ -524,7 +524,7 @@
\n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig.
\n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig.
\n
\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skjelne mellom sanntidsvideoer og normale) og det kan gi færre elementer.
\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skille mellom direktesendinger og normale videoer) og det kan gi færre elementer.
\n
\nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal.
\n
@@ -537,17 +537,17 @@
<string name="feed_use_dedicated_fetch_method_summary">Tilgjengelig i noen tjenester, det er vanligvis mye raskere, men kan gi et begrenset antall elementer, og ofte ufullstendig informasjon (f.eks. ingen varighet, elementtype, eller sanntidsstatus)</string>
<string name="feed_use_dedicated_fetch_method_title">Hent fra dedikert strøm når tilgjengelig</string>
<string name="feed_update_threshold_summary">Tid siden siste oppdatering før et abonnement vurderes utdatert — %s</string>
<string name="new_seek_duration_toast">Som følge av begrensninger i ExoPlayer er blafringsdistansen begrenset til %d sekunder</string>
<string name="new_seek_duration_toast">Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder</string>
<string name="remove_watched_popup_warning">Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet.
\nEr du sikker\? Dette kan ikke angres!</string>
<string name="autoplay_summary">Start avspilling automatisk — %s</string>
<string name="unsupported_url_dialog_message">Kunne ikke gjenkjenne angitt nettadresse. Åpne den med annet program\?</string>
<string name="unsupported_url_dialog_message">Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\?</string>
<string name="content_not_supported">Innholdet støttes ikke enda av NewPipe.
\n
\nStøtte vil forhåpentligvis komme til i en senere versjon.</string>
<string name="playlist_page_summary">Spillelisteside</string>
<string name="detail_sub_channel_thumbnail_view_description">Kanalens avatar-miniatyrbilde</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Skru på raskt modus</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Skru på hurtigmodus</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Vis kun ugrupperte abonnementer</string>
<string name="title_activity_play_queue">Spill kø</string>
<string name="no_playlist_bookmarked_yet">Ingen spillelistebokmerker enda</string>
@@ -595,18 +595,18 @@
<string name="soundcloud_go_plus_content">Dette er et spor fra SoundCloud Go+, ihvertfall i ditt land, så det kan ikke strømmes eller lastes ned av NewPipe.</string>
<string name="georestricted_content">Innholdet er ikke tilgjengelig i din region.</string>
<string name="download_has_started">Nedlastingen har startet</string>
<string name="select_night_theme_toast">Du kan velge din favorittnattdrakt nedenfor</string>
<string name="night_theme_summary">Velg din favorittnattdrakt — %s</string>
<string name="auto_device_theme_title">Automatisk (enhetsdrakt)</string>
<string name="select_night_theme_toast">Du kan velge ditt favorittnattema nedenfor</string>
<string name="night_theme_summary">Velg ditt favorittnattema — %s</string>
<string name="auto_device_theme_title">Automatisk (enhetstema)</string>
<string name="radio">Radio</string>
<string name="featured">Framhevet</string>
<string name="recaptcha_solve">Løs</string>
<string name="night_theme_title">Nattdrakt</string>
<string name="night_theme_title">Nattema</string>
<string name="show_channel_details">Vis kanaldetaljer</string>
<string name="disable_media_tunneling_summary">Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking</string>
<string name="disable_media_tunneling_title">Skru av media-tunnelering</string>
<string name="description_select_note">Du kan nå velge tekst inne i beskrivelsen. Merk at siden kan flimre og lenker er kanskje ikke klikkbare i utvalgsmodus.</string>
<string name="feed_load_error_fast_unknown">Raskt modus for informasjonskanal tilbyr ikke mer info om dette.</string>
<string name="feed_load_error_fast_unknown">Hurtigmodus for informasjonskanal tilbyr ikke mer info om dette.</string>
<string name="feed_load_error_terminated">Skaperens konto har blitt terminert.
\nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden.
\nØnsker du å oppheve ditt abonnement på denne kanalen\?</string>
@@ -619,7 +619,7 @@
<string name="feed_load_error">Kunne ikke laste inn informasjonskanal</string>
<string name="downloads_storage_use_saf_summary_api_29">Fra Android 10 er kun «lagringstilgangsrammeverk» støttet</string>
<string name="downloads_storage_ask_summary_no_saf_notice">Du vil bli spurt om hvor du vil lagre hver nedlastning</string>
<string name="seekbar_preview_thumbnail_title">Forhåndsvisning av miniatyrbilde i søkefelt</string>
<string name="seekbar_preview_thumbnail_title">Forhåndsvisning av miniatyrbilde på spolelinjen</string>
<string name="no_dir_yet">Ingen nedlastingsmappe er satt ennå, velg en standard nedlastingsmappe nå</string>
<string name="off">Av</string>
<string name="on"></string>
@@ -722,4 +722,12 @@
<string name="sort">Sorter</string>
<string name="toggle_all">Velg alle</string>
<string name="faq_description">Hvis du har problemer med å bruke appen, så bør du sjekke ut disse svarene fra generelle spørsmål!</string>
<string name="unset_playlist_thumbnail">Skru av vedvarende miniatyrbilde</string>
<string name="night_theme_available">Dette valget er kun tilgjengelig dersom %s er valgt som tema</string>
<string name="msg_failed_to_copy">Klarte ikke å kopiere til utklippstavlen</string>
<string name="app_update_available_notification_text">Trykk for å laste ned %s</string>
<string name="app_update_unavailable_toast">Du bruker den nyeste versjonen av NewPipe</string>
<string name="card">Kort</string>
<string name="import_subscriptions_hint">Importer eller eksporter fra trepunktsmenyen</string>
<string name="fast_mode">Hurtigmodus</string>
</resources>

View File

@@ -727,7 +727,9 @@
<string name="app_update_unavailable_toast">U heeft de laatste versie van NewPipe</string>
<string name="app_update_available_notification_text">Klik om %s te downloaden</string>
<string name="msg_failed_to_copy">Kon niet naar klembord kopiëren</string>
<string name="night_theme_available">Deze instelling is alleen beschikbaar als %s als thema ingesteld is</string>
<string name="night_theme_available">Deze instelling is alleen beschikbaar als %s als Thema ingesteld is</string>
<string name="card">Kaart</string>
<string name="unset_playlist_thumbnail">Miniatuur niet ingesteld</string>
<string name="duplicate_in_playlist">De afspeellijsten die grijs zijn, bevatten dit item al.</string>
<string name="playlist_add_stream_success_duplicate">Duplicaat is %d tijd(en) toegevoegd</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="card">କାର୍ଡ</string>
<string name="msg_failed_to_copy">କ୍ଲିପବୋର୍ଡରେ କପି କରିବାରେ ବିଫଳ</string>
<string name="unset_playlist_thumbnail">ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ</string>
<string name="duplicate_in_playlist">ଧୂସର ହୋଇଯାଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ ପୂର୍ବରୁ ଏହି ଆଇଟମ୍ ଧାରଣ କରିଥାଏ ।</string>
<string name="playlist_add_stream_success_duplicate">ନକଲ %d ସମୟ (ମୋଟ) ଯୋଡି ହୋଇଛି</string>
</resources>

View File

@@ -422,7 +422,7 @@
<string name="error_timeout">Minął czas połączenia</string>
<string name="downloads_storage_use_saf_title">Używaj systemowego selektora folderów (SAF)</string>
<string name="downloads_storage_use_saf_summary">Systemowy selektor folderów (SAF) umożliwia pobieranie na kartę pamięci</string>
<string name="clear_playback_states_title">Usuń pozycje odtwarzania</string>
<string name="clear_playback_states_title">Wyczyść pozycje odtwarzania</string>
<string name="clear_playback_states_summary">Usuwa wszystkie pozycje odtwarzania</string>
<string name="delete_playback_states_alert">Usunąć wszystkie pozycje odtwarzania\?</string>
<string name="drawer_header_description">Przełącz usługę, aktualnie wybrana:</string>
@@ -531,7 +531,7 @@
<string name="artists">Artyści</string>
<string name="albums">Albumy</string>
<string name="songs">Piosenki</string>
<string name="restricted_video">To wideo ma ograniczenia wiekowe.
<string name="restricted_video">To wideo jest objęte ograniczeniem wiekowym.
\n
\nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć.</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">Tak, i częściowo obejrzane wideo</string>
@@ -578,7 +578,7 @@
<string name="enqueued">Dodano do kolejki</string>
<string name="enqueue_stream">Dodaj do kolejki</string>
<string name="show_memory_leaks">Pokaż wycieki pamięci</string>
<string name="clear_cookie_summary">Wyczyść ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA</string>
<string name="clear_cookie_summary">Usuwa ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA</string>
<string name="recaptcha_cookies_cleared">Ciasteczka reCAPTCHA zostały wyczyszczone</string>
<string name="clear_cookie_title">Wyczyść ciasteczka reCAPTCHA</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube udostępnia „Tryb ograniczonego dostępu”, który ukrywa potencjalne treści dla dorosłych</string>
@@ -751,4 +751,6 @@
<string name="unset_playlist_thumbnail">Usuń stałą miniaturę</string>
<string name="msg_failed_to_copy">Nie udało się skopiować do schowka</string>
<string name="card">Karta</string>
<string name="duplicate_in_playlist">Wyszarzone playlisty zawierają już tę pozycję</string>
<string name="playlist_add_stream_success_duplicate">Dodano duplikat %d raz(y)</string>
</resources>

View File

@@ -743,4 +743,6 @@
<string name="unset_playlist_thumbnail">Desativar miniatura permanente</string>
<string name="card">Cartão</string>
<string name="msg_failed_to_copy">Falha ao copiar para a área de transferência</string>
<string name="playlist_add_stream_success_duplicate">Duplicata adicionada %d vez(es)</string>
<string name="duplicate_in_playlist">As playlists em cinza já contêm este item.</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="unset_playlist_thumbnail">Desativar miniatura permanente</string>
<string name="msg_failed_to_copy">Não foi possível copiar para a área de transferência</string>
<string name="card">Cartão</string>
<string name="duplicate_in_playlist">As listas de reprodução acinzentadas já contêm este item.</string>
<string name="playlist_add_stream_success_duplicate">Duplicar adicionado %d vez(es)</string>
</resources>

View File

@@ -739,8 +739,10 @@
<string name="import_subscriptions_hint">Importar ou exportar subscrições do menu de 3 pontos</string>
<string name="app_update_unavailable_toast">Já está a executar a versão mais recente do NewPipe</string>
<string name="app_update_available_notification_text">Toque para descarregar %s</string>
<string name="night_theme_available">Esta opção só está disponível se %s for selecionado para o tema</string>
<string name="night_theme_available">Esta opção só está disponível se estiver selecionado %s para o tema</string>
<string name="unset_playlist_thumbnail">Desativar miniatura permanente</string>
<string name="msg_failed_to_copy">Não foi possível copiar para a área de transferência</string>
<string name="card">Cartão</string>
<string name="duplicate_in_playlist">As listas de reprodução acinzentadas já contêm este item.</string>
<string name="playlist_add_stream_success_duplicate">Duplicar adicionado %d vez(es)</string>
</resources>

View File

@@ -740,4 +740,7 @@
<string name="app_update_unavailable_toast">Rulați cea mai recentă versiune NewPipe</string>
<string name="app_update_available_notification_text">Atingeți pentru a descărca %s</string>
<string name="night_theme_available">Această opțiune este disponibilă numai dacă %s este selectată ca temă</string>
<string name="card">Cartelă</string>
<string name="msg_failed_to_copy">Nu s-a reușit copierea în clipboard</string>
<string name="unset_playlist_thumbnail">Dezactivare miniatură permanentă</string>
</resources>

View File

@@ -661,7 +661,7 @@
<string name="high_quality_larger">Высокое качество (крупнее)</string>
<string name="seekbar_preview_thumbnail_title">Миниатюра над полосой прокрутки</string>
<string name="detail_heart_img_view_description">Автору видео понравилось это</string>
<string name="mark_as_watched">Пометить просмотренными</string>
<string name="mark_as_watched">Пометить проигранным</string>
<string name="show_image_indicators_summary">Picasso: указать цветом источник изображений (красный — сеть, синий — диск, зелёный — память)</string>
<string name="show_image_indicators_title">Цветные метки на изображениях</string>
<string name="remote_search_suggestions">Серверные предложения поиска</string>
@@ -747,4 +747,6 @@
<string name="msg_failed_to_copy">Не удалось скопировать в буфер обмена</string>
<string name="night_theme_available">Доступно, когда Тема установлена в %s</string>
<string name="unset_playlist_thumbnail">Убрать постоянную миниатюру</string>
<string name="playlist_add_stream_success_duplicate">Дубликат добавлен %d раз(а)</string>
<string name="duplicate_in_playlist">Плейлисты, выделенные серым уже содержат этот объект.</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="card">Carta</string>
<string name="msg_failed_to_copy">Còpia in punta de billete fallida</string>
<string name="unset_playlist_thumbnail">Disativa sa miniadura permanente</string>
<string name="duplicate_in_playlist">Sas iscalitas in colore murru tenent giai custu elementu.</string>
<string name="playlist_add_stream_success_duplicate">Duplicadu annantu %d borta(s)</string>
</resources>

View File

@@ -735,4 +735,14 @@
<string name="faq">Pozrieť na webovej stránke</string>
<string name="sort">Usporiadať</string>
<string name="faq_description">Ak máte problémy s používaním aplikácie, určite si prečítajte tieto odpovede na časté otázky!</string>
<string name="unset_playlist_thumbnail">Vypnutie trvalého náhľadu</string>
<string name="msg_failed_to_copy">Kopírovanie do schránky zlyhalo</string>
<string name="duplicate_in_playlist">Zoznamy zobrazené šedou farbou už obsahujú danú položku.</string>
<string name="card">Karta</string>
<string name="app_update_available_notification_text">Dotykom stiahnite %s</string>
<string name="playlist_add_stream_success_duplicate">Duplikát bol pridaný %d-krát</string>
<string name="app_update_unavailable_toast">Používate najnovšiu verziu NewPipe</string>
<string name="night_theme_available">Táto možnosť je dostupná len pre motív %s</string>
<string name="fast_mode">Rýchly režim</string>
<string name="import_subscriptions_hint">Import alebo export odberov z 3-bodkovej ponuky</string>
</resources>

View File

@@ -727,4 +727,7 @@
<string name="app_update_unavailable_toast">Du använder den senaste versionen av NewPipe</string>
<string name="app_update_available_notification_text">Tryck för att ladda ner %s</string>
<string name="night_theme_available">Det här alternativet är endast tillgängligt om %s har valts som Tema</string>
<string name="unset_playlist_thumbnail">Inaktivera permanent miniatyrbild</string>
<string name="msg_failed_to_copy">Det gick inte att kopiera till urklipp</string>
<string name="card">Kort</string>
</resources>

View File

@@ -15,7 +15,7 @@
<string name="settings">ตั้งค่า</string>
<string name="did_you_mean">หรือคุณหมายถึง \"%1$s\"\?</string>
<string name="share_dialog_title">แชร์ด้วย</string>
<string name="use_external_video_player_title">Use external video player</string>
<string name="use_external_video_player_title">ใช้เครื่องเล่นวีดิโอภายนอก</string>
<string name="use_external_audio_player_title">ใช้แอปเล่นเสียงภายนอก</string>
<string name="subscribe_button_title">ติดตาม</string>
<string name="subscribed_button_title">ติดตามแล้ว</string>
@@ -357,7 +357,7 @@
<string name="pause_downloads_on_mobile">หยุดชั่วคราวเมื่อเปลี่ยนเป็นข้อมูลมือถือ</string>
<string name="pause_downloads_on_mobile_desc">การดาวน์โหลดที่ไม่สามารถหยุดพักได้จะเริ่มต้นใหม่</string>
<string name="close">ปิด</string>
<string name="use_external_video_player_summary">Removes audio at some resolutions</string>
<string name="use_external_video_player_summary">บางความละเอียดอาจไม่มีเสียง</string>
<string name="metadata_cache_wipe_complete_notice">แคช metadate ถูกลบแล้ว</string>
<string name="resume_on_audio_focus_gain_title">เล่นต่อหลังจากการขัดจังหวะ</string>
<string name="enable_playback_resume_title">เล่นต่อ</string>
@@ -369,4 +369,13 @@
<string name="open_with">เปิดด้วย</string>
<string name="mark_as_watched">ทำเครื่องหมายว่าดูแล้ว</string>
<string name="ok">ตกลง</string>
<string name="notification_action_3_title">ปุ่มการกระทำที่สี่</string>
<string name="notification_action_0_title">ปุ่มการกระทำแรก</string>
<string name="notification_action_2_title">ปุ่มการกระทำที่สาม</string>
<string name="notification_action_4_title">ปุ่มการกระทำที่ห้า</string>
<string name="notification_actions_summary">แก้ไขการกระทำของการแต่การแจ้งเตือนด้วยการแตะไปที่มัน เลือกสามรายการที่จะแสดงในการแจ้งเตือนในการแจ้งเตือนแบบกระทัดรัดโดยใช้ปุ่มกาเครื่องหมายทางขวา</string>
<string name="notification_scale_to_square_image_title">ครอบตัดตัวอย่างภาพเป็นอัตราส่วน 1:1</string>
<string name="notification_scale_to_square_image_summary">ครอบตัดตัวอย่างภาพที่แสดงในการแจ้งเตือนจากอัตราส่วน 16:9 เป็น 1:1</string>
<string name="crash_the_player">ทำเครื่องเล่นพัง</string>
<string name="notification_action_1_title">ปุ่มการกระทำรอง</string>
</resources>

View File

@@ -730,4 +730,6 @@
<string name="unset_playlist_thumbnail">Kalıcı küçük resmin ayarını kaldır</string>
<string name="card">Kart</string>
<string name="msg_failed_to_copy">Panoya kopyalanamadı</string>
<string name="playlist_add_stream_success_duplicate">%d kez kopyası eklendi</string>
<string name="duplicate_in_playlist">Gri oynatma listeleri halihazırda bu ögeyi içeriyor.</string>
</resources>

View File

@@ -52,7 +52,7 @@
<string name="error_snackbar_action">Звіт</string>
<string name="what_device_headline">Інформація:</string>
<string name="what_happened_headline">Що сталося:</string>
<string name="main_bg_subtitle">Натисніть на «лупу», щоб почати.</string>
<string name="main_bg_subtitle">Торкніться лупи, щоб розпочати.</string>
<string name="black_theme_title">Чорна</string>
<string name="downloads">Завантаження</string>
<string name="downloads_title">Завантаження</string>
@@ -747,4 +747,6 @@
<string name="unset_playlist_thumbnail">Прибрати постійну мініатюру</string>
<string name="card">Картки</string>
<string name="msg_failed_to_copy">Не вдалося скопіювати до буфера обміну</string>
<string name="playlist_add_stream_success_duplicate">Дублікат додано %d раз(ів)</string>
<string name="duplicate_in_playlist">У виділених сірим кольором добірках цей елемент уже є.</string>
</resources>

View File

@@ -605,7 +605,7 @@
<string name="metadata_support">支持</string>
<string name="metadata_language">语言</string>
<string name="metadata_age_limit">年龄限制</string>
<string name="metadata_privacy"></string>
<string name="metadata_privacy"></string>
<string name="metadata_licence">许可</string>
<string name="metadata_tags">标签</string>
<string name="metadata_category">类别</string>
@@ -716,5 +716,7 @@
<string name="night_theme_available">只有在主题中选择了 %s 该选项才可用</string>
<string name="unset_playlist_thumbnail">取消设置永久缩略图</string>
<string name="card">卡片</string>
<string name="msg_failed_to_copy">未能复制到剪贴板</string>
<string name="msg_failed_to_copy">无法复制到剪贴板</string>
<string name="duplicate_in_playlist">变灰的播放列表已经包含此项目。</string>
<string name="playlist_add_stream_success_duplicate">重复添加了 %d 次</string>
</resources>

View File

@@ -717,4 +717,6 @@
<string name="night_theme_available">色系揀做%s嘅時候至有得揀</string>
<string name="msg_failed_to_copy">複製唔到去剪貼簿</string>
<string name="card">一張張</string>
<string name="duplicate_in_playlist">灰咗嘅播放清單,即係已經有呢個項目。</string>
<string name="playlist_add_stream_success_duplicate">重複加入咗 %d 次</string>
</resources>

View File

@@ -717,4 +717,6 @@
<string name="card">卡片</string>
<string name="unset_playlist_thumbnail">取消設定永久縮圖</string>
<string name="msg_failed_to_copy">無法複製到剪貼簿</string>
<string name="playlist_add_stream_success_duplicate">重複新增 %d 次</string>
<string name="duplicate_in_playlist">變灰的播放清單已經包含此項目。</string>
</resources>

View File

@@ -13,7 +13,6 @@ import java.util.Objects;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
@@ -169,7 +168,8 @@ public class PlayQueueTest {
final List<PlayQueueItem> streams = Collections.nCopies(5, item1);
final PlayQueue queue1 = makePlayQueue(0, streams);
final PlayQueue queue2 = makePlayQueue(0, streams);
assertEquals(queue1, queue2);
assertTrue(queue1.equalStreams(queue2));
assertTrue(queue1.equalStreamsAndIndex(queue2));
}
@Test
@@ -177,7 +177,8 @@ public class PlayQueueTest {
final List<PlayQueueItem> streams = Collections.nCopies(5, item1);
final PlayQueue queue1 = makePlayQueue(1, streams);
final PlayQueue queue2 = makePlayQueue(4, streams);
assertEquals(queue1, queue2);
assertTrue(queue1.equalStreams(queue2));
assertFalse(queue1.equalStreamsAndIndex(queue2));
}
@Test
@@ -186,7 +187,7 @@ public class PlayQueueTest {
final List<PlayQueueItem> streams2 = Collections.nCopies(5, item2);
final PlayQueue queue1 = makePlayQueue(0, streams1);
final PlayQueue queue2 = makePlayQueue(0, streams2);
assertNotEquals(queue1, queue2);
assertFalse(queue1.equalStreams(queue2));
}
@Test
@@ -195,7 +196,7 @@ public class PlayQueueTest {
final List<PlayQueueItem> streams2 = Collections.nCopies(6, item2);
final PlayQueue queue1 = makePlayQueue(0, streams1);
final PlayQueue queue2 = makePlayQueue(0, streams2);
assertNotEquals(queue1, queue2);
assertFalse(queue1.equalStreams(queue2));
}
}
}