mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2026-01-14 21:27:56 +00:00
Compare commits
45 Commits
fix/playli
...
v0.28.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8923187f9 | ||
|
|
6c5d58bed3 | ||
|
|
98a1e656ce | ||
|
|
56489e5ddd | ||
|
|
5d7a3f97cd | ||
|
|
fc39bff77e | ||
|
|
11467a73b8 | ||
|
|
3323868042 | ||
|
|
a83762c4d7 | ||
|
|
381b383a43 | ||
|
|
d5d92e8340 | ||
|
|
dc5c5b6604 | ||
|
|
680235ad51 | ||
|
|
952a1269c1 | ||
|
|
d4a124a3c4 | ||
|
|
635e6a56c7 | ||
|
|
8f071bc8f9 | ||
|
|
02e559e57f | ||
|
|
9998d99a04 | ||
|
|
5cefafa145 | ||
|
|
49aaaebd86 | ||
|
|
7f57493da1 | ||
|
|
b4f526c2a5 | ||
|
|
93166afde4 | ||
|
|
8893a27668 | ||
|
|
6c238fafbe | ||
|
|
e17b1a1fcc | ||
|
|
7806a708c2 | ||
|
|
f6085d0044 | ||
|
|
0a65c862a3 | ||
|
|
c9339a5a03 | ||
|
|
824fc8fbe1 | ||
|
|
465979e677 | ||
|
|
7101aecc98 | ||
|
|
718335d733 | ||
|
|
2dde0fef58 | ||
|
|
c2f526d5b3 | ||
|
|
c3c353f1b7 | ||
|
|
58efbf4de8 | ||
|
|
350d08ba9c | ||
|
|
2ee5f99f09 | ||
|
|
a7b226c354 | ||
|
|
3ffd194f78 | ||
|
|
f7ff5db4b5 | ||
|
|
097c643d1b |
13
.github/CONTRIBUTING.md
vendored
13
.github/CONTRIBUTING.md
vendored
@@ -3,6 +3,19 @@
|
||||
NewPipe contribution guidelines
|
||||
===============================
|
||||
|
||||
## AI policy
|
||||
|
||||
* Using generative AI to develop new features or making larger code changes is generally prohibited. Please refrain from contributions which are heavily depending on AI generated source code because they are usually lacking a fundamental understanding of the overall project structure and thus come with poor quality. However, you are allowed to use gen. AI if you
|
||||
* are aware of the project structure,
|
||||
* ensure that the generated code follows the project structure,
|
||||
* fully understand the generated code, and
|
||||
* review the generated code completely.
|
||||
* Using AI to find the root cause of bugs and generating small fixes might be acceptable. However, gen. AI often does not fix the underlying problem but is trying to fix the symptoms. If you are using AI to fix bugs, ensure that the root cause is tackled.
|
||||
* The use of AI to generate documentation is allowed. We ask you to thoroughly check the quality of generated documentation – wrong, misleading or uninformative documentation is useless and wastes the reader's time. Ensure that reasoning is documented.
|
||||
* Using generative AI to write or fill in PR or issue templates is prohibited. Those texts are often lengthy and miss critical information.
|
||||
* PRs and issues that do not follow this AI policy can be closed without further explanation.
|
||||
|
||||
|
||||
## Crash reporting
|
||||
|
||||
Report crashes through the **automated crash report system** of NewPipe.
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -26,6 +26,8 @@ body:
|
||||
required: true
|
||||
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
|
||||
required: true
|
||||
- label: "I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this bug report is not generated by AI."
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: app-version
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -25,6 +25,8 @@ body:
|
||||
required: true
|
||||
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
|
||||
required: true
|
||||
- label: "I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this request is not generated by AI."
|
||||
required: true
|
||||
|
||||
|
||||
- type: textarea
|
||||
|
||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -32,3 +32,5 @@ The APK can be found by going to the "Checks" tab below the title. On the left p
|
||||
|
||||
#### Due diligence
|
||||
- [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md).
|
||||
- [ ] The proposed changes follow the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md#ai-policy).
|
||||
- [ ] I tested the changes using an emulator or a physical device.
|
||||
|
||||
6
.github/workflows/build-release-apk.yml
vendored
6
.github/workflows/build-release-apk.yml
vendored
@@ -7,11 +7,11 @@ jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: 'master'
|
||||
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '21'
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
mv app/build/outputs/apk/release/*.apk "app/build/outputs/apk/release/NewPipe_v$VERSION_NAME.apk"
|
||||
|
||||
- name: "Upload APK"
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: app
|
||||
path: app/build/outputs/apk/release/*.apk
|
||||
|
||||
20
.github/workflows/ci.yml
vendored
20
.github/workflows/ci.yml
vendored
@@ -37,8 +37,8 @@ jobs:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: gradle/wrapper-validation-action@v2
|
||||
- uses: actions/checkout@v6
|
||||
- uses: gradle/actions/wrapper-validation@v4
|
||||
|
||||
- name: create and checkout branch
|
||||
# push events already checked out the branch
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
run: git checkout -B "$BRANCH"
|
||||
|
||||
- name: set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: "temurin"
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint
|
||||
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: app
|
||||
path: app/build/outputs/apk/debug/*.apk
|
||||
@@ -80,7 +80,7 @@ jobs:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Enable KVM
|
||||
run: |
|
||||
@@ -89,7 +89,7 @@ jobs:
|
||||
sudo udevadm trigger --name-match=kvm
|
||||
|
||||
- name: set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: "temurin"
|
||||
@@ -104,7 +104,7 @@ jobs:
|
||||
script: ./gradlew connectedCheck --stacktrace
|
||||
|
||||
- name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
if: failure()
|
||||
with:
|
||||
name: android-test-report-api${{ matrix.api-level }}
|
||||
@@ -118,19 +118,19 @@ jobs:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
||||
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: "temurin"
|
||||
cache: 'gradle'
|
||||
|
||||
- name: Cache SonarCloud packages
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ~/.sonar/cache
|
||||
key: ${{ runner.os }}-sonar
|
||||
|
||||
6
.github/workflows/image-minimizer.yml
vendored
6
.github/workflows/image-minimizer.yml
vendored
@@ -17,9 +17,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
run: npm i probe-image-size@7.2.3 --ignore-scripts
|
||||
|
||||
- name: Minimize simple images
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v8
|
||||
timeout-minutes: 3
|
||||
with:
|
||||
script: |
|
||||
|
||||
@@ -42,9 +42,9 @@ android {
|
||||
minSdk = 21
|
||||
targetSdk = 35
|
||||
|
||||
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1005
|
||||
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1006
|
||||
|
||||
versionName = "0.28.0"
|
||||
versionName = "0.28.1"
|
||||
System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it }
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
5
app/proguard-rules.pro
vendored
5
app/proguard-rules.pro
vendored
@@ -16,6 +16,11 @@
|
||||
-dontwarn javax.script.**
|
||||
-keep class jdk.dynalink.** { *; }
|
||||
-dontwarn jdk.dynalink.**
|
||||
# Rules for jsoup
|
||||
# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex
|
||||
# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs
|
||||
# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed
|
||||
-dontwarn com.google.re2j.**
|
||||
|
||||
## Rules for ExoPlayer
|
||||
-keep class com.google.android.exoplayer2.** { *; }
|
||||
|
||||
@@ -28,7 +28,7 @@ interface PlaylistRemoteDAO : BasicDAO<PlaylistRemoteEntity> {
|
||||
@Query("SELECT * FROM remote_playlists WHERE uid = :playlistId")
|
||||
fun getPlaylist(playlistId: Long): Flowable<PlaylistRemoteEntity>
|
||||
|
||||
@Query("SELECT * FROM remote_playlists WHERE url = :url AND uid = :serviceId")
|
||||
@Query("SELECT * FROM remote_playlists WHERE url = :url AND service_id = :serviceId")
|
||||
fun getPlaylist(serviceId: Long, url: String?): Flowable<MutableList<PlaylistRemoteEntity>>
|
||||
|
||||
@get:Query("SELECT * FROM remote_playlists ORDER BY display_index")
|
||||
|
||||
@@ -55,8 +55,8 @@ data class SubscriptionEntity(
|
||||
fun toChannelInfoItem(): ChannelInfoItem {
|
||||
return ChannelInfoItem(this.serviceId, this.url, this.name).apply {
|
||||
thumbnails = ImageStrategy.dbUrlToImageList(this@SubscriptionEntity.avatarUrl)
|
||||
subscriberCount = this.subscriberCount
|
||||
description = this.description
|
||||
subscriberCount = this@SubscriptionEntity.subscriberCount ?: -1
|
||||
description = this@SubscriptionEntity.description
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1133,7 +1133,7 @@ public class DownloadDialog extends DialogFragment
|
||||
}
|
||||
|
||||
DownloadManagerService.startMission(context, urls, storage, kind, threads,
|
||||
currentInfo.getUrl(), psName, psArgs, nearLength, new ArrayList<>(recoveryInfo));
|
||||
currentInfo, psName, psArgs, nearLength, new ArrayList<>(recoveryInfo));
|
||||
|
||||
Toast.makeText(context, getString(R.string.download_has_started),
|
||||
Toast.LENGTH_SHORT).show();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.schabi.newpipe.local.bookmark;
|
||||
|
||||
import static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists;
|
||||
import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
@@ -417,10 +418,11 @@ public final class BookmarkFragment extends BaseLocalListFragment<List<PlaylistL
|
||||
}
|
||||
|
||||
private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
|
||||
// if adding grid layout, also include ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
|
||||
// with an `if (shouldUseGridLayout()) ...`
|
||||
return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
|
||||
ItemTouchHelper.ACTION_STATE_IDLE) {
|
||||
int directions = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
|
||||
if (shouldUseGridLayout(requireContext())) {
|
||||
directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
|
||||
}
|
||||
return new ItemTouchHelper.SimpleCallback(directions, ItemTouchHelper.ACTION_STATE_IDLE) {
|
||||
@Override
|
||||
public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,
|
||||
final int viewSize,
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package org.schabi.newpipe.local.playlist;
|
||||
|
||||
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||
import static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar;
|
||||
import static org.schabi.newpipe.ktx.ViewUtils.animate;
|
||||
import static org.schabi.newpipe.local.playlist.ExportPlaylistKt.export;
|
||||
@@ -24,8 +22,6 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.LinearLayout.LayoutParams;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -59,7 +55,6 @@ import org.schabi.newpipe.local.BaseLocalListFragment;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
|
||||
import org.schabi.newpipe.util.DeviceUtils;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.OnClickGesture;
|
||||
@@ -116,7 +111,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
private MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter = null;
|
||||
|
||||
public static LocalPlaylistFragment getInstance(final long playlistId, final String name) {
|
||||
final LocalPlaylistFragment instance = new LocalPlaylistFragment();
|
||||
final var instance = new LocalPlaylistFragment();
|
||||
instance.setInitialData(playlistId, name);
|
||||
return instance;
|
||||
}
|
||||
@@ -185,9 +180,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
itemListAdapter.setSelectedListener(new OnClickGesture<>() {
|
||||
@Override
|
||||
public void selected(final LocalItem selectedItem) {
|
||||
if (selectedItem instanceof PlaylistStreamEntry) {
|
||||
final StreamEntity item =
|
||||
((PlaylistStreamEntry) selectedItem).getStreamEntity();
|
||||
if (selectedItem instanceof PlaylistStreamEntry entry) {
|
||||
final StreamEntity item = entry.getStreamEntity();
|
||||
NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
|
||||
item.getServiceId(), item.getUrl(), item.getTitle(), null, false);
|
||||
}
|
||||
@@ -371,7 +365,17 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
createRenameDialog();
|
||||
} else if (item.getItemId() == R.id.menu_item_remove_watched) {
|
||||
if (!isRewritingPlaylist) {
|
||||
openRemoveWatchedConfirmationDialog();
|
||||
new AlertDialog.Builder(requireContext())
|
||||
.setMessage(R.string.remove_watched_popup_warning)
|
||||
.setTitle(R.string.remove_watched_popup_title)
|
||||
.setPositiveButton(R.string.ok, (d, id) ->
|
||||
removeWatchedStreams(false))
|
||||
.setNeutralButton(
|
||||
R.string.remove_watched_popup_yes_and_partially_watched_videos,
|
||||
(d, id) -> removeWatchedStreams(true))
|
||||
.setNegativeButton(R.string.cancel,
|
||||
(d, id) -> d.cancel())
|
||||
.show();
|
||||
}
|
||||
} else if (item.getItemId() == R.id.menu_item_remove_duplicates) {
|
||||
if (!isRewritingPlaylist) {
|
||||
@@ -443,28 +447,39 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
.getIsPlaylistThumbnailPermanent(playlistId);
|
||||
boolean thumbnailVideoRemoved = false;
|
||||
|
||||
final var streamStates = recordManager
|
||||
.loadLocalStreamStateBatch(playlist).blockingGet();
|
||||
if (removePartiallyWatched) {
|
||||
for (final var playlistItem : playlist) {
|
||||
final int indexInHistory = Collections.binarySearch(historyStreamIds,
|
||||
playlistItem.getStreamId());
|
||||
|
||||
for (int i = 0; i < playlist.size(); i++) {
|
||||
final var playlistItem = playlist.get(i);
|
||||
final var streamStateEntity = streamStates.get(i);
|
||||
final int indexInHistory = Collections.binarySearch(historyStreamIds,
|
||||
playlistItem.getStreamId());
|
||||
final long duration = playlistItem.toStreamInfoItem().getDuration();
|
||||
if (indexInHistory < 0) {
|
||||
itemsToKeep.add(playlistItem);
|
||||
} else if (!isThumbnailPermanent && !thumbnailVideoRemoved
|
||||
&& playlistManager.getPlaylistThumbnailStreamId(playlistId)
|
||||
== playlistItem.getStreamEntity().getUid()) {
|
||||
thumbnailVideoRemoved = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
final var streamStates = recordManager
|
||||
.loadLocalStreamStateBatch(playlist).blockingGet();
|
||||
|
||||
if (indexInHistory < 0 // stream is not in history
|
||||
// stream is in history but the streamStateEntity is null
|
||||
// if the stream was played for less than 5 seconds, see
|
||||
// StreamStateEntity#PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS
|
||||
|| streamStateEntity == null
|
||||
|| (!streamStateEntity.isFinished(duration)
|
||||
&& !removePartiallyWatched)) {
|
||||
itemsToKeep.add(playlistItem);
|
||||
} else if (!isThumbnailPermanent && !thumbnailVideoRemoved
|
||||
&& playlistManager.getPlaylistThumbnailStreamId(playlistId)
|
||||
== playlistItem.getStreamEntity().getUid()) {
|
||||
thumbnailVideoRemoved = true;
|
||||
for (int i = 0; i < playlist.size(); i++) {
|
||||
final var playlistItem = playlist.get(i);
|
||||
final var streamStateEntity = streamStates.get(i);
|
||||
|
||||
final int indexInHistory = Collections.binarySearch(historyStreamIds,
|
||||
playlistItem.getStreamId());
|
||||
final long duration = playlistItem.toStreamInfoItem().getDuration();
|
||||
|
||||
if (indexInHistory < 0 || (streamStateEntity != null
|
||||
&& !streamStateEntity.isFinished(duration))) {
|
||||
itemsToKeep.add(playlistItem);
|
||||
} else if (!isThumbnailPermanent && !thumbnailVideoRemoved
|
||||
&& playlistManager.getPlaylistThumbnailStreamId(playlistId)
|
||||
== playlistItem.getStreamEntity().getUid()) {
|
||||
thumbnailVideoRemoved = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -480,6 +495,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
itemListAdapter.clearStreamItemList();
|
||||
itemListAdapter.addItems(itemsToKeep);
|
||||
debounceSaver.setHasChangesToSave();
|
||||
saveImmediate();
|
||||
|
||||
if (thumbnailVideoRemoved) {
|
||||
updateThumbnailUrl();
|
||||
@@ -544,8 +560,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
return;
|
||||
}
|
||||
|
||||
final DialogEditTextBinding dialogBinding =
|
||||
DialogEditTextBinding.inflate(getLayoutInflater());
|
||||
final var dialogBinding = DialogEditTextBinding.inflate(getLayoutInflater());
|
||||
dialogBinding.dialogEditText.setHint(R.string.name);
|
||||
dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
dialogBinding.dialogEditText.setSelection(dialogBinding.dialogEditText.getText().length());
|
||||
@@ -651,6 +666,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
itemListAdapter.addItems(itemsToKeep);
|
||||
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
|
||||
debounceSaver.setHasChangesToSave();
|
||||
saveImmediate();
|
||||
|
||||
hideLoading();
|
||||
isRewritingPlaylist = false;
|
||||
@@ -670,6 +686,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
|
||||
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
|
||||
debounceSaver.setHasChangesToSave();
|
||||
saveImmediate();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -692,8 +709,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
final List<LocalItem> items = itemListAdapter.getItemsList();
|
||||
final List<Long> streamIds = new ArrayList<>(items.size());
|
||||
for (final LocalItem item : items) {
|
||||
if (item instanceof PlaylistStreamEntry) {
|
||||
streamIds.add(((PlaylistStreamEntry) item).getStreamId());
|
||||
if (item instanceof PlaylistStreamEntry entry) {
|
||||
streamIds.add(entry.getStreamId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -751,6 +768,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex);
|
||||
if (isSwapped) {
|
||||
debounceSaver.setHasChangesToSave();
|
||||
saveImmediate();
|
||||
}
|
||||
return isSwapped;
|
||||
}
|
||||
@@ -880,35 +898,6 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens a confirmation dialog to remove watched streams from the playlist.
|
||||
* The user can also choose to remove partially watched streams.
|
||||
*/
|
||||
private void openRemoveWatchedConfirmationDialog() {
|
||||
final android.widget.CheckBox removePartiallyWatchedCheckbox =
|
||||
new android.widget.CheckBox(requireContext());
|
||||
removePartiallyWatchedCheckbox.setText(
|
||||
R.string.remove_watched_popup_partially_watched_streams);
|
||||
|
||||
// Wrap the checkbox in a container with dialog-like horizontal padding
|
||||
// so it aligns with the dialog title and message on the start side.
|
||||
final LinearLayout checkboxContainer = new LinearLayout(requireContext());
|
||||
checkboxContainer.setOrientation(LinearLayout.VERTICAL);
|
||||
final int padding = DeviceUtils.dpToPx(20, requireContext());
|
||||
checkboxContainer.setPadding(padding, padding, padding, 0);
|
||||
checkboxContainer.addView(removePartiallyWatchedCheckbox,
|
||||
new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
|
||||
|
||||
new AlertDialog.Builder(requireContext())
|
||||
.setMessage(R.string.remove_watched_popup_warning)
|
||||
.setTitle(R.string.remove_watched_popup_title)
|
||||
.setView(checkboxContainer)
|
||||
.setPositiveButton(R.string.yes, (d, id) ->
|
||||
removeWatchedStreams(removePartiallyWatchedCheckbox.isChecked()))
|
||||
.setNegativeButton(R.string.cancel, (d, id) -> d.cancel())
|
||||
.show();
|
||||
}
|
||||
|
||||
public void setTabsPagerAdapter(
|
||||
@Nullable final MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter) {
|
||||
this.tabsPagerAdapter = tabsPagerAdapter;
|
||||
|
||||
@@ -10,26 +10,23 @@ import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.evernote.android.state.State;
|
||||
import com.livefront.bridge.Bridge;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
|
||||
public class ImportConfirmationDialog extends DialogFragment {
|
||||
@State
|
||||
protected Intent resultServiceIntent;
|
||||
private static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent";
|
||||
|
||||
public static void show(@NonNull final Fragment fragment,
|
||||
@NonNull final Intent resultServiceIntent) {
|
||||
final ImportConfirmationDialog confirmationDialog = new ImportConfirmationDialog();
|
||||
confirmationDialog.setResultServiceIntent(resultServiceIntent);
|
||||
final Bundle args = new Bundle();
|
||||
args.putParcelable(EXTRA_RESULT_SERVICE_INTENT, resultServiceIntent);
|
||||
confirmationDialog.setArguments(args);
|
||||
confirmationDialog.show(fragment.getParentFragmentManager(), null);
|
||||
}
|
||||
|
||||
public void setResultServiceIntent(final Intent resultServiceIntent) {
|
||||
this.resultServiceIntent = resultServiceIntent;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
|
||||
@@ -38,9 +35,7 @@ public class ImportConfirmationDialog extends DialogFragment {
|
||||
.setCancelable(true)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
|
||||
if (resultServiceIntent != null && getContext() != null) {
|
||||
getContext().startService(resultServiceIntent);
|
||||
}
|
||||
requireContext().startService(resultServiceIntent);
|
||||
dismiss();
|
||||
})
|
||||
.create();
|
||||
@@ -50,11 +45,7 @@ public class ImportConfirmationDialog extends DialogFragment {
|
||||
public void onCreate(@Nullable final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (resultServiceIntent == null) {
|
||||
throw new IllegalStateException("Result intent is null");
|
||||
}
|
||||
|
||||
Bridge.restoreInstanceState(this, savedInstanceState);
|
||||
resultServiceIntent = requireArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -141,11 +141,11 @@ public final class PlayerHelper {
|
||||
@ResizeMode final int resizeMode) {
|
||||
switch (resizeMode) {
|
||||
case AspectRatioFrameLayout.RESIZE_MODE_FIT:
|
||||
return context.getResources().getString(R.string.resize_fit);
|
||||
return context.getString(R.string.resize_fit);
|
||||
case AspectRatioFrameLayout.RESIZE_MODE_FILL:
|
||||
return context.getResources().getString(R.string.resize_fill);
|
||||
return context.getString(R.string.resize_fill);
|
||||
case AspectRatioFrameLayout.RESIZE_MODE_ZOOM:
|
||||
return context.getResources().getString(R.string.resize_zoom);
|
||||
return context.getString(R.string.resize_zoom);
|
||||
case AspectRatioFrameLayout.RESIZE_MODE_FIXED_HEIGHT:
|
||||
case AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH:
|
||||
default:
|
||||
|
||||
@@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.BackpressureStrategy;
|
||||
import io.reactivex.rxjava3.core.Flowable;
|
||||
import io.reactivex.rxjava3.subjects.BehaviorSubject;
|
||||
import io.reactivex.rxjava3.subjects.PublishSubject;
|
||||
|
||||
/**
|
||||
* PlayQueue is responsible for keeping track of a list of streams and the index of
|
||||
@@ -46,7 +46,7 @@ public abstract class PlayQueue implements Serializable {
|
||||
private List<PlayQueueItem> backup;
|
||||
private List<PlayQueueItem> streams;
|
||||
|
||||
private transient BehaviorSubject<PlayQueueEvent> eventBroadcast;
|
||||
private transient PublishSubject<PlayQueueEvent> eventBroadcast;
|
||||
private transient Flowable<PlayQueueEvent> broadcastReceiver;
|
||||
private transient boolean disposed = false;
|
||||
|
||||
@@ -71,7 +71,7 @@ public abstract class PlayQueue implements Serializable {
|
||||
* </p>
|
||||
*/
|
||||
public void init() {
|
||||
eventBroadcast = BehaviorSubject.create();
|
||||
eventBroadcast = PublishSubject.create();
|
||||
|
||||
broadcastReceiver = eventBroadcast.toFlowable(BackpressureStrategy.BUFFER)
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
|
||||
@@ -1554,6 +1554,11 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa
|
||||
@Override
|
||||
public void onVideoSizeChanged(@NonNull final VideoSize videoSize) {
|
||||
super.onVideoSizeChanged(videoSize);
|
||||
// Starting with ExoPlayer 2.19.0, the VideoSize will report a width and height of 0
|
||||
// if the renderer is disabled. In that case, we skip updating the aspect ratio.
|
||||
if (videoSize.width == 0 || videoSize.height == 0) {
|
||||
return;
|
||||
}
|
||||
binding.surfaceView.setAspectRatio(((float) videoSize.width) / videoSize.height);
|
||||
}
|
||||
//endregion
|
||||
|
||||
@@ -98,10 +98,9 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment {
|
||||
return true;
|
||||
});
|
||||
|
||||
final Preference resetSettings = findPreference(getString(R.string.reset_settings));
|
||||
final Preference resetSettings = requirePreference(R.string.reset_settings);
|
||||
// Resets all settings by deleting shared preference and restarting the app
|
||||
// A dialogue will pop up to confirm if user intends to reset all settings
|
||||
assert resetSettings != null;
|
||||
resetSettings.setOnPreferenceClickListener(preference -> {
|
||||
// Show Alert Dialogue
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
||||
|
||||
@@ -48,8 +48,8 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public final Preference requirePreference(@StringRes final int resId) {
|
||||
final Preference preference = findPreference(getString(resId));
|
||||
public final <T extends Preference> T requirePreference(@StringRes final int resId) {
|
||||
final T preference = findPreference(getString(resId));
|
||||
Objects.requireNonNull(preference);
|
||||
return preference;
|
||||
}
|
||||
|
||||
@@ -22,27 +22,20 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||
addPreferencesFromResourceRegistry();
|
||||
|
||||
final Preference allowHeapDumpingPreference =
|
||||
findPreference(getString(R.string.allow_heap_dumping_key));
|
||||
requirePreference(R.string.allow_heap_dumping_key);
|
||||
final Preference showMemoryLeaksPreference =
|
||||
findPreference(getString(R.string.show_memory_leaks_key));
|
||||
requirePreference(R.string.show_memory_leaks_key);
|
||||
final Preference showImageIndicatorsPreference =
|
||||
findPreference(getString(R.string.show_image_indicators_key));
|
||||
requirePreference(R.string.show_image_indicators_key);
|
||||
final Preference checkNewStreamsPreference =
|
||||
findPreference(getString(R.string.check_new_streams_key));
|
||||
requirePreference(R.string.check_new_streams_key);
|
||||
final Preference crashTheAppPreference =
|
||||
findPreference(getString(R.string.crash_the_app_key));
|
||||
requirePreference(R.string.crash_the_app_key);
|
||||
final Preference showErrorSnackbarPreference =
|
||||
findPreference(getString(R.string.show_error_snackbar_key));
|
||||
requirePreference(R.string.show_error_snackbar_key);
|
||||
final Preference createErrorNotificationPreference =
|
||||
findPreference(getString(R.string.create_error_notification_key));
|
||||
requirePreference(R.string.create_error_notification_key);
|
||||
|
||||
assert allowHeapDumpingPreference != null;
|
||||
assert showMemoryLeaksPreference != null;
|
||||
assert showImageIndicatorsPreference != null;
|
||||
assert checkNewStreamsPreference != null;
|
||||
assert crashTheAppPreference != null;
|
||||
assert showErrorSnackbarPreference != null;
|
||||
assert createErrorNotificationPreference != null;
|
||||
|
||||
final Optional<DebugSettingsBVDLeakCanaryAPI> optBVLeakCanary = getBVDLeakCanary();
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ public class MainSettingsFragment extends BasePreferenceFragment {
|
||||
// Check if the app is updatable
|
||||
if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) {
|
||||
getPreferenceScreen().removePreference(
|
||||
findPreference(getString(R.string.update_pref_screen_key)));
|
||||
requirePreference(R.string.update_pref_screen_key));
|
||||
|
||||
defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();
|
||||
}
|
||||
@@ -33,7 +33,7 @@ public class MainSettingsFragment extends BasePreferenceFragment {
|
||||
// Hide debug preferences in RELEASE build variant
|
||||
if (!DEBUG) {
|
||||
getPreferenceScreen().removePreference(
|
||||
findPreference(getString(R.string.debug_pref_screen_key)));
|
||||
requirePreference(R.string.debug_pref_screen_key));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,8 +29,7 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
addPreferencesFromResource(R.xml.notifications_settings)
|
||||
streamsNotificationsPreference =
|
||||
findPreference(getString(R.string.enable_streams_notifications))
|
||||
streamsNotificationsPreference = requirePreference(R.string.enable_streams_notifications)
|
||||
|
||||
// main check is done in onResume, but also do it here to prevent flickering
|
||||
updateEnabledState(NotificationHelper.areNotificationsEnabledOnDevice(requireContext()))
|
||||
@@ -125,8 +124,8 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen
|
||||
|
||||
private fun updateSubscriptions(subscriptions: List<SubscriptionEntity>) {
|
||||
val notified = subscriptions.count { it.notificationMode != NotificationMode.DISABLED }
|
||||
val preference = findPreference<Preference>(getString(R.string.streams_notifications_channels_key))
|
||||
preference?.apply { summary = "$notified/${subscriptions.size}" }
|
||||
val preference = requirePreference<Preference>(R.string.streams_notifications_channels_key)
|
||||
preference.summary = "$notified/${subscriptions.size}"
|
||||
}
|
||||
|
||||
private fun onError(e: Throwable) {
|
||||
|
||||
@@ -34,9 +34,9 @@ public class UpdateSettingsFragment extends BasePreferenceFragment {
|
||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||
addPreferencesFromResourceRegistry();
|
||||
|
||||
findPreference(getString(R.string.update_app_key))
|
||||
requirePreference(R.string.update_app_key)
|
||||
.setOnPreferenceChangeListener(updatePreferenceChange);
|
||||
findPreference(getString(R.string.manual_update_key))
|
||||
requirePreference(R.string.manual_update_key)
|
||||
.setOnPreferenceClickListener(manualUpdateClick);
|
||||
}
|
||||
|
||||
|
||||
@@ -90,12 +90,12 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment {
|
||||
showHigherResolutions);
|
||||
|
||||
// get resolution preferences
|
||||
final ListPreference defaultResolution = findPreference(
|
||||
getString(R.string.default_resolution_key));
|
||||
final ListPreference defaultPopupResolution = findPreference(
|
||||
getString(R.string.default_popup_resolution_key));
|
||||
final ListPreference mobileDataResolution = findPreference(
|
||||
getString(R.string.limit_mobile_data_usage_key));
|
||||
final ListPreference defaultResolution = requirePreference(
|
||||
R.string.default_resolution_key);
|
||||
final ListPreference defaultPopupResolution = requirePreference(
|
||||
R.string.default_popup_resolution_key);
|
||||
final ListPreference mobileDataResolution = requirePreference(
|
||||
R.string.limit_mobile_data_usage_key);
|
||||
|
||||
// update resolution preferences with new resolutions, entries & values for each
|
||||
defaultResolution.setEntries(resolutionListDescriptions.toArray(new String[0]));
|
||||
@@ -161,8 +161,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment {
|
||||
}
|
||||
}
|
||||
|
||||
final ListPreference durations = findPreference(
|
||||
getString(R.string.seek_duration_key));
|
||||
final ListPreference durations = requirePreference(R.string.seek_duration_key);
|
||||
durations.setEntryValues(displayedDurationValues.toArray(new CharSequence[0]));
|
||||
durations.setEntries(displayedDescriptionValues.toArray(new CharSequence[0]));
|
||||
final int selectedDuration = Integer.parseInt(durations.getValue());
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
package org.schabi.newpipe.streams;
|
||||
|
||||
import static org.schabi.newpipe.MainActivity.DEBUG;
|
||||
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.streams.WebMReader.Cluster;
|
||||
import org.schabi.newpipe.streams.WebMReader.Segment;
|
||||
import org.schabi.newpipe.streams.WebMReader.SimpleBlock;
|
||||
@@ -13,6 +19,10 @@ import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author kapodamy
|
||||
@@ -52,8 +62,10 @@ public class OggFromWebMWriter implements Closeable {
|
||||
private long segmentTableNextTimestamp = TIME_SCALE_NS;
|
||||
|
||||
private final int[] crc32Table = new int[256];
|
||||
private final StreamInfo streamInfo;
|
||||
|
||||
public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target) {
|
||||
public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target,
|
||||
@Nullable final StreamInfo streamInfo) {
|
||||
if (!source.canRead() || !source.canRewind()) {
|
||||
throw new IllegalArgumentException("source stream must be readable and allows seeking");
|
||||
}
|
||||
@@ -63,6 +75,7 @@ public class OggFromWebMWriter implements Closeable {
|
||||
|
||||
this.source = source;
|
||||
this.output = target;
|
||||
this.streamInfo = streamInfo;
|
||||
|
||||
this.streamId = (int) System.currentTimeMillis();
|
||||
|
||||
@@ -271,12 +284,31 @@ public class OggFromWebMWriter implements Closeable {
|
||||
|
||||
@Nullable
|
||||
private byte[] makeMetadata() {
|
||||
if (DEBUG) {
|
||||
Log.d("OggFromWebMWriter", "Downloading media with codec ID " + webmTrack.codecId);
|
||||
}
|
||||
|
||||
if ("A_OPUS".equals(webmTrack.codecId)) {
|
||||
return new byte[]{
|
||||
0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string
|
||||
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
|
||||
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
|
||||
};
|
||||
final var metadata = new ArrayList<Pair<String, String>>();
|
||||
if (streamInfo != null) {
|
||||
metadata.add(Pair.create("COMMENT", streamInfo.getUrl()));
|
||||
metadata.add(Pair.create("GENRE", streamInfo.getCategory()));
|
||||
metadata.add(Pair.create("ARTIST", streamInfo.getUploaderName()));
|
||||
metadata.add(Pair.create("TITLE", streamInfo.getName()));
|
||||
metadata.add(Pair.create("DATE", streamInfo
|
||||
.getUploadDate()
|
||||
.getLocalDateTime()
|
||||
.format(DateTimeFormatter.ISO_DATE)));
|
||||
}
|
||||
|
||||
if (DEBUG) {
|
||||
Log.d("OggFromWebMWriter", "Creating metadata header with this data:");
|
||||
metadata.forEach(p -> {
|
||||
Log.d("OggFromWebMWriter", p.first + "=" + p.second);
|
||||
});
|
||||
}
|
||||
|
||||
return makeOpusTagsHeader(metadata);
|
||||
} else if ("A_VORBIS".equals(webmTrack.codecId)) {
|
||||
return new byte[]{
|
||||
0x03, // ¿¿¿???
|
||||
@@ -290,6 +322,59 @@ public class OggFromWebMWriter implements Closeable {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* This creates a single metadata tag for use in opus metadata headers. It contains the four
|
||||
* byte string length field and includes the string as-is. This cannot be used independently,
|
||||
* but must follow a proper "OpusTags" header.
|
||||
*
|
||||
* @param pair A key-value pair in the format "KEY=some value"
|
||||
* @return The binary data of the encoded metadata tag
|
||||
*/
|
||||
private static byte[] makeOpusMetadataTag(final Pair<String, String> pair) {
|
||||
final var keyValue = pair.first.toUpperCase() + "=" + pair.second.trim();
|
||||
|
||||
final var bytes = keyValue.getBytes();
|
||||
final var buf = ByteBuffer.allocate(4 + bytes.length);
|
||||
buf.order(ByteOrder.LITTLE_ENDIAN);
|
||||
buf.putInt(bytes.length);
|
||||
buf.put(bytes);
|
||||
return buf.array();
|
||||
}
|
||||
|
||||
/**
|
||||
* This returns a complete "OpusTags" header, created from the provided metadata tags.
|
||||
* <p>
|
||||
* You probably want to use makeOpusMetadata(), which uses this function to create
|
||||
* a header with sensible metadata filled in.
|
||||
*
|
||||
* @param keyValueLines A list of pairs of the tags. This can also be though of as a mapping
|
||||
* from one key to multiple values.
|
||||
* @return The binary header
|
||||
*/
|
||||
private static byte[] makeOpusTagsHeader(final List<Pair<String, String>> keyValueLines) {
|
||||
final var tags = keyValueLines
|
||||
.stream()
|
||||
.filter(p -> !p.second.isBlank())
|
||||
.map(OggFromWebMWriter::makeOpusMetadataTag)
|
||||
.collect(Collectors.toUnmodifiableList());
|
||||
|
||||
final var tagsBytes = tags.stream().collect(Collectors.summingInt(arr -> arr.length));
|
||||
|
||||
// Fixed header fields + dynamic fields
|
||||
final var byteCount = 16 + tagsBytes;
|
||||
|
||||
final var head = ByteBuffer.allocate(byteCount);
|
||||
head.order(ByteOrder.LITTLE_ENDIAN);
|
||||
head.put(new byte[]{
|
||||
0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string
|
||||
0x00, 0x00, 0x00, 0x00, // vendor (aka. Encoder) string of length 0
|
||||
});
|
||||
head.putInt(tags.size()); // 4 bytes for tag count
|
||||
tags.forEach(head::put); // dynamic amount of tag bytes
|
||||
|
||||
return head.array();
|
||||
}
|
||||
|
||||
private void write(final ByteBuffer buffer) throws IOException {
|
||||
output.write(buffer.array(), 0, buffer.position());
|
||||
buffer.position(0);
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
package org.schabi.newpipe.util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
|
||||
/**
|
||||
* Created by Christian Schabesberger on 28.09.17.
|
||||
* KioskTranslator.java is part of NewPipe.
|
||||
* <p>
|
||||
* NewPipe is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* </p>
|
||||
* <p>
|
||||
* NewPipe is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* </p>
|
||||
* <p>
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
||||
* </p>
|
||||
*/
|
||||
|
||||
public final class KioskTranslator {
|
||||
private KioskTranslator() { }
|
||||
|
||||
public static String getTranslatedKioskName(final String kioskId, final Context c) {
|
||||
switch (kioskId) {
|
||||
case "Trending":
|
||||
return c.getString(R.string.trending);
|
||||
case "Top 50":
|
||||
return c.getString(R.string.top_50);
|
||||
case "New & hot":
|
||||
return c.getString(R.string.new_and_hot);
|
||||
case "Local":
|
||||
return c.getString(R.string.local);
|
||||
case "Recently added":
|
||||
return c.getString(R.string.recently_added);
|
||||
case "Most liked":
|
||||
return c.getString(R.string.most_liked);
|
||||
case "conferences":
|
||||
return c.getString(R.string.conferences);
|
||||
case "recent":
|
||||
return c.getString(R.string.recent);
|
||||
case "live":
|
||||
return c.getString(R.string.duration_live);
|
||||
case "Featured":
|
||||
return c.getString(R.string.featured);
|
||||
case "Radio":
|
||||
return c.getString(R.string.radio);
|
||||
case "trending_gaming":
|
||||
return c.getString(R.string.trending_gaming);
|
||||
case "trending_music":
|
||||
return c.getString(R.string.trending_music);
|
||||
case "trending_movies_and_shows":
|
||||
return c.getString(R.string.trending_movies);
|
||||
case "trending_podcasts_episodes":
|
||||
return c.getString(R.string.trending_podcasts);
|
||||
default:
|
||||
return kioskId;
|
||||
}
|
||||
}
|
||||
|
||||
public static int getKioskIcon(final String kioskId) {
|
||||
switch (kioskId) {
|
||||
case "Trending":
|
||||
case "Top 50":
|
||||
case "New & hot":
|
||||
case "conferences":
|
||||
return R.drawable.ic_whatshot;
|
||||
case "Local":
|
||||
return R.drawable.ic_home;
|
||||
case "Recently added":
|
||||
case "recent":
|
||||
return R.drawable.ic_add_circle_outline;
|
||||
case "Most liked":
|
||||
return R.drawable.ic_thumb_up;
|
||||
case "live":
|
||||
return R.drawable.ic_live_tv;
|
||||
case "Featured":
|
||||
return R.drawable.ic_stars;
|
||||
case "Radio":
|
||||
return R.drawable.ic_radio;
|
||||
case "trending_gaming":
|
||||
return R.drawable.ic_videogame_asset;
|
||||
case "trending_music":
|
||||
return R.drawable.ic_music_note;
|
||||
case "trending_movies_and_shows":
|
||||
return R.drawable.ic_movie;
|
||||
case "trending_podcasts_episodes":
|
||||
return R.drawable.ic_podcasts;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
52
app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt
Normal file
52
app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>
|
||||
* SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package org.schabi.newpipe.util
|
||||
|
||||
import android.content.Context
|
||||
import org.schabi.newpipe.R
|
||||
|
||||
object KioskTranslator {
|
||||
@JvmStatic
|
||||
fun getTranslatedKioskName(kioskId: String, context: Context): String {
|
||||
return when (kioskId) {
|
||||
"Trending" -> context.getString(R.string.trending)
|
||||
"Top 50" -> context.getString(R.string.top_50)
|
||||
"New & hot" -> context.getString(R.string.new_and_hot)
|
||||
"Local" -> context.getString(R.string.local)
|
||||
"Recently added" -> context.getString(R.string.recently_added)
|
||||
"Most liked" -> context.getString(R.string.most_liked)
|
||||
"conferences" -> context.getString(R.string.conferences)
|
||||
"recent" -> context.getString(R.string.recent)
|
||||
"live" -> context.getString(R.string.duration_live)
|
||||
"Featured" -> context.getString(R.string.featured)
|
||||
"Radio" -> context.getString(R.string.radio)
|
||||
"trending_gaming" -> context.getString(R.string.trending_gaming)
|
||||
"trending_music" -> context.getString(R.string.trending_music)
|
||||
"trending_movies_and_shows" -> context.getString(R.string.trending_movies)
|
||||
"trending_podcasts_episodes" -> context.getString(R.string.trending_podcasts)
|
||||
else -> kioskId
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getKioskIcon(kioskId: String): Int {
|
||||
return when (kioskId) {
|
||||
"Trending", "Top 50", "New & hot", "conferences" -> R.drawable.ic_whatshot
|
||||
"Local" -> R.drawable.ic_home
|
||||
"Recently added", "recent" -> R.drawable.ic_add_circle_outline
|
||||
"Most liked" -> R.drawable.ic_thumb_up
|
||||
"live" -> R.drawable.ic_live_tv
|
||||
"Featured" -> R.drawable.ic_stars
|
||||
"Radio" -> R.drawable.ic_radio
|
||||
"trending_gaming" -> R.drawable.ic_videogame_asset
|
||||
"trending_music" -> R.drawable.ic_music_note
|
||||
"trending_movies_and_shows" -> R.drawable.ic_movie
|
||||
"trending_podcasts_episodes" -> R.drawable.ic_podcasts
|
||||
else -> 0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -806,7 +806,7 @@ public final class ListHelper {
|
||||
final Locale preferredLanguage = Localization.getPreferredLocale(context);
|
||||
final boolean preferOriginalAudio =
|
||||
preferences.getBoolean(context.getString(R.string.prefer_original_audio_key),
|
||||
false);
|
||||
true);
|
||||
final boolean preferDescriptiveAudio =
|
||||
preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key),
|
||||
false);
|
||||
|
||||
@@ -153,9 +153,9 @@ public final class Localization {
|
||||
case (int) ListExtractor.ITEM_COUNT_UNKNOWN:
|
||||
return "";
|
||||
case (int) ListExtractor.ITEM_COUNT_INFINITE:
|
||||
return context.getResources().getString(R.string.infinite_videos);
|
||||
return context.getString(R.string.infinite_videos);
|
||||
case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100:
|
||||
return context.getResources().getString(R.string.more_than_100_videos);
|
||||
return context.getString(R.string.more_than_100_videos);
|
||||
default:
|
||||
return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount,
|
||||
localizeNumber(streamCount));
|
||||
@@ -168,9 +168,9 @@ public final class Localization {
|
||||
case (int) ListExtractor.ITEM_COUNT_UNKNOWN:
|
||||
return "";
|
||||
case (int) ListExtractor.ITEM_COUNT_INFINITE:
|
||||
return context.getResources().getString(R.string.infinite_videos_mini);
|
||||
return context.getString(R.string.infinite_videos_mini);
|
||||
case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100:
|
||||
return context.getResources().getString(R.string.more_than_100_videos_mini);
|
||||
return context.getString(R.string.more_than_100_videos_mini);
|
||||
default:
|
||||
return String.valueOf(streamCount);
|
||||
}
|
||||
|
||||
@@ -263,7 +263,7 @@ public final class ThemeHelper {
|
||||
|
||||
private static String getSelectedThemeKey(final Context context) {
|
||||
final String themeKey = context.getString(R.string.theme_key);
|
||||
final String defaultTheme = context.getResources().getString(R.string.default_theme_value);
|
||||
final String defaultTheme = context.getString(R.string.default_theme_value);
|
||||
return PreferenceManager.getDefaultSharedPreferences(context)
|
||||
.getString(themeKey, defaultTheme);
|
||||
}
|
||||
|
||||
@@ -35,12 +35,12 @@ public class ExpandableSurfaceView extends SurfaceView {
|
||||
&& resizeMode != RESIZE_MODE_FIT
|
||||
&& verticalVideo ? maxHeight : baseHeight;
|
||||
|
||||
if (height == 0) {
|
||||
if (width == 0 || height == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
final float viewAspectRatio = width / ((float) height);
|
||||
final float aspectDeformation = videoAspectRatio / viewAspectRatio - 1;
|
||||
final float aspectDeformation = (videoAspectRatio / viewAspectRatio) - 1;
|
||||
scaleX = 1.0f;
|
||||
scaleY = 1.0f;
|
||||
|
||||
@@ -100,7 +100,7 @@ public class ExpandableSurfaceView extends SurfaceView {
|
||||
}
|
||||
|
||||
public void setAspectRatio(final float aspectRatio) {
|
||||
if (videoAspectRatio == aspectRatio) {
|
||||
if (videoAspectRatio == aspectRatio || aspectRatio == 0 || !Float.isFinite(aspectRatio)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -85,6 +85,7 @@ public class DownloadRunnableFallback extends Thread {
|
||||
if (mMission.unknownLength || mConn.getResponseCode() == 200) {
|
||||
// restart amount of bytes downloaded
|
||||
mMission.done = mMission.offsets[mMission.current] - mMission.offsets[0];
|
||||
start = 0; // reset position to avoid writing at wrong offset
|
||||
}
|
||||
|
||||
mF = mMission.storage.getStream();
|
||||
|
||||
@@ -34,7 +34,7 @@ class OggFromWebmDemuxer extends Postprocessing {
|
||||
|
||||
@Override
|
||||
int process(SharpStream out, @NonNull SharpStream... sources) throws IOException {
|
||||
OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out);
|
||||
OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out, streamInfo);
|
||||
demuxer.parseSource();
|
||||
demuxer.selectTrack(0);
|
||||
demuxer.build();
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.streams.io.SharpStream;
|
||||
|
||||
import java.io.File;
|
||||
@@ -30,7 +31,8 @@ public abstract class Postprocessing implements Serializable {
|
||||
public transient static final String ALGORITHM_M4A_NO_DASH = "mp4D-m4a";
|
||||
public transient static final String ALGORITHM_OGG_FROM_WEBM_DEMUXER = "webm-ogg-d";
|
||||
|
||||
public static Postprocessing getAlgorithm(@NonNull String algorithmName, String[] args) {
|
||||
public static Postprocessing getAlgorithm(@NonNull String algorithmName, String[] args,
|
||||
StreamInfo streamInfo) {
|
||||
Postprocessing instance;
|
||||
|
||||
switch (algorithmName) {
|
||||
@@ -56,6 +58,7 @@ public abstract class Postprocessing implements Serializable {
|
||||
}
|
||||
|
||||
instance.args = args;
|
||||
instance.streamInfo = streamInfo;
|
||||
return instance;
|
||||
}
|
||||
|
||||
@@ -75,8 +78,8 @@ public abstract class Postprocessing implements Serializable {
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
|
||||
private String[] args;
|
||||
protected StreamInfo streamInfo;
|
||||
|
||||
private transient DownloadMission mission;
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ import androidx.preference.PreferenceManager;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.download.DownloadActivity;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.player.helper.LockManager;
|
||||
import org.schabi.newpipe.streams.io.StoredDirectoryHelper;
|
||||
import org.schabi.newpipe.streams.io.StoredFileHelper;
|
||||
@@ -74,12 +75,12 @@ public class DownloadManagerService extends Service {
|
||||
private static final String EXTRA_THREADS = "DownloadManagerService.extra.threads";
|
||||
private static final String EXTRA_POSTPROCESSING_NAME = "DownloadManagerService.extra.postprocessingName";
|
||||
private static final String EXTRA_POSTPROCESSING_ARGS = "DownloadManagerService.extra.postprocessingArgs";
|
||||
private static final String EXTRA_SOURCE = "DownloadManagerService.extra.source";
|
||||
private static final String EXTRA_NEAR_LENGTH = "DownloadManagerService.extra.nearLength";
|
||||
private static final String EXTRA_PATH = "DownloadManagerService.extra.storagePath";
|
||||
private static final String EXTRA_PARENT_PATH = "DownloadManagerService.extra.storageParentPath";
|
||||
private static final String EXTRA_STORAGE_TAG = "DownloadManagerService.extra.storageTag";
|
||||
private static final String EXTRA_RECOVERY_INFO = "DownloadManagerService.extra.recoveryInfo";
|
||||
private static final String EXTRA_STREAM_INFO = "DownloadManagerService.extra.streamInfo";
|
||||
|
||||
private static final String ACTION_RESET_DOWNLOAD_FINISHED = APPLICATION_ID + ".reset_download_finished";
|
||||
private static final String ACTION_OPEN_DOWNLOADS_FINISHED = APPLICATION_ID + ".open_downloads_finished";
|
||||
@@ -353,13 +354,13 @@ public class DownloadManagerService extends Service {
|
||||
* @param kind type of file (a: audio v: video s: subtitle ?: file-extension defined)
|
||||
* @param threads the number of threads maximal used to download chunks of the file.
|
||||
* @param psName the name of the required post-processing algorithm, or {@code null} to ignore.
|
||||
* @param source source url of the resource
|
||||
* @param streamInfo stream metadata that may be written into the downloaded file.
|
||||
* @param psArgs the arguments for the post-processing algorithm.
|
||||
* @param nearLength the approximated final length of the file
|
||||
* @param recoveryInfo array of MissionRecoveryInfo, in case is required recover the download
|
||||
*/
|
||||
public static void startMission(Context context, String[] urls, StoredFileHelper storage,
|
||||
char kind, int threads, String source, String psName,
|
||||
char kind, int threads, StreamInfo streamInfo, String psName,
|
||||
String[] psArgs, long nearLength,
|
||||
ArrayList<MissionRecoveryInfo> recoveryInfo) {
|
||||
final Intent intent = new Intent(context, DownloadManagerService.class)
|
||||
@@ -367,14 +368,14 @@ public class DownloadManagerService extends Service {
|
||||
.putExtra(EXTRA_URLS, urls)
|
||||
.putExtra(EXTRA_KIND, kind)
|
||||
.putExtra(EXTRA_THREADS, threads)
|
||||
.putExtra(EXTRA_SOURCE, source)
|
||||
.putExtra(EXTRA_POSTPROCESSING_NAME, psName)
|
||||
.putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs)
|
||||
.putExtra(EXTRA_NEAR_LENGTH, nearLength)
|
||||
.putExtra(EXTRA_RECOVERY_INFO, recoveryInfo)
|
||||
.putExtra(EXTRA_PARENT_PATH, storage.getParentUri())
|
||||
.putExtra(EXTRA_PATH, storage.getUri())
|
||||
.putExtra(EXTRA_STORAGE_TAG, storage.getTag());
|
||||
.putExtra(EXTRA_STORAGE_TAG, storage.getTag())
|
||||
.putExtra(EXTRA_STREAM_INFO, streamInfo);
|
||||
|
||||
context.startService(intent);
|
||||
}
|
||||
@@ -387,9 +388,9 @@ public class DownloadManagerService extends Service {
|
||||
char kind = intent.getCharExtra(EXTRA_KIND, '?');
|
||||
String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME);
|
||||
String[] psArgs = intent.getStringArrayExtra(EXTRA_POSTPROCESSING_ARGS);
|
||||
String source = intent.getStringExtra(EXTRA_SOURCE);
|
||||
long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0);
|
||||
String tag = intent.getStringExtra(EXTRA_STORAGE_TAG);
|
||||
StreamInfo streamInfo = (StreamInfo)intent.getSerializableExtra(EXTRA_STREAM_INFO);
|
||||
final var recovery = IntentCompat.getParcelableArrayListExtra(intent, EXTRA_RECOVERY_INFO,
|
||||
MissionRecoveryInfo.class);
|
||||
Objects.requireNonNull(recovery);
|
||||
@@ -405,11 +406,11 @@ public class DownloadManagerService extends Service {
|
||||
if (psName == null)
|
||||
ps = null;
|
||||
else
|
||||
ps = Postprocessing.getAlgorithm(psName, psArgs);
|
||||
ps = Postprocessing.getAlgorithm(psName, psArgs, streamInfo);
|
||||
|
||||
final DownloadMission mission = new DownloadMission(urls, storage, kind, ps);
|
||||
mission.threadCount = threads;
|
||||
mission.source = source;
|
||||
mission.source = streamInfo.getUrl();
|
||||
mission.nearLength = nearLength;
|
||||
mission.recoveryInfo = recovery.toArray(new MissionRecoveryInfo[0]);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package us.shandian.giga.ui.adapter;
|
||||
|
||||
import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION;
|
||||
import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
|
||||
import static android.content.Intent.createChooser;
|
||||
import static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST;
|
||||
import static us.shandian.giga.get.DownloadMission.ERROR_FILE_CREATION;
|
||||
import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_NO_CONTENT;
|
||||
@@ -349,11 +350,15 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.v(TAG, "Mime: " + mimeType + " package: " + BuildConfig.APPLICATION_ID + ".provider");
|
||||
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||
intent.setDataAndType(resolveShareableUri(mission), mimeType);
|
||||
intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
|
||||
intent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION);
|
||||
ShareUtils.openIntentInApp(mContext, intent);
|
||||
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
|
||||
viewIntent.setDataAndType(resolveShareableUri(mission), mimeType);
|
||||
viewIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
|
||||
viewIntent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION);
|
||||
|
||||
Intent chooserIntent = createChooser(viewIntent, null);
|
||||
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | FLAG_GRANT_READ_URI_PERMISSION);
|
||||
|
||||
ShareUtils.openIntentInApp(mContext, chooserIntent);
|
||||
}
|
||||
|
||||
private void shareFile(Mission mission) {
|
||||
@@ -364,8 +369,7 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
|
||||
shareIntent.putExtra(Intent.EXTRA_STREAM, resolveShareableUri(mission));
|
||||
shareIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
|
||||
|
||||
final Intent intent = new Intent(Intent.ACTION_CHOOSER);
|
||||
intent.putExtra(Intent.EXTRA_INTENT, shareIntent);
|
||||
final Intent intent = createChooser(shareIntent, null);
|
||||
// unneeded to set a title to the chooser on Android P and higher because the system
|
||||
// ignores this title on these versions
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
<item quantity="other">%s مُشاهِد</item>
|
||||
</plurals>
|
||||
<string name="show_hold_to_append_summary">عرض تلميح عند الضغط على زر استخدام المشغل الخلفي أو النافذة المنبثقة في صفحة تفاصيل الفديو</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
|
||||
<string name="error_timeout">انتهى وقت الاتصال</string>
|
||||
<string name="unknown_audio_track">غير معروف</string>
|
||||
<string name="autoplay_title">تشغيل تلقائي</string>
|
||||
|
||||
@@ -547,7 +547,7 @@
|
||||
<string name="restricted_video">هذا الفيديو مقيد بالفئة العمرية.
|
||||
\n
|
||||
\nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
|
||||
<string name="remove_watched_popup_warning">ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل.
|
||||
\nهل أنت واثق؟ لا يمكن التراجع عن هذا!</string>
|
||||
<string name="remove_watched_popup_title">إزالة مقاطع الفيديو التي تمت مشاهدتها؟</string>
|
||||
|
||||
@@ -585,7 +585,7 @@
|
||||
<string name="peertube_instance_add_fail">Serveri təsdiqləmək mümkün olmadı</string>
|
||||
<string name="peertube_instance_url_help">%s-də bəyəndiyiniz serverləri tapın</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ı titr 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="caption_setting_description">Oynadıcı titr mətn miqyasını və arxa plan ü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>
|
||||
@@ -652,7 +652,7 @@
|
||||
<string name="playback_speed_control">Oynatma Sürəti Nizamlamaları</string>
|
||||
<string name="unhook_checkbox">Ayır (pozuntuya səbəb ola bilər)</string>
|
||||
<string name="show_error">Xətanı göstər</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Bəli və qismən baxılmış videolar</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Bəli və qismən baxılmış videolar</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="one">%1$s endirməsi silindi</item>
|
||||
<item quantity="other">%1$s endirmə silindi</item>
|
||||
|
||||
@@ -312,7 +312,7 @@
|
||||
<string name="feed_oldest_subscription_update">Últimu anovamientu del feed: %s</string>
|
||||
<string name="feed_groups_header_title">Grupos de canales</string>
|
||||
<string name="new_seek_duration_toast">Pola mor de les torgues d\'ExoPlayer la duración afitóse en %d segundos</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sí, y tamién los vistos parcialmente</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sí, y tamién los vistos parcialmente</string>
|
||||
<string name="remove_watched_popup_warning">Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción.
|
||||
\n¿De xuru\? ¡Esto nun pue desfacese!</string>
|
||||
<string name="remove_watched_popup_title">¿Desaniciar los vídeos vistos\?</string>
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
<item quantity="other">%d sekondlar</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">ExoPlayer cheklovlari tufayli qidiruv davomiyligi %d soniya qilib belgilandi</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ha, va qisman videolarni tomosha qildim</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ha, va qisman videolarni tomosha qildim</string>
|
||||
<string name="remove_watched_popup_warning">Pleylistga qo\'shilishdan oldin va keyin ko\'rilgan videolar o\'chiriladi.
|
||||
\nIshonchingiz komilmi\? Buni qaytarib bo\'lmaydi!</string>
|
||||
<string name="remove_watched_popup_title">Ko\'rilgan videolar olib tashlansinmi\?</string>
|
||||
|
||||
@@ -617,7 +617,7 @@
|
||||
<string name="downloads_storage_ask_summary_no_saf_notice">Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання</string>
|
||||
<string name="feed_notification_loading">Загрузка канала…</string>
|
||||
<string name="remove_watched_popup_title">Выдаліць прагледжаныя відэа\?</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Так, часткова прагледжаныя відэа таксама</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Так, часткова прагледжаныя відэа таксама</string>
|
||||
<string name="percent">Працэнт</string>
|
||||
<string name="remove_watched_popup_warning">Відэа, якія прагледжаны перад дадаваннем і пасля дадавання ў спіс прайгравання, будуць выдалены. \nВы ўпэўнены? Гэта дзеянне немагчыма скасаваць!</string>
|
||||
<string name="show_crash_the_player_summary">Паказвае варыянт збою пры выкарыстанні плэера</string>
|
||||
@@ -831,4 +831,5 @@
|
||||
<string name="trending_movies">Трэнды – фільмы і перадачы</string>
|
||||
<string name="unsupported_content_in_country">Гэты кантэнт недаступны для цяперашняй краіны кантэнту.\n\nЯе можна змяніць праз «Налады > Кантэнт > Прадвызначаная краіна кантэнту».</string>
|
||||
<string name="migration_info_7_8_message">21 ліпеня 2025 года YouTube спыніў падтрымку аб\'яднанай старонкі трэндаў. NewPipe замяніў старонку трэндаў на трэнды трансляцый.\n\nТаксама можна выбраць іншыя старонкі трэндаў праз «Налады > Кантэнт > Змесціва галоўнай старонкі».</string>
|
||||
<string name="migration_info_7_8_title">Аб\'яднаныя трэнды YouTube выдалены</string>
|
||||
</resources>
|
||||
|
||||
@@ -502,7 +502,7 @@
|
||||
<string name="paid_content">Съдържанието е достъпно само за хора, които са си платили, затова не може да бъде гледано или изтеглено с NewPipe.</string>
|
||||
<string name="youtube_music_premium_content">Това видео е достъпно за абонати на YouTube Music Premium, затова не може да бъде гледано или изтеглено с NewPipe.</string>
|
||||
<string name="remove_watched_popup_title">Премахни изгледаните видеа\?</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Да, както и само частично изгледаните видеа</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Да, както и само частично изгледаните видеа</string>
|
||||
<string name="subscribers_count_not_available">Брой на абонати не е наличен</string>
|
||||
<string name="peertube_instance_add_exists">Инстанцията вече съществува</string>
|
||||
<string name="missing_file">Файлът е преместен или изтрит</string>
|
||||
|
||||
@@ -307,4 +307,8 @@
|
||||
<string name="notification_scale_to_square_image_summary">বিজ্ঞপ্তিতে প্রদর্শিত ভিডিও থাম্বনেল 16:9 থেকে 1:1 অনুপাতের করুন (বিকৃতি দেখা যেতে পারে)</string>
|
||||
<string name="notification_action_shuffle">অদলবদল</string>
|
||||
<string name="notification_action_nothing">কিছু না</string>
|
||||
<string name="yes">হ্যাঁ</string>
|
||||
<string name="no">না</string>
|
||||
<string name="search_with_service_name">সার্চ</string>
|
||||
<string name="search_with_service_name_and_filter">খুঁজুন</string>
|
||||
</resources>
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
<string name="player_unrecoverable_failure">অপুনরুদ্ধারযোগ্য প্লেয়ার ত্রুটি ঘটেছে</string>
|
||||
<string name="peertube_instance_add_fail">ইন্সট্যান্সটি যাচাই করা যায়নি</string>
|
||||
<string name="recaptcha_cookies_cleared">রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও</string>
|
||||
<string name="permission_denied">ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে</string>
|
||||
<string name="autoplay_summary">স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে</string>
|
||||
<string name="start_here_on_popup">একটি পপ-আপে প্লে শুরু করো</string>
|
||||
|
||||
@@ -117,5 +117,4 @@
|
||||
<string name="detail_thumbnail_view_description">Lenn ar video, pad:</string>
|
||||
<string name="what_device_headline">Titouroù:</string>
|
||||
<string name="video">Video</string>
|
||||
<string name="streams_notification_channel_description"></string>
|
||||
</resources>
|
||||
|
||||
@@ -579,7 +579,7 @@
|
||||
<string name="remove_duplicates_title">Ukloniti duplikate?</string>
|
||||
<string name="remove_duplicates_message">Želite li ukloniti sve duplikatne tokove na ovoj listi za reprodukciju?</string>
|
||||
<string name="remove_watched_popup_warning">Videozapisi koji su pregledani prije i poslije dodavanja na listu za reprodukciju bit će uklonjeni.\nJeste li sigurni? Ovo se ne može poništiti!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Da, i djelimično odgledani videozapisi</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Da, i djelimično odgledani videozapisi</string>
|
||||
<string name="new_seek_duration_toast">Zbog ograničenja ExoPlayera, trajanje pretraživanja je postavljeno na %d sekundi</string>
|
||||
<string name="fragment_feed_title">Šta je novo</string>
|
||||
<string name="feed_group_page_summary">Stranica grupe kanala</string>
|
||||
|
||||
@@ -508,7 +508,7 @@
|
||||
<item quantity="other">%d segons</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">A causa de les limitacions d\'ExoPlayer, la durada de cerca és de %d segons</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sí, i també els vídeos vistos parcialment</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sí, i també els vídeos vistos parcialment</string>
|
||||
<string name="remove_watched_popup_warning">Els vídeos que ja heu vist tant abans com després d\'haver estat afegits a la llista de reproducció seran suprimits.
|
||||
\nN\'esteu segurs\? Aquesta acció no pot desfer-se!</string>
|
||||
<string name="remove_watched_popup_title">Esborrar els vídeos ja vistos\?</string>
|
||||
|
||||
@@ -350,7 +350,7 @@
|
||||
<string name="hold_to_append">پهنجهڕاگرتن لهسهری بۆ نۆبهت نهبوون</string>
|
||||
<string name="max_retry_desc">زۆرترین ژمارەی هەوڵدان پێش پاشگەزبوونەوە لە دابەزاندنەکە</string>
|
||||
<string name="general_error">هەڵه</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">بەڵێ، لەگەڵ ڤیدیۆ سەیر کراوەکانەوە</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">بەڵێ، لەگەڵ ڤیدیۆ سەیر کراوەکانەوە</string>
|
||||
<string name="start_here_on_popup">دەستپێکردنی لێدان لە پەنجەرەوه</string>
|
||||
<string name="detail_dislikes_img_view_description">نابەدڵهكان</string>
|
||||
<string name="title_activity_history">مێژوو</string>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<string name="restricted_video">Toto video má věkové omezení.
|
||||
\n
|
||||
\nPokud jej chcete vidět, povolte „%1$s“ v nastavení.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ano, i zčásti zhlédnutá videa</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ano, i zčásti zhlédnutá videa</string>
|
||||
<string name="remove_watched_popup_title">Odstranit zhlédnutá videa?</string>
|
||||
<string name="remove_watched">Odstranit zhlédnutá</string>
|
||||
<string name="remove_watched_popup_warning">Videa, která jste zhlédli před a po jejich přidání do playlistu, budou odstraněna.
|
||||
|
||||
@@ -630,7 +630,7 @@
|
||||
<string name="no_app_to_open_intent">Ingen app på din enhed kan åbne dette</string>
|
||||
<string name="error_insufficient_storage_left">Ingen ledig plads på enheden</string>
|
||||
<string name="app_language_title">App-sprog</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ja, og delvist sete videoer</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ja, og delvist sete videoer</string>
|
||||
<string name="feed_load_error">Fejl ved indlæsning af feed</string>
|
||||
<string name="feed_load_error_account_info">Kunne ikke indlæse feed for \'%s\'.</string>
|
||||
<string name="show_crash_the_player_title">Vis \"Crash afspilleren\"</string>
|
||||
|
||||
@@ -518,7 +518,7 @@
|
||||
\nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest.</string>
|
||||
<string name="remove_watched_popup_warning">Videos, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt.
|
||||
\nBist du sicher\? Dies kann nicht rückgängig gemacht werden!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ja, und teilweise gesehene Videos</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ja, und teilweise gesehene Videos</string>
|
||||
<string name="remove_watched">Gesehene entfernen</string>
|
||||
<string name="remove_watched_popup_title">Gesehene Videos entfernen\?</string>
|
||||
<string name="show_original_time_ago_title">Originalzeit vor Elementen anzeigen</string>
|
||||
@@ -837,7 +837,7 @@
|
||||
<string name="trending_movies">Beliebte Filme und Shows</string>
|
||||
<string name="trending_music">Beliebte Musik</string>
|
||||
<string name="trending_podcasts">Beliebte Podcasts</string>
|
||||
<string name="migration_info_7_8_title">YouTube hat den geteilten Feed entfernt</string>
|
||||
<string name="migration_info_7_8_title">YouTube hat die kombinierten „beliebten Seiten“ entfernt</string>
|
||||
<string name="migration_info_7_8_message">YouTube hat die kombinierte Trending-Seite ab dem 21. Juli 2025 eingestellt. NewPipe hat die Standard-Trending-Seite durch die Trending-Livestreams ersetzt.\n\nDu kannst auch verschiedene Trendseiten unter „Einstellungen > Inhalt > Inhalt der Hauptseite“ auswählen.</string>
|
||||
<string name="permission_display_over_apps_message">Um den Pop-up-Player zu verwenden, bitte in den folgenden Android-Einstellungen %1$s auswählen und %2$s aktivieren.</string>
|
||||
<string name="permission_display_over_apps_permission_name">„Über anderen Apps einblenden“</string>
|
||||
|
||||
@@ -524,7 +524,7 @@
|
||||
<item quantity="other">%d δευτερόλεπτα</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Λόγω περιορισμών του ExoPlayer, η διάρκεια αναζήτησης ορίστηκε στα %d δευτερόλεπτα</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ναι. Και τα μερικώς θεαθέντα βίντεο</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ναι. Και τα μερικώς θεαθέντα βίντεο</string>
|
||||
<string name="remove_watched_popup_warning">Τα βίντεο που εθεάθησαν πριν και αφού προστέθηκαν στη λίστα αναπαραγωγής θα απομακρυνθούν
|
||||
\nΕίστε σίγουρος; Δεν μπορεί να αναιρεθεί!</string>
|
||||
<string name="remove_watched_popup_title">Απομάκρυνση θεαθέντων βίντεο;</string>
|
||||
|
||||
@@ -612,5 +612,5 @@
|
||||
<string name="channel_tab_videos">Filmetoj</string>
|
||||
<string name="remove_watched_popup_warning">Filmetoj kiuj spektiĝis antaŭ aŭ post sia aldoniĝo al la ludlisto foriĝus.. \nĈu vi certas? Ĉi tio nemalfareblus!</string>
|
||||
<string name="reset_settings_summary">Restarigi implicitajn agordojn</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Jes, kaj ankaŭ parte spektitajn filmetojn</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Jes, kaj ankaŭ parte spektitajn filmetojn</string>
|
||||
</resources>
|
||||
|
||||
@@ -512,7 +512,7 @@
|
||||
<string name="albums">Álbumes</string>
|
||||
<string name="songs">Canciones</string>
|
||||
<string name="restricted_video">Este vídeo tiene restricción de edad. \n \nHabilitar \"%1$s\" en los ajustes si quieres verlo.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sí, y también vídeos vistos parcialmente</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sí, y también vídeos vistos parcialmente</string>
|
||||
<string name="remove_watched_popup_warning">Los vídeos que ya se hayan visto luego de añadidos a la lista de reproducción, serán quitados.
|
||||
\n¿Estás seguro\? ¡Esta acción no se puede deshacer!</string>
|
||||
<string name="remove_watched_popup_title">¿Quitar vídeos ya vistos\?</string>
|
||||
|
||||
@@ -532,7 +532,7 @@
|
||||
</plurals>
|
||||
<string name="remove_watched_popup_warning">Sellega eemaldame vaadatud videod ja esitusloendisse lisatud videod.
|
||||
\nKas sa oled kindel\? Seda tegevust ei saa hiljem tagasi pöörata!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Jah, sealhulgas videod, mille vaatmine jäi pooleli</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Jah, sealhulgas videod, mille vaatmine jäi pooleli</string>
|
||||
<string name="remove_watched_popup_title">Kas eemaldame vaadatud videod\?</string>
|
||||
<string name="remove_watched">Eemalda vaadatud videod</string>
|
||||
<string name="systems_language">Kasuta süsteemi keelt</string>
|
||||
|
||||
@@ -512,7 +512,7 @@
|
||||
<string name="channel_created_by">%s-k sortua</string>
|
||||
<string name="detail_sub_channel_thumbnail_view_description">Kanalaren avatar-earen miniatura</string>
|
||||
<string name="feed_group_show_only_ungrouped_subscriptions">Erakutsi agrupatuta ez dauden harpidetzak bakarrik</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Bai, partzialki ikusitako bideoak ere bai</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Bai, partzialki ikusitako bideoak ere bai</string>
|
||||
<string name="remove_watched_popup_warning">Jada ikusi eta gero erreprodukzio zerrendara gehitu diren bideoak ezabatuak izango dira.
|
||||
\nJarraitu nahi duzu\? Ekintza hau ezin da desegin!</string>
|
||||
<string name="remove_watched_popup_title">Ikusitako bideoak ezabatu\?</string>
|
||||
|
||||
@@ -449,7 +449,7 @@
|
||||
<item quantity="one">%d ثانیه</item>
|
||||
<item quantity="other">%d ثانیه</item>
|
||||
</plurals>
|
||||
<string name="remove_watched_popup_partially_watched_streams">بله، و ویدیوهای ناقص دیده شده</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">بله، و ویدیوهای ناقص دیده شده</string>
|
||||
<string name="remove_watched_popup_title">برداشتن ویدیوهای دیده شده؟</string>
|
||||
<string name="remove_watched">پاک کردن دیده شدهها</string>
|
||||
<string name="systems_language">پیشفرض دستگاه</string>
|
||||
|
||||
@@ -395,7 +395,7 @@
|
||||
<string name="remove_watched_popup_warning">Aiemmin katsotut ja soittolistaan lisätyt videot poistetaan.
|
||||
\nOletko varma\? Tätä ei voi peruuttaa!</string>
|
||||
<string name="remove_watched_popup_title">Poistetaanko katsotut videot\?</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Kyllä ja osittain katsotut videot</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Kyllä ja osittain katsotut videot</string>
|
||||
<string name="stop">Pysäytä</string>
|
||||
<string name="clear_download_history">Tyhjennä lataushistoria</string>
|
||||
<string name="close">Sulje</string>
|
||||
|
||||
@@ -249,7 +249,7 @@
|
||||
<string name="tracks">Mga track</string>
|
||||
<string name="users">Mga gumagamit</string>
|
||||
<string name="metadata_age_limit">Hangganan ng Edad</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Oo, pati na rin ang mga napanood nang video</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Oo, pati na rin ang mga napanood nang video</string>
|
||||
<string name="auto_device_theme_title">Kusa (tema ng device)</string>
|
||||
<string name="delete_view_history_alert">Tanggalin ang kabuuan ng watch history?</string>
|
||||
<string name="no_streams_available_download">Walang mga stream na maaaring i-download</string>
|
||||
|
||||
@@ -521,7 +521,7 @@
|
||||
\n
|
||||
\nActivez « %1$s » dans les paramètres si vous voulez la voir.</string>
|
||||
<string name="remove_watched">Supprimer les vidéos visionnées</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Oui ainsi que les vidéos partiellement visionnées</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Oui ainsi que les vidéos partiellement visionnées</string>
|
||||
<string name="remove_watched_popup_warning">Les vidéos qui ont été visionnées avant et après avoir été ajoutées à la playlist seront supprimées. \nÊtes-vous certain(e) ? Cette action est irréversible !</string>
|
||||
<string name="remove_watched_popup_title">Supprimer les vidéos visionnées \?</string>
|
||||
<string name="detail_sub_channel_thumbnail_view_description">Miniature de l\'avatar de la chaine</string>
|
||||
@@ -862,7 +862,7 @@
|
||||
<string name="account_terminated_service_provides_reason">Compte fermé\n\n%1$s fournit la raison suivante : %2$s</string>
|
||||
<string name="player_http_403">Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par l\'expiration de l\'URL de streaming ou une interdiction d\'IP</string>
|
||||
<string name="player_http_invalid_status">Erreur HTTP %1$s reçue du serveur pendant la lecture</string>
|
||||
<string name="youtube_player_http_403">Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par une interdiction d\'IP ou des problèmes de désobfuscation d\'URL de streaming.</string>
|
||||
<string name="youtube_player_http_403">Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\'IP ou des problèmes de désobfuscation de l\'URL de streaming</string>
|
||||
<string name="sign_in_confirm_not_bot_error">%1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que le demandeur n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bannie par %1$s. Vous pouvez patienter un peu ou changer d\'adresse IP (par exemple en activant/désactivant un VPN, ou en passant du Wi-Fi aux données mobiles).</string>
|
||||
<string name="unsupported_content_in_country">Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ».</string>
|
||||
</resources>
|
||||
|
||||
@@ -387,7 +387,7 @@
|
||||
<item quantity="other">%d segundos</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Debido ás restricións de ExoPlayer, a duración da busca estableceuse en %d segundos</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Si, e visualizou parcialmente estes vídeos</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Si, e visualizou parcialmente estes vídeos</string>
|
||||
<string name="remove_watched_popup_warning">Eliminaranse os vídeos vistos antes e despois de seren engadidos á lista de reprodución.
|
||||
\nEstás seguro\? Isto non se pode desfacer.!</string>
|
||||
<string name="remove_watched_popup_title">Borrar todos os vídeos vistos\?</string>
|
||||
|
||||
@@ -527,7 +527,7 @@
|
||||
<string name="restricted_video">סרטון זה מוגבל לצפייה מגיל מסוים.
|
||||
\n
|
||||
\nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">כן, לרבות סרטונים שהפסקתי באמצע</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">כן, לרבות סרטונים שהפסקתי באמצע</string>
|
||||
<string name="remove_watched_popup_warning">סרטונים שלאחר שצפית בהם מופיע לרשימת הנגינה יוסרו.
|
||||
\nלהמשיך\? זאת פעולה בלתי הפיכה!</string>
|
||||
<string name="remove_watched">הסרת נצפו</string>
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
<string name="enable_watch_history_summary">देखे गए वीडियोज़ की सूची रखें</string>
|
||||
<string name="resume_on_audio_focus_gain_title">प्लेबैक फिर से शुरू करें</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें</string>
|
||||
<string name="show_next_and_similar_title">\'अगले\' और \'सबंधित\' वीडियो दिखाएं</string>
|
||||
<string name="show_next_and_similar_title">\'अगला\' और \'संबंधित\' वीडियो दिखाएं</string>
|
||||
<string name="show_hold_to_append_title">\"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाएं</string>
|
||||
<string name="show_hold_to_append_summary">जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं</string>
|
||||
<string name="unsupported_url">असमर्थित URL</string>
|
||||
@@ -93,7 +93,7 @@
|
||||
<string name="disabled">बंद किया</string>
|
||||
<string name="clear">साफ करें</string>
|
||||
<string name="best_resolution">उत्तम रिजॉल्युशन</string>
|
||||
<string name="undo">वापिस</string>
|
||||
<string name="undo">अन-डू करें</string>
|
||||
<string name="play_all">सभी प्ले करें</string>
|
||||
<string name="notification_channel_name">न्यूपाइप की नोटीफिकेशन</string>
|
||||
<string name="notification_channel_description">न्यूपाइप के प्लेयर के लिए नोटीफिकेशन</string>
|
||||
@@ -104,7 +104,7 @@
|
||||
<string name="parsing_error">वैबसाइट parse नहीं हो सकी</string>
|
||||
<string name="content_not_available">विषय वस्तु उपलब्ध नहीं है</string>
|
||||
<string name="could_not_setup_download_menu">डाउनलोड मेनू स्थापित नहीं किया जा सका</string>
|
||||
<string name="app_ui_crash">APP/UI करैश हो गई</string>
|
||||
<string name="app_ui_crash">ऐप/UI करैश हो गई</string>
|
||||
<string name="player_stream_failure">इस वीडियो को चलाने में असफल हुए</string>
|
||||
<string name="player_unrecoverable_failure">अनचाही वीडियो प्लेयर त्रुटी आयी है</string>
|
||||
<string name="player_recoverable_failure">वीडियो प्लेयर त्रुटी से ठीक हो रहा है</string>
|
||||
@@ -391,7 +391,7 @@
|
||||
<string name="clear_playback_states_title">प्लेबैक स्थानों को मिटाएं</string>
|
||||
<string name="clear_playback_states_summary">सारे प्लेबैक स्थानों को मिटाता है</string>
|
||||
<string name="delete_playback_states_alert">सारे प्लेबैक स्थानों को मिटाएं\?</string>
|
||||
<string name="enable_disposed_exceptions_summary">निपटान के बाद खंड या गतिविधि जीवन चक्र के बाहर अविभाज्य आरएक्स अपवादों की रिपोर्टिंग को बलपूर्वक लागू करें</string>
|
||||
<string name="enable_disposed_exceptions_summary">हैंडलिंग के बाद फ्रैगमेंट या एक्टिविटी लूप के बाहर अनहैंडल्ड Rx एक्सेप्शन की रिपोर्टिंग को बलपूर्वक लागू करें</string>
|
||||
<string name="import_soundcloud_instructions">साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये:
|
||||
\n
|
||||
\n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है)
|
||||
@@ -406,7 +406,7 @@
|
||||
<string name="grid">ग्रिड</string>
|
||||
<string name="auto">ऑटो</string>
|
||||
<string name="show_error">त्रुटि दिखाएं</string>
|
||||
<string name="error_http_unsupported_range">सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ</string>
|
||||
<string name="error_http_unsupported_range">सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, @string/msg_threads = 1 के साथ पुनः कोशिश करें</string>
|
||||
<string name="downloads_storage_use_saf_summary">\'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है</string>
|
||||
<string name="drawer_header_description">सेवा चुनें, वर्तमान चुनाव :</string>
|
||||
<string name="default_kiosk_page_summary">डिफ़ॉल्ट कियोस्क</string>
|
||||
@@ -502,7 +502,7 @@
|
||||
<string name="infinite_videos">अनगिनत विडीओज़</string>
|
||||
<string name="more_than_100_videos">100+ विडीओज़</string>
|
||||
<string name="description_tab_description">विवरण</string>
|
||||
<string name="related_items_tab_description">संबंधित स्ट्रीमस</string>
|
||||
<string name="related_items_tab_description">संबंधित आइटम्स</string>
|
||||
<string name="comments_tab_description">टिप्पणियाँ</string>
|
||||
<string name="error_report_open_github_notice">कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं।</string>
|
||||
<string name="error_report_open_issue_button_text">गिटहब पर रिपोर्ट करें</string>
|
||||
@@ -584,7 +584,7 @@
|
||||
<string name="delete_downloaded_files_confirm">डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं\?</string>
|
||||
<string name="downloads_storage_use_saf_summary_api_29">एंड्रॉइड 10 से शुरू होकर केवल \'स्टोरेज एक्सेस फ्रेमवर्क\' समर्थित है</string>
|
||||
<string name="choose_instance_prompt">एक इंस्टेंस चुनें</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">हां, और आंशिक रूप से देखे गए वीडियो भी</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">हां, और आंशिक रूप से देखे गए वीडियो भी</string>
|
||||
<string name="feed_notification_loading">फ़ीड लोड हो रही है…</string>
|
||||
<string name="feed_update_threshold_title">फ़ीड अपडेट चरणसीमा</string>
|
||||
<string name="feed_load_error">फ़ीड लोड करने में त्रुटि हूई</string>
|
||||
@@ -828,4 +828,26 @@
|
||||
<string name="feed_group_page_summary">चैनल समूह पेज</string>
|
||||
<string name="channel_tab_likes">पसंद</string>
|
||||
<string name="share_playlist_as_youtube_temporary_playlist">यूट्यूब अस्थायी प्लेलिस्ट के रूप में साझा करें</string>
|
||||
<string name="entry_deleted">एंटरी मिटा दी गई</string>
|
||||
<string name="delete_file">फाईल डिलीट करें</string>
|
||||
<string name="delete_entry">एंटरी मिटाऐं</string>
|
||||
<string name="short_thousand">%sहज़ार</string>
|
||||
<string name="permission_display_over_apps_message">पॉपअप प्लेयर इस्तेमाल करने के लिए, कृपया नीचे दिए गए Android सेटिंग्स मेनू में %1$s चुनें और %2$s चालू करें।</string>
|
||||
<string name="permission_display_over_apps_permission_name">“अन्य ऐप्स पर डिस्प्ले की अनुमति दें”</string>
|
||||
<string name="short_million">%sमिलीअन</string>
|
||||
<string name="short_billion">%sअरब</string>
|
||||
<string name="account_terminated_service_provides_reason">अकाउंट बंद कर दिया गया\n\n%1$s यह कारण बताता है: %2$s</string>
|
||||
<string name="migration_info_6_7_title">साउंडक्लाउड टॉप 50 पेज हटा दिया गया</string>
|
||||
<string name="migration_info_6_7_message">साउंडक्लाउड ने ओरिजिनल टॉप 50 चार्ट बंद कर दिए हैं। इससे जुड़ा टैब आपके मेन पेज से हटा दिया गया है।</string>
|
||||
<string name="migration_info_7_8_title">YouTube कंबाइंड ट्रेंडिंग हटा दी गई</string>
|
||||
<string name="migration_info_7_8_message">YouTube ने 21 जुलाई 2025 से कंबाइंड ट्रेंडिंग पेज बंद कर दिया है। NewPipe ने डिफ़ॉल्ट ट्रेंडिंग पेज को ट्रेंडिंग लाइवस्ट्रीम से बदल दिया है।\n\nआप \"सेटिंग्स > कंटेंट > मेन पेज कंटेंट\" में अलग-अलग ट्रेंडिंग पेज भी चुन सकते हैं।</string>
|
||||
<string name="trending_gaming">गेमिंग ट्रेंडस</string>
|
||||
<string name="trending_podcasts">ट्रेंडिंग पॉडकास्ट</string>
|
||||
<string name="trending_movies">ट्रेंडिंग फिल्में और शो</string>
|
||||
<string name="trending_music">ट्रेंडिंग संगीत</string>
|
||||
<string name="player_http_403">पले करते समय सर्वर से HTTP error 403 मिला, शायद स्ट्रीमिंग URL एक्सपायर होने या IP बैन की वजह से हुआ</string>
|
||||
<string name="player_http_invalid_status">पले करते समय सर्वर से HTTP error %1$s मिला</string>
|
||||
<string name="youtube_player_http_403">पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है</string>
|
||||
<string name="sign_in_confirm_not_bot_error">%1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\n\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)।</string>
|
||||
<string name="unsupported_content_in_country">यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\n\n\"सेटिंग्स > कंटेंट > डिफ़ॉल्ट कंटेंट देश\" से अपना चुनाव बदलें।</string>
|
||||
</resources>
|
||||
|
||||
@@ -502,7 +502,7 @@
|
||||
<string name="feed_processing_message">Obrada feeda u tijeku …</string>
|
||||
<string name="feed_oldest_subscription_update">Zadnje aktualiziranje feeda: %s</string>
|
||||
<string name="feed_groups_header_title">Grupe kanala</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Da, i djelomično pogledana videa</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Da, i djelomično pogledana videa</string>
|
||||
<string name="choose_instance_prompt">Odaberi jednu instancu</string>
|
||||
<string name="downloads_storage_ask_summary">Aplikacija će te pitati kamo spremati preuzimanja.
|
||||
\nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu</string>
|
||||
|
||||
@@ -620,7 +620,7 @@
|
||||
<string name="metadata_tags">Címkék</string>
|
||||
<string name="metadata_privacy">Adatvédelem</string>
|
||||
<string name="feed_use_dedicated_fetch_method_disable_button">Gyors mód letiltása</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Igen, és távolítsa el a részben megnézett videókat is</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Igen, és távolítsa el a részben megnézett videókat is</string>
|
||||
<string name="remove_watched_popup_warning">A videók, melyeket már megnézett miután a lejátszási listához adta őket, el lesznek távolítva.
|
||||
\nBiztos benne\? Ez nem vonható vissza!</string>
|
||||
<string name="show_original_time_ago_summary">A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken</string>
|
||||
@@ -817,7 +817,7 @@
|
||||
<string name="entry_deleted">Bejegyzés törölve</string>
|
||||
<string name="account_terminated_service_provides_reason">Fiók megszüntetve\n\n%1$s az alábbi ok miatt: %2$s</string>
|
||||
<string name="player_http_403">A lejátszás közben a kiszolgáló 403-as HTTP-hibát adott vissza, valószínűleg a közvetítési hivatkozás érvényessége lejárt vagy a IP-tiltás miatt</string>
|
||||
<string name="player_http_invalid_status">HTTP-hiba %1$s érkezett a kiszolgáltól a lejátszás közben</string>
|
||||
<string name="player_http_invalid_status">HTTP-hiba (%1$s) érkezett a kiszolgálótól a lejátszás során</string>
|
||||
<string name="youtube_player_http_403">HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt</string>
|
||||
<string name="sign_in_confirm_not_bot_error">%1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva).</string>
|
||||
<string name="unsupported_content_in_country">Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban.</string>
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
<string name="import_data_summary">Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente</string>
|
||||
<string name="remove_watched_popup_warning">Le videos jam observate ante e post de esser addite al lista de reproduction essera removite.
|
||||
\nSecur que tu vole\? Isto non pote disfacer se!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Si, e le videos partialmente observate</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Si, e le videos partialmente observate</string>
|
||||
<string name="remove_watched_popup_title">Deler le videos observate\?</string>
|
||||
<string name="remove_watched">Deler le videos observate</string>
|
||||
<plurals name="watching">
|
||||
|
||||
@@ -486,7 +486,7 @@
|
||||
<string name="content_not_supported">Konten ini belum didukung oleh NewPipe.
|
||||
\n
|
||||
\nSemoga akan didukung pada versi berikutnya.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Iya, dan video yang ditonton sebagian</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Iya, dan video yang ditonton sebagian</string>
|
||||
<string name="remove_watched_popup_warning">Video yang sudah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dibuang.
|
||||
\nApakah Anda yakin\? Ini tidak bisa diurungkan!</string>
|
||||
<string name="unmute">Batal bisukan</string>
|
||||
|
||||
@@ -675,7 +675,7 @@
|
||||
<string name="max_retry_desc">Fjöldi tilrauna áður en hætt er við niðurhal</string>
|
||||
<string name="remove_watched_popup_warning">Myndskeiðum sem skoðuð voru áður eða eftir að þeim var bætt við spilunarlistann verður eytt.
|
||||
\nErtu viss? Það er ekki hægt að afturkalla þetta!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Já og skoðuð að hluta</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Já og skoðuð að hluta</string>
|
||||
<string name="feed_use_dedicated_fetch_method_title">Nota RSS ef tiltækt</string>
|
||||
<string name="detail_heart_img_view_description">Hjartað af höfunda</string>
|
||||
<string name="notifications_disabled">Slökkt er á tilkynningum</string>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<string name="restricted_video">Questo video ha restrizioni di età.
|
||||
\n
|
||||
\nAttivare «%1$s» nelle Impostazioni per poterlo vedere.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sì, anche quelli visualizzati parzialmente</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sì, anche quelli visualizzati parzialmente</string>
|
||||
<string name="remove_watched_popup_warning">I video che sono stati visti prima e dopo essere stati aggiunti alla playlist verranno rimossi.
|
||||
\nProcedere\? L\'azione è irreversibile!</string>
|
||||
<string name="remove_watched_popup_title">Rimuovere i video già visti\?</string>
|
||||
|
||||
@@ -499,7 +499,7 @@
|
||||
\n閲覧したい場合、設定から \"%1$s\" を有効化してください。</string>
|
||||
<string name="remove_watched_popup_warning">プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。
|
||||
\nよろしいですか?この操作は元に戻せません!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">はい、部分的に視聴した動画も削除します</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">はい、部分的に視聴した動画も削除します</string>
|
||||
<string name="remove_watched_popup_title">視聴済みの動画を削除しますか?</string>
|
||||
<string name="remove_watched">視聴済みを削除</string>
|
||||
<string name="show_original_time_ago_summary">サービスのオリジナルのテキストが生放送に表示されます</string>
|
||||
|
||||
@@ -483,7 +483,7 @@
|
||||
<string name="systems_language">სისტემის ნაგულისხმევი</string>
|
||||
<string name="remove_watched">ნანახის ამოღება</string>
|
||||
<string name="remove_watched_popup_title">წაშალოთ ნანახი ვიდეოები\?</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">დიახ, და ნაწილობრივ ნანახი ვიდეოები</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">დიახ, და ნაწილობრივ ნანახი ვიდეოები</string>
|
||||
<string name="new_seek_duration_toast">ExoPlayer-ის შეზღუდვების გამო ძიების ხანგრძლივობა დაყენდა %d წამზე</string>
|
||||
<plurals name="seconds">
|
||||
<item quantity="one">%d წამი</item>
|
||||
|
||||
@@ -355,7 +355,7 @@
|
||||
<item quantity="other">%d çirkeyan</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Ji ber astengiyên ExoPlayer dema lêgerînê li %d çirkeyan hate saz kirin</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Erê, û bi qismî vîdyoyan temaşe kir</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Erê, û bi qismî vîdyoyan temaşe kir</string>
|
||||
<string name="remove_watched_popup_warning">Vîdyoyên ku berî û piştî ku li lîsteya lîsteyê hatine zêdekirin hatine temaşekirin, dê werin rakirin.
|
||||
\nPiştrastin\? Ev nayê betal kirin!</string>
|
||||
<string name="remove_watched_popup_title">Vîdyoyên temaşekirî rakin\?</string>
|
||||
|
||||
@@ -589,7 +589,7 @@
|
||||
<item quantity="other">%s 다운로드 완료</item>
|
||||
</plurals>
|
||||
<string name="app_language_title">앱 언어</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">예, 부분적으로 본 비디오</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">예, 부분적으로 본 비디오</string>
|
||||
<string name="metadata_category">카테고리</string>
|
||||
<string name="video_detail_by">%s에 의해</string>
|
||||
<string name="select_night_theme_toast">아래에서 선호하는 어두운 테마를 선택할 수 있습니다</string>
|
||||
|
||||
@@ -499,7 +499,7 @@
|
||||
<string name="artists">هونەرمەندەکان</string>
|
||||
<string name="albums">ئەلبوومەکان</string>
|
||||
<string name="songs">گۆرانییەکان</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">بەڵێ، لەگەڵ ڤیدیۆ تەماشاکراوەکانەوە</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">بەڵێ، لەگەڵ ڤیدیۆ تەماشاکراوەکانەوە</string>
|
||||
<string name="remove_watched_popup_warning">ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ لیستەلێدان دەسڕێنەوە.
|
||||
\nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە!</string>
|
||||
<string name="remove_watched_popup_title">ڤیدیۆ تەماشاکراوەکان بسڕێنەوە؟</string>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="main_bg_subtitle">Pigia la lente per inziaa.</string>
|
||||
<string name="channels">Canai</string>
|
||||
</resources>
|
||||
|
||||
@@ -409,7 +409,7 @@
|
||||
<string name="error_ssl_exception">Užmegzti saugaus ryšio nepavyko</string>
|
||||
<string name="limit_mobile_data_usage_title">Riboti raišką naudojant mobilius duomenis</string>
|
||||
<string name="autoplay_summary">Automatiškai atkurti — %s</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Taip ir iš dalies žiūrėtus vaizdo įrašus</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Taip ir iš dalies žiūrėtus vaizdo įrašus</string>
|
||||
<string name="error_download_resource_gone">Atstatyti parsiuntimo nepavyko</string>
|
||||
<string name="pause_downloads_on_mobile">Pertraukti matuojamuose tinkluose</string>
|
||||
<string name="minimize_on_exit_popup_description">Sumažinti iki iššokančio lango grotuvo</string>
|
||||
|
||||
@@ -338,7 +338,7 @@
|
||||
<item quantity="other">%d sekundes</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">ExoPlayer ierobežojumu dēļ meklēšanas ilgums tika iestatīts uz %d sekundēm</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Jā, un daļēji skatītos videoklipus</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Jā, un daļēji skatītos videoklipus</string>
|
||||
<string name="remove_watched_popup_warning">Videoklipi, kas ir skatīti pirms un pēc pievienošanas atskaņošanas sarakstam, tiks noņemti.
|
||||
\nVai tu esi pārliecināts\? To nevar atsaukt!</string>
|
||||
<string name="remove_watched_popup_title">Vai noņemt skatītos videoklipus\?</string>
|
||||
|
||||
@@ -406,7 +406,7 @@
|
||||
<string name="main_tabs_position_summary">Премести ги основниот селектор на јазичиња најдолу</string>
|
||||
<string name="main_tabs_position_title">Позиција на основните јазичиња</string>
|
||||
<string name="show_channel_details">Прикажи информации за каналот</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Да, како и делумно изгледаните видеа</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Да, како и делумно изгледаните видеа</string>
|
||||
<string name="audio_track_present_in_video">Аудио снимка треба да е веќе присутна во овој стрим</string>
|
||||
<plurals name="listening">
|
||||
<item quantity="one">%s слушател</item>
|
||||
|
||||
@@ -461,7 +461,7 @@
|
||||
<item quantity="other">%d സെക്കൻഡുകൾ</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">എക്സോപ്ലെയർ പരിമിതികൾ കാരണം തിരയൽ ദൈർഘ്യം %d സെക്കൻഡിലേക്ക് സജ്ജമാക്കി</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">അതെ, അതിന്റെകൂടെ ഭാഗികമായി കണ്ട വീഡിയോകളും</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">അതെ, അതിന്റെകൂടെ ഭാഗികമായി കണ്ട വീഡിയോകളും</string>
|
||||
<string name="remove_watched_popup_warning">പ്ലേലിസ്റ്റിലേക്ക് ചേർക്കുന്നതിന് മുമ്പും ശേഷവും കണ്ട വീഡിയോകൾ നീക്കംചെയ്യും.
|
||||
\nനിങ്ങൾക്ക് ഉറപ്പാണോ\? ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല!</string>
|
||||
<string name="remove_watched_popup_title">കണ്ട വീഡിയോകൾ നീക്കംചെയ്യണോ\?</string>
|
||||
|
||||
@@ -488,7 +488,7 @@
|
||||
<string name="artists">Artister</string>
|
||||
<string name="albums">Album</string>
|
||||
<string name="songs">Sanger</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ja, og delvist sette videoer</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ja, og delvist sette videoer</string>
|
||||
<string name="remove_watched_popup_title">Fjern sette videoer\?</string>
|
||||
<string name="remove_watched">Fjern sette</string>
|
||||
<string name="channel_created_by">Opprettet av %s</string>
|
||||
|
||||
@@ -514,7 +514,7 @@
|
||||
<string name="content_not_supported">यो सामग्री अझै NewPipeमा समर्थित छैन।
|
||||
\n…
|
||||
\nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ।</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">हो र आंशिक रूपमा हेरिएको भिडियोहरू</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">हो र आंशिक रूपमा हेरिएको भिडियोहरू</string>
|
||||
<string name="notification_colorize_title">सूचना पाटी रंगिन बनाउनु</string>
|
||||
<string name="notification_action_nothing">केहि छैन</string>
|
||||
<string name="notification_action_buffering">Buffering हुँदै</string>
|
||||
|
||||
@@ -440,7 +440,7 @@
|
||||
<item quantity="other">%d seconden</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ja, en deels bekeken video\'s</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ja, en deels bekeken video\'s</string>
|
||||
<string name="remove_watched_popup_warning">Video\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd.
|
||||
\nBent u zeker\? Dit kan niet ongedaan gemaakt worden!</string>
|
||||
<string name="remove_watched_popup_title">Verwijder bekeken video\'s\?</string>
|
||||
|
||||
@@ -502,7 +502,7 @@
|
||||
<string name="content_not_supported">Deze inhoud wordt nog niet ondersteund door NewPipe.
|
||||
\n
|
||||
\nHopelijk zal dit bij een toekomstige versie ondersteund worden.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Ja, en deels bekeken video\'s</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ja, en deels bekeken video\'s</string>
|
||||
<string name="remove_watched_popup_warning">Video\'s die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd.
|
||||
\nWeet u dit zeker\? Deze actie kan niet ongedaan gemaakt worden!</string>
|
||||
<string name="remove_watched_popup_title">Bekeken video\'s verwijderen\?</string>
|
||||
|
||||
@@ -594,7 +594,7 @@
|
||||
<string name="remove_watched">ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫</string>
|
||||
<string name="remove_watched_popup_warning">ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫.
|
||||
\nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫</string>
|
||||
<string name="new_seek_duration_toast">ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫</string>
|
||||
<plurals name="minutes">
|
||||
<item quantity="other">ߡߌ߬ߛߍ߲߬ %d</item>
|
||||
|
||||
@@ -595,7 +595,7 @@
|
||||
<string name="overwrite_finished_warning">ଏହି ନାମ ସହିତ ଏକ ଡାଉନଲୋଡ୍ ଫାଇଲ୍ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି</string>
|
||||
<string name="delete_downloaded_files">ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡିକ ଡିଲିଟ୍ କରନ୍ତୁ</string>
|
||||
<string name="downloads_storage_use_saf_title">ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) ବ୍ୟବହାର କରନ୍ତୁ</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">ହଁ, ଏବଂ ଆଂଶିକ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">ହଁ, ଏବଂ ଆଂଶିକ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ</string>
|
||||
<string name="feed_group_dialog_empty_name">ଗୋଷ୍ଠୀ ନାମ ଖାଲି ଅଛି</string>
|
||||
<string name="feed_use_dedicated_fetch_method_title">ଉପଲବ୍ଧ ଥିବାବେଳେ ଉତ୍ସର୍ଗୀକୃତ ଫିଡରୁ ଆଣ</string>
|
||||
<string name="list">ତାଲିକା</string>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<string name="fragment_feed_title">ਨਵਾਂ ਕੀ ਹੈ</string>
|
||||
<string name="controls_background_title">ਬੈਕਗ੍ਰਾਊਂਡ</string>
|
||||
<string name="controls_popup_title">ਪੌਪ-ਅਪ</string>
|
||||
<string name="controls_add_to_playlist_title">ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ</string>
|
||||
<string name="controls_add_to_playlist_title">ਦੇ ਵਿੱਚ ਜੋੜ੍ਹੋ</string>
|
||||
<string name="download_path_title">ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ</string>
|
||||
<string name="download_path_summary">ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ</string>
|
||||
<string name="download_path_dialog_title">ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ</string>
|
||||
@@ -93,7 +93,7 @@
|
||||
<string name="disabled">ਬੰਦ ਕੀਤਾ</string>
|
||||
<string name="clear">ਸਾਫ ਕਰੋ</string>
|
||||
<string name="best_resolution">ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ</string>
|
||||
<string name="undo">ਵਾਪਿਸ</string>
|
||||
<string name="undo">ਅਣ-ਕੀਤਾ ਕਰੋ</string>
|
||||
<string name="play_all">ਸਾਰੇ ਚਲਾਓ</string>
|
||||
<string name="always">ਹਮੇਸ਼ਾਂ</string>
|
||||
<string name="just_once">ਸਿਰਫ਼ ਇਸ ਬਾਰ</string>
|
||||
@@ -184,8 +184,7 @@
|
||||
<string name="msg_wait">ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ…</string>
|
||||
<string name="msg_copied">ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ</string>
|
||||
<string name="no_available_dir">ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ</string>
|
||||
<string name="msg_popup_permission">ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ
|
||||
\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</string>
|
||||
<string name="msg_popup_permission">ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</string>
|
||||
<string name="one_item_deleted">1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ।</string>
|
||||
<string name="title_activity_recaptcha">ReCaptcha ਚੁਣੌਤੀ</string>
|
||||
<string name="recaptcha_request_toast">ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ</string>
|
||||
@@ -278,36 +277,19 @@
|
||||
<string name="previous_export">ਪਿੱਛਲਾ ਐਕਸਪੋਰਟ</string>
|
||||
<string name="subscriptions_import_unsuccessful">ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ</string>
|
||||
<string name="subscriptions_export_unsuccessful">ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਐਕਸਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ</string>
|
||||
<string name="import_youtube_instructions">ਗੂਗਲ ਟੇਕਅਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ:
|
||||
\n
|
||||
\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s
|
||||
\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ
|
||||
\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ
|
||||
\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਫੇਰ \"create export\" ਤੇ
|
||||
\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ।ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ)
|
||||
\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ
|
||||
\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ</string>
|
||||
<string name="import_soundcloud_instructions">URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ:
|
||||
\n
|
||||
\n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ)
|
||||
\n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s
|
||||
\n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ
|
||||
\n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ.</string>
|
||||
<string name="import_youtube_instructions">ਗੂਗਲ ਟੇਕਆਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ:\n\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਫੇਰ \"create export\" ਤੇ\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ)\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ</string>
|
||||
<string name="import_soundcloud_instructions">URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: \n \n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) \n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s \n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ \n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ।</string>
|
||||
<string name="import_soundcloud_instructions_hint">ਤੁਹਾਡੀ ਆਈਡੀ, soundcloud.com/ਤੁਹਾਡੀ ਆਈਡੀ</string>
|
||||
<string name="import_network_expensive_warning">ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ।
|
||||
\n
|
||||
\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ\?</string>
|
||||
<string name="import_network_expensive_warning">ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string>
|
||||
<string name="playback_speed_control">ਪਲੇਅਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ</string>
|
||||
<string name="playback_tempo">ਤਾਲ</string>
|
||||
<string name="playback_pitch">ਪਿੱਚ</string>
|
||||
<string name="unhook_checkbox">ਅਲਹਿਦਾ ਕਰੋ (ਵਿਗਾੜ ਪੈ ਸਕਦਾ ਹੈ)</string>
|
||||
<string name="import_settings">ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\?</string>
|
||||
<string name="privacy_policy_title">ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ</string>
|
||||
<string name="privacy_policy_encouragement">ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।
|
||||
\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।</string>
|
||||
<string name="privacy_policy_encouragement">ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।</string>
|
||||
<string name="read_privacy_policy">ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ</string>
|
||||
<string name="start_accept_privacy_policy">ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ।
|
||||
\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ।</string>
|
||||
<string name="start_accept_privacy_policy">ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ।\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ।</string>
|
||||
<string name="accept">ਸਵੀਕਾਰ ਕਰੋ</string>
|
||||
<string name="decline">ਅਸਵੀਕਾਰ</string>
|
||||
<string name="limit_data_usage_none_description">ਕੋਈ ਸੀਮਾ ਨਹੀਂ</string>
|
||||
@@ -511,9 +493,8 @@
|
||||
<item quantity="one">%d ਸਕਿੰਟ</item>
|
||||
<item quantity="other">%d ਸਕਿੰਟ</item>
|
||||
</plurals>
|
||||
<string name="remove_watched_popup_partially_watched_streams">ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ</string>
|
||||
<string name="remove_watched_popup_warning">ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ, ਪਹਿਲਾਂ ਚਾਹੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ।
|
||||
\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ!</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ</string>
|
||||
<string name="remove_watched_popup_warning">ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ!</string>
|
||||
<string name="remove_watched_popup_title">ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\?</string>
|
||||
<string name="remove_watched">ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ</string>
|
||||
<string name="systems_language">ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ</string>
|
||||
@@ -554,7 +535,7 @@
|
||||
<string name="no_one_listening">ਕੋਈ ਸਰੋਤਾ ਨਹੀਂ ਸੁਣ ਰਿਹਾ</string>
|
||||
<string name="no_one_watching">ਕੋਈ ਦਰਸ਼ਕ ਨਹੀਂ ਵੇਖ ਰਿਹਾ</string>
|
||||
<string name="description_tab_description">ਵੇਰਵਾ</string>
|
||||
<string name="related_items_tab_description">ਸਬੰਧਤ ਨਗ</string>
|
||||
<string name="related_items_tab_description">ਸਬੰਧਤ ਆਈਟਮਾਂ</string>
|
||||
<string name="comments_tab_description">ਟਿੱਪਣੀਆਂ</string>
|
||||
<string name="error_report_open_issue_button_text">ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ</string>
|
||||
<string name="permission_display_over_apps">ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string>
|
||||
@@ -822,10 +803,32 @@
|
||||
<string name="audio_track_type_secondary">ਸੈਕੰਡਰੀ</string>
|
||||
<string name="share_playlist_as_youtube_temporary_playlist">ਅਸਥਾਈ ਯੂਟਿਊਬ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ</string>
|
||||
<string name="tab_bookmarks_short">ਪਲੇਲਿਸਟਾਂ</string>
|
||||
<string name="search_with_service_name">%1$s ਦੀ ਖੋਜ ਕਰੋ</string>
|
||||
<string name="search_with_service_name_and_filter">%1$s (%2$s) ٪1$s ਦੀ ਖੋਜ ਕਰੋ</string>
|
||||
<string name="search_with_service_name">%1$s ਖੋਜੋ</string>
|
||||
<string name="search_with_service_name_and_filter">%1$s (%2$s) ਖੋਜੋ</string>
|
||||
<string name="select_a_feed_group">ਫੀਡ ਗਰੁੱਪ ਚੁਣੋ</string>
|
||||
<string name="no_feed_group_created_yet">ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ</string>
|
||||
<string name="feed_group_page_summary">ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ</string>
|
||||
<string name="channel_tab_likes">ਪਸੰਦ</string>
|
||||
<string name="delete_file">ਫ਼ਾਈਲ ਮਿਟਾਓ</string>
|
||||
<string name="delete_entry">ਐਂਟਰੀ ਮਿਟਾਓ</string>
|
||||
<string name="account_terminated_service_provides_reason">ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s</string>
|
||||
<string name="entry_deleted">ਐਂਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ</string>
|
||||
<string name="permission_display_over_apps_message">ਪੌਪਅੱਪ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤੇ Android ਸੈਟਿੰਗ ਮੀਨੂ ਵਿੱਚ %1$s ਚੁਣੋ ਅਤੇ %2$s ਨੂੰ ਇਨੇਬਲ ਕਰੋ।</string>
|
||||
<string name="permission_display_over_apps_permission_name">\"ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਡਿਸਪਲੇ ਦੀ ਆਗਿਆ ਦਿਓ\"</string>
|
||||
<string name="short_thousand">%sਹਜ਼ਾਰ</string>
|
||||
<string name="short_million">%sਮਿਲੀਅਨ</string>
|
||||
<string name="short_billion">%sਅਰਬ</string>
|
||||
<string name="migration_info_6_7_title">SoundCloud ਟੌਪ 50 ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ</string>
|
||||
<string name="migration_info_6_7_message">SoundCloud ਨੇ ਮੂਲ ਟੌਪ 50 ਚਾਰਟਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਸੰਬੰਧਿਤ ਟੈਬ ਨੂੰ ਤੁਹਾਡੇ ਮੁੱਖ ਪੰਨੇ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।</string>
|
||||
<string name="migration_info_7_8_title">YouTube ਸੰਯੁਕਤ ਰੁਝਾਨ ਹਟਾਇਆ ਗਿਆ</string>
|
||||
<string name="migration_info_7_8_message">YouTube ਨੇ 21 ਜੁਲਾਈ 2025 ਤੋਂ ਸੰਯੁਕਤ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। NewPipe ਨੇ ਡਿਫ਼ਾਲਟ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਟ੍ਰੈਂਡਿੰਗ ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਹੈ।\n\nਤੁਸੀਂ \"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ\" ਵਿੱਚ ਵੱਖ-ਵੱਖ ਟ੍ਰੈਂਡਿੰਗ ਪੰਨਿਆਂ ਨੂੰ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ।</string>
|
||||
<string name="trending_gaming">ਗੇਮਿੰਗ ਟ੍ਰੈਂਡਸ</string>
|
||||
<string name="trending_podcasts">ਟ੍ਰੈਂਡਿੰਗ ਪੌਡਕਾਸਟ</string>
|
||||
<string name="trending_movies">ਟਰੈਂਡਿੰਗ ਫ਼ਿਲਮਾਂ ਅਤੇ ਸ਼ੋਅ</string>
|
||||
<string name="trending_music">ਟਰੈਂਡਿੰਗ ਸੰਗੀਤ</string>
|
||||
<string name="player_http_403">ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ ਸਟ੍ਰੀਮਿੰਗ URL ਦੀ ਮਿਆਦ ਪੁੱਗਣ ਜਾਂ IP ਦੀ ਪਾਬੰਦੀ ਕਾਰਨ ਹੋਈ ਹੈ</string>
|
||||
<string name="player_http_invalid_status">ਚਲਾਉਣ ਦੌਰਾਨ ਸਰਵਰ ਤੋਂ HTTP error %1$s ਪ੍ਰਾਪਤ ਹੋਇਆ</string>
|
||||
<string name="youtube_player_http_403">ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ IP ਬੈਨ ਜਾਂ ਸਟ੍ਰੀਮਿੰਗ URL ਡੀਔਬਫਸਕੇਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਕਾਰਨ ਹੋਈ ਹੈ</string>
|
||||
<string name="sign_in_confirm_not_bot_error">%1$s ਨੇ ਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ, ਅਤੇ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਲੌਗਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਕਿ ਬੇਨਤੀਕਰਤਾ ਬੋਟ ਨਹੀਂ ਹੈ।\n\nਹੋ ਸਕਦਾ ਹੈ ਕਿ %1$s ਨੇ ਤੁਹਾਡੇ IP ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਕੁਝ ਸਮਾਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਿਸੇ ਵੱਖਰੇ IP \'ਤੇ ਸਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ (ਉਦਾਹਰਣ ਵਜੋਂ VPN ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਕੇ, ਜਾਂ WiFi ਤੋਂ ਮੋਬਾਈਲ ਡੇਟਾ \'ਤੇ ਸਵਿੱਚ ਕਰਕੇ)।</string>
|
||||
<string name="unsupported_content_in_country">ਇਹ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣੇ ਗਏ ਦੇਸ਼ ਦੀ ਸਮੱਗਰੀ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n\n\"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਡਿਫ਼ਾਲਟ ਸਮੱਗਰੀ ਦੇਸ਼\" ਤੋਂ ਆਪਣੀ ਚੋਣ ਬਦਲੋ।</string>
|
||||
</resources>
|
||||
|
||||
@@ -522,7 +522,7 @@
|
||||
<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_partially_watched_streams">Tak, i częściowo obejrzane wideo</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Tak, i częściowo obejrzane wideo</string>
|
||||
<string name="remove_watched_popup_warning">Wideo, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte.
|
||||
\nCzy na pewno\? Tego nie da się cofnąć!</string>
|
||||
<string name="remove_watched_popup_title">Czy usunąć obejrzane wideo\?</string>
|
||||
|
||||
@@ -517,7 +517,7 @@
|
||||
<string name="restricted_video">Este vídeo tem restrição de idade.
|
||||
\n
|
||||
\nAtive \"%1$s\" nas configurações se quiser vê-lo.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sim, e vídeos parcialmente assistidos</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sim, e vídeos parcialmente assistidos</string>
|
||||
<string name="remove_watched_popup_warning">Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos.
|
||||
\nTem certeza? Esta ação não pode ser desfeita!</string>
|
||||
<string name="remove_watched_popup_title">Remover vídeos assistidos?</string>
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
<string name="feed_update_threshold_title">Limite de atualização da fonte</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="subscription_update_failed">Não foi possível atualizar a subscrição</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sim e também os vídeos parcialmente vistos</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sim e também os vídeos parcialmente vistos</string>
|
||||
<string name="no_playlist_bookmarked_yet">Ainda não há listas de reprodução favoritas</string>
|
||||
<plurals name="listening">
|
||||
<item quantity="one">%s ouvinte</item>
|
||||
|
||||
@@ -519,7 +519,7 @@
|
||||
\nPara o poder ver, tem que ativar \"%1$s\" nas definições.</string>
|
||||
<string name="remove_watched_popup_warning">Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos.
|
||||
\nTem a certeza\? Esta ação não pode ser revertida!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Sim e também os vídeos parcialmente vistos</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sim e também os vídeos parcialmente vistos</string>
|
||||
<string name="remove_watched_popup_title">Remover vídeos visualizados\?</string>
|
||||
<string name="remove_watched">Remover visualizados</string>
|
||||
<string name="show_original_time_ago_summary">Os textos originais dos serviços serão visíveis nos itens do vídeo</string>
|
||||
|
||||
@@ -432,7 +432,7 @@
|
||||
<item quantity="other">%d de secunde</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Datorită constrângerilor ExoPlayer, durata de căutare a fost setată la %d secunde</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Da, și videoclipuri vizionate parțial</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Da, și videoclipuri vizionate parțial</string>
|
||||
<string name="remove_watched_popup_warning">Videoclipurile care au fost vizionate înainte și după ce au fost adăugate la lista de redare vor fi eliminate.
|
||||
\nSunteți sigur\? Acest lucru nu poate fi anulat!</string>
|
||||
<string name="remove_watched_popup_title">Eliminați videoclipurile vizionate\?</string>
|
||||
|
||||
3
app/src/main/res/values-rom/strings.xml
Normal file
3
app/src/main/res/values-rom/strings.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
@@ -525,7 +525,7 @@
|
||||
<string name="artists">Исполнители</string>
|
||||
<string name="albums">Альбомы</string>
|
||||
<string name="remove_watched">Удалить просмотренные</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Да, и частично просмотренные</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Да, и частично просмотренные</string>
|
||||
<string name="remove_watched_popup_warning">Видео, просмотренные до или после добавления в плейлист, будут удалены.
|
||||
\nПродолжить\? Не может быть отменено!</string>
|
||||
<string name="remove_watched_popup_title">Удалить просмотренные видео\?</string>
|
||||
|
||||
@@ -509,7 +509,7 @@
|
||||
\nいちらんさるいばあい、しっていから \"%1$s\" ゆーいるこうかしみそーれー。</string>
|
||||
<string name="remove_watched_popup_warning">プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。
|
||||
\nゆたさいびーが?くぬあしっさーむとぅんかいむどぅしやびらん!</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん</string>
|
||||
<string name="remove_watched_popup_title">しちょうじみぬちゃーしがさちゅるじょさびーが?</string>
|
||||
<string name="remove_watched">しちょうじみさちゅるじょ</string>
|
||||
<string name="show_original_time_ago_summary">サービスぬオリジナルぬテキストぬやーまほうあぬんかいひょうじさりやびーん</string>
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
<string name="remove_watched">ᱧᱮᱞᱚᱜ ᱟᱠᱟᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ</string>
|
||||
<string name="remove_watched_popup_title">ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ?</string>
|
||||
<string name="remove_duplicates">ᱫᱩᱯᱞᱟᱹᱲ ᱠᱚ ᱦᱮᱡ ᱢᱮ</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ</string>
|
||||
<string name="feed_groups_header_title">ᱪᱟᱱᱮᱞ ᱜᱨᱩᱯ</string>
|
||||
<string name="feed_oldest_subscription_update">ᱯᱷᱤᱰ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ: %s</string>
|
||||
<string name="feed_subscription_not_loaded_count">ᱵᱟᱝ ᱞᱚᱰ ᱟᱠᱟᱱᱟ: %d</string>
|
||||
|
||||
@@ -284,7 +284,7 @@
|
||||
<item quantity="other">%d segundu</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Pro more de sos lìmites de ExoPlayer sa longària de s\'iscostiamentu lestru est istada impostada a %d segundos</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Eja, e fintzas sos vìdeos pompiados in parte</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Eja, e fintzas sos vìdeos pompiados in parte</string>
|
||||
<string name="remove_watched_popup_warning">Sos vìdeos pompiados in antis e a pustis de los àere annànghidos a s\'iscalita ant a èssere bogados.
|
||||
\n Seguru ses\? Custu no est reversìbile!</string>
|
||||
<string name="remove_watched_popup_title">Bogare sos elementos pompiados\?</string>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<string name="detail_uploader_thumbnail_view_description">Náhľad avataru uploadera</string>
|
||||
<string name="detail_likes_img_view_description">Lajky</string>
|
||||
<string name="detail_dislikes_img_view_description">Dislajky</string>
|
||||
<string name="main_bg_subtitle">Začnite klepnutím na lupu.</string>
|
||||
<string name="main_bg_subtitle">Začnite ťuknutím na lupu.</string>
|
||||
<string name="content">Obsah</string>
|
||||
<string name="show_age_restricted_content_title">Zobraziť vekovo obmedzený obsah</string>
|
||||
<string name="duration_live">Naživo</string>
|
||||
@@ -74,7 +74,7 @@
|
||||
<string name="msg_wait">Čakajte prosím…</string>
|
||||
<string name="msg_copied">Skopírované do schránky</string>
|
||||
<string name="no_available_dir">Priečinok na sťahovanie zadefinujte prosím neskôr v nastaveniach</string>
|
||||
<string name="downloads">Sťahované súbory</string>
|
||||
<string name="downloads">Stiahnuté súbory</string>
|
||||
<string name="downloads_title">Stiahnuté</string>
|
||||
<string name="error_report_title">Hlásenie o chybe</string>
|
||||
<string name="app_ui_crash">Aplikácia/UP zlyhalo</string>
|
||||
@@ -208,7 +208,7 @@
|
||||
<string name="no_valid_zip_file">Neplatný ZIP súbor</string>
|
||||
<string name="could_not_import_all_files">Upozornenie: Nemožno importovať všetky súbory.</string>
|
||||
<string name="override_current_data">Toto prepíše vaše aktuálne nastavenie.</string>
|
||||
<string name="trending">Trendy</string>
|
||||
<string name="trending">Populárne</string>
|
||||
<string name="top_50">Top 50</string>
|
||||
<string name="new_and_hot">Nové a horúce</string>
|
||||
<string name="play_queue_remove">Odstrániť</string>
|
||||
@@ -473,7 +473,7 @@
|
||||
<item quantity="other">%d dní</item>
|
||||
</plurals>
|
||||
<string name="feed_groups_header_title">Skupiny kanálov</string>
|
||||
<string name="feed_oldest_subscription_update">Zdroj naposledy aktualizovaný: %s</string>
|
||||
<string name="feed_oldest_subscription_update">Zdroj aktualizovaný: %s</string>
|
||||
<string name="feed_subscription_not_loaded_count">Nenačítané: %d</string>
|
||||
<string name="feed_notification_loading">Načítavanie zdroja…</string>
|
||||
<string name="feed_processing_message">Spracovávanie zdroja…</string>
|
||||
@@ -509,7 +509,7 @@
|
||||
<string name="content_not_supported">Tento obsah ešte nie je podporovaný v NwPipe.
|
||||
\n
|
||||
\nMožno v budúcnosti sa to zmení.</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Áno aj čiastočne pozreté videá</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Áno aj čiastočne pozreté videá</string>
|
||||
<string name="remove_watched_popup_warning">Pozreté videá, ktoré ste pozreli pred a po ich pridaní do playlistu, budú odstránené. \nSte si istí ich odstránením z playlistu? Táto operácia je nezvratná!</string>
|
||||
<string name="remove_watched_popup_title">Odstrániť pozreté videá\?</string>
|
||||
<string name="remove_watched">Odstrániť pozreté</string>
|
||||
@@ -845,10 +845,10 @@
|
||||
<string name="migration_info_6_7_message">SoundCloud prestal používať pôvodnú Top 50. Daná stránka bola odstránená z hlavnej stránky.</string>
|
||||
<string name="migration_info_7_8_title">Odstránené kombinované trendy na YouTube</string>
|
||||
<string name="migration_info_7_8_message">YouTube ukončil prevádzku kombinovanej stránky s trendmi k 21. júlu 2025. NewPipe nahradil predvolenú stránku s trendmi stránkou s trendovými živými prenosmi.\n\nV nastaveniach „Nastavenia > Obsah > Obsah hlavnej stránky“ môžete vybrať aj iné stránky s trendmi.</string>
|
||||
<string name="trending_gaming">Ttendy v hrách</string>
|
||||
<string name="trending_podcasts">Trendové podcasty</string>
|
||||
<string name="trending_movies">Trendové filmy a seriály</string>
|
||||
<string name="trending_music">Trendová hudba</string>
|
||||
<string name="trending_gaming">Populárne hry</string>
|
||||
<string name="trending_podcasts">Populárne podcasty</string>
|
||||
<string name="trending_movies">Populárne filmy a seriály</string>
|
||||
<string name="trending_music">Populárna hudba</string>
|
||||
<string name="short_thousand">%stis.</string>
|
||||
<string name="short_million">%smil.</string>
|
||||
<string name="short_billion">%smld.</string>
|
||||
|
||||
@@ -490,7 +490,7 @@
|
||||
<item quantity="other">%d ilbiriqsi</item>
|
||||
</plurals>
|
||||
<string name="new_seek_duration_toast">Ayadooy ugu wacantahay xayiraad xaga ExoPlayer-ka ah xadka dhaaf-dhaafinta waa %d ilbiriqsi</string>
|
||||
<string name="remove_watched_popup_partially_watched_streams">Haa, sidoo kale ku dar muuqaalada qayb laga daawaday</string>
|
||||
<string name="remove_watched_popup_yes_and_partially_watched_videos">Haa, sidoo kale ku dar muuqaalada qayb laga daawaday</string>
|
||||
<string name="remove_watched_popup_warning">Muuqaalada la daawaday kahor iyo kadib markii xulka lagu daray waa la saari doonaa.
|
||||
\nMa hubtaa\? Arrinkan dib looma soocelin karo!</string>
|
||||
<string name="remove_watched_popup_title">Saar muuqaalada la daawaday\?</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user