Merge pull request #3863 from TeamNewPipe/release_0.19.6

Release 0.19.6
This commit is contained in:
Tobias Groza 2020-07-12 20:25:05 +02:00 committed by GitHub
commit c900ef036c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
106 changed files with 3468 additions and 1032 deletions

View File

@ -13,8 +13,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdkVersion 19
targetSdkVersion 29
versionCode 950
versionName "0.19.5"
versionCode 951
versionName "0.19.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
@ -84,13 +84,18 @@ ext {
checkstyleVersion = '8.32'
stethoVersion = '1.5.1'
leakCanaryVersion = '2.2'
exoPlayerVersion = '2.11.4'
exoPlayerVersion = '2.11.6'
androidxLifecycleVersion = '2.2.0'
androidxRoomVersion = '2.2.5'
groupieVersion = '2.8.0'
markwonVersion = '4.3.1'
}
configurations {
checkstyle
ktlint
}
checkstyle {
configFile rootProject.file('checkstyle.xml')
ignoreFailures false
@ -106,8 +111,7 @@ task runCheckstyle(type: Checkstyle) {
exclude '**/BuildConfig.java'
exclude 'main/java/us/shandian/giga/**'
// empty classpath
classpath = files()
classpath = configurations.checkstyle
showViolations true
@ -117,10 +121,6 @@ task runCheckstyle(type: Checkstyle) {
}
}
configurations {
ktlint
}
task runKtlint(type: JavaExec) {
main = "com.pinterest.ktlint.Main"
classpath = configurations.ktlint
@ -143,7 +143,7 @@ dependencies {
implementation "frankiesardo:icepick:${icepickVersion}"
kapt "frankiesardo:icepick-processor:${icepickVersion}"
debugImplementation "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
ktlint "com.pinterest:ktlint:0.35.0"
debugImplementation "com.facebook.stetho:stetho:${stethoVersion}"
@ -163,7 +163,7 @@ dependencies {
exclude module: 'support-annotations'
}
implementation 'com.github.TeamNewPipe:NewPipeExtractor:bda83fe6a5b9a8a0751669fbc444fa49d72d0d2f'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:a70cb0283ffc3bba2709815673a5a7940aab0a3a'
implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751"
implementation "org.jsoup:jsoup:1.13.1"

View File

@ -1,22 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.schabi.newpipe">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<application
android:banner="@mipmap/newpipe_tv_banner"
android:name=".App"
android:allowBackup="true"
android:banner="@mipmap/newpipe_tv_banner"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:logo="@mipmap/ic_launcher"
@ -28,13 +29,14 @@
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="androidx.media.session.MediaButtonReceiver" >
<receiver android:name="androidx.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
@ -50,36 +52,36 @@
<activity
android:name=".player.BackgroundPlayerActivity"
android:launchMode="singleTask"
android:label="@string/title_activity_background_player"/>
android:label="@string/title_activity_background_player"
android:launchMode="singleTask" />
<activity
android:name=".player.PopupVideoPlayerActivity"
android:launchMode="singleTask"
android:label="@string/title_activity_popup_player"/>
android:label="@string/title_activity_popup_player"
android:launchMode="singleTask" />
<service
android:name=".player.PopupVideoPlayer"
android:exported="false"/>
android:exported="false" />
<activity
android:name=".player.MainVideoPlayer"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTask"
android:theme="@style/VideoPlayerTheme"/>
android:theme="@style/VideoPlayerTheme" />
<activity
android:name=".settings.SettingsActivity"
android:label="@string/settings"/>
android:label="@string/settings" />
<activity
android:name=".about.AboutActivity"
android:label="@string/title_activity_about"/>
android:label="@string/title_activity_about" />
<service android:name=".local.subscription.services.SubscriptionsImportService"/>
<service android:name=".local.subscription.services.SubscriptionsExportService"/>
<service android:name=".local.feed.service.FeedLoadService"/>
<service android:name=".local.subscription.services.SubscriptionsImportService" />
<service android:name=".local.subscription.services.SubscriptionsExportService" />
<service android:name=".local.feed.service.FeedLoadService" />
<activity
android:name=".PanicResponderActivity"
@ -87,25 +89,25 @@
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="info.guardianproject.panic.action.TRIGGER"/>
<action android:name="info.guardianproject.panic.action.TRIGGER" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ExitActivity"
android:label="@string/general_error"
android:theme="@android:style/Theme.NoDisplay"/>
<activity android:name=".report.ErrorActivity"/>
android:theme="@android:style/Theme.NoDisplay" />
<activity android:name=".report.ErrorActivity" />
<!-- giga get related -->
<activity
android:name=".download.DownloadActivity"
android:label="@string/app_name"
android:launchMode="singleTask"/>
android:launchMode="singleTask" />
<service android:name="us.shandian.giga.service.DownloadManagerService"/>
<service android:name="us.shandian.giga.service.DownloadManagerService" />
<activity
android:name=".util.FilePickerActivityHelper"
@ -119,7 +121,7 @@
<activity
android:name=".ReCaptchaActivity"
android:label="@string/recaptcha"/>
android:label="@string/recaptcha" />
<provider
android:name="androidx.core.content.FileProvider"
@ -128,7 +130,7 @@
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/nnf_provider_paths"/>
android:resource="@xml/nnf_provider_paths" />
</provider>
<activity
@ -140,165 +142,197 @@
<!-- Youtube filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="youtube.com"/>
<data android:host="m.youtube.com"/>
<data android:host="www.youtube.com"/>
<data android:host="music.youtube.com"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="youtube.com" />
<data android:host="m.youtube.com" />
<data android:host="www.youtube.com" />
<data android:host="music.youtube.com" />
<!-- video prefix -->
<data android:pathPrefix="/v/"/>
<data android:pathPrefix="/embed/"/>
<data android:pathPrefix="/watch"/>
<data android:pathPrefix="/attribution_link"/>
<data android:pathPrefix="/v/" />
<data android:pathPrefix="/embed/" />
<data android:pathPrefix="/watch" />
<data android:pathPrefix="/attribution_link" />
<!-- channel prefix -->
<data android:pathPrefix="/channel/"/>
<data android:pathPrefix="/user/"/>
<data android:pathPrefix="/c/"/>
<data android:pathPrefix="/channel/" />
<data android:pathPrefix="/user/" />
<data android:pathPrefix="/c/" />
<!-- playlist prefix -->
<data android:pathPrefix="/playlist"/>
<data android:pathPrefix="/playlist" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="youtu.be"/>
<data android:pathPrefix="/"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="youtu.be" />
<data android:pathPrefix="/" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="www.youtube-nocookie.com"/>
<data android:pathPrefix="/embed/"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="www.youtube-nocookie.com" />
<data android:pathPrefix="/embed/" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="vnd.youtube"/>
<data android:scheme="vnd.youtube.launch"/>
<data android:scheme="vnd.youtube" />
<data android:scheme="vnd.youtube.launch" />
</intent-filter>
<!-- Hooktube filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="hooktube.com"/>
<data android:host="*.hooktube.com"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="hooktube.com" />
<data android:host="*.hooktube.com" />
<!-- video prefix -->
<data android:pathPrefix="/v/"/>
<data android:pathPrefix="/embed/"/>
<data android:pathPrefix="/watch"/>
<data android:pathPrefix="/v/" />
<data android:pathPrefix="/embed/" />
<data android:pathPrefix="/watch" />
<!-- channel prefix -->
<data android:pathPrefix="/channel/"/>
<data android:pathPrefix="/user/"/>
<data android:pathPrefix="/channel/" />
<data android:pathPrefix="/user/" />
</intent-filter>
<!-- Invidious filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="invidio.us"/>
<data android:host="dev.invidio.us"/>
<data android:host="www.invidio.us"/>
<data android:host="invidious.snopyta.org"/>
<data android:host="de.invidious.snopyta.org"/>
<data android:host="fi.invidious.snopyta.org"/>
<data android:host="vid.wxzm.sx"/>
<data android:host="invidious.kabi.tk"/>
<data android:host="invidiou.sh"/>
<data android:host="www.invidiou.sh"/>
<data android:host="no.invidiou.sh"/>
<data android:host="invidious.enkirton.net"/>
<data android:host="tube.poal.co"/>
<data android:host="invidious.13ad.de"/>
<data android:host="yt.elukerio.org"/>
<data android:pathPrefix="/"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="invidio.us" />
<data android:host="dev.invidio.us" />
<data android:host="www.invidio.us" />
<data android:host="invidious.snopyta.org" />
<data android:host="fi.invidious.snopyta.org" />
<data android:host="yewtu.be" />
<data android:host="invidious.ggc-project.de" />
<data android:host="yt.maisputain.ovh" />
<data android:host="invidious.13ad.de" />
<data android:host="invidious.toot.koeln" />
<data android:host="invidious.fdn.fr" />
<data android:host="watch.nettohikari.com" />
<data android:host="invidious.snwmds.net" />
<data android:host="invidious.snwmds.org" />
<data android:host="invidious.snwmds.com" />
<data android:host="invidious.sunsetravens.com" />
<data android:host="invidious.gachirangers.com" />
<data android:pathPrefix="/" />
</intent-filter>
<!-- Soundcloud filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="soundcloud.com"/>
<data android:host="m.soundcloud.com"/>
<data android:host="www.soundcloud.com"/>
<data android:pathPrefix="/"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="soundcloud.com" />
<data android:host="m.soundcloud.com" />
<data android:host="www.soundcloud.com" />
<data android:pathPrefix="/" />
</intent-filter>
<!-- Share filter -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<!-- MediaCCC filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="media.ccc.de"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="media.ccc.de" />
<!-- video prefix -->
<data android:pathPrefix="/v/"/>
<data android:pathPrefix="/v/" />
<!-- channel prefix-->
<data android:pathPrefix="/c/"/>
<data android:pathPrefix="/b/"/>
<data android:pathPrefix="/c/" />
<data android:pathPrefix="/b/" />
</intent-filter>
<!-- PeerTube filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="framatube.org" />
<data android:host="media.assassinate-you.net" />
<data android:host="peertube.co.uk" />
<data android:host="peertube.cpy.re" />
<data android:host="peertube.mastodon.host" />
<data android:host="peertube.fr" />
<data android:host="peertube.live" />
<data android:host="peertube.video" />
<data android:host="tube.privacytools.io" />
<data android:host="video.ploud.fr" />
<data android:host="video.lqdn.fr" />
<data android:host="skeptikon.fr" />
<data android:pathPrefix="/videos/" /> <!-- it contains playlists -->
<data android:pathPrefix="/accounts/" />
<data android:pathPrefix="/video-channels/" />
</intent-filter>
</activity>
<service
android:name=".RouterActivity$FetcherService"
android:exported="false"/>
android:exported="false" />
</application>
</manifest>

View File

@ -34,8 +34,6 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
@ -127,12 +125,6 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
if (getSupportFragmentManager() != null
&& getSupportFragmentManager().getBackStackEntryCount() == 0) {
initFragments();

View File

@ -1,8 +1,6 @@
package org.schabi.newpipe.about;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -26,6 +24,7 @@ import org.schabi.newpipe.R;
import org.schabi.newpipe.util.ThemeHelper;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import static org.schabi.newpipe.util.ShareUtils.openUrlInBrowser;
public class AboutActivity extends AppCompatActivity {
/**
@ -143,28 +142,23 @@ public class AboutActivity extends AppCompatActivity {
View githubLink = rootView.findViewById(R.id.github_link);
githubLink.setOnClickListener(nv ->
openWebsite(context.getString(R.string.github_url), context));
openUrlInBrowser(context, context.getString(R.string.github_url)));
View donationLink = rootView.findViewById(R.id.donation_link);
donationLink.setOnClickListener(v ->
openWebsite(context.getString(R.string.donation_url), context));
openUrlInBrowser(context, context.getString(R.string.donation_url)));
View websiteLink = rootView.findViewById(R.id.website_link);
websiteLink.setOnClickListener(nv ->
openWebsite(context.getString(R.string.website_url), context));
openUrlInBrowser(context, context.getString(R.string.website_url)));
View privacyPolicyLink = rootView.findViewById(R.id.privacy_policy_link);
privacyPolicyLink.setOnClickListener(v ->
openWebsite(context.getString(R.string.privacy_policy_url), context));
openUrlInBrowser(context, context.getString(R.string.privacy_policy_url)));
return rootView;
}
private void openWebsite(final String url, final Context context) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
context.startActivity(intent);
}
}
/**

View File

@ -1,7 +1,33 @@
package org.schabi.newpipe.database.playlist;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public interface PlaylistLocalItem extends LocalItem {
String getOrderingName();
static List<PlaylistLocalItem> merge(
final List<PlaylistMetadataEntry> localPlaylists,
final List<PlaylistRemoteEntity> remotePlaylists) {
final List<PlaylistLocalItem> items = new ArrayList<>(
localPlaylists.size() + remotePlaylists.size());
items.addAll(localPlaylists);
items.addAll(remotePlaylists);
Collections.sort(items, (left, right) -> {
final String on1 = left.getOrderingName();
final String on2 = right.getOrderingName();
if (on1 == null) {
return on2 == null ? 0 : 1;
} else {
return on2 == null ? -1 : on1.compareToIgnoreCase(on2);
}
});
return items;
}
}

View File

@ -20,6 +20,45 @@ abstract class SubscriptionDAO : BasicDAO<SubscriptionEntity> {
@Query("SELECT * FROM subscriptions ORDER BY name COLLATE NOCASE ASC")
abstract override fun getAll(): Flowable<List<SubscriptionEntity>>
@Query("""
SELECT * FROM subscriptions
WHERE name LIKE '%' || :filter || '%'
ORDER BY name COLLATE NOCASE ASC
""")
abstract fun getSubscriptionsFiltered(filter: String): Flowable<List<SubscriptionEntity>>
@Query("""
SELECT * FROM subscriptions s
LEFT JOIN feed_group_subscription_join fgs
ON s.uid = fgs.subscription_id
WHERE (fgs.subscription_id IS NULL OR fgs.group_id = :currentGroupId)
ORDER BY name COLLATE NOCASE ASC
""")
abstract fun getSubscriptionsOnlyUngrouped(
currentGroupId: Long
): Flowable<List<SubscriptionEntity>>
@Query("""
SELECT * FROM subscriptions s
LEFT JOIN feed_group_subscription_join fgs
ON s.uid = fgs.subscription_id
WHERE (fgs.subscription_id IS NULL OR fgs.group_id = :currentGroupId)
AND s.name LIKE '%' || :filter || '%'
ORDER BY name COLLATE NOCASE ASC
""")
abstract fun getSubscriptionsOnlyUngroupedFiltered(
currentGroupId: Long,
filter: String
): Flowable<List<SubscriptionEntity>>
@Query("SELECT * FROM subscriptions WHERE url LIKE :url AND service_id = :serviceId")
abstract fun getSubscriptionFlowable(serviceId: Int, url: String): Flowable<List<SubscriptionEntity>>
@ -52,7 +91,7 @@ abstract class SubscriptionDAO : BasicDAO<SubscriptionEntity> {
entity.uid = uidFromInsert
} else {
val subscriptionIdFromDb = getSubscriptionIdInternal(entity.serviceId, entity.url)
?: throw IllegalStateException("Subscription cannot be null just after insertion.")
?: throw IllegalStateException("Subscription cannot be null just after insertion.")
entity.uid = subscriptionIdFromDb
update(entity)

View File

@ -130,4 +130,55 @@ public class SubscriptionEntity {
item.setDescription(getDescription());
return item;
}
// TODO: Remove these generated methods by migrating this class to a data class from Kotlin.
@Override
@SuppressWarnings("EqualsReplaceableByObjectsCall")
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final SubscriptionEntity that = (SubscriptionEntity) o;
if (uid != that.uid) {
return false;
}
if (serviceId != that.serviceId) {
return false;
}
if (!url.equals(that.url)) {
return false;
}
if (name != null ? !name.equals(that.name) : that.name != null) {
return false;
}
if (avatarUrl != null ? !avatarUrl.equals(that.avatarUrl) : that.avatarUrl != null) {
return false;
}
if (subscriberCount != null
? !subscriberCount.equals(that.subscriberCount)
: that.subscriberCount != null) {
return false;
}
return description != null
? description.equals(that.description)
: that.description == null;
}
@Override
public int hashCode() {
int result = (int) (uid ^ (uid >>> 32));
result = 31 * result + serviceId;
result = 31 * result + url.hashCode();
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (avatarUrl != null ? avatarUrl.hashCode() : 0);
result = 31 * result + (subscriberCount != null ? subscriberCount.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
return result;
}
}

View File

@ -479,7 +479,6 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo>
case R.id.detail_controls_download:
NavigationHelper.openDownloads(getActivity());
break;
case R.id.detail_uploader_root_layout:
if (TextUtils.isEmpty(currentInfo.getSubChannelUrl())) {
Log.w(TAG,
@ -488,6 +487,9 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo>
openChannel(currentInfo.getUploaderUrl(), currentInfo.getUploaderName());
}
break;
case R.id.detail_title_root_layout:
ShareUtils.copyToClipboard(getContext(), videoTitleTextView.getText().toString());
break;
}
return true;
@ -583,6 +585,7 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo>
protected void initListeners() {
super.initListeners();
videoTitleRoot.setOnLongClickListener(this);
uploaderRootLayout.setOnClickListener(this);
uploaderRootLayout.setOnLongClickListener(this);
videoTitleRoot.setOnClickListener(this);

View File

@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.ListInfo;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.util.Constants;
import org.schabi.newpipe.views.NewPipeRecyclerView;
@ -30,7 +31,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
protected String url;
protected I currentInfo;
protected String currentNextPageUrl;
protected Page currentNextPage;
protected Disposable currentWorker;
@Override
@ -78,7 +79,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
public void writeTo(final Queue<Object> objectsToSave) {
super.writeTo(objectsToSave);
objectsToSave.add(currentInfo);
objectsToSave.add(currentNextPageUrl);
objectsToSave.add(currentNextPage);
}
@Override
@ -86,7 +87,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception {
super.readFrom(savedObjects);
currentInfo = (I) savedObjects.poll();
currentNextPageUrl = (String) savedObjects.poll();
currentNextPage = (Page) savedObjects.poll();
}
/*//////////////////////////////////////////////////////////////////////////
@ -130,7 +131,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
.subscribe((@NonNull I result) -> {
isLoading.set(false);
currentInfo = result;
currentNextPageUrl = result.getNextPageUrl();
currentNextPage = result.getNextPage();
handleResult(result);
}, (@NonNull Throwable throwable) -> onError(throwable));
}
@ -182,7 +183,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
@Override
public void handleNextItems(final ListExtractor.InfoItemsPage result) {
super.handleNextItems(result);
currentNextPageUrl = result.getNextPageUrl();
currentNextPage = result.getNextPage();
infoListAdapter.addInfoItemList(result.getItems());
showListFooter(hasMoreItems());
@ -190,7 +191,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
@Override
protected boolean hasMoreItems() {
return !TextUtils.isEmpty(currentNextPageUrl);
return Page.isValid(currentNextPage);
}
/*//////////////////////////////////////////////////////////////////////////

View File

@ -403,7 +403,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
@Override
protected Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() {
return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPageUrl);
return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPage);
}
@Override
@ -555,7 +555,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
}
}
return new ChannelPlayQueue(currentInfo.getServiceId(), currentInfo.getUrl(),
currentInfo.getNextPageUrl(), streamItems, index);
currentInfo.getNextPage(), streamItems, index);
}
@Override

View File

@ -71,7 +71,7 @@ public class CommentsFragment extends BaseListInfoFragment<CommentsInfo> {
@Override
protected Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() {
return ExtractorHelper.getMoreCommentItems(serviceId, currentInfo, currentNextPageUrl);
return ExtractorHelper.getMoreCommentItems(serviceId, currentInfo, currentNextPage);
}
@Override

View File

@ -44,7 +44,7 @@ public class DefaultKioskFragment extends KioskFragment {
name = kioskTranslatedName;
currentInfo = null;
currentNextPageUrl = null;
currentNextPage = null;
} catch (ExtractionException e) {
onUnrecoverableError(e, UserAction.REQUESTED_KIOSK, "none",
"Loading default kiosk from selected service", 0);

View File

@ -150,7 +150,7 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> {
@Override
public Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() {
return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextPageUrl);
return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextPage);
}
/*//////////////////////////////////////////////////////////////////////////

View File

@ -229,7 +229,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
@Override
protected Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() {
return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPageUrl);
return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPage);
}
@Override
@ -349,7 +349,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
return new PlaylistPlayQueue(
currentInfo.getServiceId(),
currentInfo.getUrl(),
currentInfo.getNextPageUrl(),
currentInfo.getNextPage(),
infoItems,
index
);

View File

@ -7,6 +7,7 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.Html;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
@ -37,6 +38,7 @@ import org.schabi.newpipe.database.history.model.SearchHistoryEntry;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.search.SearchExtractor;
@ -71,6 +73,7 @@ import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subjects.PublishSubject;
import static android.text.Html.escapeHtml;
import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags;
import static java.util.Arrays.asList;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
@ -118,13 +121,18 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
@State
String lastSearchedString;
@State
String searchSuggestion;
@State
boolean isCorrectedSearch;
@State
boolean wasSearchFocused = false;
private Map<Integer, String> menuItemToFilterName;
private StreamingService service;
private String currentPageUrl;
private String nextPageUrl;
private Page nextPage;
private String contentCountry;
private boolean isSuggestionsEnabled = true;
@ -143,6 +151,8 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
private EditText searchEditText;
private View searchClear;
private TextView correctSuggestion;
private View suggestionsPanel;
private RecyclerView suggestionsRecyclerView;
@ -257,6 +267,8 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
}
}
handleSearchSuggestion();
if (suggestionDisposable == null || suggestionDisposable.isDisposed()) {
initSuggestionObserver();
}
@ -345,6 +357,8 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
searchToolbarContainer = activity.findViewById(R.id.toolbar_search_container);
searchEditText = searchToolbarContainer.findViewById(R.id.toolbar_search_edit_text);
searchClear = searchToolbarContainer.findViewById(R.id.toolbar_search_clear);
correctSuggestion = rootView.findViewById(R.id.correct_suggestion);
}
/*//////////////////////////////////////////////////////////////////////////
@ -354,15 +368,13 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
@Override
public void writeTo(final Queue<Object> objectsToSave) {
super.writeTo(objectsToSave);
objectsToSave.add(currentPageUrl);
objectsToSave.add(nextPageUrl);
objectsToSave.add(nextPage);
}
@Override
public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception {
super.readFrom(savedObjects);
currentPageUrl = (String) savedObjects.poll();
nextPageUrl = (String) savedObjects.poll();
nextPage = (Page) savedObjects.poll();
}
@Override
@ -497,6 +509,8 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
return;
}
correctSuggestion.setVisibility(View.GONE);
searchEditText.setText("");
suggestionListAdapter.setItems(new ArrayList<>());
showKeyboardSearch();
@ -554,11 +568,13 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start,
final int count, final int after) { }
final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start,
final int before, final int count) { }
final int before, final int count) {
}
@Override
public void afterTextChanged(final Editable s) {
@ -688,10 +704,6 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
return false;
}
public void giveSearchEditTextFocus() {
showKeyboardSearch();
}
private void initSuggestionObserver() {
if (DEBUG) {
Log.d(TAG, "initSuggestionObserver() called");
@ -845,7 +857,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
@Override
protected void loadMoreItems() {
if (nextPageUrl == null || nextPageUrl.isEmpty()) {
if (!Page.isValid(nextPage)) {
return;
}
isLoading.set(true);
@ -858,7 +870,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
searchString,
asList(contentFilter),
sortFilter,
nextPageUrl)
nextPage)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnEvent((nextItemsResult, throwable) -> isLoading.set(false))
@ -961,9 +973,13 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
NewPipe.getNameOfService(serviceId), searchString, 0);
}
searchSuggestion = result.getSearchSuggestion();
isCorrectedSearch = result.isCorrectedSearch();
handleSearchSuggestion();
lastSearchedString = searchString;
nextPageUrl = result.getNextPageUrl();
currentPageUrl = result.getUrl();
nextPage = result.getNextPage();
if (infoListAdapter.getItemsList().size() == 0) {
if (!result.getRelatedItems().isEmpty()) {
@ -978,17 +994,49 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
super.handleResult(result);
}
private void handleSearchSuggestion() {
if (TextUtils.isEmpty(searchSuggestion)) {
correctSuggestion.setVisibility(View.GONE);
} else {
final String helperText = getString(isCorrectedSearch
? R.string.search_showing_result_for
: R.string.did_you_mean);
final String highlightedSearchSuggestion =
"<b><i>" + escapeHtml(searchSuggestion) + "</i></b>";
correctSuggestion.setText(
Html.fromHtml(String.format(helperText, highlightedSearchSuggestion)));
correctSuggestion.setOnClickListener(v -> {
correctSuggestion.setVisibility(View.GONE);
search(searchSuggestion, contentFilter, sortFilter);
searchEditText.setText(searchSuggestion);
});
correctSuggestion.setOnLongClickListener(v -> {
searchEditText.setText(searchSuggestion);
searchEditText.setSelection(searchSuggestion.length());
showKeyboardSearch();
return true;
});
correctSuggestion.setVisibility(View.VISIBLE);
}
}
@Override
public void handleNextItems(final ListExtractor.InfoItemsPage result) {
showListFooter(false);
currentPageUrl = result.getNextPageUrl();
infoListAdapter.addInfoItemList(result.getItems());
nextPageUrl = result.getNextPageUrl();
nextPage = result.getNextPage();
if (!result.getErrors().isEmpty()) {
showSnackBarError(result.getErrors(), UserAction.SEARCHED,
NewPipe.getNameOfService(serviceId),
"\"" + searchString + "\" → page: " + nextPageUrl, 0);
"\"" + searchString + "\" → pageUrl: " + nextPage.getUrl() + ", "
+ "pageIds: " + nextPage.getIds() + ", "
+ "pageCookies: " + nextPage.getCookies(), 0);
}
super.handleNextItems(result);
}
@ -1020,6 +1068,10 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
public int getSuggestionMovementFlags(@NonNull final RecyclerView recyclerView,
@NonNull final RecyclerView.ViewHolder viewHolder) {
final int position = viewHolder.getAdapterPosition();
if (position == RecyclerView.NO_POSITION) {
return 0;
}
final SuggestionItem item = suggestionListAdapter.getItem(position);
return item.fromHistory ? makeMovementFlags(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) : 0;

View File

@ -1,15 +1,11 @@
package org.schabi.newpipe.info_list.holder;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
@ -24,6 +20,7 @@ import org.schabi.newpipe.util.CommentTextOnTouchListener;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ShareUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -129,14 +126,10 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
itemView.setOnLongClickListener(view -> {
if (!AndroidTvUtils.isTv(itemBuilder.getContext())) {
ClipboardManager clipboardManager = (ClipboardManager) itemBuilder.getContext()
.getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, commentText));
Toast.makeText(itemBuilder.getContext(), R.string.msg_copied, Toast.LENGTH_SHORT)
.show();
} else {
if (AndroidTvUtils.isTv(itemBuilder.getContext())) {
openCommentAuthor(item);
} else {
ShareUtils.copyToClipboard(itemBuilder.getContext(), commentText);
}
return true;
});

View File

@ -30,8 +30,6 @@ import org.schabi.newpipe.report.UserAction;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.OnClickGesture;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import icepick.State;
@ -54,31 +52,6 @@ public final class BookmarkFragment extends BaseLocalListFragment<List<PlaylistL
// Fragment LifeCycle - Creation
///////////////////////////////////////////////////////////////////////////
private static List<PlaylistLocalItem> merge(
final List<PlaylistMetadataEntry> localPlaylists,
final List<PlaylistRemoteEntity> remotePlaylists) {
List<PlaylistLocalItem> items = new ArrayList<>(
localPlaylists.size() + remotePlaylists.size());
items.addAll(localPlaylists);
items.addAll(remotePlaylists);
Collections.sort(items, (left, right) -> {
String on1 = left.getOrderingName();
String on2 = right.getOrderingName();
if (on1 == null && on2 == null) {
return 0;
} else if (on1 != null && on2 == null) {
return -1;
} else if (on1 == null && on2 != null) {
return 1;
} else {
return on1.compareToIgnoreCase(on2);
}
});
return items;
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -164,7 +137,7 @@ public final class BookmarkFragment extends BaseLocalListFragment<List<PlaylistL
super.startLoading(forceLoad);
Flowable.combineLatest(localPlaylistManager.getPlaylists(),
remotePlaylistManager.getPlaylists(), BookmarkFragment::merge)
remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge)
.onBackpressureLatest()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getPlaylistsSubscriber());

View File

@ -2,9 +2,11 @@ package org.schabi.newpipe.local.subscription
import android.content.Context
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.schabi.newpipe.NewPipeDatabase
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.database.subscription.SubscriptionDAO
import org.schabi.newpipe.database.subscription.SubscriptionEntity
import org.schabi.newpipe.extractor.ListInfo
@ -21,9 +23,28 @@ class SubscriptionManager(context: Context) {
fun subscriptionTable(): SubscriptionDAO = subscriptionTable
fun subscriptions() = subscriptionTable.all
fun getSubscriptions(
currentGroupId: Long = FeedGroupEntity.GROUP_ALL_ID,
filterQuery: String = "",
showOnlyUngrouped: Boolean = false
): Flowable<List<SubscriptionEntity>> {
return when {
filterQuery.isNotEmpty() -> {
return if (showOnlyUngrouped) {
subscriptionTable.getSubscriptionsOnlyUngroupedFiltered(
currentGroupId, filterQuery)
} else {
subscriptionTable.getSubscriptionsFiltered(filterQuery)
}
}
showOnlyUngrouped -> subscriptionTable.getSubscriptionsOnlyUngrouped(currentGroupId)
else -> subscriptionTable.all
}
}
fun upsertAll(infoList: List<ChannelInfo>): List<SubscriptionEntity> {
val listEntities = subscriptionTable.upsertAll(
infoList.map { SubscriptionEntity.from(it) })
infoList.map { SubscriptionEntity.from(it) })
database.runInTransaction {
infoList.forEachIndexed { index, info ->
@ -35,13 +56,13 @@ class SubscriptionManager(context: Context) {
}
fun updateChannelInfo(info: ChannelInfo): Completable = subscriptionTable.getSubscription(info.serviceId, info.url)
.flatMapCompletable {
Completable.fromRunnable {
it.setData(info.name, info.avatarUrl, info.description, info.subscriberCount)
subscriptionTable.update(it)
feedDatabaseManager.upsertAll(it.uid, info.relatedItems)
}
.flatMapCompletable {
Completable.fromRunnable {
it.setData(info.name, info.avatarUrl, info.description, info.subscriberCount)
subscriptionTable.update(it)
feedDatabaseManager.upsertAll(it.uid, info.relatedItems)
}
}
fun updateFromInfo(subscriptionId: Long, info: ListInfo<StreamInfoItem>) {
val subscriptionEntity = subscriptionTable.getSubscription(subscriptionId)
@ -57,8 +78,8 @@ class SubscriptionManager(context: Context) {
fun deleteSubscription(serviceId: Int, url: String): Completable {
return Completable.fromCallable { subscriptionTable.deleteSubscription(serviceId, url) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
fun insertSubscription(subscriptionEntity: SubscriptionEntity, info: ChannelInfo) {

View File

@ -5,6 +5,7 @@ import android.content.Context
import android.os.Bundle
import android.os.Parcelable
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
@ -13,34 +14,22 @@ import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.xwray.groupie.GroupAdapter
import com.xwray.groupie.OnItemClickListener
import com.xwray.groupie.Section
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import icepick.Icepick
import icepick.State
import java.io.Serializable
import kotlinx.android.synthetic.main.dialog_feed_group_create.cancel_button
import kotlinx.android.synthetic.main.dialog_feed_group_create.confirm_button
import kotlinx.android.synthetic.main.dialog_feed_group_create.delete_button
import kotlinx.android.synthetic.main.dialog_feed_group_create.delete_screen_message
import kotlinx.android.synthetic.main.dialog_feed_group_create.group_name_input
import kotlinx.android.synthetic.main.dialog_feed_group_create.group_name_input_container
import kotlinx.android.synthetic.main.dialog_feed_group_create.icon_preview
import kotlinx.android.synthetic.main.dialog_feed_group_create.icon_selector
import kotlinx.android.synthetic.main.dialog_feed_group_create.options_root
import kotlinx.android.synthetic.main.dialog_feed_group_create.select_channel_button
import kotlinx.android.synthetic.main.dialog_feed_group_create.selected_subscription_count_view
import kotlinx.android.synthetic.main.dialog_feed_group_create.separator
import kotlinx.android.synthetic.main.dialog_feed_group_create.subscriptions_selector
import kotlinx.android.synthetic.main.dialog_feed_group_create.subscriptions_selector_header_info
import kotlinx.android.synthetic.main.dialog_feed_group_create.subscriptions_selector_list
import kotlin.collections.contains
import kotlinx.android.synthetic.main.dialog_feed_group_create.*
import kotlinx.android.synthetic.main.toolbar_search_layout.*
import org.schabi.newpipe.R
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.database.subscription.SubscriptionEntity
import org.schabi.newpipe.fragments.BackPressable
import org.schabi.newpipe.local.subscription.FeedGroupIcon
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.DeleteScreen
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.IconPickerScreen
@ -51,9 +40,10 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.Dia
import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem
import org.schabi.newpipe.local.subscription.item.PickerIconItem
import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem
import org.schabi.newpipe.util.AndroidTvUtils
import org.schabi.newpipe.util.ThemeHelper
class FeedGroupDialog : DialogFragment() {
class FeedGroupDialog : DialogFragment(), BackPressable {
private lateinit var viewModel: FeedGroupDialogViewModel
private var groupId: Long = NO_GROUP_SELECTED
private var groupIcon: FeedGroupIcon? = null
@ -66,22 +56,20 @@ class FeedGroupDialog : DialogFragment() {
object DeleteScreen : ScreenState()
}
@State
@JvmField
var selectedIcon: FeedGroupIcon? = null
@State
@JvmField
var selectedSubscriptions: HashSet<Long> = HashSet()
@State
@JvmField
var currentScreen: ScreenState = InitialScreen
@State @JvmField var selectedIcon: FeedGroupIcon? = null
@State @JvmField var selectedSubscriptions: HashSet<Long> = HashSet()
@State @JvmField var wasSubscriptionSelectionChanged: Boolean = false
@State @JvmField var currentScreen: ScreenState = InitialScreen
@State
@JvmField
var subscriptionsListState: Parcelable? = null
@State
@JvmField
var iconsListState: Parcelable? = null
@State @JvmField var subscriptionsListState: Parcelable? = null
@State @JvmField var iconsListState: Parcelable? = null
@State @JvmField var wasSearchSubscriptionsVisible = false
@State @JvmField var subscriptionsCurrentSearchQuery = ""
@State @JvmField var subscriptionsShowOnlyUngrouped = false
private val subscriptionMainSection = Section()
private val subscriptionEmptyFooter = Section()
private lateinit var subscriptionGroupAdapter: GroupAdapter<GroupieViewHolder>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -91,22 +79,30 @@ class FeedGroupDialog : DialogFragment() {
groupId = arguments?.getLong(KEY_GROUP_ID, NO_GROUP_SELECTED) ?: NO_GROUP_SELECTED
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.dialog_feed_group_create, container)
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return object : Dialog(requireActivity(), theme) {
override fun onBackPressed() {
if (currentScreen !is InitialScreen) {
showScreen(InitialScreen)
} else {
if (!this@FeedGroupDialog.onBackPressed()) {
super.onBackPressed()
}
}
}
}
override fun onPause() {
super.onPause()
wasSearchSubscriptionsVisible = isSearchVisible()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
@ -119,11 +115,15 @@ class FeedGroupDialog : DialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this, FeedGroupDialogViewModel.Factory(requireContext(), groupId))
.get(FeedGroupDialogViewModel::class.java)
viewModel = ViewModelProvider(this,
FeedGroupDialogViewModel.Factory(requireContext(),
groupId, subscriptionsCurrentSearchQuery, subscriptionsShowOnlyUngrouped)
).get(FeedGroupDialogViewModel::class.java)
viewModel.groupLiveData.observe(viewLifecycleOwner, Observer(::handleGroup))
viewModel.subscriptionsLiveData.observe(viewLifecycleOwner, Observer { setupSubscriptionPicker(it.first, it.second) })
viewModel.subscriptionsLiveData.observe(viewLifecycleOwner, Observer {
setupSubscriptionPicker(it.first, it.second)
})
viewModel.dialogEventLiveData.observe(viewLifecycleOwner, Observer {
when (it) {
ProcessingEvent -> disableInput()
@ -131,15 +131,54 @@ class FeedGroupDialog : DialogFragment() {
}
})
subscriptionGroupAdapter = GroupAdapter<GroupieViewHolder>().apply {
add(subscriptionMainSection)
add(subscriptionEmptyFooter)
spanCount = 4
}
subscriptions_selector_list.apply {
// Disable animations, too distracting.
itemAnimator = null
adapter = subscriptionGroupAdapter
layoutManager = GridLayoutManager(requireContext(), subscriptionGroupAdapter.spanCount,
RecyclerView.VERTICAL, false).apply {
spanSizeLookup = subscriptionGroupAdapter.spanSizeLookup
}
}
setupIconPicker()
setupListeners()
showScreen(currentScreen)
if (currentScreen == SubscriptionsPickerScreen && wasSearchSubscriptionsVisible) {
showSearch()
} else if (currentScreen == InitialScreen && groupId == NO_GROUP_SELECTED) {
showKeyboard()
}
}
// /////////////////////////////////////////////////////////////////////////
override fun onDestroyView() {
super.onDestroyView()
subscriptions_selector_list?.adapter = null
icon_selector?.adapter = null
}
/*///////////////////////////////////////////////////////////////////////////
// Setup
// /////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// */
override fun onBackPressed(): Boolean {
if (currentScreen is SubscriptionsPickerScreen && isSearchVisible()) {
hideSearch()
return true
} else if (currentScreen !is InitialScreen) {
showScreen(InitialScreen)
return true
}
return false
}
private fun setupListeners() {
delete_button.setOnClickListener { showScreen(DeleteScreen) }
@ -163,13 +202,64 @@ class FeedGroupDialog : DialogFragment() {
}
})
confirm_button.setOnClickListener {
when (currentScreen) {
InitialScreen -> handlePositiveButtonInitialScreen()
DeleteScreen -> viewModel.deleteGroup()
else -> showScreen(InitialScreen)
confirm_button.setOnClickListener { handlePositiveButton() }
select_channel_button.setOnClickListener {
subscriptions_selector_list.scrollToPosition(0)
showScreen(SubscriptionsPickerScreen)
}
val headerMenu = subscriptions_header_toolbar.menu
requireActivity().menuInflater.inflate(R.menu.menu_feed_group_dialog, headerMenu)
headerMenu.findItem(R.id.action_search).setOnMenuItemClickListener {
showSearch()
true
}
headerMenu.findItem(R.id.feed_group_toggle_show_only_ungrouped_subscriptions).apply {
isChecked = subscriptionsShowOnlyUngrouped
setOnMenuItemClickListener {
subscriptionsShowOnlyUngrouped = !subscriptionsShowOnlyUngrouped
it.isChecked = subscriptionsShowOnlyUngrouped
viewModel.toggleShowOnlyUngrouped(subscriptionsShowOnlyUngrouped)
true
}
}
toolbar_search_clear.setOnClickListener {
if (TextUtils.isEmpty(toolbar_search_edit_text.text)) {
hideSearch()
return@setOnClickListener
}
resetSearch()
showKeyboardSearch()
}
toolbar_search_edit_text.setOnClickListener {
if (AndroidTvUtils.isTv(context)) {
showKeyboardSearch()
}
}
toolbar_search_edit_text.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
override fun afterTextChanged(s: Editable) = Unit
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
val newQuery: String = toolbar_search_edit_text.text.toString()
subscriptionsCurrentSearchQuery = newQuery
viewModel.filterSubscriptionsBy(newQuery)
}
})
subscriptionGroupAdapter?.setOnItemClickListener(subscriptionPickerItemListener)
}
private fun handlePositiveButton() = when {
currentScreen is InitialScreen -> handlePositiveButtonInitialScreen()
currentScreen is DeleteScreen -> viewModel.deleteGroup()
currentScreen is SubscriptionsPickerScreen && isSearchVisible() -> hideSearch()
else -> showScreen(InitialScreen)
}
private fun handlePositiveButtonInitialScreen() {
@ -202,80 +292,73 @@ class FeedGroupDialog : DialogFragment() {
groupIcon = feedGroupEntity?.icon
groupSortOrder = feedGroupEntity?.sortOrder ?: -1
icon_preview.setImageResource((if (selectedIcon == null) icon else selectedIcon!!).getDrawableRes(requireContext()))
val feedGroupIcon = if (selectedIcon == null) icon else selectedIcon!!
icon_preview.setImageResource(feedGroupIcon.getDrawableRes(requireContext()))
if (group_name_input.text.isNullOrBlank()) {
group_name_input.setText(name)
}
}
private fun setupSubscriptionPicker(subscriptions: List<SubscriptionEntity>, selectedSubscriptions: Set<Long>) {
this.selectedSubscriptions.addAll(selectedSubscriptions)
val useGridLayout = subscriptions.isNotEmpty()
private val subscriptionPickerItemListener = OnItemClickListener { item, view ->
if (item is PickerSubscriptionItem) {
val subscriptionId = item.subscriptionEntity.uid
wasSubscriptionSelectionChanged = true
val groupAdapter = GroupAdapter<GroupieViewHolder>()
groupAdapter.spanCount = if (useGridLayout) 4 else 1
val subscriptionsCount = this.selectedSubscriptions.size
val selectedCountText = resources.getQuantityString(R.plurals.feed_group_dialog_selection_count, subscriptionsCount, subscriptionsCount)
selected_subscription_count_view.text = selectedCountText
subscriptions_selector_header_info.text = selectedCountText
Section().apply {
addAll(subscriptions.map {
val isSelected = this@FeedGroupDialog.selectedSubscriptions.contains(it.uid)
PickerSubscriptionItem(it, isSelected)
})
setPlaceholder(EmptyPlaceholderItem())
groupAdapter.add(this)
}
subscriptions_selector_list.apply {
layoutManager = if (useGridLayout) {
GridLayoutManager(requireContext(), groupAdapter.spanCount, RecyclerView.VERTICAL, false)
val isSelected = if (this.selectedSubscriptions.contains(subscriptionId)) {
this.selectedSubscriptions.remove(subscriptionId)
false
} else {
LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
this.selectedSubscriptions.add(subscriptionId)
true
}
adapter = groupAdapter
item.updateSelected(view, isSelected)
updateSubscriptionSelectedCount()
}
}
if (subscriptionsListState != null) {
layoutManager?.onRestoreInstanceState(subscriptionsListState)
subscriptionsListState = null
}
private fun setupSubscriptionPicker(
subscriptions: List<PickerSubscriptionItem>,
selectedSubscriptions: Set<Long>
) {
if (!wasSubscriptionSelectionChanged) {
this.selectedSubscriptions.addAll(selectedSubscriptions)
}
groupAdapter.setOnItemClickListener { item, _ ->
when (item) {
is PickerSubscriptionItem -> {
val subscriptionId = item.subscriptionEntity.uid
updateSubscriptionSelectedCount()
val isSelected = if (this.selectedSubscriptions.contains(subscriptionId)) {
this.selectedSubscriptions.remove(subscriptionId)
false
} else {
this.selectedSubscriptions.add(subscriptionId)
true
}
item.isSelected = isSelected
item.notifyChanged(PickerSubscriptionItem.UPDATE_SELECTED)
val subscriptionsCount = this.selectedSubscriptions.size
val updateSelectedCountText = resources.getQuantityString(R.plurals.feed_group_dialog_selection_count, subscriptionsCount, subscriptionsCount)
selected_subscription_count_view.text = updateSelectedCountText
subscriptions_selector_header_info.text = updateSelectedCountText
}
}
if (subscriptions.isEmpty()) {
subscriptionEmptyFooter.clear()
subscriptionEmptyFooter.add(EmptyPlaceholderItem())
} else {
subscriptionEmptyFooter.clear()
}
select_channel_button.setOnClickListener {
subscriptions.forEach {
it.isSelected = this@FeedGroupDialog.selectedSubscriptions
.contains(it.subscriptionEntity.uid)
}
subscriptionMainSection.update(subscriptions, false)
if (subscriptionsListState != null) {
subscriptions_selector_list.layoutManager?.onRestoreInstanceState(subscriptionsListState)
subscriptionsListState = null
} else {
subscriptions_selector_list.scrollToPosition(0)
showScreen(SubscriptionsPickerScreen)
}
}
private fun updateSubscriptionSelectedCount() {
val selectedCount = this.selectedSubscriptions.size
val selectedCountText = resources.getQuantityString(
R.plurals.feed_group_dialog_selection_count,
selectedCount, selectedCount)
selected_subscription_count_view.text = selectedCountText
subscriptions_header_info.text = selectedCountText
}
private fun setupIconPicker() {
val groupAdapter = GroupAdapter<GroupieViewHolder>()
groupAdapter.addAll(FeedGroupIcon.values().map { PickerIconItem(requireContext(), it) })
@ -311,9 +394,9 @@ class FeedGroupDialog : DialogFragment() {
}
}
// /////////////////////////////////////////////////////////////////////////
/*///////////////////////////////////////////////////////////////////////////
// Screen Selector
// /////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// */
private fun showScreen(screen: ScreenState) {
currentScreen = screen
@ -337,7 +420,8 @@ class FeedGroupDialog : DialogFragment() {
else -> View.VISIBLE
}
if (currentScreen != InitialScreen) hideKeyboard()
hideKeyboard()
hideSearch()
}
private fun View.onlyVisibleIn(vararg screens: ScreenState) {
@ -347,13 +431,58 @@ class FeedGroupDialog : DialogFragment() {
}
}
// /////////////////////////////////////////////////////////////////////////
/*///////////////////////////////////////////////////////////////////////////
// Utils
// /////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// */
private fun isSearchVisible() = subscriptions_header_search_container?.visibility == View.VISIBLE
private fun resetSearch() {
toolbar_search_edit_text.setText("")
subscriptionsCurrentSearchQuery = ""
viewModel.clearSubscriptionsFilter()
}
private fun hideSearch() {
resetSearch()
subscriptions_header_search_container.visibility = View.GONE
subscriptions_header_info_container.visibility = View.VISIBLE
subscriptions_header_toolbar.menu.findItem(R.id.action_search).isVisible = true
hideKeyboardSearch()
}
private fun showSearch() {
subscriptions_header_search_container.visibility = View.VISIBLE
subscriptions_header_info_container.visibility = View.GONE
subscriptions_header_toolbar.menu.findItem(R.id.action_search).isVisible = false
showKeyboardSearch()
}
private val inputMethodManager by lazy {
requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}
private fun showKeyboardSearch() {
if (toolbar_search_edit_text.requestFocus()) {
inputMethodManager.showSoftInput(toolbar_search_edit_text, InputMethodManager.SHOW_IMPLICIT)
}
}
private fun hideKeyboardSearch() {
inputMethodManager.hideSoftInputFromWindow(toolbar_search_edit_text.windowToken,
InputMethodManager.RESULT_UNCHANGED_SHOWN)
toolbar_search_edit_text.clearFocus()
}
private fun showKeyboard() {
if (group_name_input.requestFocus()) {
inputMethodManager.showSoftInput(group_name_input, InputMethodManager.SHOW_IMPLICIT)
}
}
private fun hideKeyboard() {
val inputMethodManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(group_name_input.windowToken, InputMethodManager.RESULT_UNCHANGED_SHOWN)
inputMethodManager.hideSoftInputFromWindow(group_name_input.windowToken,
InputMethodManager.RESULT_UNCHANGED_SHOWN)
group_name_input.clearFocus()
}

View File

@ -9,42 +9,56 @@ import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.disposables.Disposable
import io.reactivex.functions.BiFunction
import io.reactivex.processors.BehaviorProcessor
import io.reactivex.schedulers.Schedulers
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.database.subscription.SubscriptionEntity
import org.schabi.newpipe.local.feed.FeedDatabaseManager
import org.schabi.newpipe.local.subscription.FeedGroupIcon
import org.schabi.newpipe.local.subscription.SubscriptionManager
import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem
class FeedGroupDialogViewModel(applicationContext: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModel() {
class Factory(val context: Context, val groupId: Long = FeedGroupEntity.GROUP_ALL_ID) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return FeedGroupDialogViewModel(context.applicationContext, groupId) as T
}
}
class FeedGroupDialogViewModel(
applicationContext: Context,
private val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,
initialQuery: String = "",
initialShowOnlyUngrouped: Boolean = false
) : ViewModel() {
private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(applicationContext)
private var subscriptionManager = SubscriptionManager(applicationContext)
private var filterSubscriptions = BehaviorProcessor.create<String>()
private var toggleShowOnlyUngrouped = BehaviorProcessor.create<Boolean>()
private var subscriptionsFlowable = Flowable
.combineLatest(
filterSubscriptions.startWith(initialQuery),
toggleShowOnlyUngrouped.startWith(initialShowOnlyUngrouped),
BiFunction { t1: String, t2: Boolean -> Filter(t1, t2) }
)
.distinctUntilChanged()
.switchMap { filter ->
subscriptionManager.getSubscriptions(groupId, filter.query, filter.showOnlyUngrouped)
}.map { list -> list.map { PickerSubscriptionItem(it) } }
private val mutableGroupLiveData = MutableLiveData<FeedGroupEntity>()
private val mutableSubscriptionsLiveData = MutableLiveData<Pair<List<SubscriptionEntity>, Set<Long>>>()
private val mutableSubscriptionsLiveData = MutableLiveData<Pair<List<PickerSubscriptionItem>, Set<Long>>>()
private val mutableDialogEventLiveData = MutableLiveData<DialogEvent>()
val groupLiveData: LiveData<FeedGroupEntity> = mutableGroupLiveData
val subscriptionsLiveData: LiveData<Pair<List<SubscriptionEntity>, Set<Long>>> = mutableSubscriptionsLiveData
val subscriptionsLiveData: LiveData<Pair<List<PickerSubscriptionItem>, Set<Long>>> = mutableSubscriptionsLiveData
val dialogEventLiveData: LiveData<DialogEvent> = mutableDialogEventLiveData
private var actionProcessingDisposable: Disposable? = null
private var feedGroupDisposable = feedDatabaseManager.getGroup(groupId)
.subscribeOn(Schedulers.io())
.subscribe(mutableGroupLiveData::postValue)
.subscribeOn(Schedulers.io())
.subscribe(mutableGroupLiveData::postValue)
private var subscriptionsDisposable = Flowable
.combineLatest(subscriptionManager.subscriptions(), feedDatabaseManager.subscriptionIdsForGroup(groupId),
BiFunction { t1: List<SubscriptionEntity>, t2: List<Long> -> t1 to t2.toSet() })
.subscribeOn(Schedulers.io())
.subscribe(mutableSubscriptionsLiveData::postValue)
.combineLatest(subscriptionsFlowable, feedDatabaseManager.subscriptionIdsForGroup(groupId),
BiFunction { t1: List<PickerSubscriptionItem>, t2: List<Long> -> t1 to t2.toSet() })
.subscribeOn(Schedulers.io())
.subscribe(mutableSubscriptionsLiveData::postValue)
override fun onCleared() {
super.onCleared()
@ -55,14 +69,14 @@ class FeedGroupDialogViewModel(applicationContext: Context, val groupId: Long =
fun createGroup(name: String, selectedIcon: FeedGroupIcon, selectedSubscriptions: Set<Long>) {
doAction(feedDatabaseManager.createGroup(name, selectedIcon)
.flatMapCompletable {
feedDatabaseManager.updateSubscriptionsForGroup(it, selectedSubscriptions.toList())
})
.flatMapCompletable {
feedDatabaseManager.updateSubscriptionsForGroup(it, selectedSubscriptions.toList())
})
}
fun updateGroup(name: String, selectedIcon: FeedGroupIcon, selectedSubscriptions: Set<Long>, sortOrder: Long) {
doAction(feedDatabaseManager.updateSubscriptionsForGroup(groupId, selectedSubscriptions.toList())
.andThen(feedDatabaseManager.updateGroup(FeedGroupEntity(groupId, name, selectedIcon, sortOrder))))
.andThen(feedDatabaseManager.updateGroup(FeedGroupEntity(groupId, name, selectedIcon, sortOrder))))
}
fun deleteGroup() {
@ -74,13 +88,40 @@ class FeedGroupDialogViewModel(applicationContext: Context, val groupId: Long =
mutableDialogEventLiveData.value = DialogEvent.ProcessingEvent
actionProcessingDisposable = completable
.subscribeOn(Schedulers.io())
.subscribe { mutableDialogEventLiveData.postValue(DialogEvent.SuccessEvent) }
.subscribeOn(Schedulers.io())
.subscribe { mutableDialogEventLiveData.postValue(DialogEvent.SuccessEvent) }
}
}
fun filterSubscriptionsBy(query: String) {
filterSubscriptions.onNext(query)
}
fun clearSubscriptionsFilter() {
filterSubscriptions.onNext("")
}
fun toggleShowOnlyUngrouped(showOnlyUngrouped: Boolean) {
toggleShowOnlyUngrouped.onNext(showOnlyUngrouped)
}
sealed class DialogEvent {
object ProcessingEvent : DialogEvent()
object SuccessEvent : DialogEvent()
}
data class Filter(val query: String, val showOnlyUngrouped: Boolean)
class Factory(
private val context: Context,
private val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,
private val initialQuery: String = "",
private val initialShowOnlyUngrouped: Boolean = false
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return FeedGroupDialogViewModel(context.applicationContext,
groupId, initialQuery, initialShowOnlyUngrouped) as T
}
}
}

View File

@ -7,4 +7,5 @@ import org.schabi.newpipe.R
class EmptyPlaceholderItem : Item() {
override fun getLayout(): Int = R.layout.list_empty_view
override fun bind(viewHolder: GroupieViewHolder, position: Int) {}
override fun getSpanSize(spanCount: Int, position: Int): Int = spanCount
}

View File

@ -1,39 +1,28 @@
package org.schabi.newpipe.local.subscription.item
import android.view.View
import com.nostra13.universalimageloader.core.DisplayImageOptions
import com.nostra13.universalimageloader.core.ImageLoader
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import com.xwray.groupie.kotlinandroidextensions.Item
import kotlinx.android.synthetic.main.picker_subscription_item.selected_highlight
import kotlinx.android.synthetic.main.picker_subscription_item.thumbnail_view
import kotlinx.android.synthetic.main.picker_subscription_item.title_view
import kotlinx.android.synthetic.main.picker_subscription_item.*
import kotlinx.android.synthetic.main.picker_subscription_item.view.*
import org.schabi.newpipe.R
import org.schabi.newpipe.database.subscription.SubscriptionEntity
import org.schabi.newpipe.util.AnimationUtils
import org.schabi.newpipe.util.AnimationUtils.animateView
import org.schabi.newpipe.util.ImageDisplayConstants
data class PickerSubscriptionItem(val subscriptionEntity: SubscriptionEntity, var isSelected: Boolean = false) : Item() {
companion object {
const val UPDATE_SELECTED = 123
val IMAGE_LOADING_OPTIONS: DisplayImageOptions = ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS
}
data class PickerSubscriptionItem(
val subscriptionEntity: SubscriptionEntity,
var isSelected: Boolean = false
) : Item() {
override fun getId(): Long = subscriptionEntity.uid
override fun getLayout(): Int = R.layout.picker_subscription_item
override fun bind(viewHolder: GroupieViewHolder, position: Int, payloads: MutableList<Any>) {
if (payloads.contains(UPDATE_SELECTED)) {
animateView(viewHolder.selected_highlight, AnimationUtils.Type.LIGHT_SCALE_AND_ALPHA, isSelected, 150)
return
}
super.bind(viewHolder, position, payloads)
}
override fun getSpanSize(spanCount: Int, position: Int): Int = 1
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
ImageLoader.getInstance().displayImage(subscriptionEntity.avatarUrl, viewHolder.thumbnail_view, IMAGE_LOADING_OPTIONS)
ImageLoader.getInstance().displayImage(subscriptionEntity.avatarUrl,
viewHolder.thumbnail_view, ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS)
viewHolder.title_view.text = subscriptionEntity.name
viewHolder.selected_highlight.visibility = if (isSelected) View.VISIBLE else View.GONE
@ -47,7 +36,9 @@ data class PickerSubscriptionItem(val subscriptionEntity: SubscriptionEntity, va
viewHolder.selected_highlight.alpha = 1F
}
override fun getId(): Long {
return subscriptionEntity.uid
fun updateSelected(containerView: View, isSelected: Boolean) {
this.isSelected = isSelected
animateView(containerView.selected_highlight,
AnimationUtils.Type.LIGHT_SCALE_AND_ALPHA, isSelected, 150)
}
}

View File

@ -64,7 +64,6 @@ import org.schabi.newpipe.player.helper.LoadController;
import org.schabi.newpipe.player.helper.MediaSessionManager;
import org.schabi.newpipe.player.helper.PlayerDataSource;
import org.schabi.newpipe.player.helper.PlayerHelper;
import org.schabi.newpipe.player.mediasource.FailedMediaSource;
import org.schabi.newpipe.player.playback.BasePlayerMediaSession;
import org.schabi.newpipe.player.playback.CustomTrackSelector;
import org.schabi.newpipe.player.playback.MediaSourceManager;
@ -77,7 +76,6 @@ import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.SerializedCache;
import java.io.IOException;
import java.net.UnknownHostException;
import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable;
@ -217,7 +215,7 @@ public abstract class BasePlayer implements
final TrackSelection.Factory trackSelectionFactory = PlayerHelper
.getQualitySelector(context);
this.trackSelector = new CustomTrackSelector(trackSelectionFactory);
this.trackSelector = new CustomTrackSelector(context, trackSelectionFactory);
this.loadControl = new LoadController();
this.renderFactory = new DefaultRenderersFactory(context);
@ -333,13 +331,12 @@ public abstract class BasePlayer implements
final SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(context);
final float speed = preferences
.getFloat(context.getString(R.string.playback_speed_key), getPlaybackSpeed());
final float pitch = preferences.getFloat(context.getString(R.string.playback_pitch_key),
getPlaybackPitch());
final boolean skipSilence = preferences
.getBoolean(context.getString(R.string.playback_skip_silence_key),
getPlaybackSkipSilence());
final float speed = preferences.getFloat(
context.getString(R.string.playback_speed_key), getPlaybackSpeed());
final float pitch = preferences.getFloat(
context.getString(R.string.playback_pitch_key), getPlaybackPitch());
final boolean skipSilence = preferences.getBoolean(
context.getString(R.string.playback_skip_silence_key), getPlaybackSkipSilence());
return new PlaybackParameters(speed, pitch, skipSilence);
}
@ -835,16 +832,8 @@ public abstract class BasePlayer implements
final Throwable cause = error.getCause();
if (error instanceof BehindLiveWindowException) {
reload();
} else if (cause instanceof UnknownHostException) {
playQueue.error(/*isNetworkProblem=*/true);
} else if (isCurrentWindowValid()) {
playQueue.error(/*isTransitioningToBadStream=*/true);
} else if (cause instanceof FailedMediaSource.MediaSourceResolutionException) {
playQueue.error(/*recoverableWithNoAvailableStream=*/false);
} else if (cause instanceof FailedMediaSource.StreamInfoLoadException) {
playQueue.error(/*recoverableIfLoadFailsWhenNetworkIsFine=*/false);
} else {
playQueue.error(/*noIdeaWhatHappenedAndLetUserChooseWhatToDo=*/true);
playQueue.error();
}
}
@ -1131,6 +1120,7 @@ public abstract class BasePlayer implements
Log.d(TAG, "onFastRewind() called");
}
seekBy(-getSeekDuration());
triggerProgressUpdate();
}
public void onFastForward() {
@ -1138,6 +1128,7 @@ public abstract class BasePlayer implements
Log.d(TAG, "onFastForward() called");
}
seekBy(getSeekDuration());
triggerProgressUpdate();
}
private int getSeekDuration() {
@ -1479,10 +1470,21 @@ public abstract class BasePlayer implements
return parameters == null ? PlaybackParameters.DEFAULT : parameters;
}
/**
* Sets the playback parameters of the player, and also saves them to shared preferences.
* Speed and pitch are rounded up to 2 decimal places before being used or saved.
* @param speed the playback speed, will be rounded to up to 2 decimal places
* @param pitch the playback pitch, will be rounded to up to 2 decimal places
* @param skipSilence skip silence during playback
*/
public void setPlaybackParameters(final float speed, final float pitch,
final boolean skipSilence) {
savePlaybackParametersToPreferences(speed, pitch, skipSilence);
simpleExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, pitch, skipSilence));
final float roundedSpeed = Math.round(speed * 100.0f) / 100.0f;
final float roundedPitch = Math.round(pitch * 100.0f) / 100.0f;
savePlaybackParametersToPreferences(roundedSpeed, roundedPitch, skipSilence);
simpleExoPlayer.setPlaybackParameters(
new PlaybackParameters(roundedSpeed, roundedPitch, skipSilence));
}
private void savePlaybackParametersToPreferences(final float speed, final float pitch,

View File

@ -166,9 +166,6 @@ public final class PopupVideoPlayer extends Service {
initPopup();
initPopupCloseOverlay();
}
if (!playerImpl.isPlaying()) {
playerImpl.getPlayer().setPlayWhenReady(true);
}
playerImpl.handleIntent(intent);

View File

@ -45,7 +45,6 @@ import org.schabi.newpipe.util.ThemeHelper;
import java.util.Collections;
import java.util.List;
import static org.schabi.newpipe.player.helper.PlayerHelper.formatPitch;
import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
@ -84,14 +83,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
private ImageButton repeatButton;
private ImageButton backwardButton;
private ImageButton fastRewindButton;
private ImageButton playPauseButton;
private ImageButton fastForwardButton;
private ImageButton forwardButton;
private ImageButton shuffleButton;
private ProgressBar progressBar;
private TextView playbackSpeedButton;
private TextView playbackPitchButton;
private Menu menu;
////////////////////////////////////////////////////////////////////////////
@ -166,6 +164,9 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
case R.id.action_append_playlist:
appendAllToPlaylist();
return true;
case R.id.action_playback_speed:
openPlaybackParameterDialog();
return true;
case R.id.action_mute:
player.onMuteUnmuteButtonClicked();
return true;
@ -310,20 +311,20 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
private void buildControls() {
repeatButton = rootView.findViewById(R.id.control_repeat);
backwardButton = rootView.findViewById(R.id.control_backward);
fastRewindButton = rootView.findViewById(R.id.control_fast_rewind);
playPauseButton = rootView.findViewById(R.id.control_play_pause);
fastForwardButton = rootView.findViewById(R.id.control_fast_forward);
forwardButton = rootView.findViewById(R.id.control_forward);
shuffleButton = rootView.findViewById(R.id.control_shuffle);
playbackSpeedButton = rootView.findViewById(R.id.control_playback_speed);
playbackPitchButton = rootView.findViewById(R.id.control_playback_pitch);
progressBar = rootView.findViewById(R.id.control_progress_bar);
repeatButton.setOnClickListener(this);
backwardButton.setOnClickListener(this);
fastRewindButton.setOnClickListener(this);
playPauseButton.setOnClickListener(this);
fastForwardButton.setOnClickListener(this);
forwardButton.setOnClickListener(this);
shuffleButton.setOnClickListener(this);
playbackSpeedButton.setOnClickListener(this);
playbackPitchButton.setOnClickListener(this);
}
private void buildItemPopupMenu(final PlayQueueItem item, final View view) {
@ -473,16 +474,16 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
player.onRepeatClicked();
} else if (view.getId() == backwardButton.getId()) {
player.onPlayPrevious();
} else if (view.getId() == fastRewindButton.getId()) {
player.onFastRewind();
} else if (view.getId() == playPauseButton.getId()) {
player.onPlayPause();
} else if (view.getId() == fastForwardButton.getId()) {
player.onFastForward();
} else if (view.getId() == forwardButton.getId()) {
player.onPlayNext();
} else if (view.getId() == shuffleButton.getId()) {
player.onShuffleClicked();
} else if (view.getId() == playbackSpeedButton.getId()) {
openPlaybackParameterDialog();
} else if (view.getId() == playbackPitchButton.getId()) {
openPlaybackParameterDialog();
} else if (view.getId() == metadata.getId()) {
scrollToSelected();
} else if (view.getId() == progressLiveSync.getId()) {
@ -690,8 +691,10 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
private void onPlaybackParameterChanged(final PlaybackParameters parameters) {
if (parameters != null) {
playbackSpeedButton.setText(formatSpeed(parameters.speed));
playbackPitchButton.setText(formatPitch(parameters.pitch));
if (menu != null && player != null) {
final MenuItem item = menu.findItem(R.id.action_playback_speed);
item.setTitle(formatSpeed(parameters.speed));
}
}
}

View File

@ -1,5 +1,6 @@
package org.schabi.newpipe.player.playback;
import android.content.Context;
import android.text.TextUtils;
import android.util.Pair;
@ -26,8 +27,9 @@ import com.google.android.exoplayer2.util.Assertions;
public class CustomTrackSelector extends DefaultTrackSelector {
private String preferredTextLanguage;
public CustomTrackSelector(final TrackSelection.Factory adaptiveTrackSelectionFactory) {
super(adaptiveTrackSelectionFactory);
public CustomTrackSelector(final Context context,
final TrackSelection.Factory adaptiveTrackSelectionFactory) {
super(context, adaptiveTrackSelectionFactory);
}
private static boolean formatHasLanguage(final Format format, final String language) {

View File

@ -5,6 +5,7 @@ import android.util.Log;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.ListInfo;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import java.util.ArrayList;
@ -21,7 +22,7 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
final int serviceId;
final String baseUrl;
String nextUrl;
Page nextPage;
private transient Disposable fetchReactor;
@ -29,16 +30,16 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
this(item.getServiceId(), item.getUrl(), null, Collections.emptyList(), 0);
}
AbstractInfoPlayQueue(final int serviceId, final String url, final String nextPageUrl,
AbstractInfoPlayQueue(final int serviceId, final String url, final Page nextPage,
final List<StreamInfoItem> streams, final int index) {
super(index, extractListItems(streams));
this.baseUrl = url;
this.nextUrl = nextPageUrl;
this.nextPage = nextPage;
this.serviceId = serviceId;
this.isInitial = streams.isEmpty();
this.isComplete = !isInitial && (nextPageUrl == null || nextPageUrl.isEmpty());
this.isComplete = !isInitial && !Page.isValid(nextPage);
}
protected abstract String getTag();
@ -66,7 +67,7 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
if (!result.hasNextPage()) {
isComplete = true;
}
nextUrl = result.getNextPageUrl();
nextPage = result.getNextPage();
append(extractListItems(result.getRelatedItems()));
@ -100,7 +101,7 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
if (!result.hasNextPage()) {
isComplete = true;
}
nextUrl = result.getNextPageUrl();
nextPage = result.getNextPage();
append(extractListItems(result.getItems()));

View File

@ -1,6 +1,7 @@
package org.schabi.newpipe.player.playqueue;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.channel.ChannelInfo;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
@ -17,15 +18,15 @@ public final class ChannelPlayQueue extends AbstractInfoPlayQueue<ChannelInfo, C
}
public ChannelPlayQueue(final ChannelInfo info) {
this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedItems(), 0);
this(info.getServiceId(), info.getUrl(), info.getNextPage(), info.getRelatedItems(), 0);
}
public ChannelPlayQueue(final int serviceId,
final String url,
final String nextPageUrl,
final Page nextPage,
final List<StreamInfoItem> streams,
final int index) {
super(serviceId, url, nextPageUrl, streams, index);
super(serviceId, url, nextPage, streams, index);
}
@Override
@ -41,7 +42,7 @@ public final class ChannelPlayQueue extends AbstractInfoPlayQueue<ChannelInfo, C
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getHeadListObserver());
} else {
ExtractorHelper.getMoreChannelItems(this.serviceId, this.baseUrl, this.nextUrl)
ExtractorHelper.getMoreChannelItems(this.serviceId, this.baseUrl, this.nextPage)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getNextPageObserver());

View File

@ -305,25 +305,16 @@ public abstract class PlayQueue implements Serializable {
}
/**
* Report an exception for the item at the current index in order and the course of action:
* if the error can be skipped or the current item should be removed.
* Report an exception for the item at the current index in order and skip to the next one
* <p>
* This is done as a separate event as the underlying manager may have
* different implementation regarding exceptions.
* </p>
*
* @param skippable whether the error could be skipped
*/
public synchronized void error(final boolean skippable) {
final int index = getIndex();
if (skippable) {
queueIndex.incrementAndGet();
} else {
removeInternal(index);
}
broadcast(new ErrorEvent(index, getIndex(), skippable));
public synchronized void error() {
final int oldIndex = getIndex();
queueIndex.incrementAndGet();
broadcast(new ErrorEvent(oldIndex, getIndex()));
}
private synchronized void removeInternal(final int removeIndex) {

View File

@ -115,9 +115,6 @@ public class PlayQueueAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
break;
case ERROR:
final ErrorEvent errorEvent = (ErrorEvent) message;
if (!errorEvent.isSkippable()) {
notifyItemRemoved(errorEvent.getErrorIndex());
}
notifyItemChanged(errorEvent.getErrorIndex());
notifyItemChanged(errorEvent.getQueueIndex());
break;

View File

@ -1,5 +1,6 @@
package org.schabi.newpipe.player.playqueue;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
@ -16,15 +17,15 @@ public final class PlaylistPlayQueue extends AbstractInfoPlayQueue<PlaylistInfo,
}
public PlaylistPlayQueue(final PlaylistInfo info) {
this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedItems(), 0);
this(info.getServiceId(), info.getUrl(), info.getNextPage(), info.getRelatedItems(), 0);
}
public PlaylistPlayQueue(final int serviceId,
final String url,
final String nextPageUrl,
final Page nextPage,
final List<StreamInfoItem> streams,
final int index) {
super(serviceId, url, nextPageUrl, streams, index);
super(serviceId, url, nextPage, streams, index);
}
@Override
@ -40,7 +41,7 @@ public final class PlaylistPlayQueue extends AbstractInfoPlayQueue<PlaylistInfo,
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getHeadListObserver());
} else {
ExtractorHelper.getMorePlaylistItems(this.serviceId, this.baseUrl, this.nextUrl)
ExtractorHelper.getMorePlaylistItems(this.serviceId, this.baseUrl, this.nextPage)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getNextPageObserver());

View File

@ -3,12 +3,10 @@ package org.schabi.newpipe.player.playqueue.events;
public class ErrorEvent implements PlayQueueEvent {
private final int errorIndex;
private final int queueIndex;
private final boolean skippable;
public ErrorEvent(final int errorIndex, final int queueIndex, final boolean skippable) {
public ErrorEvent(final int errorIndex, final int queueIndex) {
this.errorIndex = errorIndex;
this.queueIndex = queueIndex;
this.skippable = skippable;
}
@Override
@ -23,8 +21,4 @@ public class ErrorEvent implements PlayQueueEvent {
public int getQueueIndex() {
return queueIndex;
}
public boolean isSkippable() {
return skippable;
}
}

View File

@ -11,7 +11,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
@ -20,6 +19,7 @@ import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
@ -37,6 +37,8 @@ import org.schabi.newpipe.ActivityCommunicator;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.ShareUtils;
import org.schabi.newpipe.util.ThemeHelper;
import java.io.PrintWriter;
@ -45,7 +47,6 @@ import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Vector;
@ -81,6 +82,10 @@ public class ErrorActivity extends AppCompatActivity {
public static final String ERROR_EMAIL_ADDRESS = "crashreport@newpipe.schabi.org";
public static final String ERROR_EMAIL_SUBJECT
= "Exception in NewPipe " + BuildConfig.VERSION_NAME;
public static final String ERROR_GITHUB_ISSUE_URL
= "https://github.com/TeamNewPipe/NewPipe/issues";
private String[] errorList;
private ErrorInfo errorInfo;
private Class returnActivity;
@ -193,7 +198,10 @@ public class ErrorActivity extends AppCompatActivity {
actionBar.setDisplayShowTitleEnabled(true);
}
Button reportButton = findViewById(R.id.errorReportButton);
final Button reportEmailButton = findViewById(R.id.errorReportEmailButton);
final Button copyButton = findViewById(R.id.errorReportCopyButton);
final Button reportGithubButton = findViewById(R.id.errorReportGitHubButton);
userCommentBox = findViewById(R.id.errorCommentBox);
TextView errorView = findViewById(R.id.errorView);
TextView infoView = findViewById(R.id.errorInfosView);
@ -205,40 +213,23 @@ public class ErrorActivity extends AppCompatActivity {
errorList = intent.getStringArrayExtra(ERROR_LIST);
// important add guru meditation
addGuruMeditaion();
addGuruMeditation();
currentTimeStamp = getCurrentTimeStamp();
reportButton.setOnClickListener((View v) -> {
Context context = this;
new AlertDialog.Builder(context)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.privacy_policy_title)
.setMessage(R.string.start_accept_privacy_policy)
.setCancelable(false)
.setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> {
Intent webIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse(context.getString(R.string.privacy_policy_url))
);
context.startActivity(webIntent);
})
.setPositiveButton(R.string.accept, (dialog, which) -> {
final Intent i = new Intent(Intent.ACTION_SENDTO)
.setData(Uri.parse("mailto:")) // only email apps should handle this
.putExtra(Intent.EXTRA_EMAIL, new String[]{ERROR_EMAIL_ADDRESS})
.putExtra(Intent.EXTRA_SUBJECT, ERROR_EMAIL_SUBJECT)
.putExtra(Intent.EXTRA_TEXT, buildJson());
if (i.resolveActivity(getPackageManager()) != null) {
startActivity(i);
}
})
.setNegativeButton(R.string.decline, (dialog, which) -> {
// do nothing
})
.show();
reportEmailButton.setOnClickListener((View v) -> {
openPrivacyPolicyDialog(this, "EMAIL");
});
copyButton.setOnClickListener((View v) -> {
ShareUtils.copyToClipboard(this, buildMarkdown());
Toast.makeText(this, R.string.msg_copied, Toast.LENGTH_SHORT).show();
});
reportGithubButton.setOnClickListener((View v) -> {
openPrivacyPolicyDialog(this, "GITHUB");
});
// normal bugreport
buildInfo(errorInfo);
if (errorInfo.message != 0) {
@ -250,7 +241,7 @@ public class ErrorActivity extends AppCompatActivity {
errorView.setText(formErrorText(errorList));
//print stack trace once again for debugging:
// print stack trace once again for debugging:
for (String e : errorList) {
Log.e(TAG, e);
}
@ -281,6 +272,37 @@ public class ErrorActivity extends AppCompatActivity {
return false;
}
private void openPrivacyPolicyDialog(final Context context, final String action) {
new AlertDialog.Builder(context)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.privacy_policy_title)
.setMessage(R.string.start_accept_privacy_policy)
.setCancelable(false)
.setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> {
ShareUtils.openUrlInBrowser(context,
context.getString(R.string.privacy_policy_url));
})
.setPositiveButton(R.string.accept, (dialog, which) -> {
if (action.equals("EMAIL")) { // send on email
final Intent i = new Intent(Intent.ACTION_SENDTO)
.setData(Uri.parse("mailto:")) // only email apps should handle this
.putExtra(Intent.EXTRA_EMAIL, new String[]{ERROR_EMAIL_ADDRESS})
.putExtra(Intent.EXTRA_SUBJECT, ERROR_EMAIL_SUBJECT)
.putExtra(Intent.EXTRA_TEXT, buildJson());
if (i.resolveActivity(getPackageManager()) != null) {
startActivity(i);
}
} else if (action.equals("GITHUB")) { // open the NewPipe issue page on GitHub
ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL);
}
})
.setNegativeButton(R.string.decline, (dialog, which) -> {
// do nothing
})
.show();
}
private String formErrorText(final String[] el) {
StringBuilder text = new StringBuilder();
if (el != null) {
@ -331,7 +353,9 @@ public class ErrorActivity extends AppCompatActivity {
text += getUserActionString(info.userAction) + "\n"
+ info.request + "\n"
+ getContentLangString() + "\n"
+ getContentLanguageString() + "\n"
+ getContentCountryString() + "\n"
+ getAppLanguage() + "\n"
+ info.serviceName + "\n"
+ currentTimeStamp + "\n"
+ getPackageName() + "\n"
@ -347,7 +371,9 @@ public class ErrorActivity extends AppCompatActivity {
.object()
.value("user_action", getUserActionString(errorInfo.userAction))
.value("request", errorInfo.request)
.value("content_language", getContentLangString())
.value("content_language", getContentLanguageString())
.value("content_country", getContentCountryString())
.value("app_language", getAppLanguage())
.value("service", errorInfo.serviceName)
.value("package", getPackageName())
.value("version", BuildConfig.VERSION_NAME)
@ -365,6 +391,63 @@ public class ErrorActivity extends AppCompatActivity {
return "";
}
private String buildMarkdown() {
try {
final StringBuilder htmlErrorReport = new StringBuilder();
final String userComment = userCommentBox.getText().toString();
if (!userComment.isEmpty()) {
htmlErrorReport.append(userComment).append("\n");
}
// basic error info
htmlErrorReport
.append("## Exception")
.append("\n* __User Action:__ ")
.append(getUserActionString(errorInfo.userAction))
.append("\n* __Request:__ ").append(errorInfo.request)
.append("\n* __Content Country:__ ").append(getContentCountryString())
.append("\n* __Content Language:__ ").append(getContentLanguageString())
.append("\n* __App Language:__ ").append(getAppLanguage())
.append("\n* __Service:__ ").append(errorInfo.serviceName)
.append("\n* __Version:__ ").append(BuildConfig.VERSION_NAME)
.append("\n* __OS:__ ").append(getOsString()).append("\n");
// Collapse all logs to a single paragraph when there are more than one
// to keep the GitHub issue clean.
if (errorList.length > 1) {
htmlErrorReport
.append("<details><summary><b>Exceptions (")
.append(errorList.length)
.append(")</b></summary><p>\n");
}
// add the logs
for (int i = 0; i < errorList.length; i++) {
htmlErrorReport.append("<details><summary><b>Crash log ");
if (errorList.length > 1) {
htmlErrorReport.append(i + 1);
}
htmlErrorReport.append("</b>")
.append("</summary><p>\n")
.append("\n```\n").append(errorList[i]).append("\n```\n")
.append("</details>\n");
}
// make sure to close everything
if (errorList.length > 1) {
htmlErrorReport.append("</p></details>\n");
}
htmlErrorReport.append("<hr>\n");
return htmlErrorReport.toString();
} catch (Throwable e) {
Log.e(TAG, "Error while erroring: Could not build markdown");
e.printStackTrace();
return "";
}
}
private String getUserActionString(final UserAction userAction) {
if (userAction == null) {
return "Your description is in another castle.";
@ -373,24 +456,27 @@ public class ErrorActivity extends AppCompatActivity {
}
}
private String getContentLangString() {
String contentLanguage = PreferenceManager.getDefaultSharedPreferences(this)
.getString(this.getString(R.string.content_country_key), "none");
if (contentLanguage.equals(getString(R.string.default_localization_key))) {
contentLanguage = Locale.getDefault().toString();
}
return contentLanguage;
private String getContentCountryString() {
return Localization.getPreferredContentCountry(this).getCountryCode();
}
private String getContentLanguageString() {
return Localization.getPreferredLocalization(this).getLocalizationCode();
}
private String getAppLanguage() {
return Localization.getAppLocale(getApplicationContext()).toString();
}
private String getOsString() {
String osBase = Build.VERSION.SDK_INT >= 23 ? Build.VERSION.BASE_OS : "Android";
final String osBase = Build.VERSION.SDK_INT >= 23 ? Build.VERSION.BASE_OS : "Android";
return System.getProperty("os.name")
+ " " + (osBase.isEmpty() ? "Android" : osBase)
+ " " + Build.VERSION.RELEASE
+ " - " + Build.VERSION.SDK_INT;
}
private void addGuruMeditaion() {
private void addGuruMeditation() {
//just an easter egg
TextView sorryView = findViewById(R.id.errorSorryView);
String text = sorryView.getText().toString();

View File

@ -64,7 +64,7 @@ public class SelectChannelFragment extends DialogFragment {
private final ImageLoader imageLoader = ImageLoader.getInstance();
private OnSelectedLisener onSelectedLisener = null;
private OnSelectedListener onSelectedListener = null;
private OnCancelListener onCancelListener = null;
private ProgressBar progressBar;
@ -73,8 +73,8 @@ public class SelectChannelFragment extends DialogFragment {
private List<SubscriptionEntity> subscriptions = new Vector<>();
public void setOnSelectedLisener(final OnSelectedLisener listener) {
onSelectedLisener = listener;
public void setOnSelectedListener(final OnSelectedListener listener) {
onSelectedListener = listener;
}
public void setOnCancelListener(final OnCancelListener listener) {
@ -129,9 +129,9 @@ public class SelectChannelFragment extends DialogFragment {
}
private void clickedItem(final int position) {
if (onSelectedLisener != null) {
if (onSelectedListener != null) {
SubscriptionEntity entry = subscriptions.get(position);
onSelectedLisener
onSelectedListener
.onChannelSelected(entry.getServiceId(), entry.getUrl(), entry.getName());
}
dismiss();
@ -186,7 +186,7 @@ public class SelectChannelFragment extends DialogFragment {
// Interfaces
//////////////////////////////////////////////////////////////////////////*/
public interface OnSelectedLisener {
public interface OnSelectedListener {
void onChannelSelected(int serviceId, String url, String name);
}

View File

@ -52,11 +52,11 @@ public class SelectKioskFragment extends DialogFragment {
private RecyclerView recyclerView = null;
private SelectKioskAdapter selectKioskAdapter = null;
private OnSelectedLisener onSelectedLisener = null;
private OnSelectedListener onSelectedListener = null;
private OnCancelListener onCancelListener = null;
public void setOnSelectedLisener(final OnSelectedLisener listener) {
onSelectedLisener = listener;
public void setOnSelectedListener(final OnSelectedListener listener) {
onSelectedListener = listener;
}
public void setOnCancelListener(final OnCancelListener listener) {
@ -102,8 +102,8 @@ public class SelectKioskFragment extends DialogFragment {
}
private void clickedItem(final SelectKioskAdapter.Entry entry) {
if (onSelectedLisener != null) {
onSelectedLisener.onKioskSelected(entry.serviceId, entry.kioskId, entry.kioskName);
if (onSelectedListener != null) {
onSelectedListener.onKioskSelected(entry.serviceId, entry.kioskId, entry.kioskName);
}
dismiss();
}
@ -122,7 +122,7 @@ public class SelectKioskFragment extends DialogFragment {
// Interfaces
//////////////////////////////////////////////////////////////////////////*/
public interface OnSelectedLisener {
public interface OnSelectedListener {
void onKioskSelected(int serviceId, String kioskId, String kioskName);
}

View File

@ -0,0 +1,225 @@
package org.schabi.newpipe.settings;
import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.schabi.newpipe.NewPipeDatabase;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.AppDatabase;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.playlist.PlaylistLocalItem;
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
import org.schabi.newpipe.local.playlist.RemotePlaylistManager;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.report.UserAction;
import java.util.List;
import java.util.Vector;
import io.reactivex.Flowable;
import io.reactivex.disposables.Disposable;
public class SelectPlaylistFragment extends DialogFragment {
/**
* This contains the base display options for images.
*/
private static final DisplayImageOptions DISPLAY_IMAGE_OPTIONS
= new DisplayImageOptions.Builder().cacheInMemory(true).build();
private final ImageLoader imageLoader = ImageLoader.getInstance();
private OnSelectedListener onSelectedListener = null;
private OnCancelListener onCancelListener = null;
private ProgressBar progressBar;
private TextView emptyView;
private RecyclerView recyclerView;
private Disposable playlistsSubscriber;
private List<PlaylistLocalItem> playlists = new Vector<>();
public void setOnSelectedListener(final OnSelectedListener listener) {
onSelectedListener = listener;
}
public void setOnCancelListener(final OnCancelListener listener) {
onCancelListener = listener;
}
/*//////////////////////////////////////////////////////////////////////////
// Fragment's Lifecycle
//////////////////////////////////////////////////////////////////////////*/
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
final View v =
inflater.inflate(R.layout.select_playlist_fragment, container, false);
recyclerView = v.findViewById(R.id.items_list);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
SelectPlaylistAdapter playlistAdapter = new SelectPlaylistAdapter();
recyclerView.setAdapter(playlistAdapter);
progressBar = v.findViewById(R.id.progressBar);
emptyView = v.findViewById(R.id.empty_state_view);
progressBar.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
emptyView.setVisibility(View.GONE);
final AppDatabase database = NewPipeDatabase.getInstance(requireContext());
final LocalPlaylistManager localPlaylistManager = new LocalPlaylistManager(database);
final RemotePlaylistManager remotePlaylistManager = new RemotePlaylistManager(database);
playlistsSubscriber = Flowable.combineLatest(localPlaylistManager.getPlaylists(),
remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge)
.subscribe(this::displayPlaylists, this::onError);
return v;
}
@Override
public void onDestroy() {
super.onDestroy();
if (playlistsSubscriber != null) {
playlistsSubscriber.dispose();
playlistsSubscriber = null;
}
}
/*//////////////////////////////////////////////////////////////////////////
// Handle actions
//////////////////////////////////////////////////////////////////////////*/
@Override
public void onCancel(final DialogInterface dialogInterface) {
super.onCancel(dialogInterface);
if (onCancelListener != null) {
onCancelListener.onCancel();
}
}
private void clickedItem(final int position) {
if (onSelectedListener != null) {
final LocalItem selectedItem = playlists.get(position);
if (selectedItem instanceof PlaylistMetadataEntry) {
final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem);
onSelectedListener
.onLocalPlaylistSelected(entry.uid, entry.name);
} else if (selectedItem instanceof PlaylistRemoteEntity) {
final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem);
onSelectedListener.onRemotePlaylistSelected(
entry.getServiceId(), entry.getUrl(), entry.getName());
}
}
dismiss();
}
/*//////////////////////////////////////////////////////////////////////////
// Item handling
//////////////////////////////////////////////////////////////////////////*/
private void displayPlaylists(final List<PlaylistLocalItem> newPlaylists) {
this.playlists = newPlaylists;
progressBar.setVisibility(View.GONE);
if (newPlaylists.isEmpty()) {
emptyView.setVisibility(View.VISIBLE);
return;
}
recyclerView.setVisibility(View.VISIBLE);
}
/*//////////////////////////////////////////////////////////////////////////
// Error
//////////////////////////////////////////////////////////////////////////*/
protected void onError(final Throwable e) {
final Activity activity = getActivity();
ErrorActivity.reportError(activity, e, activity.getClass(), null, ErrorActivity.ErrorInfo
.make(UserAction.UI_ERROR, "none", "", R.string.app_ui_crash));
}
/*//////////////////////////////////////////////////////////////////////////
// Interfaces
//////////////////////////////////////////////////////////////////////////*/
public interface OnSelectedListener {
void onLocalPlaylistSelected(long id, String name);
void onRemotePlaylistSelected(int serviceId, String url, String name);
}
public interface OnCancelListener {
void onCancel();
}
private class SelectPlaylistAdapter
extends RecyclerView.Adapter<SelectPlaylistAdapter.SelectPlaylistItemHolder> {
@Override
public SelectPlaylistItemHolder onCreateViewHolder(final ViewGroup parent,
final int viewType) {
final View item = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_playlist_mini_item, parent, false);
return new SelectPlaylistItemHolder(item);
}
@Override
public void onBindViewHolder(final SelectPlaylistItemHolder holder, final int position) {
final PlaylistLocalItem selectedItem = playlists.get(position);
if (selectedItem instanceof PlaylistMetadataEntry) {
final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem);
holder.titleView.setText(entry.name);
holder.view.setOnClickListener(view -> clickedItem(position));
imageLoader.displayImage(entry.thumbnailUrl, holder.thumbnailView,
DISPLAY_IMAGE_OPTIONS);
} else if (selectedItem instanceof PlaylistRemoteEntity) {
final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem);
holder.titleView.setText(entry.getName());
holder.view.setOnClickListener(view -> clickedItem(position));
imageLoader.displayImage(entry.getThumbnailUrl(), holder.thumbnailView,
DISPLAY_IMAGE_OPTIONS);
}
}
@Override
public int getItemCount() {
return playlists.size();
}
public class SelectPlaylistItemHolder extends RecyclerView.ViewHolder {
public final View view;
final ImageView thumbnailView;
final TextView titleView;
SelectPlaylistItemHolder(final View v) {
super(v);
this.view = v;
thumbnailView = v.findViewById(R.id.itemThumbnailView);
titleView = v.findViewById(R.id.itemTitleView);
}
}
}
}

View File

@ -34,6 +34,7 @@ import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.report.UserAction;
import org.schabi.newpipe.settings.SelectChannelFragment;
import org.schabi.newpipe.settings.SelectKioskFragment;
import org.schabi.newpipe.settings.SelectPlaylistFragment;
import org.schabi.newpipe.settings.tabs.AddTabDialog.ChooseTabListItem;
import org.schabi.newpipe.util.ThemeHelper;
@ -48,7 +49,7 @@ public class ChooseTabsFragment extends Fragment {
private TabsManager tabsManager;
private List<Tab> tabList = new ArrayList<>();
private final List<Tab> tabList = new ArrayList<>();
private ChooseTabsFragment.SelectedTabsAdapter selectedTabsAdapter;
/*//////////////////////////////////////////////////////////////////////////
@ -78,10 +79,10 @@ public class ChooseTabsFragment extends Fragment {
initButton(rootView);
RecyclerView listSelectedTabs = rootView.findViewById(R.id.selectedTabs);
final RecyclerView listSelectedTabs = rootView.findViewById(R.id.selectedTabs);
listSelectedTabs.setLayoutManager(new LinearLayoutManager(requireContext()));
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
itemTouchHelper.attachToRecyclerView(listSelectedTabs);
selectedTabsAdapter = new SelectedTabsAdapter(requireContext(), itemTouchHelper);
@ -138,7 +139,7 @@ public class ChooseTabsFragment extends Fragment {
private void updateTitle() {
if (getActivity() instanceof AppCompatActivity) {
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
final ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
actionBar.setTitle(R.string.main_page_content);
}
@ -201,16 +202,33 @@ public class ChooseTabsFragment extends Fragment {
switch (type) {
case KIOSK:
SelectKioskFragment selectKioskFragment = new SelectKioskFragment();
selectKioskFragment.setOnSelectedLisener((serviceId, kioskId, kioskName) ->
selectKioskFragment.setOnSelectedListener((serviceId, kioskId, kioskName) ->
addTab(new Tab.KioskTab(serviceId, kioskId)));
selectKioskFragment.show(requireFragmentManager(), "select_kiosk");
return;
case CHANNEL:
SelectChannelFragment selectChannelFragment = new SelectChannelFragment();
selectChannelFragment.setOnSelectedLisener((serviceId, url, name) ->
selectChannelFragment.setOnSelectedListener((serviceId, url, name) ->
addTab(new Tab.ChannelTab(serviceId, url, name)));
selectChannelFragment.show(requireFragmentManager(), "select_channel");
return;
case PLAYLIST:
SelectPlaylistFragment selectPlaylistFragment = new SelectPlaylistFragment();
selectPlaylistFragment.setOnSelectedListener(
new SelectPlaylistFragment.OnSelectedListener() {
@Override
public void onLocalPlaylistSelected(final long id, final String name) {
addTab(new Tab.PlaylistTab(id, name));
}
@Override
public void onRemotePlaylistSelected(
final int serviceId, final String url, final String name) {
addTab(new Tab.PlaylistTab(serviceId, url, name));
}
});
selectPlaylistFragment.show(requireFragmentManager(), "select_playlist");
return;
default:
addTab(type.getTab());
break;
@ -248,6 +266,11 @@ public class ChooseTabsFragment extends Fragment {
R.attr.ic_kiosk_hot)));
}
break;
case PLAYLIST:
returnList.add(new ChooseTabListItem(tab.getTabId(),
getString(R.string.playlist_page_summary),
tab.getTabIconRes(context)));
break;
default:
if (!tabList.contains(tab)) {
returnList.add(new ChooseTabListItem(context, tab));
@ -337,7 +360,7 @@ public class ChooseTabsFragment extends Fragment {
@Override
public ChooseTabsFragment.SelectedTabsAdapter.TabViewHolder onCreateViewHolder(
@NonNull final ViewGroup parent, final int viewType) {
View view = inflater.inflate(R.layout.list_choose_tabs, parent, false);
final View view = inflater.inflate(R.layout.list_choose_tabs, parent, false);
return new ChooseTabsFragment.SelectedTabsAdapter.TabViewHolder(view);
}
@ -393,6 +416,13 @@ public class ChooseTabsFragment extends Fragment {
tabName = NewPipe.getNameOfService(((Tab.ChannelTab) tab)
.getChannelServiceId()) + "/" + tab.getTabName(requireContext());
break;
case PLAYLIST:
final int serviceId = ((Tab.PlaylistTab) tab).getPlaylistServiceId();
final String serviceName = serviceId == -1
? getString(R.string.local)
: NewPipe.getNameOfService(serviceId);
tabName = serviceName + "/" + tab.getTabName(requireContext());
break;
default:
tabName = tab.getTabName(requireContext());
break;

View File

@ -11,6 +11,7 @@ import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonSink;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.LocalItem.LocalItemType;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@ -18,9 +19,11 @@ import org.schabi.newpipe.fragments.BlankFragment;
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
import org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment;
import org.schabi.newpipe.fragments.list.kiosk.KioskFragment;
import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;
import org.schabi.newpipe.local.bookmark.BookmarkFragment;
import org.schabi.newpipe.local.feed.FeedFragment;
import org.schabi.newpipe.local.history.StatisticsPlaylistFragment;
import org.schabi.newpipe.local.playlist.LocalPlaylistFragment;
import org.schabi.newpipe.local.subscription.SubscriptionFragment;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.report.UserAction;
@ -33,7 +36,8 @@ import java.util.Objects;
public abstract class Tab {
private static final String JSON_TAB_ID_KEY = "tab_id";
Tab() { }
Tab() {
}
Tab(@NonNull final JsonObject jsonObject) {
readDataFromJson(jsonObject);
@ -83,6 +87,8 @@ public abstract class Tab {
return new KioskTab(jsonObject);
case CHANNEL:
return new ChannelTab(jsonObject);
case PLAYLIST:
return new PlaylistTab(jsonObject);
}
}
@ -147,7 +153,8 @@ public abstract class Tab {
BOOKMARKS(new BookmarksTab()),
HISTORY(new HistoryTab()),
KIOSK(new KioskTab()),
CHANNEL(new ChannelTab());
CHANNEL(new ChannelTab()),
PLAYLIST(new PlaylistTab());
private Tab tab;
@ -482,4 +489,123 @@ public abstract class Tab {
return kioskId;
}
}
public static class PlaylistTab extends Tab {
public static final int ID = 8;
private static final String JSON_PLAYLIST_SERVICE_ID_KEY = "playlist_service_id";
private static final String JSON_PLAYLIST_URL_KEY = "playlist_url";
private static final String JSON_PLAYLIST_NAME_KEY = "playlist_name";
private static final String JSON_PLAYLIST_ID_KEY = "playlist_id";
private static final String JSON_PLAYLIST_TYPE_KEY = "playlist_type";
private int playlistServiceId;
private String playlistUrl;
private String playlistName;
private long playlistId;
private LocalItemType playlistType;
private PlaylistTab() {
this(-1, "<no-name>");
}
public PlaylistTab(final long playlistId, final String playlistName) {
this.playlistName = playlistName;
this.playlistId = playlistId;
this.playlistType = LocalItemType.PLAYLIST_LOCAL_ITEM;
this.playlistServiceId = -1;
this.playlistUrl = "<no-url>";
}
public PlaylistTab(final int playlistServiceId, final String playlistUrl,
final String playlistName) {
this.playlistServiceId = playlistServiceId;
this.playlistUrl = playlistUrl;
this.playlistName = playlistName;
this.playlistType = LocalItemType.PLAYLIST_REMOTE_ITEM;
this.playlistId = -1;
}
public PlaylistTab(final JsonObject jsonObject) {
super(jsonObject);
}
@Override
public int getTabId() {
return ID;
}
@Override
public String getTabName(final Context context) {
return playlistName;
}
@DrawableRes
@Override
public int getTabIconRes(final Context context) {
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_bookmark);
}
@Override
public Fragment getFragment(final Context context) {
if (playlistType == LocalItemType.PLAYLIST_LOCAL_ITEM) {
return LocalPlaylistFragment.getInstance(playlistId, playlistName);
} else { // playlistType == LocalItemType.PLAYLIST_REMOTE_ITEM
return PlaylistFragment.getInstance(playlistServiceId, playlistUrl, playlistName);
}
}
@Override
protected void writeDataToJson(final JsonSink writerSink) {
writerSink.value(JSON_PLAYLIST_SERVICE_ID_KEY, playlistServiceId)
.value(JSON_PLAYLIST_URL_KEY, playlistUrl)
.value(JSON_PLAYLIST_NAME_KEY, playlistName)
.value(JSON_PLAYLIST_ID_KEY, playlistId)
.value(JSON_PLAYLIST_TYPE_KEY, playlistType.toString());
}
@Override
protected void readDataFromJson(final JsonObject jsonObject) {
playlistServiceId = jsonObject.getInt(JSON_PLAYLIST_SERVICE_ID_KEY, -1);
playlistUrl = jsonObject.getString(JSON_PLAYLIST_URL_KEY, "<no-url>");
playlistName = jsonObject.getString(JSON_PLAYLIST_NAME_KEY, "<no-name>");
playlistId = jsonObject.getInt(JSON_PLAYLIST_ID_KEY, -1);
playlistType = LocalItemType.valueOf(
jsonObject.getString(JSON_PLAYLIST_TYPE_KEY,
LocalItemType.PLAYLIST_LOCAL_ITEM.toString())
);
}
@Override
public boolean equals(final Object obj) {
if (!(super.equals(obj)
&& Objects.equals(playlistType, ((PlaylistTab) obj).playlistType)
&& Objects.equals(playlistName, ((PlaylistTab) obj).playlistName))) {
return false; // base objects are different
}
return (playlistId == ((PlaylistTab) obj).playlistId) // local
|| (playlistServiceId == ((PlaylistTab) obj).playlistServiceId // remote
&& Objects.equals(playlistUrl, ((PlaylistTab) obj).playlistUrl));
}
public int getPlaylistServiceId() {
return playlistServiceId;
}
public String getPlaylistUrl() {
return playlistUrl;
}
public String getPlaylistName() {
return playlistName;
}
public long getPlaylistId() {
return playlistId;
}
public LocalItemType getPlaylistType() {
return playlistType;
}
}
}

View File

@ -43,7 +43,8 @@ public class DataReader {
return readBuffer[readOffset++] & 0xFF;
}
public long skipBytes(long amount) throws IOException {
public long skipBytes(final long byteAmount) throws IOException {
long amount = byteAmount;
if (readCount < 0) {
return 0;
} else if (readCount == 0) {
@ -90,7 +91,10 @@ public class DataReader {
return read(buffer, 0, buffer.length);
}
public int read(final byte[] buffer, int offset, int count) throws IOException {
public int read(final byte[] buffer, final int off, final int c) throws IOException {
int offset = off;
int count = c;
if (readCount < 0) {
return -1;
}

View File

@ -464,16 +464,16 @@ public class Mp4FromDashWriter {
}
private void initChunkTables(final TablesInfo tables, final int firstCount,
final int succesiveCount) {
final int successiveCount) {
// tables.stsz holds amount of samples of the track (total)
int totalSamples = (tables.stsz - firstCount);
float chunkAmount = totalSamples / (float) succesiveCount;
float chunkAmount = totalSamples / (float) successiveCount;
int remainChunkOffset = (int) Math.ceil(chunkAmount);
boolean remain = remainChunkOffset != (int) chunkAmount;
int index = 0;
tables.stsc = 1;
if (firstCount != succesiveCount) {
if (firstCount != successiveCount) {
tables.stsc++;
}
if (remain) {
@ -488,15 +488,15 @@ public class Mp4FromDashWriter {
tables.stscBEntries[index++] = firstCount;
tables.stscBEntries[index++] = 1;
if (firstCount != succesiveCount) {
if (firstCount != successiveCount) {
tables.stscBEntries[index++] = 2;
tables.stscBEntries[index++] = succesiveCount;
tables.stscBEntries[index++] = successiveCount;
tables.stscBEntries[index++] = 1;
}
if (remain) {
tables.stscBEntries[index++] = remainChunkOffset + 1;
tables.stscBEntries[index++] = totalSamples % succesiveCount;
tables.stscBEntries[index++] = totalSamples % successiveCount;
tables.stscBEntries[index] = 1;
}
}
@ -640,19 +640,20 @@ public class Mp4FromDashWriter {
return size;
}
private byte[] makeMdat(long refSize, final boolean is64) {
private byte[] makeMdat(final long refSize, final boolean is64) {
long size = refSize;
if (is64) {
refSize += 16;
size += 16;
} else {
refSize += 8;
size += 8;
}
ByteBuffer buffer = ByteBuffer.allocate(is64 ? 16 : 8)
.putInt(is64 ? 0x01 : (int) refSize)
.putInt(is64 ? 0x01 : (int) size)
.putInt(0x6D646174); // mdat
if (is64) {
buffer.putLong(refSize);
buffer.putLong(size);
}
return buffer.array();
@ -717,18 +718,6 @@ public class Mp4FromDashWriter {
makeTrak(i, durations[i], defaultMediaTime[i], tablesInfo[i], is64);
}
// udta/meta/ilst/©too
auxWrite(new byte[]{
0x00, 0x00, 0x00, 0x5C, 0x75, 0x64, 0x74, 0x61, 0x00, 0x00, 0x00, 0x54, 0x6D, 0x65,
0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x68, 0x64, 0x6C, 0x72,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x64, 0x69, 0x72, 0x61, 0x70,
0x70, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x27, 0x69, 0x6C, 0x73, 0x74, 0x00, 0x00, 0x00,
0x1F, (byte) 0xA9, 0x74, 0x6F, 0x6F, 0x00, 0x00, 0x00, 0x17, 0x64, 0x61, 0x74, 0x61,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x4E, 0x65, 0x77, 0x50, 0x69, 0x70, 0x65 // "NewPipe" binary string
});
return lengthFor(start);
}
@ -850,20 +839,10 @@ public class Mp4FromDashWriter {
private byte[] makeHdlr(final Hdlr hdlr) {
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{
0x00, 0x00, 0x00, 0x77, 0x68, 0x64, 0x6C, 0x72, // hdlr
0x00, 0x00, 0x00, 0x21, 0x68, 0x64, 0x6C, 0x72, // hdlr
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// binary string
// "ISO Media file created in NewPipe (
// A libre lightweight streaming frontend for Android)."
0x49, 0x53, 0x4F, 0x20, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x20, 0x66, 0x69, 0x6C, 0x65,
0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x4E, 0x65,
0x77, 0x50, 0x69, 0x70, 0x65, 0x20, 0x28, 0x41, 0x20, 0x6C, 0x69, 0x62, 0x72, 0x65,
0x20, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73,
0x74, 0x72, 0x65, 0x61, 0x6D, 0x69, 0x6E, 0x67,
0x20, 0x66, 0x72, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20,
0x41, 0x6E,
0x64, 0x72, 0x6F, 0x69, 0x64, 0x29, 0x2E
0x00// null string character
});
buffer.position(12);
@ -899,7 +878,7 @@ public class Mp4FromDashWriter {
* characteristics of sample groups. The descriptive information is any other
* information needed to define or characterize the sample group.
*
* ¿is replicabled this box?
* ¿is replicable this box?
* NO due lacks of documentation about this box but...
* most of m4a encoders and ffmpeg uses this box with dummy values (same values)
*/

View File

@ -274,30 +274,15 @@ public class OggFromWebMWriter implements Closeable {
if ("A_OPUS".equals(webmTrack.codecId)) {
return new byte[]{
0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string
0x07, 0x00, 0x00, 0x00, // writing application string size
0x4E, 0x65, 0x77, 0x50, 0x69, 0x70, 0x65, // "NewPipe" binary string
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
};
} else if ("A_VORBIS".equals(webmTrack.codecId)) {
return new byte[]{
0x03, // ????????
0x03, // ¿¿¿???
0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // "vorbis" binary string
0x07, 0x00, 0x00, 0x00, // writting application string size
0x4E, 0x65, 0x77, 0x50, 0x69, 0x70, 0x65, // "NewPipe" binary string
0x01, 0x00, 0x00, 0x00, // additional tags count (zero means no tags)
/*
// whole file duration (not implemented)
0x44,// tag string size
0x55, 0x52, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x3D, 0x30,
0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x2E, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30
*/
0x0F, // tag string size
0x00, 0x00, 0x00, 0x45, 0x4E, 0x43, 0x4F,
0x44, 0x45, 0x52, 0x3D, // "ENCODER=" binary string
0x4E, 0x65, 0x77, 0x50, 0x69, 0x70, 0x65, // "NewPipe" binary string
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // ????????
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
};
}
@ -377,7 +362,7 @@ public class OggFromWebMWriter implements Closeable {
return addPacketSegment(block.dataSize);
}
private boolean addPacketSegment(int size) {
private boolean addPacketSegment(final int size) {
if (size > 65025) {
throw new UnsupportedOperationException("page size cannot be larger than 65025");
}
@ -396,8 +381,8 @@ public class OggFromWebMWriter implements Closeable {
return false; // not enough space on the page
}
for (; size > 0; size -= 255) {
segmentTable[segmentTableSize++] = (byte) Math.min(size, 255);
for (int seg = size; seg > 0; seg -= 255) {
segmentTable[segmentTableSize++] = (byte) Math.min(seg, 255);
}
if (extra) {
@ -419,12 +404,13 @@ public class OggFromWebMWriter implements Closeable {
}
}
private int calcCrc32(int initialCrc, final byte[] buffer, final int size) {
private int calcCrc32(final int initialCrc, final byte[] buffer, final int size) {
int crc = initialCrc;
for (int i = 0; i < size; i++) {
int reg = (initialCrc >>> 24) & 0xff;
initialCrc = (initialCrc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)];
int reg = (crc >>> 24) & 0xff;
crc = (crc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)];
}
return initialCrc;
return crc;
}
}

View File

@ -148,31 +148,27 @@ public class WebMWriter implements Closeable {
0x11, 0x4d, (byte) 0x9b, 0x74, (byte) 0xbe,
0x4d, (byte) 0xbb, (byte) 0x8b,
0x53, (byte) 0xab, (byte) 0x84, 0x15, 0x49, (byte) 0xa9, 0x66, 0x53,
(byte) 0xac, (byte) 0x81, /*info offset*/ 0x43,
(byte) 0xac, (byte) 0x81,
/*info offset*/ 0x43,
0x4d, (byte) 0xbb, (byte) 0x8b, 0x53, (byte) 0xab,
(byte) 0x84, 0x16, 0x54, (byte) 0xae, 0x6b, 0x53, (byte) 0xac, (byte) 0x81,
/*tracks offset*/ 0x6a,
/*tracks offset*/ 0x56,
0x4d, (byte) 0xbb, (byte) 0x8e, 0x53, (byte) 0xab, (byte) 0x84, 0x1f,
0x43, (byte) 0xb6, 0x75, 0x53, (byte) 0xac, (byte) 0x84, /*cluster offset [2]*/ 0x00, 0x00, 0x00, 0x00,
0x43, (byte) 0xb6, 0x75, 0x53, (byte) 0xac, (byte) 0x84,
/*cluster offset [2]*/ 0x00, 0x00, 0x00, 0x00,
0x4d, (byte) 0xbb, (byte) 0x8e, 0x53, (byte) 0xab, (byte) 0x84, 0x1c, 0x53,
(byte) 0xbb, 0x6b, 0x53, (byte) 0xac, (byte) 0x84, /*cues offset [7]*/ 0x00, 0x00, 0x00, 0x00
(byte) 0xbb, 0x6b, 0x53, (byte) 0xac, (byte) 0x84,
/*cues offset [7]*/ 0x00, 0x00, 0x00, 0x00
});
/* info */
listBuffer.add(new byte[]{
0x15, 0x49, (byte) 0xa9, 0x66, (byte) 0xa2, 0x2a, (byte) 0xd7, (byte) 0xb1
0x15, 0x49, (byte) 0xa9, 0x66, (byte) 0x8e, 0x2a, (byte) 0xd7, (byte) 0xb1
});
listBuffer.add(encode(DEFAULT_TIMECODE_SCALE, true)); // this value MUST NOT exceed 4 bytes
// the segment duration MUST NOT exceed 4 bytes
listBuffer.add(encode(DEFAULT_TIMECODE_SCALE, true));
listBuffer.add(new byte[]{0x44, (byte) 0x89, (byte) 0x84,
0x00, 0x00, 0x00, 0x00, // info.duration
/* MuxingApp */
0x4d, (byte) 0x80, (byte) 0x87, 0x4E,
0x65, 0x77, 0x50, 0x69, 0x70, 0x65, // "NewPipe" binary string
/* WritingApp */
0x57, 0x41, (byte) 0x87, 0x4E,
0x65, 0x77, 0x50, 0x69, 0x70, 0x65// "NewPipe" binary string
});
/* tracks */
@ -416,9 +412,10 @@ public class WebMWriter implements Closeable {
}
}
private long makeCluster(final SharpStream stream, final long timecode, long offset,
private long makeCluster(final SharpStream stream, final long timecode, final long offsetStart,
final boolean create) throws IOException {
ClusterInfo cluster;
long offset = offsetStart;
if (offset > 0) {
// save the size of the previous cluster (maximum 256 MiB)
@ -449,7 +446,7 @@ public class WebMWriter implements Closeable {
}
private void makeEBML(final SharpStream stream) throws IOException {
// deafult values
// default values
dump(new byte[]{
0x1A, 0x45, (byte) 0xDF, (byte) 0xA3, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x42, (byte) 0x86, (byte) 0x81, 0x01,
@ -588,8 +585,10 @@ public class WebMWriter implements Closeable {
return lengthFor(buffer);
}
private void makeEbmlVoid(final SharpStream out, int size, final boolean wipe)
private void makeEbmlVoid(final SharpStream out, final int amount, final boolean wipe)
throws IOException {
int size = amount;
/* ebml void */
outByteBuffer.putShort(0, (short) 0xec20);
outByteBuffer.putShort(2, (short) (size - 4));

View File

@ -33,6 +33,7 @@ import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage;
import org.schabi.newpipe.extractor.ListInfo;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.channel.ChannelInfo;
import org.schabi.newpipe.extractor.comments.CommentsInfo;
@ -87,14 +88,13 @@ public final class ExtractorHelper {
final String searchString,
final List<String> contentFilter,
final String sortFilter,
final String pageUrl) {
final Page page) {
checkServiceId(serviceId);
return Single.fromCallable(() ->
SearchInfo.getMoreItems(NewPipe.getService(serviceId),
NewPipe.getService(serviceId)
.getSearchQHFactory()
.fromQuery(searchString, contentFilter, sortFilter),
pageUrl));
.fromQuery(searchString, contentFilter, sortFilter), page));
}
@ -125,10 +125,10 @@ public final class ExtractorHelper {
}
public static Single<InfoItemsPage> getMoreChannelItems(final int serviceId, final String url,
final String nextStreamsUrl) {
final Page nextPage) {
checkServiceId(serviceId);
return Single.fromCallable(() ->
ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl));
ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage));
}
public static Single<ListInfo<StreamInfoItem>> getFeedInfoFallbackToChannelInfo(
@ -157,10 +157,10 @@ public final class ExtractorHelper {
public static Single<InfoItemsPage> getMoreCommentItems(final int serviceId,
final CommentsInfo info,
final String nextPageUrl) {
final Page nextPage) {
checkServiceId(serviceId);
return Single.fromCallable(() ->
CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPageUrl));
CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPage));
}
public static Single<PlaylistInfo> getPlaylistInfo(final int serviceId, final String url,
@ -172,10 +172,10 @@ public final class ExtractorHelper {
}
public static Single<InfoItemsPage> getMorePlaylistItems(final int serviceId, final String url,
final String nextStreamsUrl) {
final Page nextPage) {
checkServiceId(serviceId);
return Single.fromCallable(() ->
PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl));
PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage));
}
public static Single<KioskInfo> getKioskInfo(final int serviceId, final String url,
@ -184,12 +184,10 @@ public final class ExtractorHelper {
Single.fromCallable(() -> KioskInfo.getInfo(NewPipe.getService(serviceId), url)));
}
public static Single<InfoItemsPage> getMoreKioskItems(final int serviceId,
final String url,
final String nextStreamsUrl) {
public static Single<InfoItemsPage> getMoreKioskItems(final int serviceId, final String url,
final Page nextPage) {
return Single.fromCallable(() ->
KioskInfo.getMoreItems(NewPipe.getService(serviceId),
url, nextStreamsUrl));
KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage));
}
/*//////////////////////////////////////////////////////////////////////////
@ -240,8 +238,8 @@ public final class ExtractorHelper {
* @param infoType the {@link InfoItem.InfoType} of the item
* @return a {@link Single} that loads the item
*/
public static <I extends Info> Maybe<I> loadFromCache(final int serviceId, final String url,
final InfoItem.InfoType infoType) {
private static <I extends Info> Maybe<I> loadFromCache(final int serviceId, final String url,
final InfoItem.InfoType infoType) {
checkServiceId(serviceId);
return Maybe.defer(() -> {
//noinspection unchecked

View File

@ -1,10 +1,13 @@
package org.schabi.newpipe.util;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.widget.Toast;
import org.schabi.newpipe.R;
@ -78,4 +81,27 @@ public final class ShareUtils {
context.startActivity(Intent.createChooser(
intent, context.getString(R.string.share_dialog_title)));
}
/**
* Copy the text to clipboard, and indicate to the user whether the operation was completed
* successfully using a Toast.
*
* @param context the context to use
* @param text the text to copy
*/
public static void copyToClipboard(final Context context, final String text) {
final ClipboardManager clipboardManager =
(ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboardManager == null) {
Toast.makeText(context,
R.string.permission_denied,
Toast.LENGTH_LONG).show();
return;
}
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text));
Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT)
.show();
}
}

View File

@ -111,7 +111,7 @@
tools:ignore="RtlHardcoded">
<ImageButton
android:id="@+id/control_backward"
android:id="@+id/control_fast_rewind"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
@ -121,7 +121,7 @@
android:focusable="true"
android:scaleType="fitCenter"
android:tint="?attr/colorAccent"
android:src="@drawable/exo_controls_previous"
android:src="@drawable/exo_controls_rewind"
android:background="?attr/selectableItemBackgroundBorderless"
tools:ignore="ContentDescription"/>
@ -161,7 +161,7 @@
android:visibility="invisible"/>
<ImageButton
android:id="@+id/control_forward"
android:id="@+id/control_fast_forward"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
@ -172,7 +172,7 @@
android:focusable="true"
android:scaleType="fitCenter"
android:tint="?attr/colorAccent"
android:src="@drawable/exo_controls_next"
android:src="@drawable/exo_controls_fastforward"
tools:ignore="ContentDescription"/>
</RelativeLayout>
@ -185,8 +185,8 @@
android:orientation="horizontal"
tools:ignore="RtlHardcoded">
<TextView
android:id="@+id/control_playback_speed"
<ImageButton
android:id="@+id/control_backward"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
@ -195,11 +195,13 @@
android:layout_toLeftOf="@+id/control_repeat"
android:gravity="center"
android:minWidth="50dp"
android:text="1x"
android:textColor="?attr/colorAccent"
android:textStyle="bold"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded"/>
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:scaleType="fitXY"
android:src="@drawable/exo_controls_previous"
android:tint="?attr/colorAccent"
tools:ignore="ContentDescription" />
<ImageButton
android:id="@+id/control_repeat"
@ -236,8 +238,8 @@
app:srcCompat="@drawable/ic_shuffle_white_24dp"
tools:ignore="ContentDescription"/>
<TextView
android:id="@+id/control_playback_pitch"
<ImageButton
android:id="@+id/control_forward"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
@ -246,11 +248,13 @@
android:layout_toRightOf="@+id/control_shuffle"
android:gravity="center"
android:minWidth="50dp"
android:text="100%"
android:textColor="?attr/colorAccent"
android:textStyle="bold"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded"/>
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:scaleType="fitXY"
android:src="@drawable/exo_controls_next"
android:tint="?attr/colorAccent"
tools:ignore="ContentDescription" />
</RelativeLayout>
</RelativeLayout>

View File

@ -118,11 +118,31 @@
android:inputType="" />
<Button
android:id="@+id/errorReportButton"
android:id="@+id/errorReportEmailButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/error_report_button_text" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"
android:textStyle="bold"
android:text="@string/error_report_open_github_notice" />
<Button
android:id="@+id/errorReportCopyButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/copy_for_github" />
<Button
android:id="@+id/errorReportGitHubButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/error_report_open_issue_button_text" />
</LinearLayout>
</ScrollView>

View File

@ -55,7 +55,6 @@
<TextView
android:id="@+id/song_name"
style="@android:style/TextAppearance.StatusBar.EventContent.Title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
@ -63,14 +62,13 @@
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="14sp"
android:textColor="?attr/colorAccent"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta."
/>
<TextView
android:id="@+id/artist_name"
style="@android:style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
@ -78,6 +76,7 @@
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="12sp"
tools:text="Duis posuere arcu condimentum lobortis mattis."/>
</LinearLayout>
@ -169,22 +168,6 @@
android:orientation="horizontal"
tools:ignore="RtlHardcoded">
<TextView
android:id="@+id/control_playback_speed"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/control_repeat"
android:gravity="center"
android:minWidth="50dp"
android:text="1x"
android:textColor="?attr/colorAccent"
android:textStyle="bold"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded"/>
<ImageButton
android:id="@+id/control_repeat"
android:layout_width="30dp"
@ -207,7 +190,7 @@
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toLeftOf="@+id/control_play_pause"
android:layout_toLeftOf="@+id/control_fast_rewind"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
@ -216,6 +199,20 @@
android:src="@drawable/exo_controls_previous"
tools:ignore="ContentDescription"/>
<ImageButton
android:id="@+id/control_fast_rewind"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toLeftOf="@id/control_play_pause"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:scaleType="fitCenter"
android:tint="?attr/colorAccent"
android:src="@drawable/exo_controls_rewind"/>
<ImageButton
android:id="@+id/control_play_pause"
android:layout_width="50dp"
@ -251,13 +248,28 @@
android:visibility="invisible"
tools:visibility="visible"/>
<ImageButton
android:id="@+id/control_fast_forward"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toRightOf="@id/control_play_pause"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:scaleType="fitCenter"
android:tint="?attr/colorAccent"
android:src="@drawable/exo_controls_fastforward"/>
<ImageButton
android:id="@+id/control_forward"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toRightOf="@+id/control_play_pause"
android:layout_toRightOf="@+id/control_fast_forward"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
@ -282,21 +294,6 @@
app:srcCompat="@drawable/ic_shuffle_white_24dp"
tools:ignore="ContentDescription"/>
<TextView
android:id="@+id/control_playback_pitch"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/control_shuffle"
android:gravity="center"
android:minWidth="50dp"
android:text="100%"
android:textColor="?attr/colorAccent"
android:textStyle="bold"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded"/>
</RelativeLayout>
</RelativeLayout>

View File

@ -102,42 +102,56 @@
android:id="@+id/subscriptions_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
android:orientation="vertical">
<LinearLayout
<androidx.appcompat.widget.Toolbar
android:id="@+id/subscriptions_header_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingTop="12dp"
android:paddingRight="16dp"
android:paddingBottom="12dp">
android:layout_height="?attr/actionBarSize"
android:gravity="center_vertical"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar"
app:titleTextAppearance="@style/Toolbar.Title">
<TextView
android:layout_width="0dp"
<LinearLayout
android:id="@+id/subscriptions_header_info_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start|center_vertical"
android:text="@string/tab_subscriptions"
android:textColor="?android:attr/textColorPrimary"
android:textSize="16sp"
android:textStyle="bold" />
android:orientation="vertical"
android:gravity="center_vertical">
<TextView
android:id="@+id/subscriptions_selector_header_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp"
tools:text="1 selected" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:text="@string/tab_subscriptions"
android:textColor="?android:attr/textColorPrimary"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/subscriptions_header_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp"
tools:text="1 selected" />
</LinearLayout>
<include
android:id="@+id/subscriptions_header_search_container"
layout="@layout/toolbar_search_layout"
android:visibility="gone"/>
</androidx.appcompat.widget.Toolbar>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/subscriptions_selector_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp"
android:clipToPadding="false"
tools:itemCount="200"
tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
tools:listitem="@layout/picker_subscription_item"
@ -203,4 +217,4 @@
android:layout_alignParentEnd="true"
android:text="@string/create" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>

View File

@ -6,13 +6,25 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/correct_suggestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignTop="@id/error_panel"
android:background="?attr/selectableItemBackground"
android:padding="10dp"
android:textColor="@color/background_title_color"
android:textSize="@dimen/search_suggestion_text_size"
tools:text="Showing results for lorem ipsum dolor sit amet consectetur adipisci elit" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/correct_suggestion"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"
tools:listitem="@layout/list_stream_item"/>
tools:listitem="@layout/list_stream_item" />
<ProgressBar
android:id="@+id/loading_progress_bar"
@ -58,6 +70,7 @@
android:background="?android:attr/windowBackground"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:visibility="gone"
tools:background="@android:color/transparent"
tools:visibility="visible">
@ -68,7 +81,7 @@
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"
tools:listitem="@layout/item_search_suggestion"/>
tools:listitem="@layout/item_search_suggestion" />
</LinearLayout>
<!--ERROR PANEL-->

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="13dp">
<TextView
android:id="@+id/titleTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="10dp"
android:text="@string/select_a_playlist"
android:textAppearance="?android:attr/textAppearanceLarge" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/list_playlist_mini_item">
</androidx.recyclerview.widget.RecyclerView>
<TextView
android:id="@+id/empty_state_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/no_playlist_bookmarked_yet"
android:textAppearance="?android:attr/textAppearanceListItem" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"/>
</LinearLayout>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?attr/colorPrimary">
tools:background="?attr/colorPrimary">
<EditText
android:id="@+id/toolbar_search_edit_text"
@ -14,7 +15,7 @@
android:layout_marginBottom="4dp"
android:layout_marginRight="48dp"
android:layout_marginTop="4dp"
android:background="?attr/colorPrimary"
android:background="@null"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@+id/suggestions_list"
@ -29,6 +30,7 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="right|center_vertical"
android:contentDescription="@string/clear"
android:focusable="true"
tools:ignore="RtlHardcoded">

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:icon="?attr/ic_search"
android:title="@string/search"
app:showAsAction="always"
tools:ignore="AlwaysShowAction" />
<item
android:id="@+id/feed_group_toggle_show_only_ungrouped_subscriptions"
android:checkable="true"
android:checked="false"
android:title="@string/feed_group_show_only_ungrouped_subscriptions"
app:showAsAction="never" />
</menu>

View File

@ -10,6 +10,14 @@
android:visible="true"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_playback_speed"
android:title="1x"
android:tooltipText="@string/playback_speed_control"
android:visible="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_mute"
android:icon="?attr/ic_volume_off"

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="use_external_video_player_title">استخدم مشغل فيديو خارجي</string>
<string name="screen_rotation">دوران</string>
<string name="choose_browser">اختر المتصفح</string>
<string name="share_dialog_title">مشاركة مع</string>
<string name="settings">اعدادات</string>
<string name="search">بحث</string>
<string name="controls_download_desc">تنزيل ملف البث</string>
<string name="download">تحميل</string>
<string name="share">مشاركه</string>
<string name="open_in_popup_mode">فتح في نافدة منبثقة</string>
<string name="open_in_browser">افتح في المتصفح</string>
<string name="cancel">إلغاء</string>
<string name="install">تثبيت</string>
<string name="no_player_found_toast">لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله).</string>
<string name="no_player_found">لم يتم العثور على مشغل بث. يرجى تثبيت VLC؟</string>
<string name="upload_date_text">تم النشر في %1$s</string>
<string name="view_count_text">%1$s من المشاهدات</string>
<string name="main_bg_subtitle">انقر على \"بحث\" للبدء</string>
</resources>

View File

@ -233,7 +233,7 @@
<string name="play_queue_stream_detail">التفاصيل</string>
<string name="play_queue_audio_settings">الإعدادات الصوتية</string>
<string name="start_here_on_main">تشغيل هنا</string>
<string name="start_here_on_popup">بدأ التشغيل في نافذة منبثقة جديدة</string>
<string name="start_here_on_popup">بدأ التشغيل في نافذة منبثقة</string>
<string name="title_activity_recaptcha">تحدي الكابتشا</string>
<string name="hold_to_append">ضغط مطول للإدراج الى قائمة الانتظار</string>
<plurals name="views">
@ -440,7 +440,7 @@
<string name="grid">الشبكة</string>
<string name="auto">تلقائي</string>
<string name="switch_view">تبديل طريقة العرض</string>
<string name="app_update_notification_content_title">يتوفر تحديث ل newpipe!</string>
<string name="app_update_notification_content_title">تحديث NewPipe متاح!</string>
<string name="app_update_notification_content_text">اضغط لتنزيل</string>
<string name="missions_header_finished">انتهى</string>
<string name="missions_header_pending">ريثما</string>
@ -549,7 +549,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">عند استخدام مشغل الخلفية، سيتم عرض صورة العرض للفيديو على شاشة القفل</string>
<string name="clear_download_history">تنظيف تاريخ التحميل</string>
<string name="delete_downloaded_files">حذف الملفات التي تم تنزيلها</string>
<string name="deleted_downloads">التنزيلات %1$s المحذوفة</string>
<string name="deleted_downloads">التنزيلات %1$d المحذوفة</string>
<string name="permission_display_over_apps">إعطاء إذن لعرضه على التطبيقات الأخرى</string>
<string name="app_language_title">لغة التطبيق</string>
<string name="systems_language">النظام الافتراضي</string>

View File

@ -58,7 +58,6 @@
<string name="short_billion">Mil mill.</string>
<string name="msg_popup_permission">Precísase esti permisu
\np\'abrir nel mou ventanu</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">Retu de reCAPTCHA</string>
<string name="recaptcha_request_toast">Solicitóse\'l retu de reCAPTCHA</string>
<string name="controls_background_title">En segundu planu</string>
@ -130,7 +129,7 @@
<string name="new_and_hot">Novedaes</string>
<string name="unknown_content">[Desconozse]</string>
<string name="start_here_on_background">Reproducir en segundu planu</string>
<string name="start_here_on_popup">Reproducir nun ventanu</string>
<string name="start_here_on_popup"></string>
<string name="donation_title">Donación</string>
<string name="donation_encouragement"/>
<string name="give_back">Donar</string>
@ -210,7 +209,7 @@
<string name="no_comments">Nun hai comentarios</string>
<string name="settings_category_clear_data_title">Llimpieza de datos</string>
<string name="show_comments_title">Amosar comentarios</string>
<string name="show_comments_summary"/>
<string name="show_comments_summary">Desactiva esta opción p\'anubrir los comentarios</string>
<string name="start_accept_privacy_policy">Pa cumplir cola GDPR (Regulación Xeneral de Proteición de Datos) europea, pidímoste que revises la política de privacidá de NewPipe. Lléila con procuru.
\nHas aceutala unviándonos un informe de fallos.
</string>
@ -304,4 +303,8 @@
<string name="metadata_cache_wipe_complete_notice">Llipióse la caché de metadatos</string>
<string name="metadata_cache_wipe_summary">Desanicia los datos de les páxines web na caché</string>
<string name="metadata_cache_wipe_title">Llimpiar los metadatos de la caché</string>
<string name="thumbnail_cache_wipe_complete_notice">Llimpióse la caché d\'imáxenes</string>
<string name="enable_lock_screen_video_thumbnail_summary">Amuésase una miniatura de videu na pantalla de bloquéu al usar el reproductor en segundu planu</string>
<string name="kore_not_found">¿Instalar l\'aplicación Kore\?</string>
<string name="autoplay_by_calling_app_summary">Reproduz un videu cuando s\'invoca a NewPipe dende otra aplicación</string>
</resources>

View File

@ -71,7 +71,7 @@
<string name="subscribers_count_not_available">无法得知订阅人数</string>
<string name="updates_setting_description">发布新版本时,通知我升级应用</string>
<string name="grid">网格</string>
<string name="app_update_notification_content_title">新版 NewPipe 发布</string>
<string name="app_update_notification_content_title">NewPipe有更新</string>
<string name="error_http_unsupported_range">服务器不接受 接收 multi-threaded 下载, 以 @string/msg_threads = 1 重试</string>
<string name="autoplay_title">自动播放</string>
<string name="settings_category_clear_data_title">清除数据</string>
@ -108,7 +108,6 @@
<string name="msg_running_detail">点击了解详情</string>
<string name="msg_wait">请稍候…</string>
<string name="msg_copied">复制至剪贴板</string>
<string name="recaptcha">reCAPTCHA验证码</string>
<string name="controls_popup_title">悬浮窗播放</string>
<string name="title_activity_about">关于NewPipe</string>
<string name="action_settings">设置</string>
@ -282,10 +281,10 @@
<string name="hold_to_append">长按队列</string>
<string name="unknown_content">[未知]</string>
<string name="enqueue_on_background">添加到后台部分队列</string>
<string name="enqueue_on_popup">添加至新悬浮窗列表</string>
<string name="enqueue_on_popup">加入悬浮窗队列</string>
<string name="start_here_on_main">开始在此处开始播放</string>
<string name="start_here_on_background">开始后台播放</string>
<string name="start_here_on_popup">开始在悬浮窗中播放</string>
<string name="start_here_on_popup">开始在悬浮窗中播放</string>
<string name="donation_title">捐赠</string>
<string name="donation_encouragement">NewPipe 是由志愿者花费时间为您带来最佳体验开发的。回馈帮助开发人员在享用一杯咖啡的同时,让 NewPipe 变得更好。</string>
<string name="give_back">反馈</string>
@ -525,7 +524,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">在后台播放时,锁屏上将会显示视频的缩略图</string>
<string name="clear_download_history">清除下载历史记录</string>
<string name="delete_downloaded_files">删除已下载的文件</string>
<string name="deleted_downloads">已删除 %1$s 下载</string>
<string name="deleted_downloads">已删除 %1$d 下载</string>
<string name="permission_display_over_apps">授予在其他应用上层显示的权限</string>
<string name="app_language_title">Newpipe应用语言</string>
<string name="systems_language">[系统默认]</string>
@ -535,7 +534,7 @@
<plurals name="seconds">
<item quantity="other">%d秒</item>
</plurals>
<string name="new_seek_duration_toast">由于ExoPlayer的限制搜寻间隔设置为d秒</string>
<string name="new_seek_duration_toast">由于ExoPlayer的限制搜寻间隔设置为%d秒</string>
<string name="mute">静音</string>
<string name="unmute">取消静音</string>
<string name="help">帮助</string>
@ -604,4 +603,5 @@
<string name="show_original_time_ago_summary">来自服务的原始文本将在流项目中可见</string>
<string name="show_original_time_ago_title">在项目上显示原始时间</string>
<string name="youtube_restricted_mode_enabled_title">YouTube受限模式</string>
<string name="feed_group_show_only_ungrouped_subscriptions">仅显示未分组订阅</string>
</resources>

View File

@ -185,8 +185,15 @@
<string name="download_thumbnail_title">থাম্বনেইল লোড করুন</string>
<string name="download_thumbnail_summary">থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে।</string>
<string name="thumbnail_cache_wipe_complete_notice">ছবির ক্যাশ মুছে ফেলা হয়েছে</string>
<string name="metadata_cache_wipe_summary">ওয়েবপৃষ্ঠার সকল ক্যাশড তথ্য মুছুন</string>
<string name="metadata_cache_wipe_title">ক্যাশড মেটাডেটা মুছুন</string>
<string name="metadata_cache_wipe_summary">সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো</string>
<string name="metadata_cache_wipe_title">ক্যাশ করা মেটাডেটা মুছো</string>
<string name="metadata_cache_wipe_complete_notice">মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে</string>
<string name="auto_queue_title">পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন</string>
<string name="player_gesture_controls_title">প্লেয়ারের নিয়ন্ত্রণ সংকেত</string>
<string name="brightness_gesture_control_summary">প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো</string>
<string name="brightness_gesture_control_title">উজ্জ্বলতার নিয়ন্ত্রণ সংকেত</string>
<string name="volume_gesture_control_summary">প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো</string>
<string name="volume_gesture_control_title">ভলিউম সংকেত নিয়ন্ত্রণ</string>
<string name="missions_header_finished">সম্পূর্ণ</string>
<string name="list">তালিকা</string>
</resources>

View File

@ -0,0 +1,332 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pause_downloads">ডাউনলোড পজ করুন</string>
<string name="start_downloads">ডাউনলোড শুরু করুন</string>
<string name="delete_downloaded_files">ডাউনলোড করা ফাইলগুলো ডিলিট করুন</string>
<string name="missions_header_finished">সম্পূর্ণ</string>
<string name="list">তালিকা</string>
<string name="title_activity_history">ইতিহাস</string>
<string name="website_title">ওয়েব সাইট</string>
<string name="action_open_website">ওয়েব সাইট খুলুন</string>
<string name="action_settings">সেটিংস</string>
<string name="recaptcha_request_toast">reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে</string>
<string name="title_activity_recaptcha">reCAPTCHA চ্যালেঞ্জ</string>
<string name="msg_popup_permission">এই অনুমতিটি
\nপপআপ মোডে খুলতে প্রয়োজন</string>
<string name="msg_copied">ক্লিপবোর্ডে অনুলিপি করা হয়েছে</string>
<string name="msg_wait">অনুগ্রহপূর্বক অপেক্ষা করুন…</string>
<string name="msg_running_detail">বিস্তারিত জানার জন্য আলতো চাপ</string>
<string name="msg_running">NewPipe ডাউনলোড হচ্ছে</string>
<string name="msg_url_malform">বিকৃত URL অথবা ইন্টারনেট নেই</string>
<string name="msg_exists">ফাইল ইতিমধ্যেই বিদ্যমান</string>
<string name="msg_server_unsupported">সার্ভার অসমর্থিত</string>
<string name="msg_error">ত্রুটি</string>
<string name="msg_threads">থ্রেড</string>
<string name="msg_name">ফাইলের নাম</string>
<string name="finish">ঠিক আছে</string>
<string name="add">নতুন মিশন</string>
<string name="rename">নাম পরিবর্তন করুন</string>
<string name="checksum">চেকসাম</string>
<string name="delete">ডিলেট</string>
<string name="view">প্রদর্শন</string>
<string name="pause">বিরতি</string>
<string name="start">শুরু</string>
<string name="no_views">স্টোরেজ অ্যাক্সেস করার অনুমতি অস্বীকার করা হয়েছে</string>
<string name="audio">অডিও</string>
<string name="video">ভিডিও</string>
<string name="err_dir_create">\'%1$s\' ডাউনলোড ডিরেক্টরি তৈরি করতে পারছে না</string>
<string name="user_report">ব্যবহারকারীর প্রতিবেদন</string>
<string name="report_error">একটি ত্রুটি রিপোর্ট করো</string>
<string name="use_tor_summary">(পরীক্ষামূলক) গোপনীয়তা বর্ধিত করতে টর এর মাধ্যমে ডাউনলোড ট্রাফিক জোরপুর্বক পাঠাও (ভিডিওগুলি স্ট্রিমিং এ সমর্থিত নয়)।</string>
<string name="use_tor_title">টর ব্যবহার করুন</string>
<string name="detail_dislikes_img_view_description">অপছন্দ হয়েছে</string>
<string name="detail_likes_img_view_description">পছন্দ হয়েছে</string>
<string name="detail_uploader_thumbnail_view_description">আপলোডারের ইউজারপিক থাম্বনেইল</string>
<string name="detail_thumbnail_view_description">ভিডিও প্রাকদর্শন, সময়ঃ</string>
<string name="list_thumbnail_view_description">ভিডিও প্রাকদর্শন থাম্বনেইল</string>
<string name="error_details_headline">বর্ণনা:</string>
<string name="your_comment">আপনার মন্তব্য (ইংরেজিতে):</string>
<string name="info_labels">কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর:</string>
<string name="what_happened_headline">কি হয়েছিল:</string>
<string name="what_device_headline">তথ্য:</string>
<string name="error_snackbar_action">প্রতিবেদন</string>
<string name="error_snackbar_message">দুঃখিত, কিছু ত্রুটি ঘটেছে।</string>
<string name="error_report_button_text">মেইলের মাধ্যমে ত্রুটি প্রতিবেদন করুন</string>
<string name="sorry_string">দুঃখিত, এটা ঘটা উচিত ছিল না।</string>
<string name="app_ui_crash">অ্যাপ / UI ক্র্যাশ করেছে</string>
<string name="could_not_load_image">চিত্র লোড করা যায়নি</string>
<string name="could_not_get_stream">কোনও স্ট্রিম পাওয়া যায়নি</string>
<string name="live_streams_not_supported">এটি একটি লাইভ স্ট্রিম। যা এখনও সমর্থিত নয়</string>
<string name="could_not_setup_download_menu">ডাউনলোড মেনু সেটআপ করা যায়নি</string>
<string name="content_not_available">কন্টেন্ট উপলব্ধ নয়</string>
<string name="light_parsing_error">ওয়েবসাইট সম্পুর্নভাবে বিশ্লেষন করা যায়নি</string>
<string name="parsing_error">ওয়েবসাইট বিশ্লেষন করা যায়নি</string>
<string name="youtube_signature_decryption_error">ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি</string>
<string name="could_not_load_thumbnails">সব থাম্বনেইল লোড করা যায়নি</string>
<string name="network_error">নেটওয়ার্ক ত্রুটি</string>
<string name="general_error">ত্রুটি</string>
<string name="unknown_content">[অজানা]</string>
<string name="just_once">একবার মাত্র</string>
<string name="always">সবসময়</string>
<string name="popup_resizing_indicator_title">আকার পরিবর্তন</string>
<string name="clear">পরিষ্কার</string>
<string name="refresh">রিফ্রেশ</string>
<string name="filter">ফিল্টার</string>
<string name="disabled">নিস্ক্রীয়</string>
<string name="later">পরবর্তীতে</string>
<string name="yes">হ্যাঁ</string>
<string name="playlist">প্লেলিস্ট</string>
<string name="channel">চ্যানেল</string>
<string name="all">সবগুলি</string>
<string name="error_report_title">ত্রুটি প্রতিবেদন</string>
<string name="downloads_title">ডাউনলোডগুলি</string>
<string name="downloads">ডাউনলোডগুলি</string>
<string name="duration_live">লাইভ</string>
<string name="video_is_age_restricted">ভিডিওটিকে বয়স সীমিত করা হয়েছে। প্রথমে সেটিংসে বয়স সীমাবদ্ধ ভিডিওগুলি সক্ষম করো।</string>
<string name="show_age_restricted_content_title">বয়স সীমাবদ্ধ কন্টেন্ট দেখাও</string>
<string name="content">কন্টেন্ট</string>
<string name="play_btn_text">চালাও</string>
<string name="popup_playing_toast">পপআপ মোডে চলছে</string>
<string name="background_player_playing_toast">ব্যাকগ্রাউন্ডে চলছে</string>
<string name="settings_category_debug_title">ডিবাগ</string>
<string name="settings_category_other_title">অন্যান্য</string>
<string name="settings_category_appearance_title">অ্যাপিয়ারেন্স</string>
<string name="settings_category_popup_title">পপআপ</string>
<string name="settings_category_history_title">ইতিহাস</string>
<string name="settings_category_video_audio_title">ভিডিও এবং অডিও</string>
<string name="settings_category_player_behavior_title">ব্যাবহার</string>
<string name="settings_category_player_title">প্লেয়ার</string>
<string name="content_language_title">কন্টেন্ট এর জন্য পছন্দসই ভাষা</string>
<string name="service_title">সেবা</string>
<string name="url_not_supported_toast">URL সমর্থিত নয়</string>
<string name="show_next_and_similar_title">পরবর্তী এবং অনুরূপ ভিডিওগুলি দেখাও</string>
<string name="next_video_title">পরবর্তী ভিডিও</string>
<string name="download_dialog_title">ডাউনলোড</string>
<string name="enable_watch_history_title">ইতিহাস</string>
<string name="enable_search_history_title">খোজ ইতিহাস</string>
<string name="player_gesture_controls_title">প্লেয়ারের নিয়ন্ত্রণ সংকেত</string>
<string name="brightness_gesture_control_summary">প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো</string>
<string name="brightness_gesture_control_title">উজ্জ্বলতার নিয়ন্ত্রণ সংকেত</string>
<string name="volume_gesture_control_summary">প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো</string>
<string name="volume_gesture_control_title">ভলিউম সংকেত নিয়ন্ত্রণ</string>
<string name="auto_queue_title">পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন</string>
<string name="metadata_cache_wipe_complete_notice">মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে</string>
<string name="metadata_cache_wipe_summary">সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো</string>
<string name="metadata_cache_wipe_title">ক্যাশ করা মেটাডেটা মুছো</string>
<string name="thumbnail_cache_wipe_complete_notice">ছবির ক্যাশ মুছে ফেলা হয়েছে</string>
<string name="download_thumbnail_summary">থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে।</string>
<string name="show_comments_summary">মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন</string>
<string name="show_comments_title">মতামত প্রদর্শন করুন</string>
<string name="download_thumbnail_title">থাম্বনেইল লোড করুন</string>
<string name="seek_duration_title">দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল</string>
<string name="use_inexact_seek_summary">অনির্দিষ্ট সন্ধান প্লেয়ারকে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না ৷</string>
<string name="use_inexact_seek_title">দ্রুত টানা ব্যাবহার করুন</string>
<string name="popup_remember_size_pos_summary">শেষ আকার এবং পপআপ সেট অবস্থান মনে রাখো</string>
<string name="popup_remember_size_pos_title">পপআপ আকার এবং অবস্থান মনে রাখো</string>
<string name="black_theme_title">কালো</string>
<string name="dark_theme_title">অন্ধকার</string>
<string name="light_theme_title">উজ্জ্বল</string>
<string name="theme_title">থিম</string>
<string name="default_video_format_title">পছন্দসই ভিডিও ফরম্যাট</string>
<string name="default_audio_format_title">ডিফল্ট অডিও ফরম্যাট</string>
<string name="play_audio">অডিও</string>
<string name="enable_lock_screen_video_thumbnail_summary">ব্যাকগ্রাউন্ড প্লেয়ার ব্যবহার করার সময় লক স্ক্রিনে ভিডিও থাম্বনেইল প্রদর্শিত হবে</string>
<string name="show_play_with_kodi_summary">Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর</string>
<string name="enable_lock_screen_video_thumbnail_title">লক স্ক্রিনের ভিডিও থাম্বনেইল</string>
<string name="show_play_with_kodi_title">দেখাও \"Kodi এর মাধ্যমে চালাও \" বিকল্প</string>
<string name="kore_not_found">হারানো কোর ইনস্টল করবেন\?</string>
<string name="play_with_kodi_title">Kodi এর মাধ্যমে চালান</string>
<string name="show_higher_resolutions_summary">শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে</string>
<string name="show_higher_resolutions_title">উচ্চ রেজোল্যুশন দেখাও</string>
<string name="default_popup_resolution_title">ডিফল্ট পপআপ রেজোল্যুশন</string>
<string name="default_resolution_title">ডিফল্ট রেজোল্যুশন</string>
<string name="autoplay_by_calling_app_summary">স্বয়ংক্রিয়ভাবে একটি ভিডিও প্লে করো যখন NewPipe অন্য অ্যাপ্লিকেশন থেকে চালু করা হয়</string>
<string name="autoplay_by_calling_app_title">স্বয়ংক্রিয়ভাবে প্লে করো যখন অন্য অ্যাপ্লিকেশন থেকে চালু করা হয়</string>
<string name="download_choose_new_path">প্রভাব দৃশ্যমান করার জন্য ডাউনলোড ফোল্ডার পরিবর্তন করুন</string>
<string name="download_path_audio_dialog_title">অডিও ফাইলগুলির জন্য ডাউনলোডের ফোল্ডার নির্বাচন করুন</string>
<string name="download_path_audio_summary">ডাউনলোড করা অডিও এখানে রাখা হয়</string>
<string name="download_path_audio_title">অডিও ডাউনলোড ফোল্ডার</string>
<string name="download_path_dialog_title">ভিডিওগুলির জন্য ডাউনলোডের পাথ নির্বাচন কর</string>
<string name="download_path_summary">ডাউনলোড করা ভিডিওগুলো এখানে থাকে</string>
<string name="download_path_title">ভিডিও ডাউনলোড করার ফোল্ডার</string>
<string name="controls_add_to_playlist_title">যুক্ত করুন</string>
<string name="controls_popup_title">পপআপ</string>
<string name="controls_background_title">ব্যাকগ্রাউন্ড</string>
<string name="tab_new">নতুন ট্যাব</string>
<string name="tab_bookmarks">বুকমার্ককৃত প্লেলিস্টসমূহ</string>
<string name="tab_subscriptions">সাবস্ক্রিপশন</string>
<string name="tab_main">প্রধান</string>
<string name="show_info">তথ্য দেখুন</string>
<string name="subscription_update_failed">সাবস্ক্রিপশন আপডেটে ব্যার্থ</string>
<string name="subscription_change_failed">সাবস্ক্রিপশন পরিবর্তন করা যায়নি</string>
<string name="channel_unsubscribed">চ্যানেল থেকে আনসাবস্ক্রাইব্ড</string>
<string name="unsubscribe">আনসাবস্ক্রাইব</string>
<string name="subscribed_button_title">সাবস্ক্রাইব করা আছে</string>
<string name="subscribe_button_title">সাবস্ক্রাইব</string>
<string name="popup_mode_share_menu_title">পপআপ মোড</string>
<string name="use_external_audio_player_title">বহির্গত অডিও প্লেয়ার ব্যবহার করুন</string>
<string name="use_external_video_player_summary">কিছু কিছু রেজোলিউশনে অডিও বন্ধ করে দেয়</string>
<string name="use_external_video_player_title">বাইরের ভিডিও প্লেয়ার ব্যবহার করুন</string>
<string name="screen_rotation">ঘূর্ণন</string>
<string name="choose_browser">ব্রাউজার বাছাই করুন</string>
<string name="share_dialog_title">শেয়ার করুন</string>
<string name="did_you_mean">আপনি কি বুঝিয়েছেনঃ %1$s\?</string>
<string name="settings">সেটিংস</string>
<string name="search">খুঁজুন</string>
<string name="controls_download_desc">স্ট্রিম ফাইল ডাউনলোড করুন</string>
<string name="download">ডাউনলোউড</string>
<string name="share">শেয়ার</string>
<string name="open_in_popup_mode">পপ-আপ মোডে ওপেন করুন</string>
<string name="open_in_browser">ব্রাউজারে ওপেন করুন</string>
<string name="cancel">বাদ দিন</string>
<string name="install">ইনস্টল</string>
<string name="no_player_found_toast">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি (প্লে করতে VLC ইন্সটল করতে পারেন)।</string>
<string name="no_player_found">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান\?</string>
<string name="upload_date_text">প্রকাশকাল %1$s</string>
<string name="view_count_text">%1$s জন দেখেছে</string>
<string name="main_bg_subtitle">অনুসন্ধান এ চাপ দিয়ে শুরু করুন</string>
<string name="feed_create_new_group_button_title">নতুন</string>
<string name="feed_group_dialog_name_input">নাম</string>
<string name="fragment_feed_title">নতুন কি</string>
<string name="app_language_title">অ্যাপ এর ভাষা</string>
<string name="stop">বন্ধ করুন</string>
<string name="clear_download_history">ডাওন লোড ইতিহাস মুছুন</string>
<string name="error_insufficient_storage">ডিভাইস এ স্পেস নেই</string>
<string name="error_http_not_found">পাওয়া যায় নি</string>
<string name="error_unknown_host">সার্ভার পাওয়া যায় নি</string>
<string name="label_code">কোড</string>
<string name="download_finished">ডাউন লোড শেষ হয়েছে</string>
<string name="download_failed">ডাউন লোড হয় নি</string>
<string name="paused">পজ হয়েছে</string>
<string name="app_update_notification_content_text">ডাউন লোড করার জন্য চাপ দিন</string>
<string name="auto">অটো</string>
<string name="grid">গ্রিড</string>
<string name="caption_setting_title">ক্যাপশন</string>
<string name="resize_zoom">জুম</string>
<string name="resize_fill">ফিল</string>
<string name="resize_fit">ফিট</string>
<string name="caption_none">কোন ক্যাপশন নেই</string>
<string name="playlist_creation_success">প্লে লিস্ট তৈরি হয়েছে</string>
<string name="delete_playlist_prompt">প্লে লিস্ট ডিলিট করতে চান\?</string>
<string name="unmute">আন মিউট</string>
<string name="mute">মিউট</string>
<string name="append_playlist">প্লে লিস্ট এ যুক্ত করুন</string>
<string name="delete_playlist">ডিলিট</string>
<string name="always_ask_open_action">সবসময় জিজ্ঞেস করুন</string>
<string name="video_player">ভিডিও প্লেয়ার</string>
<string name="drawer_close">ড্রয়ার বন্ধ করুন</string>
<string name="drawer_open">ড্রয়ার খুলন</string>
<string name="recently_added">সাম্প্রতিক যুক্ত</string>
<string name="new_and_hot">নতুন এবং হট</string>
<string name="top_50">প্রথম ৫০</string>
<string name="error_unable_to_load_comments">মন্তব্যগুলি লোড করা যায় নি</string>
<string name="select_a_channel">একটি চ্যানেল পছন্দ করুন</string>
<string name="channel_page_summary">চ্যানেল এর পাতা</string>
<string name="blank_page_summary">খালি পাতা</string>
<string name="item_deleted">আইটেম ডিলিট হয়েছে</string>
<string name="app_license_title">নিউপাইপ এর লাইসেন্স</string>
<string name="read_privacy_policy">প্রাইভেসি পলিসি পড়ুন</string>
<string name="privacy_policy_title">নিউপাইপ এর প্রাইভেসি পলিসি</string>
<string name="view_on_github">গিটহাব এ দেখুন</string>
<string name="tab_licenses">লাইসেন্স</string>
<string name="settings_category_downloads_title">ডাউনলোড</string>
<string name="one_item_deleted">একটি আইটেম ডিলিট হয়েছে।</string>
<string name="dismiss">ডিসমিস</string>
<string name="delete_one">একটি ডিলিট করুন</string>
<string name="no_videos">কোন ভিডিও নেই</string>
<string name="search_no_results">কোন রেজাল্ট নেই</string>
<string name="invalid_directory">কোন ফোল্ডার নেই</string>
<string name="invalid_url_toast">অবৈধ ইউ আর এল</string>
<string name="download_to_sdcard_error_title">বাহ্যিক স্টোরেজ নেই</string>
<string name="search_history_deleted">সার্চ ইতিহাস ডিলিট হয়েছে।</string>
<string name="playlist_name_input">নাম</string>
<string name="rename_playlist">নাম পরিবর্তন</string>
<string name="action_history">ইতিহাস</string>
<string name="read_full_license">লাইসেন্স পড়ুন</string>
<string name="donation_title">দান করুন</string>
<string name="delete_all">সব মুছে ফেলুন</string>
<string name="create">তৈরি করুন</string>
<string name="retry">পুনরায় চেষ্টা করুন</string>
<string name="help">সাহায্য</string>
<string name="watch_history_deleted">দেখার ইতিহাস মুছে গেছে।</string>
<string name="delete_view_history_alert">সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\?</string>
<string name="clear_views_history_title">দেখার ইতিহাস মুছে ফেলুন</string>
<string name="export_data_title">ডাটা বেস এক্সপোর্ট করুন</string>
<string name="app_update_notification_channel_name">অ্যাপ আপডেট এর সূচনা</string>
<string name="notification_channel_name">নিউ পাইপ এর সূচনা</string>
<string name="playlists">প্লেলিস্ট গুলি</string>
<string name="peertube_instance_add_title">ইন্সটান্স যোগ করুন</string>
<string name="file">ফাইল</string>
<string name="play_all">সব চালু করুন</string>
<string name="file_deleted">ফাইল ডিলিট হয়েছে</string>
<string name="albums">অ্যালবাম গুলি</string>
<string name="videos_string">ভিডিও গুলি</string>
<string name="channels">চ্যানেলগুলি</string>
<string name="settings_category_updates_title">আপডেট</string>
<string name="resume_on_audio_focus_gain_title">পুনরায় চালু করুন</string>
<string name="settings_category_clear_data_title">ডাটা মুছে ফেলুন</string>
<string name="enable_playback_resume_title">পুনরায় প্লে ব্যাক চালু করুন</string>
<string name="tab_choose">ট্যাব পছন্দ করুন</string>
<string name="restore_defaults_confirmation">আপনি কি ডিফল্ট এ ফিরতে চান\?</string>
<string name="error_occurred_detail">একটা এরর হয়েছেঃ %1$s</string>
<string name="missing_file">ফাইল সরে গেছে না হয় মুছে ফেলা হয়েছে</string>
<string name="audio_streams_empty">কোন অডিও স্ট্রিম পাওয়া যায় নি</string>
<string name="player_recoverable_failure">প্লেয়ার এর এরর থেকে বেরিয়ে আসুন</string>
<string name="player_stream_failure">স্ট্রিম টি চালানো গেল না</string>
<string name="clear_search_history_summary">সার্চের ইতিহাস মোছা হয়</string>
<string name="watch_history_states_deleted">প্লে ব্যাক এর অবস্থান মোছা হয়েছে।</string>
<string name="delete_playback_states_alert">সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\?</string>
<string name="clear_playback_states_summary">সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>
<string name="clear_playback_states_title">প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>
<string name="switch_to_main">মেন এ ফিরে যান</string>
<string name="app_update_notification_channel_description">নিউ পাইপ এর নতুন ভার্সন এর সূচনা</string>
<string name="undo">ফিরে যান</string>
<string name="artists">শিল্পীরা</string>
<string name="events">ইভেন্টগুলি</string>
<string name="youtube_restricted_mode_enabled_title">YouTube নিষিদ্ধ মোড</string>
<string name="peertube_instance_add_https_only">শুধুমাত্র HTTPS URL গুলি সাপোর্ট করে</string>
<string name="close">বন্ধ করুন</string>
<string name="limit_data_usage_none_description">কোন সীমা নেই</string>
<string name="unbookmark_playlist">বুকমার্ক মুছুন</string>
<string name="create_playlist">নতুন প্লে লিস্ট</string>
<string name="play_queue_audio_settings">অডিও সেটিং</string>
<string name="play_queue_stream_detail">বিবরণ</string>
<string name="local">স্থানীয়</string>
<string name="title_most_played">সবথেকে বেশি চালানো</string>
<string name="title_last_played">শেষ চালানো</string>
<string name="history_cleared">ইতিহাস মুছে ফেলা হয়েছে</string>
<string name="history_empty">ইতিহাস খালি</string>
<string name="history_disabled">ইতিহাস বন্ধ রয়েছে</string>
<string name="title_history_view">দেখা হয়েছে</string>
<string name="title_history_search">খোজা হয়েছে</string>
<string name="give_back">ফিরিয়ে দিন</string>
<string name="tab_contributors">যোগদান কারি গন</string>
<string name="contribution_title">যোগদান</string>
<string name="error_unable_to_load_license">লাইসেন্স লোড করা যায় নি</string>
<string name="title_activity_about">নিউ পাইপ এর সম্বন্ধে</string>
<string name="charset_letters_and_digits">শব্দ ও নম্বর</string>
<string name="recaptcha_done_button">হয়েছে</string>
<string name="no_comments">কোন মন্তব্য নেই</string>
<string name="no_subscribers">কোন সাবস্ক্রাইবার নেই</string>
<string name="no_streams_available_download">ডাউন লোড এর জন্য কোন স্ট্রিম নেই</string>
<string name="file_name_empty_error">ফাইল এর নাম খালি থাকতে পারে না</string>
<string name="video_streams_empty">কোন ভিডিও</string>
<string name="delete_search_history_alert">সমগ্র সার্চ ইতিহাস মুছবেন\?</string>
<string name="clear_search_history_title">সার্চ ইতিহাস মুছুন</string>
<string name="import_data_title">ডাটাবেস আনুন</string>
<string name="switch_to_popup">পপ-আপ এ খুলুন</string>
<string name="switch_to_background">পেছনে নিয়ে যান</string>
<string name="toggle_orientation">অরিয়েন্টেশন বদলান</string>
<string name="best_resolution">সেরা রেজুলিউসন</string>
<string name="songs">গান গুলি</string>
<string name="peertube_instance_add_help">ইন্সটান্স এর ইউ আর এল</string>
<string name="peertube_instance_url_summary">আপনার পছন্দের পিয়ার টিউব ইন্সটান্স</string>
<string name="peertube_instance_url_title">পিয়ার টিউব এর ইন্সটান্স সমূহ</string>
<string name="autoplay_title">স্বয়ংক্রিয়</string>
<string name="enable_watch_history_summary">দেখা ভিডিও গুলির হিসেব</string>
<string name="enable_playback_state_lists_title">তালিকা তে পজিশন</string>
<string name="enable_playback_resume_summary">শেষ প্লে ব্যাক পজিশন এ যান</string>
<string name="enable_search_history_summary">সার্চ গুলি স্থানীয় ভাবে জমা করুন</string>
<string name="show_search_suggestions_summary">সার্চ এর সময় সাজেশন দেখান</string>
<string name="show_search_suggestions_title">সার্চ সাজেশন</string>
</resources>

View File

@ -0,0 +1,616 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="feed_use_dedicated_fetch_method_help_text">ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە).
\n
\nئەم داوانامەیە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات:
\n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە.
\n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە.
\n
\nجیاوازی نێوان ئەم دووانە ئەوەیە کە خێراکە چەند زانیارییەکی وونە، وەکوو ماوەی هەر بڕگەیەک یان جۆرەکەی (ناتوانێت جیاوازی بکات لە نێوان ڤیدیۆی ڕاستەوخۆ و ئاسایی) لەوانەشە بڕگەی کەمتر باربکات.
\n
\nیوتیوب نموونەیە لەم خزمەتگوزارییە کە ڕێگەی خێرا بەکاردەبات بەهۆی پیشاندەری RSS.
\n
\nبۆیە هەڵژرادن بۆ خۆت دەگەڕێتەوە: زانیاری تەواو یان خێرا.</string>
<string name="app_license">‫ئەم داوانامەیە سەرچاوە کراوەیە : دەتوانی بەکاریبهێنی، بیخوێنیتەوە و هاوبەشی پێبکەیت و بەرەوپێشی ببەیت. بەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک داوانامەیەکی بڵاوی خۆڕایی, بەهۆی وەشانی ٣ ی مۆڵەتنامە، یان هەر وەشانێک کە دوواتر.</string>
<string name="info_labels">چی:\\nداواکراو:\\nزمانی ناوەڕۆک:\\nخزمەتگوزاری:\\GMTnکات:\\nگورزە:\\nوەشان:\\nوەشانی سیستەم:</string>
<string name="privacy_policy_encouragement">پڕۆژەی ئەپەکە زانیارییە تایبەتییەکانت بەوردی دەپارێزێ. هەروەها داوانامەکە هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات.
\nسیاسەتی تایبەتی داوانامە بەوردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێ و بەکاریاندەبات.</string>
<string name="download_to_sdcard_error_message">داگرتن لە بیرگەی دەرەکی ناکرێت. شوێنی بوخچەی داگرتنەکان دابنرێتەوە؟</string>
<string name="download_thumbnail_summary">ناچالاكی بكه‌ بۆ ڕاگرتنی وێنۆچكه‌كان له‌ باركردن و پاشه‌كه‌وتبوون له‌سه‌ر بیرگه‌ی ئامێره‌كه‌ت, گۆڕینی ئه‌مه‌ ده‌بێته‌ هۆی سڕینه‌وه‌یان له‌سه‌ر بیرگه‌ی مۆبایله‌كه‌ت.</string>
<string name="did_you_mean">مەبەستت ئەمەیە: %1$s\?</string>
<string name="feed_update_threshold_title">ماوەی نوێکاری</string>
<string name="grid">هێڵەکی</string>
<string name="auto_queue_summary">پاشکۆی خۆکاری پەخشێکی بەستراوە لەکاتی کارپێکردنی کۆتا پەخشدا</string>
<string name="enable_queue_limit">سنوری ڕیزبوونی داگرتنەکان</string>
<string name="error_insufficient_storage">بیرگەی ناوەکیت پڕبووە</string>
<string name="subscribers_count_not_available">ژمارەی بەشداربووان نادیارە</string>
<string name="overwrite_failed">ناتوانرێ لەسەر ئەو پەڕگەیە جێگیربکرێ</string>
<string name="tab_choose">بازدەر هەڵبژێرە</string>
<string name="short_million">ملیۆن</string>
<string name="more_than_100_videos">+١٠٠ ڤیدیۆ</string>
<string name="settings_category_player_title">کارپێکەر</string>
<string name="import_title">هێنانەوە</string>
<string name="error_report_button_text">سکاڵا لەسەر کێشە لەڕێگای ئیمێڵ</string>
<string name="playlist_name_input">ناو</string>
<string name="error_postprocessing_failed">چارەسەرکردن شکستی هێنا</string>
<string name="minimize_on_exit_title">بچوکبوونەوە لەکاتی گۆڕینی داوانامە</string>
<string name="feed_page_summary">پەڕەی نوێترینەکان</string>
<string name="use_tor_summary">|(تاقیکاری) داگرتنی خێرا بەبەکارهێنانی Tor بۆ زیادکردنی تایبەتێتی (پشتگیری پەخشە ڕاستەوخۆکان ناکات) .</string>
<string name="download_path_summary">پەڕگەی ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن</string>
<string name="export_data_summary">هەناردەکردنی مێژوو و بەشداربوون و لیستەکان</string>
<string name="use_inexact_seek_summary">بردنەپێشی ناتەواوی خێرا وا لە کارپێکەرەکە داکات کە بەخێرایی شوێنەکە بگۆڕێت. بردنەپێشی ٥ یان ١٥ یان ٢٥ چرکەیی لەگەڵ ئەمەدا کارناکات.</string>
<string name="enable_disposed_exceptions_summary">سکاڵاکردن لەسەر نەگەیاندنی Rx ی پەسەندنەکرا لە دەرەوەی پارچە یان چالاکی لەدوای پوختەکردن</string>
<string name="popup_resizing_indicator_title">قەبارە دانانەوە</string>
<string name="show_next_and_similar_title">پیشاندانی ’دواتر’ و ڤیدیۆ ’هاوشێوەکان’</string>
<string name="resize_zoom">هێنانەپێش</string>
<string name="saved_tabs_invalid_json">پەڕە بنەڕەتییەکان بەکاردەبردرێن, ناتوانرێ پەڕە پاشەکەوتکراوەکان بخوێنرێنەوە</string>
<string name="delete_view_history_alert">سڕینەوەی تەواوی مێژووی تەماشاکردن؟</string>
<string name="clear_search_history_title">سڕینەوەی مێژووی گەڕان</string>
<string name="msg_error">هەڵە</string>
<string name="override_current_data">ئەمە لەسەر ڕێکخستنەکانی ئێستات جێگیردەبێت.</string>
<string name="notification_channel_name">ئاگانامەکانی داوانامە</string>
<string name="donation_encouragement">ئەم ئەپە لەلایەن چەند خۆبەخشێکەوە دروستکراوە کەکاتی خۆیان پێ بەخشیووە تاکو باشترین خزمەتگوزاریت پێشکەش بکەن. هیچ نەبێت بە کڕینی کوپێک قاوە یارمەتی گەشەپێدەرەکانمان بدە بۆ ئەوەی کاتی زیاتر تەرخان بکەین بۆ بەرەوپێشبردنی NewPipe.</string>
<string name="short_billion">بلیۆن</string>
<string name="show_search_suggestions_title">گەڕانی پێشنیارکراوەکان</string>
<string name="playback_tempo">خێراییەکان</string>
<string name="file_deleted">پەڕگە سڕایەوە</string>
<string name="feed_groups_header_title">کۆمەڵەی کەناڵەکان</string>
<string name="msg_popup_permission">ئەم دەسەڵاتە پێویستە بۆ
\nکردنەوەی پەنجەرەی بچووک</string>
<string name="msg_exists">پەڕگە بوونی هەیە</string>
<string name="paused">ڕاگیراوە</string>
<string name="missions_header_pending">لە چاوەڕوانیدایە</string>
<string name="export_complete_toast">هەناردەکرا</string>
<string name="settings_category_debug_title">هەڵەدۆزی</string>
<string name="metadata_cache_wipe_complete_notice">پاشماوەی داتاکان سڕانەوە</string>
<string name="default_kiosk_page_summary">کیۆسکی بنەڕەتی</string>
<string name="best_resolution">باشترین پیشاندان</string>
<plurals name="subscribers">
<item quantity="one">%s بەشداربوو</item>
<item quantity="other">%s بەشداربوون</item>
</plurals>
<string name="delete_one">سڕینەوەی یەک دانە</string>
<string name="show_higher_resolutions_title">پیشاندانی وردی به‌رزتر</string>
<string name="add">ئەرکی نوێ</string>
<string name="queued">لەڕیزدایە</string>
<string name="generate_unique_name">دانانی ناوی نوێ</string>
<string name="import_data_summary">لەسەر مێژوو و بەشداربووەکانی ئێستات جێگیردەبێت</string>
<string name="could_not_get_stream">هیچ پەخشێ نەدۆزرایەوە</string>
<string name="restricted_video">تەمەنت بۆ تەماشاکردنی ئەم ڤیدیۆیە ڕێپێنەدراوە.
\n
\nگەر دەتەوێت بیبینیت ئەوا ناوەڕۆکە ڕێپێنەدراوەکانی تەمەن لە ڕێکخستنەکان چالاک بکە.</string>
<string name="clear_download_history">سڕینەوەی مێژووی داگرتن</string>
<string name="just_once">تەنها یەکجار</string>
<string name="youtube_restricted_mode_enabled_title">دۆخی قەدەغەکراوی یوتیوب</string>
<string name="title_activity_recaptcha">reCAPTCHA داواکاری</string>
<string name="settings_category_updates_title">نوێکارییەکان</string>
<string name="user_report">سکاڵا لەبەکاربەر</string>
<string name="error_http_unsupported_range">ئەم ڕاژەیە ناتوانێ چەندین داگرتن لەیەک کاتدا بکات</string>
<string name="feed_use_dedicated_fetch_method_enable_button">چالاککردنی دۆخی خێرا</string>
<string name="minimize_on_exit_background_description">بچوککردنەوە بۆ کارپێکەری پاشبنەما</string>
<string name="live_streams_not_supported">پەخشی ڕاستەوخۆ پشتگیری ناکرێ لەئێستادا</string>
<string name="enable_lock_screen_video_thumbnail_summary">کاتێ کارپێکەری پاشبنەما کاردەکات ئەوا وێنۆچکەی ڤیدیۆکە لە ڕوونما داخراوەکەدا نیشاندەدرێت</string>
<string name="channel_unsubscribed">به‌شداریت نەما له‌ كه‌ناڵ</string>
<string name="player_stream_failure">ناتوانرێ ئەم پەخشە کارپێبکرێ</string>
<string name="popup_remember_size_pos_title">بیرهاتنه‌وه‌ی شوێن و قه‌باره‌ی په‌نجه‌ره‌ی بچووک</string>
<string name="player_recoverable_failure">گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە</string>
<string name="minimize_on_exit_none_description">هیچیان</string>
<string name="pause_downloads_on_mobile_desc">بەسوودە بۆ کاتی گۆڕینی هێڵ بۆ داتای مۆبایل, لەگەڵ ئەوەشدا زۆربەی داگرتنەکان ڕاناگرێت</string>
<string name="website_title">ماڵپەڕ</string>
<string name="enqueue">لە ڕیز</string>
<string name="play_with_kodi_title">كارپێكردن به‌ Kodi</string>
<string name="error_unable_to_load_comments">ناتوانرێ لێدوانەکان باربکرێ</string>
<string name="peertube_instance_add_help">بەستەری دۆخ دابنێ</string>
<string name="download_path_audio_summary">پەڕگەی دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن</string>
<string name="error_snackbar_message">ببورە، هەندێ کێشە ڕوویدا.</string>
<string name="export_to">هەناردەکردن بۆ</string>
<string name="settings_category_player_behavior_title">ڕەفتار</string>
<string name="select_a_channel">هەڵبژاردنی کەناڵ</string>
<string name="downloads_storage_ask_title">پرسیاربکرێ لەکوێ دابگیرێ</string>
<string name="copyright" formatted="true">© %1$s لەلایەن %2$s لەژێر %3$s</string>
<string name="title_licenses">مۆڵەتنامەی لایەنی سێهەم</string>
<string name="app_license_title">مۆڵەتنامەی داوانامە</string>
<string name="show_hold_to_append_title">پیشاندانی ڕێنمایی ”داگرتن تا پاشکۆ”</string>
<string name="yes">بەڵێ</string>
<string name="msg_threads">دابەشکراوەکان</string>
<string name="title_most_played">زۆرترین کارپێکردن</string>
<string name="unbookmark_playlist">لابردنی دڵخواز</string>
<string name="tab_licenses">مۆڵەتەکان</string>
<string name="subscription_update_failed">ناتوانرێت به‌شداریكردنه‌كه‌ نوێبكرێته‌وه‌</string>
<string name="tab_new">بازدەرێکی نوێ</string>
<string name="player_gesture_controls_summary">جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ و ڕووناکی</string>
<string name="controls_background_title">پاشبنەما</string>
<string name="search_no_results">هیچ ئەنجامێک نییە</string>
<string name="localization_changes_requires_app_restart">زمان دەگۆڕدرێ لەدوای داخستن و پاشان کردنەوەی داوانامە.</string>
<string name="remove_watched">سڕینەوەی تەماشاکراوەکان</string>
<string name="enable_playback_state_lists_summary">پیشاندانی نیشانەکەری شوێنی کارپێکراو لە لیستەکان</string>
<string name="download_thumbnail_title">باركردنی وێنۆچكه‌كان</string>
<string name="enable_playback_state_lists_title">شوێنەکان لە لیستدا</string>
<string name="subscribed_button_title">به‌شداربوویت</string>
<string name="caption_setting_description">بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە داوانامە دابخەیت و دیسانەوە بیکەیتەوە.</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="one">%d دیاریکراو</item>
<item quantity="other">%d هەڵبژێردراو</item>
</plurals>
<string name="error_unknown_host">ناتوانرێ ڕاژە بدۆزرێتەوە</string>
<string name="settings_category_history_title">مێژوو &amp; کاش</string>
<string name="settings_category_feed_title">دیار</string>
<string name="delete_playlist">سڕینەوە</string>
<plurals name="listening">
<item quantity="one">%s گوێی لێدەگرێ</item>
<item quantity="other">%s گوێی لێدەگرن</item>
</plurals>
<string name="msg_running">داگرتنەکانی داوانامە</string>
<string name="feed_group_dialog_name_input">ناو</string>
<string name="channels">کەناڵەکان</string>
<string name="action_history">مێژوو</string>
<string name="subscriptions_export_unsuccessful">ناتوانرێ بەشدارییەکان پاشەکەوت بکرێن</string>
<plurals name="views">
<item quantity="one">%s بینراو</item>
<item quantity="other">%s بینراو</item>
</plurals>
<string name="pause">ڕاگرتن</string>
<string name="download_path_audio_dialog_title">فۆڵدەری داگرتنی پەڕگە دەنگییەکان هەڵبژێرە</string>
<string name="feed_create_new_group_button_title">نوێ</string>
<string name="clear_views_history_title">سڕینەوەی مێژووی تەماشاکردن</string>
<string name="enable_playback_resume_title">کارپێکردنەوەی لیست</string>
<string name="preferred_player_fetcher_notification_title">دەستکەوتنی زانیاری…</string>
<string name="clear_search_history_summary">مێژووی گەڕانەکانت دەسڕێتەوە</string>
<string name="what_happened_headline">چی ڕوویدا:</string>
<string name="background_player_playing_toast">کارپێکردن لە پاشبنەما</string>
<string name="limit_data_usage_none_description">بێ سنوور</string>
<string name="decline">ڕەتکردنەوە</string>
<string name="show_error">پیشاندانی کێشە</string>
<string name="play_btn_text">کارپێکردن</string>
<string name="feed_update_threshold_option_always_update">هەمیشە نوێکردنەوە</string>
<string name="subscriptions_import_unsuccessful">ناتوانرێ بەشدارییەکان بهێنرێتەوە</string>
<string name="brightness_gesture_control_title">کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە</string>
<string name="settings_category_appearance_title">دەرکەوتن</string>
<string name="import_data_title">هێنانەوەی بنکەی زانیاریەکان</string>
<string name="enable_search_history_title">گەڕان بەناو مێژوو</string>
<string name="overwrite_finished_warning">پەڕگەیەکی داگیراو بەم ناوەوە هەیە</string>
<string name="detail_drag_description">ڕاکێشان بۆ دووبارە ڕێکخستنەوە</string>
<string name="play_queue_remove">سڕینەوە</string>
<string name="popup_mode_share_menu_title">دۆخی په‌نجه‌ره‌ی بچووک</string>
<string name="always">هەموو کات</string>
<string name="read_full_license">مۆڵەتنامە بخوێنەوە</string>
<string name="app_ui_crash">داوانامە/ڕووکار ڕاوەستا</string>
<string name="play_all">هەمووی کارپێبکە</string>
<string name="view">کارپێکردن</string>
<string name="invalid_source">هەمان پەڕگە/بابەت بوونی نییە</string>
<string name="start">دەستپێکردن</string>
<string name="subscribe_button_title">به‌شداربوون</string>
<string name="show_play_with_kodi_title">بژاردەی ”کارپێکردن بە Kodi“ پیشانبدرێت</string>
<string name="tab_subscriptions">به‌شدارییه‌كان</string>
<string name="blank_page_summary">پەڕەی بەتاڵ</string>
<string name="default_audio_format_title">جۆری بنەڕەتی ده‌نگ</string>
<string name="charset_most_special_characters">هێما تایبەتییەکان</string>
<string name="theme_title">ڕووكار</string>
<string name="switch_to_main">گۆڕین بۆ سەرەکی</string>
<string name="show_original_time_ago_summary">دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن</string>
<string name="title_activity_popup_player">کارپێکەری پەنجەرەی بچووک</string>
<string name="download_dialog_title">داگرتن</string>
<string name="caption_setting_title">ژێرنووسەکان</string>
<string name="invalid_url_toast">بەستەر هەڵەیە</string>
<string name="enqueue_on_background">ڕیزنەبوون لە پاشبنەما</string>
<string name="volume_gesture_control_title">کۆنترۆڵی دەنگ بەجوڵەی پەنجە</string>
<string name="auto_queue_title">ڕیزکردنی خۆکاری کارپێکردنی دواتر</string>
<string name="external_player_unsupported_link_type">کارپێکەرە ڤیدیۆییە دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن</string>
<string name="permission_denied">کردار ڕەتکرایەوە لەلایەن سیستەمەوە</string>
<string name="subscription_page_summary">پەڕەی بەشدارییەکان</string>
<string name="list_thumbnail_view_description">وێنۆچکەی پێشبینینی ڤیدیۆ</string>
<string name="controls_popup_title">په‌نجه‌ره‌ی بچووک</string>
<string name="black_theme_title">ڕه‌ش</string>
<string name="default_popup_resolution_title">قه‌باره‌ی بنەڕەتی په‌نجه‌ره‌ی بچووک</string>
<string name="could_not_import_all_files">ئاگاداربە: ناتوانرێ هەموو پەڕگەکان بهێنرێنەوە.</string>
<string name="peertube_instance_url_summary">ئارەزوومەندییەکانی دۆخی پێرتووبی ڕێکبخە</string>
<string name="feed_oldest_subscription_update">دواین نوێکردنەوە: %s</string>
<string name="selection">هەڵبژاردن</string>
<string name="stop">ڕاگرتن</string>
<string name="list">لیست</string>
<string name="start_downloads">دەستپێکردنەوەی داگرتنەکان</string>
<string name="caption_none">هیچ ژێرنووسێک نییە</string>
<string name="download_finished_more">%s داگرتن تەواوبوون</string>
<string name="popup_playing_toast">کارپێکردن لە پەنجەرەی بچووک</string>
<string name="later">دواتر</string>
<string name="no_views">هیچ بینراوێک نییە</string>
<string name="invalid_file">ئەو پەڕگەیە بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە</string>
<string name="settings_category_other_title">هیتر</string>
<string name="parsing_error">ناتوانرێ ماڵپەڕ شیبکرێتەوە</string>
<string name="settings_file_charset_title">نووسە ڕێگەپێدراوەکان لە پەڕگەیەکی ناویدا</string>
<string name="import_soundcloud_instructions_hint">نازنامەکەت , soundcloud.com/yourid</string>
<string name="help">یارمەتی</string>
<string name="fragment_feed_title">چی نوێ هه‌یه‌</string>
<string name="settings_category_popup_title">پەنجەرەی بچووک</string>
<string name="msg_running_detail">گرتەبکە بۆ وردەکاری</string>
<string name="delete_playback_states_alert">شوێنی هەموو کارپێکراوەکان بسڕدرێتەوە؟</string>
<string name="top_50">باشترین ٥٠</string>
<string name="playlist">لیستی کارپێکردن</string>
<string name="peertube_instance_add_https_only">تەنها بەستەرەکانی https پشتگیریکراون</string>
<string name="error_ssl_exception">پەیوەستبوونی پارێزراو شکستی هێنا</string>
<string name="msg_server_unsupported">ڕاژە پشتگیرینەکراوە</string>
<string name="remove_watched_popup_warning">ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ خشتەی کارکردن دەسڕێنەوە.
\nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە!</string>
<string name="item_deleted">بابەت سڕایەوە</string>
<string name="detail_sub_channel_thumbnail_view_description">وێنۆچکەی کەناڵ</string>
<string name="import_settings">ئایا دەتەوێت ڕێکخستنەکانیش بهێنرێنەوە؟</string>
<string name="no_player_found">هیچ كارپێكه‌رێكی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟</string>
<string name="download_path_title">بوخچەی داگرتنی ڤیدیۆ</string>
<string name="filter">پاڵاوتن</string>
<string name="drawer_open">کردنەوەی پلیکانە</string>
<string name="light_theme_title">کاڵ</string>
<string name="show_search_suggestions_summary">پیشاندانی پێشنیارەکان لەکاتی گەڕان</string>
<string name="error_progress_lost">کردارەکە شکستی هێنا, چونکە ئەو پەڕگەیە سڕاوەتەوە</string>
<string name="controls_add_to_playlist_title">زیادکردن بۆ</string>
<string name="no_subscribers">هیچ بەشداربوویەک نییە</string>
<string name="peertube_instance_url_title">دۆخی پێرتووبی</string>
<string name="playlist_creation_success">خشتەی کارپێکردن دروستکرا</string>
<string name="unhook_checkbox">سڕینەوەی بەستەر (ڕەنگە ببێتە هۆی تێکدان)</string>
<string name="channel_page_summary">پەڕەی کەناڵەکان</string>
<string name="switch_to_background">گۆڕین بۆ پاشبنەما</string>
<string name="infinite_videos">∞ ڤیدیۆ</string>
<string name="enable_leak_canary_title">چالاککردنی LeakCanary</string>
<string name="use_inexact_seek_title">بەکارهێنانی بردنەپێشی ناتەواوی خێرا</string>
<string name="error_occurred_detail">هەڵەیەک ڕوویدا : %1$s</string>
<string name="download_path_dialog_title">بوخچەی داگرتن بۆ پەڕگەی ڤیدیۆکان هەڵبژێرە</string>
<string name="channel_created_by">دروستکراو لەلایەن %s</string>
<string name="users">بەکارهێنەران</string>
<string name="content">ناوەڕۆک</string>
<string name="use_external_video_player_title">به‌كارهێنانی كارپێكه‌ری ڤیدیۆی ده‌ره‌كی</string>
<string name="enable_lock_screen_video_thumbnail_title">چالاککردنی وێنۆچکەی ڤیدیۆی داخستنی ڕوونما</string>
<string name="play_audio">ده‌نگ</string>
<string name="tab_main">سه‌ره‌كی</string>
<string name="use_tor_title">بەکارهێنانی Tor</string>
<string name="show_original_time_ago_title">پیشاندانی کاتی بنچینەیی پێشوو لەسەر بابەتەکان</string>
<string name="play_queue_stream_detail">وردەکارییەکان</string>
<string name="peertube_instance_add_exists">هەمان دۆخ کاراکراوە</string>
<string name="content_language_title">زمانی بنەڕەتی داوانامە</string>
<string name="tab_bookmarks">خشتەی کارپێکردنەکان نیشانەکران</string>
<string name="privacy_policy_title">سیاسەتی تایبەتی داوانامە</string>
<string name="settings_category_downloads_title">داگرتن</string>
<string name="history_empty">مێژوو بەتاڵە</string>
<string name="feed_use_dedicated_fetch_method_disable_button">چالاک نەکردنی دۆخی خێرا</string>
<string name="open_in_browser">كردنه‌وه‌ له‌ وێبگه‌ر</string>
<string name="error_http_no_content">ڕاژەکە هیچ داتایەک نانێرێت</string>
<string name="watch_history_states_deleted">شوێنی کارپێکراوەکان سڕانەوە.</string>
<string name="app_update_notification_channel_description">ئاگانامەکانی وەشانی نوێی داوانامە</string>
<string name="download_finished">داگرتن تەواوبوو</string>
<string name="show_higher_resolutions_summary">تەنها چەند مۆبایلێک پشتگیری کارپێکردنی ڤیدیۆی 2K/4K دەکەن</string>
<string name="notification_channel_description">ئاگانامەکانی داوانامە بۆ پاشبنەما و کارپێکردنەکانی پەنجەرەی بچووک</string>
<string name="feed_use_dedicated_fetch_method_summary">لەهەندێ خزمەتگوزاریدا بەردەستە، هەمیشە خێرایە بەڵام ڕەنگە هەندێ لە بابەتەکان زانیارییەکانیان ناتەواو بێت (وەک نەبوونی ماوە، جۆری بابەت ، نەبوونی پەخش).</string>
<plurals name="seconds">
<item quantity="one">%d چرکە</item>
<item quantity="other">%d چرکە</item>
</plurals>
<string name="recovering">دەگەڕێنرێتەوە</string>
<string name="next_video_title">دواتر</string>
<string name="action_open_website">کردنەوەی ماڵپەڕ</string>
<string name="autoplay_by_calling_app_summary">ڤیدیۆ کارپێبکرێ کاتێ ئەپەکە لە ئەپێکیتر کرایەوە</string>
<string name="autoplay_title">کارپێکردنی خۆکاری</string>
<string name="max_retry_msg">زیاترین هەوڵدانەکان</string>
<string name="service_title">خزمەتگوزاری</string>
<string name="new_and_hot">نوێ &amp; چالاک</string>
<string name="download_already_running">داگرتنێکی ترت هەیە بەهەمان ناو</string>
<string name="kiosk">کیۆسک</string>
<plurals name="videos">
<item quantity="one">%s ڤیدیۆ</item>
<item quantity="other">%s ڤیدیۆکان</item>
</plurals>
<string name="retry">هەوڵدانەوە</string>
<string name="remove_watched_popup_title">ڤیدیۆ تەماشاکراوەکان بسڕێنەوە؟</string>
<string name="playlists">لیستی کارپێکردنەکان</string>
<string name="choose_instance_prompt">دۆخێک هەڵبژێرە</string>
<string name="skip_silence_checkbox">بردنەپێشەوەی خێرا لەکاتی بێدەنگکردن</string>
<string name="your_comment">لێدوانەکەت (بە ئینگلیزی):</string>
<string name="show_play_with_kodi_summary">پیشاندانی بژارده‌ی كارپێكردنی ڤیدیۆ به‌ Kodi</string>
<string name="overwrite_unrelated_warning">پەڕگەیەک بەهەمان ناو هەیە</string>
<plurals name="days">
<item quantity="one">%d ڕۆژ</item>
<item quantity="other">%d ڕۆژەکان</item>
</plurals>
<string name="rename_playlist">ناولێنان</string>
<string name="download">داگرتن</string>
<string name="finish">باشە</string>
<string name="metadata_cache_wipe_title">خاوێنکردنەوەی پاشماوەی داتا</string>
<string name="error_download_resource_gone">ناتوانرێ ئەم داگرتنە بهێنرێتەوە</string>
<string name="unsubscribe">بەشدارنەبوون</string>
<string name="switch_view">گۆڕینی پیشاندان</string>
<string name="video_streams_empty">هیچ پەخشێکی ڤیدیۆیی نەدۆزرایەوە</string>
<string name="import_from">هێنانەوە لە</string>
<string name="subtitle_activity_recaptcha">گرتە بکە لەسەر ”تەواو” کاتێ کە چارەسەرکرا</string>
<string name="app_update_notification_channel_name">ئاگانامەی نوێکاری داوانامە</string>
<string name="could_not_load_thumbnails">ناتوانرێ هەموو وێنۆچکەکان باربکرێن</string>
<string name="view_count_text">%1$s بینراو</string>
<string name="previous_export">هەناردەکردنی پێشووتر</string>
<string name="no_valid_zip_file">پەڕگەی ZIP دروست نییە</string>
<string name="disabled">ناچالاککراوە</string>
<string name="contribution_title">بەشداریکردن</string>
<string name="err_dir_create">ناتوانرێ شوێنی داگرتن دروستبکرێ \'%1$s\'</string>
<string name="dismiss">پشتگوێخستن</string>
<string name="downloads_title">داگرتنەکان</string>
<string name="contribution_encouragement">هەرکاتێ بیرۆکەیەکت هەبوو وەک ; وەرگێڕان، گۆڕینی دیزاین ، سڕینەوەی کۆد ،یان هەر گۆڕانکارییەکیتر ئەوا یارمەتییەکەت لەسەرچاوانمانە. ئێمە هەمیشە دەمانەوێ ئەپەکە زیاتر بەرەوپێش ببەین!</string>
<string name="playlist_add_stream_success">خشتەی کارپێکردن دانرا</string>
<string name="show_age_restricted_content_title">سنوردانانی تەمەن</string>
<string name="choose_browser">هه‌ڵبژاردنی وێبگه‌ر</string>
<string name="no_comments">هیچ لێدوانێک نییە</string>
<string name="seek_duration_title">ماوەی خێرا بردنە پێشەوە\\ گێڕانەوە بۆ دواوە</string>
<string name="undo">گەڕانەوە</string>
<string name="overwrite">چوونەجێگەی</string>
<string name="error_path_creation">بوخچەی مەبەست ناتوانرێ دروست بکرێ</string>
<string name="error_timeout">هێڵی ئینتەرنێت نەما</string>
<string name="history_cleared">مێژوو سڕایەوە</string>
<string name="clear_playback_states_summary">شوێنی هەموو کارپێکراوەکان دەسڕێتەوە</string>
<string name="delete_item_search_history">ئایا دەتەوێ ئەم بابەتە لە مێژووی گەڕان بسڕدرێتەوە؟</string>
<string name="confirm_prompt">ئایا دەتەوێ مێژووی داگرتنەکانت بسڕدرێنەوە یان هەموو پەڕگە داگیراوەکان بسڕدرێنەوە؟</string>
<string name="show_info">پیشاندانی زانیاری</string>
<string name="download_already_pending">داگرتنێکیتر هەیە بەهەمان ناو</string>
<string name="autoplay_by_calling_app_title">كاركردنی خۆكارانه‌</string>
<string name="feed_group_dialog_empty_selection">هیچ بەشدارییەک دیاری نەکراوە</string>
<string name="feed_group_dialog_empty_name">ناوی کۆمەڵە بەتاڵە</string>
<string name="recaptcha_done_button">تەواو</string>
<string name="detail_likes_img_view_description">بەدڵبوون</string>
<string name="error_unable_to_load_license">ناتوانرێ مۆڵەت باربکرێ</string>
<string name="popup_remember_size_pos_summary">بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ی بچووك</string>
<string name="create">دروستکردن</string>
<string name="import_network_expensive_warning">ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە.
\n
\nدەتەوێ بەردەوامبیت؟</string>
<string name="all">هەمووی</string>
<string name="close">داخستن</string>
<string name="auto">خۆکاری</string>
<string name="could_not_load_image">ناتوانرێ وێنە باربکرێ</string>
<string name="audio">دەنگ</string>
<string name="downloads_storage_ask_summary_kitkat">پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر پەڕگەیەک
\nدەتوانیت SAF بەکاربهێنیت گەر دەتەوێ لە بیرگەی دەرەکیدا پەڕگەکان دابگریت</string>
<string name="export_ongoing">هەناردەدەکرێت…</string>
<string name="error_details_headline">وردەکارییەکان:</string>
<string name="no_streams_available_download">هیچ پەخشێک نییە بۆ داگرتن</string>
<string name="feed_subscription_not_loaded_count">بارنەکراو : %d</string>
<string name="preferred_player_fetcher_notification_message">بارکردنی ناوەڕۆکی داواکراو</string>
<string name="error_permission_denied">ڕێگەپێدان ڕەتکرایەوە لەلایەن سیستەمەوە</string>
<string name="clear_views_history_summary">مێژوو دەسڕێتەوە لەگەڵ ڤیدیۆ کارپێکراوەکان و شوێنی لیستە ڤیدیۆییەکان</string>
<string name="caption_auto_generated">دانانی خۆکاری</string>
<string name="one_item_deleted">١ بابەت سڕایەوە.</string>
<string name="preferred_open_action_settings_summary">کرداری بنەڕەتی لەکاتی کردنەوەی بابەت — %s</string>
<string name="select_a_kiosk">هەڵبژاردنی کیۆسک</string>
<string name="conferences">کۆنفرانسەکان</string>
<string name="toast_no_player">هیچ داوانامەیەک دانەمەزراوە بۆ کارپێکردنی ئەم پەڕگەیە</string>
<string name="open_in_popup_mode">كردنه‌وه‌ له‌ په‌نجه‌ره‌ی بچووک</string>
<string name="limit_mobile_data_usage_title">سنووری قەبارە لەکاتی بەکارهێنانی داتای مۆبایل</string>
<string name="enqueue_on_popup">ڕیزنەبوون لە پەنجەرەی بچووک</string>
<string name="drawer_close">داخستنی پلیکانە</string>
<string name="channel">کەناڵ</string>
<string name="label_code">کۆد</string>
<string name="settings_category_clear_data_title">سڕینەوەی داتا</string>
<string name="action_settings">ڕێکخستنەکان</string>
<string name="duration_live">زیندوو</string>
<string name="report_error">سکاڵا لەبوونی کێشە</string>
<string name="no_channel_subscribed_yet">هیچ کەناڵێکی بەشداری نییە</string>
<string name="pause_downloads_on_mobile">ڕاوەستا لەسەر کێشەی هێڵ</string>
<string name="subscription_change_failed">ناتوانیت گۆڕانكاری له‌م به‌شدارییه‌دا بكه‌یت</string>
<string name="default_resolution_title">وردی بنەڕەتی</string>
<string name="minimize_on_exit_popup_description">بچووککردنەوە بۆ پەنجەرەی بچووک</string>
<string name="brightness_gesture_control_summary">جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما</string>
<string name="songs">گۆرانییەکان</string>
<string name="controls_download_desc">داگرتنی پەڕگەی پەخش</string>
<string name="msg_url_malform">بەستەر هەڵەیە یاخوود بەئینتەرنێتەوە پەیوەست نەبوویت</string>
<string name="list_view_mode">شێوازی پیشاندانی خشتە</string>
<string name="peertube_instance_add_title">زیادکردنی دۆخ</string>
<string name="accept">پەسەند کردن</string>
<string name="drawer_header_action_paceholder_text">بەمزووانە شتێک لێرەدا دەردەکەوێ :D</string>
<string name="title_history_view">تەماشاکراوە</string>
<string name="delete_playlist_prompt">ئەم خشتەی کارپێکردنە بسڕدرێتەوە؟</string>
<string name="popup_playing_append">ڕیزکرا لە کارپێکردن لە پەنجەرەی بچووک</string>
<string name="mute">بێدەنگکردن</string>
<string name="website_encouragement">سەردانی ماڵپەڕی داوانامەکەمان بکە بۆ زانیاری و هەواڵی نوێ.</string>
<string name="delete_all_history_prompt">ئایا دڵنیای لە سڕینەوەی هەموو بابەتەکان لە مێژوودا؟</string>
<string name="delete_stream_history_prompt">ئایا دەتەوێ ئەم بابەتە لە مێژووی تەماشاکردن بسڕدرێتەوە؟</string>
<string name="app_description">داونامایەکی خۆڕایی و کێشی کەم بۆ پەخشی ڕاستەوخۆ لەسەر ئەندرۆید.</string>
<string name="content_not_available">ناوەڕۆک بوونی نییە</string>
<string name="peertube_instance_url_help">ئەو دۆخانە بدۆزەرەوە کە لەگەڵ خۆتدا دەگونجێن لە %s</string>
<string name="file">پەڕگە</string>
<string name="error_http_not_found">نەدۆزرایەوە</string>
<string name="title_history_search">گەڕا</string>
<string name="post_processing">چارەسەردەکرێت</string>
<string name="volume_gesture_control_summary">جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ</string>
<string name="main_page_content">ناوەڕۆکی پەڕەی سەرەکی</string>
<string name="feed_group_dialog_select_subscriptions">دیاریکردنی بەشدارییەکان</string>
<string name="import_file_title">هێنانەوەی پەڕگە</string>
<string name="download_path_audio_title">بوخچەی داگرتنی ده‌نگ</string>
<string name="use_external_video_player_summary">هه‌نێ له‌ قه‌باره‌كان ده‌نگیان تێدا نابێت</string>
<string name="events">ڕووداوەکان</string>
<string name="detail_uploader_thumbnail_view_description">وێنۆچکەی کەسی بەرزکەرەوە</string>
<string name="app_update_notification_content_text">گرتەبکە بۆ داگرتن</string>
<string name="import_complete_toast">هێنرایەوە</string>
<string name="downloads">داگرتنەکان</string>
<string name="playback_speed_control">کۆنترۆڵی خێرایی کارپێکەر</string>
<string name="feed_group_dialog_delete_message">ئایا دەتەوێ ئەم کۆمەڵەیە بسڕیتەوە؟</string>
<string name="hold_to_append">پەنجەت داگرە بۆ ڕیزنەبوون</string>
<string name="max_retry_desc">زۆرترین ژمارەی هەوڵدان پێش پاشگەزبوونەوە لە داگرتنەکە</string>
<string name="general_error">هەڵەیەک ڕوویدا</string>
<string name="delete_all">هەمووی بسڕەوە</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>
<string name="checksum">تاقیکردنەوەی هێڵێک</string>
<string name="permission_display_over_apps">دەسەڵاتی پێبدە بۆ پیشاندان لەسەرووی داوانامەکانی ترەوە</string>
<string name="watch_history_deleted">مێژووی تەماشاکردن سڕایەوە.</string>
<string name="playback_step">هەنگاو</string>
<string name="msg_wait">تکایە چاوەڕێبکە…</string>
<string name="read_privacy_policy">خوێندنەوەی سیاسەتی تایبەتی</string>
<string name="delete_downloaded_files">سڕینەوەی پەڕگە داگیراوەکان</string>
<string name="sorry_string">ببوورە، ناتوانرێ ئەوە ڕووبدات.</string>
<string name="resize_fill">پڕ بە ڕونما</string>
<string name="popup_player">کارپێکەری پەنجەرەی بچووک</string>
<string name="playback_reset">ڕێکخستنەوە</string>
<string name="export_data_title">هەناردەکردنی بنکەی زانیارییەکان</string>
<string name="dark_theme_title">تاریک</string>
<string name="feed_use_dedicated_fetch_method_title">تێکەڵکردن لە دیاری تەرخانکراوەوە کاتێ بەردەست بوو</string>
<string name="download_failed">داگرتن شکستی هێنا</string>
<string name="error_connect_host">ناتوانرێ بە ڕاژەوە پەیوەست بیت</string>
<string name="start_here_on_main">دەستپێکردنی لێدان لێرەوە</string>
<string name="detail_thumbnail_view_description">کارپێکردنی ڤیدیۆ، ماوەی:</string>
<string name="short_thousand">هەزار</string>
<string name="most_liked">زۆرترین بەدڵبوون</string>
<string name="delete">سڕینەوە</string>
<string name="default_video_format_title">جۆری بنەڕەتی ڤیدیۆ</string>
<string name="empty_subscription_feed_subtitle">هیچ شتێک لێرەدا نییە</string>
<string name="clear">سڕینەوە</string>
<string name="invalid_directory">هەمان فۆڵدەر بوونی نییە</string>
<string name="bookmark_playlist">دڵخوازکردنی لیستی کارپێکردن</string>
<string name="file_name_empty_error">ناوی پەڕگە ناکرێ بەتاڵ بێت</string>
<string name="youtube_signature_decryption_error">ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە</string>
<string name="updates_setting_description">پیشاندانی ئاگانامەیەک بۆ ئامادەبوونی داوانامە لەکاتی بەردەست بوونی وەشانی نوێ</string>
<string name="tab_contributors">بەشداربووەکان</string>
<string name="enable_watch_history_title">مێژووی تەماشاکردن</string>
<string name="enable_disposed_exceptions_title">سکاڵا لەسەر کێشەکان</string>
<string name="playlist_no_uploader">خۆکاری دانرا (هیچ بەرزکەرەوەیەک نەدۆزرایەوە)</string>
<string name="start_here_on_background">دەستپێکردنی لێدان لە پاشبنەماوە</string>
<string name="msg_name">ناوی پەڕگە</string>
<string name="set_as_playlist_thumbnail">دانان لەسەر وێنۆچکەی خشتەی کارپێکردن</string>
<string name="title_activity_about">دەربارەی داوانامە</string>
<string name="append_playlist">زیادکردن بۆ خشتەی کارپێکردن</string>
<string name="unknown_content">(نەزانراو)</string>
<string name="app_language_title">زمانی داوانامە</string>
<string name="kiosk_page_summary">پەڕەی کیۆسک</string>
<string name="resume_on_audio_focus_gain_title">دەستپێکردنەوە کارپێکردن</string>
<string name="missing_file">شوێنی پەڕگە گۆڕدراوە یان سڕاوەتەوە</string>
<string name="settings_file_replacement_character_summary">هێما نادروستەکان بەم بەهایە جێگۆڕکێ دەکرێن</string>
<string name="refresh">نوێکردنەوە</string>
<string name="search">گه‌ڕان</string>
<string name="restore_defaults">گێڕانەوە بۆ بنەڕەتی</string>
<string name="player_gesture_controls_title">کۆنتڕۆڵی کارپێکەر بەجوڵەی پەنجە</string>
<string name="recaptcha_request_toast">reCAPTCHA داواکراوە</string>
<string name="switch_to_popup">گۆڕین بۆ پەنجەرەی بچووک</string>
<string name="preferred_open_action_settings_title">کرداری ’کردنەوە’ی پێشنیارکراو</string>
<plurals name="minutes">
<item quantity="one">%d خولەک</item>
<item quantity="other">%d خولەك</item>
</plurals>
<string name="feed_processing_message">ئامادەکردن…</string>
<string name="albums">ئەلبوومەکان</string>
<string name="no_videos">هیچ ڤیدیۆیەک نییە</string>
<string name="video_detail_by">لەلایەن %s</string>
<string name="toggle_orientation">دانانی ئاڕاستە</string>
<string name="main_page_content_summary">چ پەڕەیەک نیشانبدرێ لە پەڕەی سەرەکی</string>
<string name="error_snackbar_action">ڕاپۆرت</string>
<string name="always_ask_open_action">هەمیشە بپرسە</string>
<string name="enable_watch_history_summary">هێشتنەوەی تراکی ڤیدیۆ کارپێکراوەکان</string>
<string name="use_external_audio_player_title">به‌كارهێنانی كارپێكه‌ری ده‌نگی ده‌ره‌كی</string>
<string name="view_on_github">بینین لە GitHub</string>
<string name="what_device_headline">زانیاری:</string>
<string name="no_player_found_toast">هیچ کارپێکەرێکی ڤیدیۆیی نەدۆزرایەوە (دەتوانی کارپێکەری VLC دامەزرێنی) .</string>
<string name="player_unrecoverable_failure">نەگێڕانەوەی کارپێکەر بۆ پێش کێشە ڕوویدا</string>
<string name="import_ongoing">دەهێنرێتەوە…</string>
<string name="share_dialog_title">هاوبه‌شپێكردن له‌گه‌ڵ</string>
<string name="drawer_header_description">خزمەتگوزاری چەسپاو، ئێستا هەڵبژێردراو:</string>
<string name="delete_search_history_alert">تەواوی گەڕانەکانت بسڕدرێنەوە؟</string>
<string name="resume_on_audio_focus_gain_summary">بەردەوام بوونی ڤیدیۆ لەدوای هەبوونی هەر بڕینێک (وەک پەیوەندی تەلەفۆنی)</string>
<string name="main_bg_subtitle">گرته‌ له‌ ”گه‌ڕان” بكه‌ بۆ ده‌ستپێكردن</string>
<string name="enable_search_history_summary">کۆگای گەڕانی نێوخۆیی</string>
<string name="settings_category_video_audio_title">ڤیدیۆ &amp; دەنگ</string>
<string name="share">هاوبه‌شپێكردن</string>
<string name="download_choose_new_path">بوخچەی داگرتن بگۆڕە بۆ ئەنجامدانی کاریگەری</string>
<string name="show_hold_to_append_summary">پیشاندانی ڕێنمایی کاتێ لە پاشبنەما یاخوود پەنجەرەی بچووکدا گرتە دەکرێ لەسەر” وردەکاری:” ڤیدیۆیەک</string>
<string name="deleted_downloads">%1$d لە داگرتنەکان سڕانەوە</string>
<string name="audio_streams_empty">پەخشی هیچ دەنگێک نەدۆزرایەوە</string>
<string name="artists">هونەرمەندەکان</string>
<string name="no_one_watching">هیچ کەسێک تەماشای ناکات</string>
<string name="action_about">دەربارە</string>
<string name="no_available_dir">تکایە بوخچەیەک بۆ شوێنی داگرتن دیاریبکە لە ڕێکخستنەکان</string>
<string name="feed_notification_loading">بارکردن…</string>
<string name="new_seek_duration_toast">بەهۆی ExoPlayer ەوە ماوەی بردنەپێش و بردنەپاش لە %d چرکەدا دیاریکرا</string>
<string name="clear_playback_states_title">سڕینەوەی شوێنی کارپێکراوەکان</string>
<string name="recently_added">لەم ماوەیەدا بڵاوکرابێتەوە</string>
<string name="rename">ناولێنان</string>
<string name="background_player">کارپێکەری پاشبنەما</string>
<string name="error_file_creation">پەڕگە ناتوانرێ دروستبکرێ</string>
<string name="give_back">پێدانەوە</string>
<string name="create_playlist">خشتەی کارپێکردنی نوێ</string>
<plurals name="hours">
<item quantity="one">%d کاتژمێر</item>
<item quantity="other">%d کات ژمێر</item>
</plurals>
<string name="upload_date_text">بڵاوكراوه‌ته‌وه‌ له‌ %1$s</string>
<string name="history_disabled">مێژوو ناچالاکە</string>
<string name="thumbnail_cache_wipe_complete_notice">کاشی وێنە‌كان سڕایه‌وه‌</string>
<string name="settings_file_replacement_character_title">هێمای جێگۆڕین</string>
<string name="settings">ڕێكخستنه‌كان</string>
<string name="missions_header_finished">تەواوبوو</string>
<string name="import_youtube_instructions">بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە پەڕگەی خەزن بوو بگەڕێنیتەوە:
\n
\n1. ئەم بەستەرە بکەوە: %1$
\n2. بچۆرەژوورەوە گەر داوای‌ کرد
\n3. داگرتنێک دەست پێدەکات (ئەمە پەڕگەی خەزنکراوە)</string>
<string name="systems_language">بنەڕەتی سیستەم</string>
<string name="network_error">کێشە لە هێڵەکەتدا هەیە</string>
<plurals name="watching">
<item quantity="one">%s تەماشا دەکات</item>
<item quantity="other">%s تەماشا دەکەن</item>
</plurals>
<string name="error_report_title">هەڵە لە ڕاپۆرتکردن</string>
<string name="metadata_cache_wipe_summary">سڕینەوەی پاشماوەی هەموو داتاکان</string>
<string name="kore_not_found">داوانامەکە نه‌دۆزرایه‌وه‌. دابمه‌زرێت؟</string>
<string name="peertube_instance_add_fail">ناتوانرێ پشتگیری دۆخەکە بکرێ</string>
<string name="background_player_append">ڕیزکرا لە کارپێکردن لە پاشبنەما</string>
<string name="install">دامەزراندن</string>
<string name="info_dir_created">شوێنی داگرتن دانرا \'%1$s\'</string>
<string name="videos_string">ڤیدیۆکان</string>
<string name="url_not_supported_toast">بەستەرەکە پشتگیری نەکراوە</string>
<string name="playback_pitch">شەپۆلی دەنگ</string>
<string name="minimize_on_exit_summary">کرداری کاتی گۆڕین بۆ داوانامەیەکی تر لە کارپێکەری ڤیدیۆییەوە — %s</string>
<string name="msg_copied">لەبەرگیرایەوە</string>
<string name="downloads_storage_use_saf_summary">چوارچێوەی گەیشتن بە بیرگە ڕێگەدەدات بە داگرتنی پەڕگەکان لە بیرگەی دەرەکیدا.
\nتێبینی: هەندێ لە مۆبایلەکان پشتگیری ناکرێن</string>
<string name="resize_fit">گونجاو بە ڕونما</string>
<string name="enable_leak_canary_summary">چاودێری دزەکردنی بیرگە ڕەنگە ببێتە هۆی وەڵامنەدانەوەی لەکاتی گەرمبوون</string>
<string name="unmute">بێدەنگ نەکردن</string>
<string name="local">ناوخۆ</string>
<string name="trending">پڕبینەرەکان</string>
<string name="enable_queue_limit_desc">تەنها یەک داگرتن کاردەکات لەیەک کاتدا</string>
<string name="restore_defaults_confirmation">ئایا دەتەوێ بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟</string>
<string name="storage_permission_denied">دەسەڵاتی گەیشتن بە بیرگە نەدرا</string>
<string name="pause_downloads">ڕاگرتنی داگرتنەکان</string>
<string name="tab_about">دەربارە</string>
<string name="screen_rotation">خولانەوە</string>
<string name="playlist_delete_failure">ناتوانی ئەم خشتەی کارپێکردنە بسڕیتەوە.</string>
<string name="show_comments_title">پیشاندانی لێدوانەکان</string>
<string name="start_accept_privacy_policy">بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی ئەپەکەمان. تکایە بەئاگادارییەوە بیخوێنەوە.
\nپێویستە قبوڵی بکەیت بۆ ناردنی سکاڵاکانت.</string>
<string name="content_not_supported">ئەم ناوەڕۆکە پشتگیری نەکراوە لەلایەن ئەپەکەمانەوە.
\n
\nهیوادارین بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین.</string>
<string name="donation_title">بەخشین</string>
<string name="no_one_listening">هیچ کەسێ گوێی لێ ناگرێ</string>
<string name="search_history_deleted">مێژووی گەڕانەکانت سڕانەوە.</string>
<string name="video">ڤیدیۆ</string>
<string name="error_postprocessing_stopped">ئەپ داخرا لەکاتی کارکردن لەسەر ئەو پەڕگەیە</string>
<string name="video_player">کارپێکەری ڤیدیۆیی</string>
<string name="show_comments_summary">ناچالاککردن بۆ پیشان نەدانی لێدوانەکان</string>
<string name="light_parsing_error">ناتوانرێ ماڵپەڕ بەتەواوی شیبکرێتەوە</string>
<string name="downloads_storage_use_saf_title">بەکارهێنانی SAF</string>
<string name="feed_update_threshold_summary">کاتی پاش دواین نوێکردنەوە دوای بەشداربوون ڕەچاوکراوە — %s</string>
<string name="download_to_sdcard_error_title">بیرگەی دەرەکی بەردەست نییە</string>
<string name="enable_playback_resume_summary">گێڕانەوەی لیست بۆ شوێنی پێشووتر</string>
<string name="cancel">پاشگه‌زبوونه‌وه‌</string>
<string name="tracks">تراکەکان</string>
<string name="play_queue_audio_settings">ڕێکخستنەکانی دەنگ</string>
<string name="video_is_age_restricted">پیشاندانی ئەو ڤیدیۆیانەی سنوری تەمەنیان بۆ دانراوە. لە ڕێکخستنەکانەوە ڕێگەی پێدەدرێت.</string>
<string name="downloads_storage_ask_summary">پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر پەڕگەیەک</string>
<string name="title_last_played">دواین کارپێکراو</string>
<string name="could_not_setup_download_menu">ناتوانرێ لیستی داگرتن دابنرێ</string>
<string name="import_export_title">هێنانەوە/هاوردەکردن</string>
<string name="title_activity_background_player">کارپێکەری پاشبنەما</string>
<string name="app_update_notification_content_title">وەشانی نوێی داوانامە بەردەستە!</string>
<string name="playlist_thumbnail_change_success">وێنۆچکەی خشتەی کارپێکردن گۆڕدرا.</string>
<string name="import_soundcloud_instructions">هێنانەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی:
\n
\n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە)
\n2. ئەم بەستەرە بکەرەوە : %1$s
\n3. بچۆرە ژوورەوە گەر داواکرا
\n4. بەستەری پەڕەی کەسییەکەت دابنێ.</string>
<string name="charset_letters_and_digits">پیت و ژمارەکان</string>
<string name="default_content_country_title">وڵاتی بنەڕەتی</string>
<string name="updates_setting_title">نوێکارییەکان</string>
</resources>

View File

@ -433,7 +433,7 @@ otevření ve vyskakovacím okně</string>
<string name="grid">Mřížka</string>
<string name="auto">Automaticky</string>
<string name="switch_view">Přepnout zobrazení</string>
<string name="app_update_notification_content_title">K dispozici je aktualizace aplikace NewPipe!</string>
<string name="app_update_notification_content_title">Aktualizace NewPipe je k dispozici!</string>
<string name="app_update_notification_content_text">Klepněte pro stažení</string>
<string name="missions_header_finished">Hotovo</string>
<string name="missions_header_pending">Vyčkávání</string>
@ -538,7 +538,7 @@ otevření ve vyskakovacím okně</string>
<string name="enable_lock_screen_video_thumbnail_summary">Při použití přehrávače na pozadí se náhled videa ukáže na zamknuté obrazovce</string>
<string name="clear_download_history">Smazat historii stahování</string>
<string name="delete_downloaded_files">Smazat stažené soubory</string>
<string name="deleted_downloads">Smazat %1$s stahování</string>
<string name="deleted_downloads">Smazat %1$d stahování</string>
<string name="permission_display_over_apps">Souhlasit se zobrazením přes jiné aplikace</string>
<string name="app_language_title">Jazyk aplikace</string>
<string name="systems_language">Jazyk systému</string>

View File

@ -4,8 +4,7 @@
<string name="upload_date_text">Veröffentlicht am %1$s</string>
<string name="no_player_found">Keinen Stream-Player gefunden. VLC installieren\?</string>
<string name="install">Installieren</string>
<string name="cancel">Abbrechen
\n</string>
<string name="cancel">Abbrechen</string>
<string name="open_in_browser">Im Browser öffnen</string>
<string name="share">Teilen</string>
<string name="download">Herunterladen</string>
@ -65,10 +64,12 @@
<string name="live_streams_not_supported">Live-Streams werden noch nicht unterstützt</string>
<string name="light_parsing_error">Konnte Webseite nicht vollständig analysieren</string>
<string name="error_report_button_text">Fehler via E-Mail melden</string>
<string name="copy_for_github">Formatierten Fehlerbericht kopieren</string>
<string name="error_report_open_issue_button_text">Fehler auf GitHub melden</string>
<string name="error_snackbar_action">Melden</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">Dies ist passiert:</string>
<string name="info_labels">Was:\\nAnfrage:\\nSprache des Inhalts:\\nDienst:\\nZeit (GMT):\\nPaket:\\nVersion:\\nOS-Version:</string>
<string name="info_labels">Was:\\nAnfrage:\\nSprache des Inhalts:\\nLand des Inhalts:\\nSprache der App:\\nDienst:\\nZeit (GMT):\\nPaket:\\nVersion:\\nOS-Version:</string>
<string name="error_details_headline">Details:</string>
<string name="video">Video</string>
<string name="audio">Audio</string>
@ -240,7 +241,7 @@
<string name="show_hold_to_append_title">„Zum Anhängen gedrückt halten“ Tipp anzeigen</string>
<string name="unknown_content">[Unbekannt]</string>
<string name="enqueue_on_background">In Warteschlange für Hintergrundwiedergabe</string>
<string name="enqueue_on_popup">In Warteschlange in neuem Pop-up</string>
<string name="enqueue_on_popup">In Warteschlange in einem Pop-up</string>
<string name="start_here_on_main">Ab hier wiedergeben</string>
<string name="start_here_on_background">Wiedergabe im Hintergrund starten</string>
<string name="start_here_on_popup">Wiedergabe in einem Pop-up starten</string>
@ -427,7 +428,7 @@
<string name="grid">Gitter</string>
<string name="auto">Auto</string>
<string name="switch_view">Ansicht wechseln</string>
<string name="app_update_notification_content_title">NewPipe-Update verfügbar!</string>
<string name="app_update_notification_content_title">NewPipe-Update ist verfügbar!</string>
<string name="app_update_notification_content_text">Zum Herunterladen antippen</string>
<string name="missions_header_finished">Fertig</string>
<string name="missions_header_pending">Ausstehend</string>
@ -531,7 +532,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Ein Video-Miniaturbild wird auf dem Sperrbildschirm angezeigt, wenn der Hintergrundplayer verwendet wird</string>
<string name="clear_download_history">Downloadverlauf löschen</string>
<string name="delete_downloaded_files">Heruntergeladene Dateien löschen</string>
<string name="deleted_downloads">%1$s Downloads gelöscht</string>
<string name="deleted_downloads">%1$d Downloads gelöscht</string>
<string name="permission_display_over_apps">Berechtigung zur Anzeige über andere Apps erteilen</string>
<string name="app_language_title">Sprache der App</string>
<string name="systems_language">Systemstandard</string>
@ -614,4 +615,5 @@
<string name="detail_sub_channel_thumbnail_view_description">Avatarbild des Kanals</string>
<string name="channel_created_by">Erstellt von %s</string>
<string name="video_detail_by">Von %s</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Nur nicht gruppierte Abonnements anzeigen</string>
</resources>

View File

@ -170,7 +170,7 @@
<string name="hold_to_append">Teni por viciĝi</string>
<string name="unknown_content">[Nekonata]</string>
<string name="enqueue_on_background">Viciĝi en la fona ludilo</string>
<string name="enqueue_on_popup">Viciĝi en nova ŝprucfenestro</string>
<string name="enqueue_on_popup">Viciĝi en ŝprucfenestro</string>
<string name="start_here_on_popup">Komenci ludi en nova ŝprucfenestro</string>
<string name="default_content_country_title">Preferata enhavlando</string>
<string name="toggle_orientation">Ŝangi Orientiĝon</string>
@ -530,7 +530,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Bildeta filmeto estas montrita ĉe ŝlosita ekrano uzante la fona ludilo</string>
<string name="clear_download_history">Forviŝi la historion de elŝutoj</string>
<string name="delete_downloaded_files">Forviŝi elŝutitajn dosierojn</string>
<string name="deleted_downloads">%1$s elŝutoj forviŝitaj</string>
<string name="deleted_downloads">%1$d elŝutoj forviŝitaj</string>
<string name="videos_string">Filmetoj</string>
<string name="permission_display_over_apps">Doni la permeson por afiŝiĝi supre aliaj apoj</string>
<string name="app_language_title">Preferata aplingvo</string>
@ -582,4 +582,9 @@
<string name="unmute">Malmutigi</string>
<string name="help">Helpo</string>
<string name="content_not_supported">Tio enhavo ne estas ankoraŭ subtenata per NewPipe.\n\nĜi espereble estos en sekvanta versio.</string>
<string name="infinite_videos">∞ filmetoj</string>
<string name="more_than_100_videos">100+ filmetoj</string>
<string name="artists">Artistoj</string>
<string name="albums">Albumoj</string>
<string name="songs">Kantoj</string>
</resources>

View File

@ -2,7 +2,7 @@
<resources>
<string name="view_count_text">%1$s vistas</string>
<string name="upload_date_text">Publicado el %1$s</string>
<string name="no_player_found">No se encontró reproductor. ¿Instalar VLC\?</string>
<string name="no_player_found">No se encontró ningún reproductor de retransmisiones. ¿Instalar VLC\?</string>
<string name="install">Instalar</string>
<string name="cancel">Cancelar</string>
<string name="open_in_browser">Abrir en el navegador</string>
@ -15,14 +15,14 @@
<string name="choose_browser">Elegir navegador</string>
<string name="screen_rotation">giro</string>
<string name="download_path_title">Carpeta de descarga de vídeo</string>
<string name="download_path_summary">Aquí se almacenan los vídeos descargados</string>
<string name="download_path_dialog_title">Elegir carpeta de descarga para vídeos</string>
<string name="download_choose_new_path">Cambie las carpetas de descarga para que tenga efecto</string>
<string name="download_path_summary">Los archivos de vídeo descargados se almacenan aquí</string>
<string name="download_path_dialog_title">Elija la carpeta de descarga para los archivos de vídeo</string>
<string name="download_choose_new_path">Cambie las carpetas de descarga para que surtan efecto</string>
<string name="default_resolution_title">Resolución predeterminada</string>
<string name="play_with_kodi_title">Reproducir con Kodi</string>
<string name="kore_not_found">¿Instalar aplicación Kore faltante\?</string>
<string name="kore_not_found">¿Instalar la app Kore que falta\?</string>
<string name="show_play_with_kodi_title">Mostrar opción «Reproducir con Kodi»</string>
<string name="show_play_with_kodi_summary">Mostrar una opción para reproducir vídeo en el centro multimedia Kodi</string>
<string name="show_play_with_kodi_summary">Mostrar opción para reproducir vídeo a través del centro de medios Kodi</string>
<string name="play_audio">Audio</string>
<string name="default_audio_format_title">Formato de audio predeterminado</string>
<string name="download_dialog_title">Descargar</string>
@ -41,8 +41,8 @@
<string name="use_tor_summary">(Experimental) Forzar la descarga a través de Tor para una mayor privacidad (transmisión de vídeos aún no compatible).</string>
<string name="err_dir_create">No se puede crear la carpeta de descargas «%1$s»</string>
<string name="info_dir_created">Se creó la carpeta de descargas «%1$s»</string>
<string name="download_path_audio_summary">Aquí se almacenan los audios descargados</string>
<string name="download_path_audio_dialog_title">Elegir carpeta de descarga para archivos de audio</string>
<string name="download_path_audio_summary">Los archivos de audio descargados se almacenan aquí</string>
<string name="download_path_audio_dialog_title">Elija la carpeta de descarga para los archivos de audio</string>
<string name="download_path_audio_title">Carpeta de descarga de audio</string>
<string name="settings_category_video_audio_title">Vídeo y audio</string>
<string name="play_btn_text">Reproducir</string>
@ -62,7 +62,7 @@
<string name="content">Contenido</string>
<string name="show_age_restricted_content_title">Contenido restringido por edad</string>
<string name="video_is_age_restricted">Mostrar vídeo restringido por edad. Se pueden realizar más cambios desde los ajustes.</string>
<string name="main_bg_subtitle">Toque \"Buscar\" para comenzar</string>
<string name="main_bg_subtitle">Toque «Buscar» para empezar</string>
<string name="autoplay_by_calling_app_title">Reproducción automática</string>
<string name="autoplay_by_calling_app_summary">Reproducir un vídeo cuando NewPipe es llamado desde otra app</string>
<string name="duration_live">En directo</string>
@ -120,20 +120,20 @@
\npara abrir en modo emergente</string>
<string name="title_activity_recaptcha">Reto reCAPTCHA</string>
<string name="recaptcha_request_toast">Reto reCAPTCHA requerido</string>
<string name="popup_mode_share_menu_title">Modo emergente de NewPipe</string>
<string name="popup_mode_share_menu_title">Modo emergente</string>
<string name="popup_playing_toast">Reproduciendo en modo emergente</string>
<string name="default_video_format_title">Formato de vídeo predeterminado</string>
<string name="disabled">Desactivado</string>
<string name="show_higher_resolutions_title">Mostrar resoluciones más altas</string>
<string name="show_higher_resolutions_summary">Solo algunos dispositivos pueden reproducir vídeos en 2K/4K</string>
<string name="show_higher_resolutions_summary">Sólo algunos dispositivos pueden reproducir vídeos en 2K / 4K</string>
<string name="default_popup_resolution_title">Resolución predeterminada de emergente</string>
<string name="controls_background_title">Segundo plano</string>
<string name="controls_popup_title">Popup</string>
<string name="controls_popup_title">Emergente</string>
<string name="filter">Filtro</string>
<string name="refresh">Actualizar</string>
<string name="clear">Limpiar</string>
<string name="popup_remember_size_pos_title">Recordar tamaño y posición del repr. emerg.</string>
<string name="popup_remember_size_pos_summary">Recordar el último tamaño y posición del repr. emerg.</string>
<string name="popup_remember_size_pos_title">Recordar tamaño y posición del reproductor emergente</string>
<string name="popup_remember_size_pos_summary">Recordar el último tamaño y posición del reproductor emergente</string>
<string name="settings_category_popup_title">Emergente</string>
<string name="popup_resizing_indicator_title">Redimensionando</string>
<string name="use_external_video_player_summary">Elimina el audio en algunas resoluciones</string>
@ -165,7 +165,7 @@
<string name="subscription_update_failed">No se pudo actualizar la suscripción</string>
<string name="tab_main">Principal</string>
<string name="tab_subscriptions">Suscripciones</string>
<string name="fragment_feed_title">Qué hay de nuevo</string>
<string name="fragment_feed_title">Novedades</string>
<string name="resume_on_audio_focus_gain_title">Reanudar reproducción</string>
<string name="resume_on_audio_focus_gain_summary">Continuar reproduciendo después de las interrupciones (ej. llamadas telefónicas)</string>
<string name="settings_category_downloads_title">Descargar</string>
@ -213,7 +213,7 @@
<string name="delete_item_search_history">¿Quiere eliminar este elemento del historial de búsquedas\?</string>
<string name="main_page_content">Contenido de la página principal</string>
<string name="blank_page_summary">Página en blanco</string>
<string name="kiosk_page_summary">Página del kiosco</string>
<string name="kiosk_page_summary">Página del quiosco</string>
<string name="subscription_page_summary">Página de suscripción</string>
<string name="feed_page_summary">Página de novedades</string>
<string name="channel_page_summary">Página del canal</string>
@ -280,7 +280,7 @@
<string name="override_current_data">Esto reemplazará su configuración actual.</string>
<string name="controls_download_desc">Descargar archivo de retransmisión</string>
<string name="show_info">Mostrar información</string>
<string name="tab_bookmarks">"Listas de reproducción en marcadores "</string>
<string name="tab_bookmarks">Playlists en marcadores</string>
<string name="controls_add_to_playlist_title">Añadir a</string>
<string name="detail_drag_description">Arrastrar para reordenar</string>
<string name="create">Crear</string>
@ -317,7 +317,7 @@
<string name="enable_leak_canary_summary">La monitorización de fugas de memoria puede causar que la app no responda cuando hay Heap Dump</string>
<string name="enable_disposed_exceptions_title">Reportar errores fuera del ciclo de duración</string>
<string name="enable_disposed_exceptions_summary">Forzar reporte de excepciones no entregables de RX fuera del fragmento o del ciclo de actividad después del descarte</string>
<string name="use_inexact_seek_title">Usar búsqueda rápida inexacta</string>
<string name="use_inexact_seek_title">Usar búsqueda rápida e inexacta</string>
<string name="use_inexact_seek_summary">La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión. Buscar de a 5, 15 o 25 segundos no funciona.</string>
<string name="auto_queue_title">Poner en cola vídeo relacionado siguiente</string>
<string name="auto_queue_summary">Continuar reproducción sin repetir al añadir de forma automática un vídeo relacionado con el último visto</string>
@ -354,10 +354,10 @@
\n
\n¿Quiere continuar\?</string>
<string name="download_thumbnail_title">Cargar miniaturas</string>
<string name="download_thumbnail_summary">Desactívela para evitar la carga de miniaturas y ahorrar datos y memoria. Se vaciará la caché de imágenes en la memoria volátil y en el disco.</string>
<string name="download_thumbnail_summary">Desactivar para evitar la carga de miniaturas y ahorrar datos y memoria. Se vaciará la caché de imágenes en la memoria volátil y en el disco.</string>
<string name="thumbnail_cache_wipe_complete_notice">Se vació la caché de imágenes</string>
<string name="metadata_cache_wipe_title">Eliminar metadatos en memoria caché</string>
<string name="metadata_cache_wipe_summary">Eliminar todos los datos de páginas web en memoria caché</string>
<string name="metadata_cache_wipe_title">Vaciar metadatos en memoria caché</string>
<string name="metadata_cache_wipe_summary">Eliminar todos los datos de páginas web en antememoria</string>
<string name="metadata_cache_wipe_complete_notice">Se vació la caché de metadatos</string>
<string name="playback_speed_control">Controles de velocidad de reproducción</string>
<string name="playback_tempo">Tiempo</string>
@ -501,7 +501,7 @@
<string name="clear_playback_states_summary">Elimina todas las posiciones de reproducción</string>
<string name="delete_playback_states_alert">¿Quiere eliminar todas las posiciones de reproducción\?</string>
<string name="drawer_header_description">Activar/desactivar servicio, seleccionados actualmente:</string>
<string name="default_kiosk_page_summary">kiosco predeterminado</string>
<string name="default_kiosk_page_summary">Quiosco predeterminado</string>
<string name="no_one_watching">Nadie está viendo</string>
<plurals name="watching">
<item quantity="one">%s viendo</item>
@ -527,11 +527,11 @@
<string name="most_liked">Más gustados</string>
<string name="playlist_no_uploader">Generado automáticamente (no se encontró creador)</string>
<string name="choose_instance_prompt">Elige una instancia</string>
<string name="enable_lock_screen_video_thumbnail_title">Miniatura de vídeo en la pantalla de bloqueo</string>
<string name="enable_lock_screen_video_thumbnail_summary">Se mostrará una miniatura del video en la pantalla de bloqueo al usar el reproductor de fondo</string>
<string name="enable_lock_screen_video_thumbnail_title">Miniatura de vídeo en pantalla de bloqueo</string>
<string name="enable_lock_screen_video_thumbnail_summary">Se mostrará una miniatura del vídeo en la pantalla de bloqueo al usar el reproductor en segundo plano</string>
<string name="clear_download_history">Limpiar historial de descargas</string>
<string name="delete_downloaded_files">Eliminar archivos descargados</string>
<string name="deleted_downloads">Eliminadas %1$s descargas</string>
<string name="deleted_downloads">Eliminadas %1$d descargas</string>
<string name="permission_display_over_apps">Dar permisos para que se muestre por sobre otras apps</string>
<string name="app_language_title">Idioma de aplicación</string>
<string name="systems_language">Predeterminado del sistema</string>

View File

@ -530,7 +530,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Atzeko planoko bideo erreproduzitzailea erabiltzen den bitartean, bideoaren karatula blokeo pantailan erakutsiko da</string>
<string name="clear_download_history">Garbitu deskargen historiala</string>
<string name="delete_downloaded_files">Ezabatu deskargatutako fitxategiak</string>
<string name="deleted_downloads">%1$s deskarga ezabatuta</string>
<string name="deleted_downloads">%1$d deskarga ezabatuta</string>
<string name="permission_display_over_apps">Baimena eman beste aplikazioen gainetik erakusteko</string>
<string name="app_language_title">Aplikazioaren hizkuntza</string>
<string name="systems_language">Sistemaren lehenetsia</string>

View File

@ -47,7 +47,7 @@
<string name="play_btn_text">پخش</string>
<string name="content">محتوا</string>
<string name="show_age_restricted_content_title">محتوای محدود شده بر اساس سن</string>
<string name="video_is_age_restricted">نمایش ویدیوهای دارای محدودیت سنی. اجازه دادن به چنین محتوای از بخش تنظیمات ممکن است.</string>
<string name="video_is_age_restricted">نمایش ویدیوهای دارای محدودیت سنی. تغییرات آتی از طریق تنظیمات ممکن است.</string>
<string name="duration_live">زنده</string>
<string name="downloads">بارگیری‌ها</string>
<string name="downloads_title">بارگیری‌ها</string>
@ -63,7 +63,7 @@
<string name="live_streams_not_supported">جریان‌های زنده هنوز پشتیبانی نمی‌شوند</string>
<string name="could_not_get_stream">نمی‌توان هیچ جریانی را گرفت</string>
<string name="sorry_string">ببخشید! نباید این اتّفاق زخ می‌داد.</string>
<string name="error_report_button_text">گزارش خطا با رایانامه</string>
<string name="error_report_button_text">این خطا را با رایانامه گزارش کنید</string>
<string name="error_snackbar_message">ببخشید، چند مشکل رخ داد.</string>
<string name="error_snackbar_action">گزارش</string>
<string name="what_device_headline">اطّلاعات:</string>
@ -77,14 +77,14 @@
<string name="detail_dislikes_img_view_description">نپسندیدن‌ها</string>
<string name="use_tor_title">استفاده از تور</string>
<string name="use_tor_summary">(آزمایشی) اجبار ترافیک بارگیری از مسیر تور برای محرمانگی بیش‌تر (هنوز پخش جریانی پشتیبانی نمی‌شود).</string>
<string name="report_error">گزارش یک خطا</string>
<string name="report_error">گزارش خطا</string>
<string name="user_report">گزارش کاربر</string>
<string name="err_dir_create">نمی‌توان شاخهٔ بارگیری «%1$s» را ایجاد کرد</string>
<string name="info_dir_created">شاخهٔ بارگیری «%1$s» ایجاد شد</string>
<string name="video">ویدیو</string>
<string name="audio">صدا</string>
<string name="retry">تلاش دوباره</string>
<string name="storage_permission_denied">اجازهٔ دسترسی به فضای ذخیره رد شد</string>
<string name="storage_permission_denied">ابتدا اجازهٔ دسترسی به فضای ذخیره را بدهید</string>
<string name="start">شروع</string>
<string name="pause">مکث</string>
<string name="view">پخش</string>
@ -288,7 +288,7 @@
<string name="settings_category_debug_title">اشکال‌زدایی</string>
<string name="settings_category_updates_title">به‌روزرسانی‌ها</string>
<string name="open_in_popup_mode">در پنجره جداگانه باز شود</string>
<string name="popup_mode_share_menu_title">حالت پنجره مجزا</string>
<string name="popup_mode_share_menu_title">حالت تصویر در تصویر</string>
<string name="default_popup_resolution_title">اندازه پیش فرض پنجره جداگانه</string>
<string name="controls_popup_title">پنجره جداگانه</string>
<string name="popup_remember_size_pos_title">به یاد داشتن اندازه و موقعیت پنجره جداگانه</string>
@ -377,7 +377,7 @@
<string name="start_here_on_main">شروع پخش در اینجا</string>
<string name="start_here_on_background">شروع پخش در پس‌زمینه</string>
<string name="start_here_on_popup">شروع پخش در حالت تصویر در تصویر</string>
<string name="donation_encouragement">نیوپایپ توسط داوطلبانی توسعه داده می‌شود که با صرف زمان، بهترین تجربه را برای شما به ارمغان می‌آورند. حمایت از توسعه‌دهندگان، به آنها کمک می‌کند تا حین نوشیدن یک فنجان قهوه، نیوپایپ را به مراتب بهتر کنند.</string>
<string name="donation_encouragement">نیوپایپ توسط داوطلبانی توسعه داده می‌شود که با صرف زمان آزاد‌شان، بهترین تجربه کاربری را برای شما به ارمغان می‌آورند. حمایت از توسعه‌دهندگان، به آنها کمک می‌کند تا حین لذت بردن از نوشیدن یک فنجان قهوه، نیوپایپ را به مراتب بهتر کنند.</string>
<string name="give_back">حمایت</string>
<string name="website_encouragement">برای اطلاعات و اخبار بیشتر، به وب‌سایت نیوپایپ سر بزنید.</string>
<string name="switch_to_popup">تغییر وضعیت به تصویر در تصویر</string>
@ -470,7 +470,7 @@
<string name="error_insufficient_storage">فضایی روی دستگاه باقی نمانده است</string>
<string name="error_progress_lost">پیشرفت کار متوفق شد زیرا پرونده پاک شده است</string>
<string name="error_timeout">پایان زمان اتصال</string>
<string name="confirm_prompt">مطمئنید؟</string>
<string name="confirm_prompt">می‌خواهید تاریخچه بارگیری را پاک کنید یا همه پرونده‌هایی که بارگیری شده‌اند؟</string>
<string name="enable_queue_limit">محدود کردن صف بارگیری</string>
<string name="enable_queue_limit_desc">یک بارگیری در هر زمان اجرا شود</string>
<string name="start_downloads">شروع بارگیری‌ها</string>
@ -480,8 +480,8 @@
<string name="downloads_storage_ask_summary_kitkat">از شما پرسیده خواهد شد که هر بارگیری کجا ذخیره شود.
\nاگر می‌خواهید بارگیری در کارت SD خارجی ذخیره شود، گزینه SAF را انتخاب کنید</string>
<string name="downloads_storage_use_saf_title">استفاده از SAF</string>
<string name="downloads_storage_use_saf_summary">چارچوب دسترسی حافظه اجازه دخیره بارگیری‌ها در کارت SD خارجی را می‌دهد.
\nنکته: برخی دستگاه‌ها با این قابلیت سازگاری ندارند</string>
<string name="downloads_storage_use_saf_summary">«چارچوب دسترسی حافظه» اجازه دخیره بارگیری‌ها در کارت SD خارجی را می‌دهد.
\nبرخی دستگاه‌ها با این قابلیت سازگاری ندارند</string>
<string name="clear_playback_states_title">حذف موقعیت‌های پخش</string>
<string name="clear_playback_states_summary">حذف تمام موقعیت‌های پخش</string>
<string name="delete_playback_states_alert">همه موقعیت‌های پخش حذف شوند؟</string>
@ -508,4 +508,80 @@
<string name="enable_lock_screen_video_thumbnail_summary">به کمک پخش‌کننده پس‌زمینه، تصویر بندانگشتی ویدئو در حالت قفل صفحه نمایش یابد</string>
<string name="enable_lock_screen_video_thumbnail_title">تصویر ویدئو در حالت قفل صفحه</string>
<string name="minimize_on_exit_title">کمینه کردن به هنگام تغییر برنامه</string>
<string name="video_detail_by">توسط %s</string>
<string name="channel_created_by">ایجاد شده توسط %s</string>
<string name="content_not_supported">این محتوا هنوز توسط نیوپایپ پشتیبانی می‌شود.
\n
\nامیدواریم در نسخه‌های آینده مورد پشتیبانی قرار گیرد.</string>
<string name="feed_use_dedicated_fetch_method_disable_button">غیرفعال‌سازی حالت سریع</string>
<string name="feed_use_dedicated_fetch_method_enable_button">فعال‌سازی حالت سریع</string>
<string name="settings_category_feed_title">خوراک</string>
<string name="feed_create_new_group_button_title">جدید</string>
<string name="feed_group_dialog_delete_message">می‌خواهید این گروه را پاک کنید؟</string>
<string name="feed_group_dialog_name_input">نام</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="one">%d مورد انتخاب شده</item>
<item quantity="other">%d مورد انتخاب شده</item>
</plurals>
<string name="feed_processing_message">پردازش خوراک…</string>
<string name="feed_notification_loading">بارگیری خوراک…</string>
<string name="feed_subscription_not_loaded_count">بارگیری نشده: %d</string>
<string name="feed_oldest_subscription_update">آخرین به‌روزرسانی خوراک: %s</string>
<plurals name="days">
<item quantity="one">%d روز</item>
<item quantity="other">%d روز</item>
</plurals>
<plurals name="hours">
<item quantity="one">%d ساعت</item>
<item quantity="other">%d ساعت</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%d دقیقه</item>
<item quantity="other">%d دقیقه</item>
</plurals>
<plurals name="seconds">
<item quantity="one">%d ثانیه</item>
<item quantity="other">%d ثانیه</item>
</plurals>
<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>
<string name="app_language_title">زبان برنامه</string>
<string name="choose_instance_prompt">نمونه‌ای را انتخاب کنید</string>
<string name="deleted_downloads">تعداد %1$d بارگیری، پاک شد</string>
<string name="delete_downloaded_files">پاک کردن پرونده‌های بارگیری شده</string>
<string name="clear_download_history">پاک کردن تاریخچه بارگیری</string>
<string name="error_download_resource_gone">ناتوانی در بازیابی این بارگیری</string>
<string name="recovering">در حال بازیابی</string>
<string name="minimize_on_exit_popup_description">کمینه‌سازی به پخش‌کننده تصویر در تصویر</string>
<string name="show_original_time_ago_title">نمایش زمان سپری‌شده اصلی هر مورد</string>
<string name="unmute">صدادار</string>
<string name="mute">بی‌صدا</string>
<string name="most_liked">مورد پسندترین‌ها</string>
<string name="recently_added">اخیرا اضافه شده</string>
<string name="local">محلی</string>
<string name="localization_changes_requires_app_restart">زبان، با راه‌اندازی مجدد برنامه تغییر خواهد یافت.</string>
<string name="default_kiosk_page_summary">کیوسک پیش‌فرض</string>
<string name="recaptcha_done_button">انجام شد</string>
<string name="subtitle_activity_recaptcha">وقتی انجام شد، «Done» یا «انجام شد» را بفشارید</string>
<string name="infinite_videos">بی‌نهایت ویدئو</string>
<string name="more_than_100_videos">بیش از ۱۰۰ ویدئو</string>
<plurals name="listening">
<item quantity="one">%s شنونده</item>
<item quantity="other">%s شنونده</item>
</plurals>
<string name="no_one_listening">کسی در حال شنیدن نیست</string>
<plurals name="watching">
<item quantity="one">%s تماشاچی</item>
<item quantity="other">%s تماشاچی</item>
</plurals>
<string name="no_one_watching">کسی در حال مشاهده نیست</string>
<string name="drawer_header_description">تغییر خدمت، خدمت جاری:</string>
<string name="permission_display_over_apps">اجازه نمایش روی دیگر برنامه‌ها را بدهید</string>
<string name="help">راهنما</string>
<string name="artists">هنرمندان</string>
<string name="albums">آلبوم‌ها</string>
<string name="songs">موسیقی‌ها</string>
<string name="youtube_restricted_mode_enabled_title">حالت محدودیت یوتیوب</string>
</resources>

View File

@ -3,11 +3,11 @@
<string name="main_bg_subtitle">Napauta hakua aloittaaksesi</string>
<string name="view_count_text">%1$s näyttökertaa</string>
<string name="upload_date_text">Julkaistu %1$s</string>
<string name="no_player_found">Ei löytynyt soitinta. Haluatko asentaa VLC:n?</string>
<string name="no_player_found">Ei löytynyt suoratoistosoitinta. Asennetaanko VLC\?</string>
<string name="install">Asenna</string>
<string name="cancel">Peruuta</string>
<string name="open_in_browser">Avaa selaimessa</string>
<string name="open_in_popup_mode">Avaa ponnahdusikkunassa</string>
<string name="open_in_popup_mode">Avaa ponnahdusikkunatilassa</string>
<string name="share">Jaa</string>
<string name="download">Lataus</string>
<string name="search">Haku</string>
@ -19,31 +19,31 @@
<string name="use_external_video_player_title">Käytä ulkoista videosoitinta</string>
<string name="use_external_video_player_summary">Poistaa äänen joillakin resoluutioilla</string>
<string name="use_external_audio_player_title">Käytä ulkoista äänisoitinta</string>
<string name="popup_mode_share_menu_title">NewPipe ponnahdusikkuna</string>
<string name="popup_mode_share_menu_title">Ponnahdusikkunatila</string>
<string name="subscribe_button_title">Tilaa</string>
<string name="subscribed_button_title">Tilattu</string>
<string name="channel_unsubscribed">Kanavan tilaus peruttu</string>
<string name="subscription_change_failed">Ei pystytty vaihtamaan tilausta</string>
<string name="subscription_change_failed">Tilauksen vaihtaminen epäonnistui</string>
<string name="subscription_update_failed">Ei pystytty päivittämään tilausta</string>
<string name="tab_main">Päävalikko</string>
<string name="tab_subscriptions">Tilaukset</string>
<string name="fragment_feed_title">Uudet</string>
<string name="controls_background_title">Taustatoisto</string>
<string name="controls_popup_title">Ikkuna</string>
<string name="download_path_title">Videolatausten sijainti</string>
<string name="download_path_summary">Sijainti ladatuille videoille</string>
<string name="download_path_dialog_title">Aseta videoiden tallennussijainti</string>
<string name="download_path_audio_title">Äänilatausten sijaintikansio</string>
<string name="download_path_audio_summary">Sijainti ladatuille äänitiedostoille</string>
<string name="download_path_audio_dialog_title">Aseta sijainti minne äänitiedostot tallennetaan</string>
<string name="controls_popup_title">Ponnahdusikkuna</string>
<string name="download_path_title">Videon latauskansio</string>
<string name="download_path_summary">Ladatut videotiedostot tallennetaan tänne</string>
<string name="download_path_dialog_title">Valitse videotiedostojen latauskansio</string>
<string name="download_path_audio_title">Äänen latauskansio</string>
<string name="download_path_audio_summary">Ladatut äänitiedostot tallennetaan tänne</string>
<string name="download_path_audio_dialog_title">Valitse äänitiedostojen latauskansio</string>
<string name="autoplay_by_calling_app_title">Automaattitoisto</string>
<string name="autoplay_by_calling_app_summary">Toistaa automaattisesti videon, kun NewPipe avataan toisesta ohjelmasta</string>
<string name="autoplay_by_calling_app_summary">Toistaa videon automaattisesti, kun NewPipe avataan toisesta ohjelmasta</string>
<string name="default_resolution_title">Oletusresoluutio</string>
<string name="default_popup_resolution_title">Ponnahdusikkunan oletusresoluutio</string>
<string name="show_higher_resolutions_title">Näytä korkeampia resoluutioita</string>
<string name="show_higher_resolutions_summary">Vain jotkin laitteet tukevat 2K/4K videotoistoa</string>
<string name="show_higher_resolutions_summary">Vain jotkin laitteet voivat toistaa 2K/4K-videoa</string>
<string name="play_with_kodi_title">Toista Kodi:ssa</string>
<string name="kore_not_found">Kore sovellusta ei löytynyt. Asennetaanko se?</string>
<string name="kore_not_found">Asennetaanko puuttuva Kore-sovellus\?</string>
<string name="show_play_with_kodi_title">Näytä \"Toista Kodi:ssa\" vaihtoehto</string>
<string name="show_play_with_kodi_summary">Näyttää painikkeen, jolla voi toistaa videon Kodi media center:llä</string>
<string name="play_audio">Ääni</string>
@ -54,35 +54,35 @@
<string name="dark_theme_title">Tumma</string>
<string name="black_theme_title">Musta</string>
<string name="popup_remember_size_pos_title">Muista ponnahdusikkunan koko ja sijainti</string>
<string name="popup_remember_size_pos_summary">Muista viimeisin ponnahdusikkunan koko ja sijainti</string>
<string name="popup_remember_size_pos_summary">Muista ponnahdusikkunan viimeisin koko ja sijainti</string>
<string name="player_gesture_controls_title">Soittimen eleohjaus</string>
<string name="player_gesture_controls_summary">Käytä eleitä ohjataksesi kirkkautta ja äänentasoa</string>
<string name="player_gesture_controls_summary">Käytä eleitä ohjataksesi soittimen kirkkautta ja äänentasoa</string>
<string name="show_search_suggestions_title">Hakuehdotukset</string>
<string name="show_search_suggestions_summary">Näytä ehdotuksia hakiessa</string>
<string name="enable_search_history_title">Hakuhistoria</string>
<string name="enable_search_history_summary">Tallentaa hakutietokannan paikallisesti</string>
<string name="enable_watch_history_title">Historia ja Välimuisti</string>
<string name="enable_watch_history_title">Katseluhistoria</string>
<string name="enable_watch_history_summary">Pidä muistissa katsotut videot</string>
<string name="resume_on_audio_focus_gain_summary">Jatka toistoa keskeytysten jälkeen (esim. puhelut)</string>
<string name="download_dialog_title">Lataus</string>
<string name="next_video_title">Seuraava video</string>
<string name="next_video_title">Seuraava</string>
<string name="show_next_and_similar_title">Näytä seuraavia ja samankaltaisia videoita</string>
<string name="url_not_supported_toast">URL ei tueta</string>
<string name="url_not_supported_toast">URL ei tuettu</string>
<string name="content_language_title">Oletus-sisällon kieli</string>
<string name="settings_category_player_title">Soitin</string>
<string name="settings_category_player_behavior_title">Käyttäytyminen</string>
<string name="settings_category_video_audio_title">Video &amp; Ääni</string>
<string name="settings_category_history_title">Historia ja välimuisti</string>
<string name="settings_category_video_audio_title">Video &amp; ääni</string>
<string name="settings_category_history_title">Historia &amp; välimuisti</string>
<string name="settings_category_popup_title">Ponnahdusikkuna</string>
<string name="settings_category_appearance_title">Ulkoasu</string>
<string name="settings_category_other_title">Muu</string>
<string name="background_player_playing_toast">Toistaa taustalla</string>
<string name="popup_playing_toast">Toistaa ponnahdusikkunassa</string>
<string name="popup_playing_toast">Toistetaan ponnahdusikkunatilassa</string>
<string name="play_btn_text">Toista</string>
<string name="content">Sisältö</string>
<string name="show_age_restricted_content_title">Näytä ikärajoitettua sisältöä</string>
<string name="video_is_age_restricted">Ikärajoitettu video. Ikärajoituksen voi sallia asetuksista.</string>
<string name="duration_live">suora</string>
<string name="show_age_restricted_content_title">Ikärajoitettu sisältö</string>
<string name="video_is_age_restricted">Ikärajoitettu video. Muuttaminen on mahdollista asetuksissa.</string>
<string name="duration_live">Suora</string>
<string name="downloads">Lataukset</string>
<string name="downloads_title">Lataukset</string>
<string name="error_report_title">Virheraportti</string>
@ -99,7 +99,7 @@
<string name="best_resolution">Paras resoluutio</string>
<string name="undo">Peru</string>
<string name="notification_channel_name">NewPipe Ilmoitus</string>
<string name="notification_channel_description">Ilmoitukset Newpipe taustasoitolle ja ponnahdusikkunalle</string>
<string name="notification_channel_description">Ilmoitukset NewPipen tausta- ja ponnahdusikkunasoittimille</string>
<string name="general_error">Virhe</string>
<string name="network_error">Verkkovirhe</string>
<string name="could_not_load_thumbnails">Ei pystytty lataamaan kaikkia esikatselukuvia</string>
@ -108,24 +108,24 @@
<string name="light_parsing_error">Ei pystytty jäsentämään websivua kokonaan</string>
<string name="content_not_available">Sisältö ei ole saatavilla</string>
<string name="could_not_setup_download_menu">Ei pystytty asettamaan latausvalikkoa</string>
<string name="live_streams_not_supported">Tämä on LIVE LÄHETYS, mitä ei vielä tueta.</string>
<string name="could_not_get_stream">Ei saatu mitään suoratoistoa</string>
<string name="live_streams_not_supported">Live-suoratoistoa ei vielä tueta</string>
<string name="could_not_get_stream">Suoratoistosisältöä ei saatu</string>
<string name="could_not_load_image">Kuvan lataus epäonnistui</string>
<string name="app_ui_crash">Sovellus/UI kaatui</string>
<string name="sorry_string">Pahoittelut, noin ei olisi pitänyt käydä.</string>
<string name="error_report_button_text">Raportoi virhe sähköpostin kautta</string>
<string name="error_report_button_text">Raportoi tämä virhe sähköpostin kautta</string>
<string name="error_snackbar_message">Pahoittelut, joitain virheitä tapahtui.</string>
<string name="error_snackbar_action">RAPORTTI</string>
<string name="error_snackbar_action">Raportti</string>
<string name="what_happened_headline">Mitä tapahtui:</string>
<string name="your_comment">Sinun viesti (englanniksi):</string>
<string name="error_details_headline">Yksityiskohdat:</string>
<string name="list_thumbnail_view_description">Videon esikatselukuva</string>
<string name="detail_thumbnail_view_description">Videon esikatselukuva</string>
<string name="detail_uploader_thumbnail_view_description">Jakajan avatar esikatselukuva</string>
<string name="detail_thumbnail_view_description">Toista video, kesto:</string>
<string name="detail_uploader_thumbnail_view_description">Lataajan hahmokuvake</string>
<string name="detail_likes_img_view_description">Tykkäykset</string>
<string name="detail_dislikes_img_view_description">Ei-tykkäykset</string>
<string name="use_tor_title">Käytä Tor</string>
<string name="use_tor_summary">(Kokeellinen) Pakota latausliikenne Tor:n kautta saadaksesi parempaa yksityisyyttä (videoiden suoratoistoa ei vielä tueta).</string>
<string name="use_tor_summary">(Kokeellinen) Pakota latausliikenne Tor:n kautta parantaaksesi yksityisyyttä (videoiden suoratoistoa ei vielä tueta).</string>
<string name="report_error">Raportoi virhe</string>
<string name="user_report">Käyttäjäraportti</string>
<string name="search_no_results">Ei tuloksia</string>
@ -135,7 +135,7 @@
<string name="video">Video</string>
<string name="audio">Ääni</string>
<string name="retry">Toista uudelleen</string>
<string name="storage_permission_denied">Oikeus tallennustilan hallintaan evätty</string>
<string name="storage_permission_denied">Myönnä ensin käyttöoikeus tallennustilaan</string>
<string name="short_thousand">t.</string>
<string name="short_million">milj.</string>
<string name="short_billion">bilj.</string>
@ -155,7 +155,7 @@
<item quantity="other">%s videoita</item>
</plurals>
<string name="start">Aloita</string>
<string name="pause">Keskeytä</string>
<string name="pause">Tauota</string>
<string name="view">Toista</string>
<string name="delete">Poista</string>
<string name="checksum">Tarkistus-suma</string>
@ -164,17 +164,18 @@
<string name="msg_name">Tiedostonimi</string>
<string name="msg_threads">Säikeet</string>
<string name="msg_error">Virhe</string>
<string name="msg_server_unsupported">Serveriä ei tueta</string>
<string name="msg_server_unsupported">Palvelinta ei tueta</string>
<string name="msg_exists">Tiedosto on jo olemassa</string>
<string name="msg_url_malform">Epämuodostunut URL tai Internet-yhteys ei ole saatavilla</string>
<string name="msg_running">NewPipe Lataus käynnissä</string>
<string name="msg_running_detail">Napauta nähdäksesi lisää</string>
<string name="msg_wait">Odota…</string>
<string name="msg_copied">Kopioitu leikepöydälle</string>
<string name="no_available_dir">Valitse saatavilla oleva latauskansio</string>
<string name="msg_popup_permission">Tämä käyttöoikeus tarvitaan ponnahdusikkunan käytölle</string>
<string name="no_available_dir">Määritä latauskansio myöhemmin asetuksissa</string>
<string name="msg_popup_permission">Tämä käyttöoikeus tarvitaan
\nponnahdusikkunatilan käyttämiseksi</string>
<string name="title_activity_recaptcha">reCAPTCHA Haaste</string>
<string name="recaptcha_request_toast">reCAPTCHA Haaste pyydetty</string>
<string name="recaptcha_request_toast">reCAPTCHA-haaste pyydetty</string>
<string name="settings_category_downloads_title">Lataus</string>
<string name="settings_file_charset_title">Sallitut merkit tiedostonimissä</string>
<string name="settings_file_replacement_character_summary">Epäkelvot merkit korvataan tällä arvolla</string>
@ -190,22 +191,22 @@
<string name="tab_about">Tietoja</string>
<string name="tab_contributors">Hyväntekijät</string>
<string name="tab_licenses">Lisenssit</string>
<string name="app_description">Vapaa ja kevyt nettivideo- ja audiostriimitoistin Androidille.</string>
<string name="app_description">Vapaata ja kevyttä suoratoistoa Androidilla.</string>
<string name="view_on_github">Näytä GitHub:ssa</string>
<string name="app_license_title">NewPipe:n Lisenssi</string>
<string name="contribution_encouragement">Olkoon sinulla ideoita; käännöksistä, design muutoksista, koodin siivoamisesta tai raskaista koodimuutoksista—apu on aina tervetullutta. Mitä enemmän saadaan tehtyä, sen paremmaksi sovellus tulee!</string>
<string name="contribution_encouragement">Olkoon sinulla ideoita; käännöksistä, designmuutoksista, koodin siivoamisesta tai raskaista koodimuutoksista—apu on aina tervetullutta. Mitä enemmän saadaan tehtyä, sen paremmaksi sovellus tulee!</string>
<string name="read_full_license">Lue lisenssi</string>
<string name="contribution_title">Osallistu</string>
<string name="title_activity_history">Historia</string>
<string name="title_history_search">Haettu</string>
<string name="title_history_view">Katsottu</string>
<string name="history_disabled">Historia on poistettu käytöstä</string>
<string name="history_disabled">Historia on pois käytöstä</string>
<string name="action_history">Historia</string>
<string name="history_empty">Historia on tyhjä</string>
<string name="history_cleared">Historia pyyhitty</string>
<string name="item_deleted">Poistettu</string>
<string name="delete_item_search_history">Haluatko poistaa tämän hakuhistoriasta?</string>
<string name="resume_on_audio_focus_gain_title">Jatka toistoa ohjelman palatessa päällimmäiseksi</string>
<string name="resume_on_audio_focus_gain_title">Jatka toistoa</string>
<string name="what_device_headline">Info:</string>
<string name="info_labels">Mikä:\\nPyyntö:\\nSisällön kieli:\\nPalvelu:\\nGMT Aika:\\nPaketti:\\nVersio:\\nOS versio:</string>
<string name="copyright" formatted="true">© %1$s %2$s %3$s alla</string>
@ -216,54 +217,54 @@
<string name="feed_page_summary">Syötteet</string>
<string name="channel_page_summary">Kanavat</string>
<string name="select_a_channel">Valitse kanava</string>
<string name="no_channel_subscribed_yet">Ei yhtään tilattua kanavaa vielä</string>
<string name="no_channel_subscribed_yet">Yhtään kanavaa ei ole vielä tilattu</string>
<string name="select_a_kiosk">Valitse kioski</string>
<string name="kiosk">Kioski</string>
<string name="trending">Nousussa</string>
<string name="top_50">Top 50</string>
<string name="new_and_hot">Uudet &amp; kuumat</string>
<string name="show_hold_to_append_summary">Näytä vihje kun taustasoitto tai popup painiketta painetaan pohjassa</string>
<string name="show_hold_to_append_summary">Näytä vihje, kun taustasoitto- tai ponnahdusikkunapainiketta painetaan videon yksityiskohtanäkymässä</string>
<string name="background_player_append">Lisätty taustasoittojonoon</string>
<string name="popup_playing_append">Lisätty ikkunajonoon</string>
<string name="popup_playing_append">Lisätty ponnahdusikkunasoittimen jonoon</string>
<string name="play_all">Toista kaikki</string>
<string name="player_stream_failure">Tätä ei voitu toistaa</string>
<string name="player_stream_failure">Tätä suoratoistosisältöä ei voitu toistaa</string>
<string name="player_unrecoverable_failure">Palautuskelvoton soittimen virhe</string>
<string name="player_recoverable_failure">Palaudutaan soittimen virheestä</string>
<string name="title_activity_background_player">Taustatoisto</string>
<string name="title_activity_popup_player">Ikkuna</string>
<string name="title_activity_background_player">Taustasoitin</string>
<string name="title_activity_popup_player">Ponnahdusikkunasoitin</string>
<string name="play_queue_remove">Poista</string>
<string name="play_queue_stream_detail">Yksityiskohdat</string>
<string name="play_queue_audio_settings">Ääniasetukset</string>
<string name="hold_to_append">Pidä pohjassa lisätäksesi jonoon</string>
<string name="show_hold_to_append_title">"Näytä vihje soittolistaan lisäämiseen "</string>
<string name="show_hold_to_append_title">Näytä vihje soittolistaan lisäämiseksi</string>
<string name="unknown_content">[Tuntematon]</string>
<string name="enqueue_on_background">Lisää taustatoistojonoon</string>
<string name="enqueue_on_popup">Lisää ikkunajonoon</string>
<string name="start_here_on_main">Aloita toistaminen</string>
<string name="enqueue_on_popup">Lisää ponnahdusikkunajonoon</string>
<string name="start_here_on_main">Aloita toistaminen tässä</string>
<string name="start_here_on_background">Aloita toisto taustalla</string>
<string name="start_here_on_popup">Aloita toisto ikkunassa</string>
<string name="start_here_on_popup">Aloita toisto ponnahdusikkunassa</string>
<string name="donation_title">Lahjoita</string>
<string name="donation_encouragement">NewPipe kehitetään vapaaehtoisten toimesta, jotka käyttävät vapaa-aikaansa tuottaakseen parhaan mahdollisen käyttökokemuksen sinulle. Nyt on aika antaa takaisin, jotta kehittäjät voivat tehdä NewPipe:sta vielä paremman nauttiessaan kupin kahvia.</string>
<string name="donation_encouragement">NewPipe on vapaaehtoisten vapaa-ajallaan kehittämä tuoden sinulle parhaan mahdollisen käyttäjäkokemuksen. Nyt on aika auttaa kehittäjiä tekemään NewPipesta vielä parempi heidän nauttiessaan kupin kahvia.</string>
<string name="give_back">Anna takaisin</string>
<string name="website_title">Websivu</string>
<string name="website_encouragement">Käy verkkosivuillamme saadaksesi lisää tietoa ja uusimmat uutiset NewPipe:stä.</string>
<string name="no_player_found_toast">Soitinta ei löytynyt (voit asentaa VLC:n toistaaksesi).</string>
<string name="controls_download_desc">Lataa toistotiedosto</string>
<string name="no_player_found_toast">Suoratoistosoitinta ei löytynyt (voit asentaa VLC:n toistaaksesi).</string>
<string name="controls_download_desc">Lataa suoratoistotiedosto</string>
<string name="show_info">Näytä lisätietoja</string>
<string name="tab_bookmarks">Kirjamerkityt soittolistat</string>
<string name="tab_bookmarks">Kirjanmerkityt soittolistat</string>
<string name="controls_add_to_playlist_title">Lisää soittolistaan</string>
<string name="use_inexact_seek_title">Käytä nopeampaa epätarkkaa pikakelausta</string>
<string name="use_inexact_seek_summary">Epätarkka kelaus mahdollistaa videon kelauksen nopeammin, huonommalla tarkkuudella</string>
<string name="download_thumbnail_title">Näytä videoiden pikkukuvat</string>
<string name="download_thumbnail_summary">Poista käytöstä lopettaaksesi kaikkien pikkukuvien lataus säästääksesi mobiilidataa ja muistinkäyttöä. Tämän asetuksen muuttaminen poistaa kaikki pikkukuvat välimuistista</string>
<string name="use_inexact_seek_summary">Epätarkka kelaus mahdollistaa videon kelauksen nopeammin huonommalla tarkkuudella. Kelaaminen 5, 15 tai 25 sekuntia ei toimi tämän kanssa.</string>
<string name="download_thumbnail_title">Lataa esikatselukuvat</string>
<string name="download_thumbnail_summary">Poista käytöstä estääksesi esikatselukuvien lataus säästääksesi dataa ja muistinkäyttöä. Asetuksen muuttaminen poistaa sekä muistissa että levyllä olevan kuvavälimuistin.</string>
<string name="thumbnail_cache_wipe_complete_notice">Kuvavälimuisti tyhjennetty</string>
<string name="metadata_cache_wipe_title">Poista tallennettu metatieto</string>
<string name="metadata_cache_wipe_summary">Poista kaikki tallennettu sivutieto</string>
<string name="metadata_cache_wipe_complete_notice">Metatiedot poistettu</string>
<string name="auto_queue_summary">Automaattisesti lisää seuraavan youtuben ehdottaman videon soittolistaan, sen viimeisen kappaleen soidessa (Youtuben Autoplay)</string>
<string name="auto_queue_summary">Jatka päättyvää (ei uudelleentoistettavaa) toistojonoa lisäämällä siihen aiheeseen liittyvä suoratoistosisältö</string>
<string name="default_content_country_title">Sisällön oletusmaa</string>
<string name="service_title">Palvelu</string>
<string name="settings_category_debug_title">"Virheenkorjaus "</string>
<string name="settings_category_debug_title">Virheenkorjaus</string>
<string name="channels">Kanavat</string>
<string name="playlists">Soittolistat</string>
<string name="tracks">Ääniraidat</string>
@ -273,27 +274,27 @@
<string name="file">Tiedosto</string>
<string name="toggle_orientation">Vaihda orientaatio</string>
<string name="switch_to_background">Vaihda taustalle</string>
<string name="switch_to_popup">Vaihda ponnahdusikkunatoistoon</string>
<string name="switch_to_popup">Vaihda ponnahdusikkunaan</string>
<string name="switch_to_main">Vaihda normaalitoistoon</string>
<string name="import_data_title">Tuo tietokanta</string>
<string name="export_data_title">Vie tietokanta</string>
<string name="import_data_summary">Kirjoittaa yli tämänhetkisen historian ja tilaukset</string>
<string name="export_data_summary">Vie historia, tilaukset tai soittolistat</string>
<string name="clear_views_history_title">Poista katseluhistoria</string>
<string name="clear_views_history_summary">Poistaa toistohistorian</string>
<string name="delete_view_history_alert">Poista koko katseluhistoria.</string>
<string name="clear_views_history_summary">Poistaa toistohistorian ja toistokohdat</string>
<string name="delete_view_history_alert">Poista koko katseluhistoria\?</string>
<string name="watch_history_deleted">Katseluhistoria onnistuneesti poistettu.</string>
<string name="clear_search_history_title">Poista hakuhistoria</string>
<string name="clear_search_history_summary">Poistaa historian haetuista videoista</string>
<string name="delete_search_history_alert">Poista koko hakuhistoria.</string>
<string name="delete_search_history_alert">Poista koko hakuhistoria\?</string>
<string name="search_history_deleted">Hakuhistoria onnistuneesti poistettu.</string>
<string name="external_player_unsupported_link_type">Ulkoiset soittimet eivät tue tämänkaltaisia linkkejä</string>
<string name="invalid_url_toast">Viallinen osoite</string>
<string name="video_streams_empty">Videojonoja ei löytynyt</string>
<string name="audio_streams_empty">Audiojonoja ei löytynyt</string>
<string name="invalid_directory">Virheellinen kansio</string>
<string name="invalid_source">Virheellinen tiedosto/lähde</string>
<string name="invalid_file">Tiedosta ei löydy tai sen kirjoittamiseen/lukemiseen ei ole lupaa</string>
<string name="video_streams_empty">Suoratoistovideoita ei löytynyt</string>
<string name="audio_streams_empty">Suoratoistoääntä ei löytynyt</string>
<string name="invalid_directory">Kansiota ei ole olemassa</string>
<string name="invalid_source">Tiedoston/sisällön lähdettä ei ole</string>
<string name="invalid_file">Tiedoa ei ole tai lupa sen kirjoittamiseen tai lukemiseen puuttuu</string>
<string name="file_name_empty_error">Tiedostonimi ei voi olla tyhjä</string>
<string name="error_occurred_detail">Hups! Tapahtui virhe: %1$s</string>
<string name="detail_drag_description">Vedä järjestelläksesi</string>
@ -305,11 +306,12 @@
<string name="one_item_deleted">1 poistettu.</string>
<string name="toast_no_player">Ohjelmaa tämän toistamiseen ei ole asennettu</string>
<string name="privacy_policy_title">NewPipen tietosuojakäytäntö</string>
<string name="privacy_policy_encouragement">NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi. NewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä.</string>
<string name="privacy_policy_encouragement">NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi.
\nNewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä.</string>
<string name="read_privacy_policy">Lue tietosuojakäytäntö</string>
<string name="auto_queue_title">Automaattisesti lisää ehdotettu video soittolistaan</string>
<string name="no_streams_available_download">Videostriimejä ei löytynyt ladattavaksi</string>
<string name="app_license">NewPipe on vapaata softaa. Voit käyttää sitä, katsella sekä muokata sen koodia ja parannella sitä ilmaiseksi mielesi mukaan. Tarkemmin sanottuna, voit jakaa sitä edelleen ja/tai muokata sitä Free Software Foundationin julkaiseman GNU GPL:n, joko versio kolmosen (GPLv3), tai uudemman, ehdoilla.</string>
<string name="auto_queue_title">Lisää ehdotettu suoratoistosisältö automaattisesti soittolistaan</string>
<string name="no_streams_available_download">Suoratoistosisältöä ei saatavilla ladattavaksi</string>
<string name="app_license">NewPipe on vapaata ohjelmistoa. Voit käyttää, opiskella, jakaa ja parantaa sitä mielesi mukaan. Tarkemmin sanottuna voit jakaa sitä edelleen ja/tai muokata sitä Free Software Foundationin julkaiseman GNU General Public Licensen, version 3 tai uudemman, ehdoilla.</string>
<string name="delete_stream_history_prompt">Haluatko poistaa tämän katseluhistoriasta?</string>
<string name="delete_all_history_prompt">Oletko varma että haluat poistaa kaiken katseluhistoriasta?</string>
<string name="title_last_played">Viimeksi toistettu</string>
@ -331,31 +333,31 @@
<string name="always_ask_open_action">Kysy aina</string>
<string name="preferred_player_fetcher_notification_title">Haetaan infoa…</string>
<string name="preferred_player_fetcher_notification_message">Ladataan pyydettyä sisältöä</string>
<string name="create_playlist">Luo uusi soittolista</string>
<string name="delete_playlist">Poista soittolista</string>
<string name="rename_playlist">Uudelleennimeä soittolista</string>
<string name="create_playlist">Uusi soittolista</string>
<string name="delete_playlist">Poista</string>
<string name="rename_playlist">Uudelleennimeä</string>
<string name="playlist_name_input">Nimi</string>
<string name="append_playlist">Lisää soittolistaan</string>
<string name="set_as_playlist_thumbnail">Aseta soittolistan kuvakkeeksi</string>
<string name="bookmark_playlist">Tallenna soittolista kirjanmerkkeihin</string>
<string name="unbookmark_playlist">Poista kirjanmerkki</string>
<string name="delete_playlist_prompt">Haluatko poistaa tämän soittolistan?</string>
<string name="delete_playlist_prompt">Poistetaanko tämä soittolista\?</string>
<string name="playlist_creation_success">Soittolista luotu</string>
<string name="playlist_add_stream_success">Lisätty soittolistaan</string>
<string name="playlist_thumbnail_change_success">Soittolistan kuvake muutettu</string>
<string name="playlist_delete_failure">Soittolistaa ei voitu poistaa</string>
<string name="playlist_thumbnail_change_success">Soittolistan kuvake muutettu.</string>
<string name="playlist_delete_failure">Soittolistaa ei voitu poistaa.</string>
<string name="caption_none">Ei tekstityksiä</string>
<string name="resize_fit">Sovita</string>
<string name="resize_fill">Täytä</string>
<string name="resize_zoom">Suurenna</string>
<string name="caption_auto_generated">Automaattisesti luotu</string>
<string name="caption_setting_title">Tekstitykset</string>
<string name="caption_setting_description">Muokkaa tekstitysten kokoa ja taustaa. Asetusten päivittämiseksi sinun tulee käynnistää ohjelma uudelleen</string>
<string name="enable_leak_canary_title">Laita päälle LeakCanary-muistivuodonpaljastin (virheenkorjausta varten)</string>
<string name="caption_setting_description">Muokkaa soittimen tekstitysten kokoa ja taustatyylejä. Asetusten käyttöönotto vaatii uudelleenkäynnistyksen.</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_summary">Muistivuotojen valvonta voi aiheuttaa ohjelman hidastumisen virhetilanteissa</string>
<string name="enable_disposed_exceptions_title">Raportoi yhteensopimattomuusvirheitä jotka aiheutuvat vanhoista ohjelmista</string>
<string name="enable_disposed_exceptions_summary">Pakota raportointi kuljetuskelvottomille Rx-poikkeuksille jotka ovat muistisirpaleiden tai aktiviteettielämänkaaren ulkopuolella poiston jälkeen</string>
<string name="import_export_title">Tuo/Vie</string>
<string name="enable_disposed_exceptions_title">Raportoi yhteensopivuusvirheitä, jotka aiheutuvat vanhoista ohjelmista</string>
<string name="enable_disposed_exceptions_summary">Pakota raportointi toimituskelvottomille Rx-poikkeuksille, jotka ovat poiston jälkeen muistisirpaleiden tai aktiviteettielämänkaaren ulkopuolella</string>
<string name="import_export_title">Tuo/vie</string>
<string name="import_title">Tuo</string>
<string name="import_from">Tuo kohteesta</string>
<string name="export_to">Vie kohteeseen</string>
@ -377,28 +379,238 @@
\n3. Kirjaudu sisään kysyttäessä.
\n4. Kopioi se nettiosoite johon sinut ohjattiin.</string>
<string name="import_soundcloud_instructions_hint">sinun käyttäjänimesi, soundcloud.com/&lt;sinun käyttäjänimesi&gt;</string>
<string name="import_network_expensive_warning">Ota huomioon että tämä operaatio voi käyttää paljon dataa.
\nHaluatko jatkaa?</string>
<string name="playback_speed_control">Toiston nopeuden säätimet</string>
<string name="playback_tempo">Musiikkitempo</string>
<string name="import_network_expensive_warning">Ota huomioon että tämä operaatio voi käyttää paljon dataa.
\n
\nHaluatko jatkaa\?</string>
<string name="playback_speed_control">Toistonopeuden säätimet</string>
<string name="playback_tempo">Tempo</string>
<string name="playback_pitch">Sävelkorkeus</string>
<string name="unhook_checkbox">Irroita tempo ja nopeus toisistaan (saattaa aiheuttaa säröä äänessä)</string>
<string name="unhook_checkbox">Irrota toisistaan (saattaa aiheuttaa säröytymistä)</string>
<string name="skip_silence_checkbox">Kelaa eteenpäin hiljaisissa kohdissa</string>
<string name="playback_step">Askel</string>
<string name="playback_reset">Nollaa</string>
<string name="start_accept_privacy_policy">Jotta olisimme kelpoisia EU:n uuden yleisen tietosuoja-asetuksen (GDPR) kannalta, meidän pitää muistuttaa sinua lukemaan NewPipen tietosuojakäytäntö. Lue se oikeasti. Sinun pitää myös hyväksyä se jotta voit lähettää virheraportin.</string>
<string name="start_accept_privacy_policy">Noudattaaksemme EU:n yleistä tietosuoja-asetusta (GDPR), meidän pitää muistuttaa sinua lukemaan NewPipen tietosuojakäytäntö. Lue se tarkkaan.
\nSinun pitää myös hyväksyä se, jotta voit lähettää virheraportin.</string>
<string name="accept">Hyväksy</string>
<string name="decline">Hylkää</string>
<string name="limit_data_usage_none_description">Ei rajaa</string>
<string name="limit_mobile_data_usage_title">Rajoita resoluutiota kun mobiilidata on käytössä</string>
<string name="minimize_on_exit_title">Pienennä vaihtaessa ohjelmaa</string>
<string name="minimize_on_exit_summary">Toiminto kun vaihdetaan toiseen ohjelmaan päävideosoittimesta — %s</string>
<string name="minimize_on_exit_title">Pienennä vaihdettaessa ohjelmaa</string>
<string name="minimize_on_exit_summary">Toiminto vaihdettaessa toiseen ohjelmaan päävideosoittimesta — %s</string>
<string name="minimize_on_exit_none_description">Ei koskaan</string>
<string name="minimize_on_exit_background_description">Pienennä taustasoittimeksi</string>
<string name="minimize_on_exit_popup_description">Muuta ponnahdusikkunaksi</string>
<string name="minimize_on_exit_popup_description">Pienennä ponnahdusikkunasoittimeksi</string>
<string name="unsubscribe">Peru tilaus</string>
<string name="tab_new">Uusi välilehti</string>
<string name="tab_choose">Valitse välilehti</string>
<string name="missions_header_finished">Valmis</string>
<string name="enqueue">Jono</string>
<string name="seek_duration_title">Eteen-/taaksepäinkelauksen aika-askeleen pituus</string>
<string name="recently_added">Hiljattain lisätyt</string>
<string name="local">Paikalliset</string>
<string name="most_liked">Pidetyimmät</string>
<string name="localization_changes_requires_app_restart">Kieli vaihtuu, kun sovellus uudelleenkäynnistetään.</string>
<string name="error_unable_to_load_comments">Kommentteja ei voitu ladata</string>
<string name="selection">Valinta</string>
<string name="main_page_content_summary">Mitkä välilehdet näytetään pääsivulla</string>
<string name="recaptcha_done_button">Valmis</string>
<string name="subtitle_activity_recaptcha">Paina \"Valmis\", kun ratkaistu</string>
<string name="infinite_videos">∞ videota</string>
<string name="more_than_100_videos">100+ videota</string>
<plurals name="watching">
<item quantity="one">%s katselija</item>
<item quantity="other">%s katselijaa</item>
</plurals>
<plurals name="listening">
<item quantity="one">%s kuuntelija</item>
<item quantity="other">%s kuuntelijaa</item>
</plurals>
<string name="no_one_listening">Ei kuuntelijoita</string>
<string name="no_one_watching">Ei katselijoita</string>
<string name="subscribers_count_not_available">Tilaajien lukumäärä ei saatavilla</string>
<string name="drawer_header_description">Kytke palvelu, tällä hetkellä valittuna:</string>
<string name="permission_display_over_apps">Myönnä käyttöoikeus näyttää muiden sovellusten päällä</string>
<string name="restore_defaults_confirmation">Haluatko palauttaa oletusarvot\?</string>
<string name="restore_defaults">Palauta oletusarvot</string>
<string name="saved_tabs_invalid_json">Ei voitu lukea talletettuja välilehtiä, joten käytetään oletusvälilehtiä</string>
<string name="missing_file">Tiedosto siirretty tai poistettu</string>
<string name="download_to_sdcard_error_message">Lataaminen ulkoiselle SD-kortille ei ole mahdollista. Nollataanko latauskansion sijainti\?</string>
<string name="download_to_sdcard_error_title">Ulkoinen tallennustila ei käytettävissä</string>
<string name="help">Ohje</string>
<string name="app_update_notification_channel_description">Ilmoitukset uudesta NewPipe-versiosta</string>
<string name="app_update_notification_channel_name">Sovelluspäivitysilmoitus</string>
<string name="file_deleted">Tiedosto poistettu</string>
<string name="artists">Esittäjät</string>
<string name="albums">Albumit</string>
<string name="songs">Kappaleet</string>
<string name="events">Tapahtumat</string>
<string name="videos_string">Videot</string>
<string name="restricted_video">Tämä video on ikärajoitettu.
\n
\nSalli ikärajoitettu sisältö asetuksissa katsoaksesi.</string>
<string name="youtube_restricted_mode_enabled_title">YouTuben rajoitettu tila</string>
<string name="settings_category_updates_title">Päivitykset</string>
<string name="peertube_instance_add_exists">Instanssi on jo olemassa</string>
<string name="peertube_instance_add_https_only">Vain HTTPS-URL:t ovat tuettuja</string>
<string name="peertube_instance_add_fail">Instanssia ei voitu vahvistaa</string>
<string name="peertube_instance_add_help">Syötä instanssin URL</string>
<string name="peertube_instance_add_title">Lisää instanssi</string>
<string name="peertube_instance_url_help">Hae instansseja, joista pidät, osoitteesta %s</string>
<string name="peertube_instance_url_summary">Valitse PeerTube-suosikki-instanssisi</string>
<string name="peertube_instance_url_title">PeerTube-instanssit</string>
<string name="autoplay_title">Automaattinen toisto</string>
<string name="settings_category_clear_data_title">Tietojen tyhjennys</string>
<string name="enable_playback_resume_title">Jatka toistoa</string>
<string name="download_choose_new_path">Vaihda latauskansioita, että muutokset tulevat voimaan</string>
<string name="show_original_time_ago_summary">Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä</string>
<string name="brightness_gesture_control_summary">Käytä eleitä ohjataksesi soittimen kirkkautta</string>
<string name="brightness_gesture_control_title">Kirkkauden eleohjaus</string>
<string name="volume_gesture_control_summary">Käytä eleitä ohjataksesi soittimen äänenvoimakkuutta</string>
<string name="volume_gesture_control_title">Äänenvoimakkuuden eleohjaus</string>
<string name="show_comments_summary">Poista käytöstä piilottaaksesi kommentit</string>
<string name="watch_history_states_deleted">Toistokohdat poistettu.</string>
<string name="delete_playback_states_alert">Poistetaanko kaikki toistokohdat\?</string>
<string name="clear_playback_states_summary">Poistaa kaikki toistokohdat</string>
<string name="clear_playback_states_title">Poista toistokohdat</string>
<string name="enable_playback_state_lists_summary">Näytä toistokohtien osoittimet listoissa</string>
<string name="enable_playback_state_lists_title">Kohdat listoissa</string>
<string name="enable_playback_resume_summary">Palauta edellinen toistokohta</string>
<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_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>
<string name="delete_downloaded_files">Poista ladatut tiedostot</string>
<string name="confirm_prompt">Haluatko tyhjentää lataushistoriasi vai poistaa kaikki ladatut tiedostot\?</string>
<string name="no_comments">Ei kommentteja</string>
<string name="show_comments_title">Näytä kommentit</string>
<string name="detail_sub_channel_thumbnail_view_description">Kanavan hahmokuvake</string>
<string name="enable_lock_screen_video_thumbnail_summary">Videon esikatselukuva näytetään lukitusnäytöllä, kun käytetään taustasoitinta</string>
<string name="enable_lock_screen_video_thumbnail_title">Videon esikatselukuva lukitusnäytöllä</string>
<string name="video_detail_by">Kenen toimesta: %s</string>
<string name="feed_use_dedicated_fetch_method_help_text">Onko syötteen lataaminen mielestäsi liian hidas\? Voit koittaa ottaa käyttöön nopean lataamisen (voit vaihtaa sen asetuksista tai painamalla alla olevaa painiketta).
\n
\nNewPipe tarjoaa kaksi tapaa ladata syöte:
\n• Koko tilatun kanavan lataaminen, mikä on hidasta, mutta lataa syötteen kokonaisuudessaan.
\n• Erityisen palvelu-endpointin käyttö, mikä on nopeaa, mutta yleensä ei lataa syötettä kokonaisuudessaan.
\n
\nNäiden kahden välinen ero on, että nopean lataamista tiedoista yleensä puuttuu esim. sisällön kesto tai tyyppi (ei voi erotella livevideoita ja tavallisia) tai se ei lataa kaikkea sisältöä.
\n
\nYouTuve on esimerkki palvelusta, joka tarjoaa nopean tavan RSS-syötteen avulla.
\n
\nValinta riippuu siitä, mitä halutaan: nopeutta vai tarkkoja tietoja.</string>
<string name="default_kiosk_page_summary">Oletuskioski</string>
<string name="channel_created_by">%s:n luoma</string>
<string name="content_not_supported">NewPipe ei vielä tue tätä sisältöä.
\n
\nToivottavasti sitä tuetaan myöhemmässä versiossa.</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Poista nopea tila käytöstä</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Ota nopea tila käyttöön</string>
<string name="feed_use_dedicated_fetch_method_summary">Saatavilla joissakin palveluissa, on yleensä paljon nopeampi, mutta voi palauttaa rajallisen määrän sisältöä ja usein epätäydelliset tiedot (esim. ei kestoa, ei sisällön tyyppiä, ei livestatusta).</string>
<string name="feed_use_dedicated_fetch_method_title">Hae erityisestä syötteestä, kun sellainen on saatavilla</string>
<string name="feed_update_threshold_option_always_update">Päivitä aina</string>
<string name="feed_update_threshold_summary">Edellisestä päivityksestä kulunut aika, jonka jälkeen tilaus katsotaan vanhentuneeksi</string>
<string name="feed_update_threshold_title">Syötteen päivitysvälin kynnysarvo</string>
<string name="settings_category_feed_title">Syöte</string>
<string name="feed_create_new_group_button_title">Uusi</string>
<string name="feed_group_dialog_delete_message">Haluatko poistaa tämän ryhmän\?</string>
<string name="feed_group_dialog_name_input">Nimi</string>
<string name="feed_group_dialog_empty_name">Tyhjä ryhmän nimi</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="one">%d valittu</item>
<item quantity="other">%d valittu</item>
</plurals>
<string name="feed_group_dialog_empty_selection">Tilausta ei valittuna</string>
<string name="feed_group_dialog_select_subscriptions">Valitse tilaukset</string>
<string name="feed_processing_message">Käsitellään syötettä…</string>
<string name="feed_notification_loading">Ladataan syötettä…</string>
<string name="feed_subscription_not_loaded_count">Ei ladattu: %d</string>
<string name="feed_oldest_subscription_update">Syöte viimeksi päivitetty: %s</string>
<string name="feed_groups_header_title">Kanavaryhmät</string>
<plurals name="days">
<item quantity="one">%d päivä</item>
<item quantity="other">%d päivää</item>
</plurals>
<plurals name="hours">
<item quantity="one">%d tunti</item>
<item quantity="other">%d tuntia</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%d minuutti</item>
<item quantity="other">%d minuuttia</item>
</plurals>
<plurals name="seconds">
<item quantity="one">%d sekunti</item>
<item quantity="other">%d sekuntia</item>
</plurals>
<string name="new_seek_duration_toast">ExoPlayerin rajoitusten takia kelauksen aika-askel asetettiin %d sekuntiin</string>
<string name="remove_watched">Poista katsotut</string>
<string name="systems_language">Järjestelmän oletus</string>
<string name="app_language_title">Sovelluksen kieli</string>
<string name="choose_instance_prompt">Valitse instanssi</string>
<string name="downloads_storage_use_saf_summary">\'Storage Access Framework\' sallii lataukset ulkoiselle SD-kortille.
\nJotkin laitteet eivät ole yhteensopivia</string>
<string name="downloads_storage_use_saf_title">Käytä SAF:ää</string>
<string name="downloads_storage_ask_summary_kitkat">Jokaisen latauksen kohde kysytään.
\nValitse SAF, jos haluat ladata ulkoiselle SD-kortille</string>
<string name="downloads_storage_ask_summary">Jokaisen latauksen kohde kysytään</string>
<string name="downloads_storage_ask_title">Kysy mihin ladataan</string>
<string name="start_downloads">Aloita lataukset</string>
<string name="enable_queue_limit_desc">Yksi lataus kerrallaan on käynnissä</string>
<string name="enable_queue_limit">Rajoita latausjonon kokoa</string>
<string name="max_retry_desc">Suurin määrä yrityksiä ennen kuin lataus perutaan</string>
<string name="max_retry_msg">Uudelleenyritysten maksimimäärä</string>
<string name="deleted_downloads">Poistettiin %1$d latausta</string>
<string name="error_download_resource_gone">Tätä latausta ei voi palauttaa</string>
<string name="error_timeout">Yhteys aikakatkaistiin</string>
<string name="error_progress_lost">Eteneminen menetettiin, koska tiedosto poistettiin</string>
<string name="error_insufficient_storage">Laitteella ei ole tilaa</string>
<string name="error_postprocessing_stopped">NewPipe suljettiin, kun se käsitteli tiedostoa</string>
<string name="error_postprocessing_failed">Jälkikäsittely epäonnistui</string>
<string name="error_http_not_found">Ei löytynyt</string>
<string name="error_http_unsupported_range">Palvelin ei hyväksy monisäikeisiä latauksia, yritä uudelleen asetuksella @string/msg_threads = 1</string>
<string name="error_http_no_content">Palvelin ei lähetä dataa</string>
<string name="error_connect_host">Palvelimelle ei voi yhdistää</string>
<string name="error_unknown_host">Palvelinta ei löytynyt</string>
<string name="error_ssl_exception">Turvallista yhteyttä ei voitu muodostaa</string>
<string name="error_permission_denied">Järjestelmä esti käyttöoikeuden</string>
<string name="error_path_creation">Kohdekansiota ei voi luoda</string>
<string name="error_file_creation">Tiedostoa ei voi luoda</string>
<string name="label_code">Koodi</string>
<string name="show_error">Näytä virhe</string>
<string name="download_already_pending">Tällä nimellä on jo lataus odottamassa</string>
<string name="download_already_running">Tällä nimellä on jo lataus käynnissä</string>
<string name="overwrite_failed">tiedostoa ei voi ylikirjoittaa</string>
<string name="overwrite_finished_warning">Ladattu tiedosto, jolla on tämä nimi, on jo olemassa</string>
<string name="overwrite_unrelated_warning">Tämän niminen tiedosto on jo olemassa</string>
<string name="overwrite">Ylikirjoita</string>
<string name="generate_unique_name">Luo uniikki nimi</string>
<string name="download_finished_more">%s latausta valmiina</string>
<string name="download_finished">Lataus valmis</string>
<string name="download_failed">Lataus epäonnistui</string>
<string name="permission_denied">Järjestelmä kieltäytyi toiminnosta</string>
<string name="recovering">palautetaan</string>
<string name="post_processing">jälkikäsitellään</string>
<string name="queued">lisätty jonoon</string>
<string name="missions_header_pending">Odottaa</string>
<string name="show_original_time_ago_title">Näytä alkuperäinen aika sisällölle</string>
<string name="pause_downloads">Tauota lataukset</string>
<string name="pause_downloads_on_mobile_desc">Hyödyllinen vaihdettaessa mobiilidataan, vaikka joitakin latauksia ei voi pysäyttää</string>
<string name="pause_downloads_on_mobile">Keskeytä käytön mukaan laskutettavilla yhteyksillä</string>
<string name="paused">tauotettu</string>
<string name="app_update_notification_content_text">Napauta ladataksesi</string>
<string name="app_update_notification_content_title">NewPipe-päivitys on saatavilla!</string>
<string name="switch_view">Vaihda näkymää</string>
<string name="list_view_mode">Listanäkymän ulkoasu</string>
<string name="auto">Automaattinen</string>
<string name="grid">Ruudukko</string>
<string name="list">Lista</string>
<string name="updates_setting_description">Näytä ilmoitus sovelluspäivityksestä, kun uusi versio on saatavilla</string>
<string name="updates_setting_title">Päivitykset</string>
<string name="playlist_no_uploader">Automaattisesti luotu (lataajaa ei löytynyt)</string>
<string name="unmute">Poista mykistys</string>
<string name="mute">Mykistä</string>
<string name="conferences">Konferenssit</string>
</resources>

View File

@ -529,7 +529,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Une miniature de la vidéo sera affichée sur lécran de verrouillage lorsque le lecteur en arrière-plan est utilisé</string>
<string name="clear_download_history">Effacer lhistorique de téléchargement</string>
<string name="delete_downloaded_files">Supprimer les fichiers téléchargés</string>
<string name="deleted_downloads">%1$s téléchargements supprimés</string>
<string name="deleted_downloads">%1$d téléchargements supprimés</string>
<string name="permission_display_over_apps">Autoriser laffichage au-dessus dautres applications</string>
<string name="app_language_title">Langue de lapplication</string>
<string name="systems_language">Prédéfini par le système</string>
@ -562,7 +562,7 @@
<string name="feed_oldest_subscription_update">Dernière mise à jour du flux : %s</string>
<string name="feed_subscription_not_loaded_count">Pas chargés : %d</string>
<string name="feed_notification_loading">Chargement du flux…</string>
<string name="feed_processing_message">Préparation du flux…</string>
<string name="feed_processing_message">Traitement du flux…</string>
<string name="feed_group_dialog_select_subscriptions">Choisir les abonnements</string>
<string name="feed_group_dialog_empty_selection">Aucun abonnement sélectionné</string>
<plurals name="feed_group_dialog_selection_count">
@ -577,21 +577,21 @@
<string name="feed_update_threshold_title">Seuil de mise à jour du flux</string>
<string name="feed_update_threshold_summary">Temps depuis la dernière mise à jour pour que le flux ne soit plus considéré comme à jour — %s</string>
<string name="feed_update_threshold_option_always_update">Toujours mettre à jour</string>
<string name="feed_use_dedicated_fetch_method_title">Charger depuis un service dédié quand c\'est possible</string>
<string name="feed_use_dedicated_fetch_method_summary">Disponible pour quelques services, c\'est généralement bien plus rapide mais peut retourner un nombre d\'élements limité et des informations souvent incomplètes (ex : pas de durée, pas de statut « En direct ».</string>
<string name="feed_use_dedicated_fetch_method_title">Récupérer depuis un flux dédié lorsque disponible</string>
<string name="feed_use_dedicated_fetch_method_summary">Disponible dans certains services, cest généralement beaucoup plus rapide mais cela peut renvoyer un nombre limité déléments et souvent avec des informations incomplètes (p. ex. aucune durée, de type délément ou de statut en direct).</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Activer le mode rapide</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Désactiver le mode rapide</string>
<string name="feed_use_dedicated_fetch_method_help_text">Pensez-vous que la chargement du flux est trop lent \? Si c\'est le cas, essayez le mode rapide (vous pouvez changer le mode dans les paramètres ou en pressant le bouton en dessous).
<string name="feed_use_dedicated_fetch_method_help_text">Pensez-vous que le chargement du flux est trop lent\? Si cest le cas, essayez le chargement rapide (vous pouvez le modifier dans les paramètres ou en pressant le bouton ci-dessous).
\n
\n NewPipe propose deux manières de charger le flux :
\n • Charger toutes les chaines auquelles vous êtes abonnés, cette manière est lente mais complète.
\n • Charger depuis un service dédié, cette manière est plus rapide mais souvent incomplète.
\nNewPipe propose deux stratégies de chargement de flux :
\n• Récupérer la totalité de la chaîne dabonnement, ce qui est lent mais complet.
\n• Utiliser un service dédié, ce qui est rapide mais souvent incomplet.
\n
\n La différence entre les deux est que la méthode rapide manque souvent de quelques informations, comme la durée d\'un élément ou le type (nous ne pouvons pas différencier les vidéos en direct des vidéos normales) et pourrait retourner moins d\'éléments.
\nLa différence entre les deux est que la méthode rapide manque souvent de quelques informations, comme la durée dun élément ou le type (pas de distinction possible entre les vidéos en direct et les autres), et elle pourrait retourner moins déléments.
\n
\n YouTube est un exemple qui offre cette méthode rapide avec le flux RSS.
\nYouTube est un exemple de service qui offre une méthode rapide avec son flux RSS.
\n
\n Donc le choix vous revient : Préferez-vous la vitesse ou des informations précises \?</string>
\nDonc le choix se résume à ce que vous préférez : la rapidité ou des informations précises.</string>
<string name="help">Aide</string>
<string name="content_not_supported">Ce contenu n\'est pas encore supporté par NewPipe.\n\nIl le sera peut-être dans une version future.</string>
<string name="albums">Albums</string>
@ -613,4 +613,5 @@
<string name="show_original_time_ago_summary">Les textes originaux des services vont être visibles dans les items</string>
<string name="show_original_time_ago_title">Afficher la date originelle sur les items</string>
<string name="youtube_restricted_mode_enabled_title">Mode restreint de YouTube</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Afficher les abonnements sans groupes uniquement</string>
</resources>

View File

@ -458,7 +458,7 @@
<string name="error_unknown_host">לא ניתן למצוא את השרת</string>
<string name="error_connect_host">לא ניתן להתחבר לשרת</string>
<string name="error_http_no_content">השרת לא שולח נתונים</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="error_http_not_found">לא נמצא</string>
<string name="error_postprocessing_failed">העיבוד המאוחר נכשל</string>
<string name="stop">עצירה</string>
@ -540,7 +540,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">תמונה מוקטנת של הסרטון תופיע על מסך הנעילה בעת שימוש בנגן הרקע</string>
<string name="clear_download_history">מחיקת היסטוריית ההורדות</string>
<string name="delete_downloaded_files">למחוק את הקבצים שהורדתי</string>
<string name="deleted_downloads">נמחקו %1$s הורדות</string>
<string name="deleted_downloads">נמחקו %1$d הורדות</string>
<string name="permission_display_over_apps">יש להעניק הרשאה להציג על גבי יישומונים אחרים</string>
<string name="app_language_title">שפת היישומון</string>
<string name="systems_language">בררת המחדל של המערכת</string>
@ -633,4 +633,5 @@
<string name="video_detail_by">מאת %s</string>
<string name="channel_created_by">נוצר ע״י %s</string>
<string name="detail_sub_channel_thumbnail_view_description">תמונה ממוזערת של הערוץ</string>
<string name="feed_group_show_only_ungrouped_subscriptions">להציג רק מינויים שאינם בקבוצות</string>
</resources>

View File

@ -467,8 +467,8 @@
<string name="error_unable_to_load_comments">Komentare nije moguće učitati</string>
<string name="close">Zatvori</string>
<string name="app_license">NewPipe je copyleft libre software: možete ga koristiti, proučavati i poboljšavati po volji. Konkretno, možete ga redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila Free Software Foundation, bilo verzije 3 Licence, ili (po vašem izboru) bilo koje kasnije verzije.</string>
<string name="privacy_policy_encouragement">"Projekt NewPipe ozbiljno shvaća vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka.
\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i pohranjuju kada šaljete izvješće o padu aplikacije."</string>
<string name="privacy_policy_encouragement">Projekt NewPipe ozbiljno shvaća vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka.
\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i pohranjuju kada šaljete izvješće o padu aplikacije.</string>
<string name="start_accept_privacy_policy">Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), upozoravamo vas na politiku privatnosti tvrtke NewPipe. Pažljivo ga pročitajte. Morate ga prihvatiti da nam pošaljete izvješća o pogreškama.</string>
<string name="enable_playback_resume_title">Nastavi reprodukciju</string>
<string name="enable_playback_resume_summary">Vrati zadnji položaj reprodukcije</string>
@ -496,7 +496,7 @@
<string name="playlist_no_uploader">Automatski generirano (nije pronađen nijedan autor)</string>
<string name="clear_download_history">Očisti povijest preuzimanja</string>
<string name="delete_downloaded_files">Izbriši preuzete datoteke</string>
<string name="deleted_downloads">Obrisano %1$s preuzimanja</string>
<string name="deleted_downloads">Obrisano %1$d preuzimanja</string>
<string name="permission_display_over_apps">Dajte dopuštenje za prikazivanje na vrhu</string>
<string name="app_language_title">Jezik aplikacije</string>
<string name="systems_language">Zadani sustav</string>

View File

@ -19,7 +19,7 @@
<string name="download_path_dialog_title">Válassza ki a videófájlok letöltési helyét</string>
<string name="default_resolution_title">Alapértelmezett felbontás</string>
<string name="play_with_kodi_title">Lejátszás Kodi-val</string>
<string name="kore_not_found">A Kore alkalmazás nem található. Telepíted a Kore lejátszót?</string>
<string name="kore_not_found">Telepíted a Kore lejátszót\?</string>
<string name="show_play_with_kodi_title">\"Lejátszás Kodi-val\" opció mutatása</string>
<string name="show_play_with_kodi_summary">Opció mutatása a videók Kodi médiaközponttal való lejátszására</string>
<string name="play_audio">Hang</string>
@ -78,7 +78,7 @@
<string name="user_report">Felhasználói jelentés</string>
<string name="video">Videó</string>
<string name="audio">Audio</string>
<string name="main_bg_subtitle">A kezdéshez koppints a keresésre</string>
<string name="main_bg_subtitle">A kezdéshez koppints a \"Keresés\"-re!</string>
<string name="could_not_load_thumbnails">Nem sikerült az összes előnézeti kép betöltése</string>
<string name="parsing_error">Nem sikerült a weblap betöltése</string>
<string name="light_parsing_error">Nem sikerült a weblap teljes betöltése</string>
@ -115,13 +115,13 @@
<string name="no_player_found_toast">Nem található stream lejátszó alkalmazás (feltelepítheted a VLC-t a lejátszáshoz).</string>
<string name="open_in_popup_mode">Megnyitás felugró ablakként</string>
<string name="use_external_video_player_summary">Néhány felbontásnál eltávolítja a hangot</string>
<string name="popup_mode_share_menu_title">NewPipe felugró ablak</string>
<string name="popup_mode_share_menu_title">Felugró ablak</string>
<string name="subscribe_button_title">Feliratkozás</string>
<string name="subscribed_button_title">Feliratkozva</string>
<string name="show_info">Több infó</string>
<string name="default_popup_resolution_title">Alapértelmezett felugró ablak felbontása</string>
<string name="show_higher_resolutions_title">Mutassa a magasabb felbontásokat</string>
<string name="show_higher_resolutions_summary">Csak néhány eszköz támogatja a 2K/4K videók lejátszását</string>
<string name="show_higher_resolutions_summary">Csak néhány eszköz tud lejátszani 2K/4K videókat</string>
<string name="default_video_format_title">Alapértelmezett videó formátum</string>
<string name="black_theme_title">Fekete</string>
<string name="popup_remember_size_pos_title">Jegyezze meg a felugró ablak helyét és méretét</string>
@ -173,7 +173,7 @@
<string name="controls_download_desc">Adatfolyam fájl letöltése</string>
<string name="controls_add_to_playlist_title">Hozzáadás ehhez</string>
<string name="use_inexact_seek_title">Gyorsabb, de pontatlan tekerés használata</string>
<string name="use_inexact_seek_summary">A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kevesebb pontossággal</string>
<string name="use_inexact_seek_summary">A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kevesebb pontossággal. Az 5, 15, vagy 25 másodperces tekerés nem működik ebben a módban.</string>
<string name="download_thumbnail_title">Bélyegképek betöltése</string>
<string name="download_thumbnail_summary">Kapcsold ki, hogy a megelőzzed bélyegképek betöltését, így csökkentve az adat és memória használatot. Ennek az értéknek a megváltoztatása törli a memóriában és a meghajtón lévő bélyegkép gyorsítótárat.</string>
<string name="thumbnail_cache_wipe_complete_notice">A bélyegkép gyorsítótár törölve</string>
@ -374,7 +374,7 @@
<string name="tab_new">Új fül</string>
<string name="tab_choose">Válassz fület</string>
<string name="show_comments_title">Kommentek mutatása</string>
<string name="show_comments_summary">Kapcsold ki, hogy ne mutassa a kommenteket</string>
<string name="show_comments_summary">Kapcsold ki a kommentek elrejtéséhez</string>
<string name="default_content_country_title">Tartalmak alapértelmezett országa</string>
<string name="switch_to_main">Folytatás főnézetben</string>
<string name="dismiss">Figyelmen kívül hagy</string>
@ -383,5 +383,9 @@
<string name="enqueue">Sor</string>
<string name="overwrite_failed">a fájl nem írható felül</string>
<string name="seek_duration_title">Az előre- és visszatekerés időtartama</string>
<string name="enable_lock_screen_video_thumbnail_title">Videó előnézet megjelenítése a lezárási képernyőn</string>
<string name="enable_lock_screen_video_thumbnail_title">Videó előnézet a lezárási képernyőn</string>
<string name="enable_playback_resume_summary">Legutóbbi lejátszási pozíció visszaállítása</string>
<string name="enable_playback_resume_title">Lejátszás folytatása</string>
<string name="enable_lock_screen_video_thumbnail_summary">Megjeleníti a videó bélyegképét a képernyőzáron, amikor a háttér lejátszó van használva</string>
<string name="download_choose_new_path">Változtasd meg a letöltési helyet, hogy érvénybe lépjen</string>
</resources>

View File

@ -422,7 +422,7 @@
<string name="grid">Kisi</string>
<string name="auto">Otomatis</string>
<string name="switch_view">Alihkan Tampilan</string>
<string name="app_update_notification_content_title">Pembaruan NewPipe Tersedia!</string>
<string name="app_update_notification_content_title">Pembaruan NewPipe telah tersedia!</string>
<string name="app_update_notification_content_text">Ketuk untuk mengunduh</string>
<string name="missions_header_finished">Selesai</string>
<string name="missions_header_pending">Tertunda</string>
@ -524,7 +524,7 @@
<string name="default_kiosk_page_summary">Kiosk Default</string>
<string name="clear_download_history">Hapus riwayat unduhan</string>
<string name="delete_downloaded_files">Hapus berkas yang diunduh</string>
<string name="deleted_downloads">%1$s unduhan dihapus</string>
<string name="deleted_downloads">%1$d unduhan dihapus</string>
<string name="permission_display_over_apps">Izinkan untuk ditampilkan di atas aplikasi lain</string>
<string name="app_language_title">Bahasa apl</string>
<string name="systems_language">Default sistem</string>

View File

@ -530,7 +530,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">La copertina del video verrà mostrata nella schermata di blocco, durante la riproduzione in sottofondo</string>
<string name="clear_download_history">Pulisci Cronologia Download</string>
<string name="delete_downloaded_files">Elimina File Scaricati</string>
<string name="deleted_downloads">%1$s download eliminati</string>
<string name="deleted_downloads">%1$d download eliminati</string>
<string name="permission_display_over_apps">Consentire la visualizzazione sopra altre applicazioni</string>
<string name="app_language_title">Lingua Applicazione</string>
<string name="systems_language">Predefinita di Sistema</string>

View File

@ -336,7 +336,8 @@
</plurals>
<string name="one_item_deleted">1 つのアイテムが削除されました。</string>
<string name="give_back">支援する</string>
<string name="privacy_policy_encouragement">NewPipe プロジェクトはあなたのプライバシーを非常に大切にしています。あなたの同意がない限り、アプリはいかなるデータも収集しません。NewPipe のプライバシー・ポリシーでは、クラッシュリポート送信時にどのような種類のデータが送信・記録されるかを詳細に説明しています。</string>
<string name="privacy_policy_encouragement">NewPipe プロジェクトはあなたのプライバシーを非常に大切にしています。あなたの同意がない限り、アプリはいかなるデータも収集しません。
\nNewPipe のプライバシー・ポリシーでは、クラッシュリポート送信時にどのような種類のデータが送信・記録されるかを詳細に説明しています。</string>
<string name="app_license">NewPipe はコピーレフトなソフトウェアです。あなたは自由にそれを使用し、研究し、そして改善することができます。あなたは、GNU フリーソフトウェア財団が公開する GNU General Public ライセンス バージョン3以降の下に、自由に再配布・修正を行うことができます。</string>
<string name="title_last_played">最終再生日時</string>
<string name="title_most_played">最も再生した動画</string>
@ -411,7 +412,7 @@
<string name="grid">グリッド</string>
<string name="auto">自動</string>
<string name="switch_view">スイッチビュー</string>
<string name="app_update_notification_content_title">NewPipeのアップデートがあります</string>
<string name="app_update_notification_content_title">NewPipe のアップデートがあります!</string>
<string name="app_update_notification_content_text">タップでダウンロード</string>
<string name="missions_header_finished">完了</string>
<string name="missions_header_pending">保留中</string>
@ -523,7 +524,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">バックグラウンドプレイヤーを使用中、ロック画面に動画のサムネイルが表示されるようになります</string>
<string name="clear_download_history">ダウンロード履歴を消去</string>
<string name="delete_downloaded_files">ダウンロードしたファイルを消去</string>
<string name="deleted_downloads">%1$s 個削除しました</string>
<string name="deleted_downloads">%1$d 個削除しました</string>
<string name="playlist_no_uploader">自動生成 (アップローダーが見つかりません)</string>
<string name="permission_display_over_apps">他のアプリの上に表示する権限を与えてください</string>
<string name="app_language_title">アプリの言語</string>
@ -602,4 +603,5 @@
<string name="video_detail_by">%s による</string>
<string name="channel_created_by">%s により作成</string>
<string name="detail_sub_channel_thumbnail_view_description">チャンネルのサムネイル</string>
<string name="feed_group_show_only_ungrouped_subscriptions">グループ化されていない登録チャンネルのみ表示</string>
</resources>

View File

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_playback_state_lists_title">Posisi nang daftar</string>
<string name="enable_playback_resume_title">Teruske, loske wae lur</string>
<string name="enable_watch_history_title">Delok sejarah mantan</string>
<string name="enable_search_history_title">Riwayatmu biyen cuk</string>
<string name="show_search_suggestions_summary">Duduhke saran nalika nggoleki</string>
<string name="show_search_suggestions_title">Goleki saran</string>
<string name="player_gesture_controls_summary">Gunake gestur gawe ngontrol kepadhangan lan volum</string>
<string name="brightness_gesture_control_summary">Ngontrol kepadhangan ngaggo gesture</string>
<string name="brightness_gesture_control_title">Kontrol kepadhangan nganggo gestur</string>
<string name="volume_gesture_control_summary">Gunake gesture gawe ngontrol volum</string>
<string name="auto_queue_summary">Pokoke teruske muter suara/video</string>
<string name="auto_queue_title">Antri otomatis stream bare</string>
<string name="metadata_cache_wipe_complete_notice">Sampah metadata wes dibusak</string>
<string name="metadata_cache_wipe_summary">Busak kabeh sampah ora kanggo</string>
<string name="download_thumbnail_summary">Pateni ben gambar cilik ora ketok, ora boros data lan memori. Iku bakal ngresiki sampah gambar.</string>
<string name="thumbnail_cache_wipe_complete_notice">Sampah gambar wes resik</string>
<string name="show_comments_summary">Pateni gawe ngumpetke komentar</string>
<string name="show_comments_title">Duduhke komentar</string>
<string name="download_thumbnail_title">Duduhke gambar cilik</string>
<string name="seek_duration_title">Durasi cepet maju/mundure</string>
<string name="popup_remember_size_pos_summary">Eling-eling ukuran lan posisi ngambang terakhir</string>
<string name="popup_remember_size_pos_title">Eling-eling ukuran lan posisi ngambang</string>
<string name="black_theme_title">Ireng</string>
<string name="dark_theme_title">Peteng</string>
<string name="light_theme_title">Padhang</string>
<string name="theme_title">Tema</string>
<string name="default_video_format_title">Format video standar</string>
<string name="default_audio_format_title">Format audio standar</string>
<string name="play_audio">Suara ati</string>
<string name="enable_lock_screen_video_thumbnail_summary">Gambar cilik video diduduhke nang layar kegembok nalika nganggo pemuter mburi</string>
<string name="show_play_with_kodi_summary">Duduhke pilihan muter video nganggo Kodi</string>
<string name="enable_lock_screen_video_thumbnail_title">Gambar cilik nang lock screen</string>
<string name="show_play_with_kodi_title">Duduhke pilihan \"Puter nganggo Kodi\"</string>
<string name="kore_not_found">Aplikasi Kore rung ono, pasang\?</string>
<string name="play_with_kodi_title">Puter nganggo Kodi</string>
<string name="show_higher_resolutions_summary">Mung piranti tertentu sing iso muter video 2K/4K</string>
<string name="show_higher_resolutions_title">Duduhke resolusi luwih gedhe</string>
<string name="default_popup_resolution_title">Resolusi ngambang standar</string>
<string name="default_resolution_title">Resolusi standar</string>
<string name="autoplay_by_calling_app_summary">Puter video nalika NewPipe diarani seko aplikasi liyane</string>
<string name="autoplay_by_calling_app_title">Puter otomatis</string>
<string name="download_choose_new_path">Ganti tempat unduhan ben ngefek</string>
<string name="download_path_audio_dialog_title">Pilih tempat kanggo nyimpen suara</string>
<string name="download_path_audio_summary">Suara sing diunduh disimpen nang kene</string>
<string name="download_path_audio_title">Tempat nyimpen suara</string>
<string name="download_path_dialog_title">Pilih tempat nyimpen video</string>
<string name="download_path_summary">Video unduhan disimpen nang kene</string>
<string name="download_path_title">Folder video unduhan</string>
<string name="controls_add_to_playlist_title">Tambah nang</string>
<string name="controls_popup_title">Ngambang</string>
<string name="controls_background_title">Latar mburi</string>
<string name="tab_choose">Pilih Tab</string>
<string name="tab_new">Tab anyar</string>
<string name="tab_bookmarks">Daftar sing ditandai</string>
<string name="tab_subscriptions">Langganan</string>
<string name="tab_main">Utama</string>
<string name="show_info">Ndeloke info</string>
<string name="subscription_update_failed">Ora iso nganyari langganan</string>
<string name="subscription_change_failed">Ora iso ngubah langganan</string>
<string name="channel_unsubscribed">Wes ora langganan saluran</string>
<string name="unsubscribe">Rasido langganan</string>
<string name="subscribed_button_title">Pelanggan</string>
<string name="subscribe_button_title">Langganan</string>
<string name="popup_mode_share_menu_title">Mode ngambang</string>
<string name="use_external_audio_player_title">Gunake pemuter suara liyane</string>
<string name="use_external_video_player_summary">Busak suara ing resolusi cuk</string>
<string name="use_external_video_player_title">Gunake pemuter video liyane</string>
<string name="screen_rotation">puter</string>
<string name="choose_browser">Pilih browser</string>
<string name="share_dialog_title">Bagi nganggo</string>
<string name="did_you_mean">Maksude: %1$s\?</string>
<string name="settings">Setelan</string>
<string name="search">Goleki</string>
<string name="controls_download_desc">Unduh file</string>
<string name="download">Unduh</string>
<string name="share">Bagi</string>
<string name="open_in_popup_mode">Buka nang mode nyembul</string>
<string name="open_in_browser">Buka nang Browser</string>
<string name="cancel">Orasido</string>
<string name="install">Pasang</string>
<string name="no_player_found_toast">Ra ono pemuter (kowe iso pasang VLC gae muter iku).</string>
<string name="no_player_found">Raono pemuter. Pasang VLC\?</string>
<string name="upload_date_text">Diterbitke %1$s</string>
<string name="view_count_text">%1$s penonton</string>
<string name="main_bg_subtitle">Pencet \"Cari\" nek meh mulai</string>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tab_new">Iccer amaynut</string>
</resources>

View File

@ -523,8 +523,8 @@
<string name="error_download_resource_gone">이 다운로드를 복구할 수 없습니다</string>
<string name="choose_instance_prompt">인스턴스를 선택하세요</string>
<string name="enable_lock_screen_video_thumbnail_title">비디어 썸네일 화면 고정을 가능하게 한다</string>
<string name="enable_lock_screen_video_thumbnail_summary">백그라운드 플레이어를 사용하는 경우 비디오 썸네일은 고정된 스크린 위에 표시됩니다.</string>
<string name="enable_lock_screen_video_thumbnail_summary">백그라운드 플레이어를 사용하는 경우 비디오 썸네일은 잠금화면 상에 표시됩니다.</string>
<string name="clear_download_history">다운로드 기록 삭제</string>
<string name="delete_downloaded_files">다운로드된 파일 삭제</string>
<string name="deleted_downloads">%1$s 다운로드 삭제</string>
<string name="deleted_downloads">%1$d 다운로드 삭제</string>
</resources>

View File

@ -534,7 +534,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">کاتێ کارپێکەری پاشبنەما کاردەکات ئەوا وێنۆچکەی ڤیدیۆکە لە ڕوونما داخراوەکەدا نیشاندەدرێت</string>
<string name="clear_download_history">سڕینەوەی مێژووی داگرتن</string>
<string name="delete_downloaded_files">سڕینەوەی فایلە داگیراوەکان</string>
<string name="deleted_downloads">%1$ لە داگرتنەکان سڕانەوە</string>
<string name="deleted_downloads">%1$d لە داگرتنەکان سڕانەوە</string>
<string name="permission_display_over_apps">دەسەڵاتی پێبدە بۆ پیشاندان لەسەرووی ئەپەکانیترەوە</string>
<string name="app_language_title">زمانی ئەپ</string>
<string name="systems_language">بنەڕەتی سیستەم</string>

View File

@ -51,4 +51,6 @@
<!-- File picker dimensions -->
<dimen name="file_picker_items_text_size">16sp</dimen>
<dimen name="search_suggestion_text_size">14sp</dimen>
</resources>

View File

@ -224,7 +224,7 @@
<string name="video">വീഡിയോ</string>
<string name="info_dir_created">\'%1$s\' ഡൗൺലോഡ് പട്ടിക നിലവിൽ വന്നു</string>
<string name="err_dir_create">ഡൗൺലോഡ് പട്ടിക ഉണ്ടാക്കാൻ സാധിച്ചില്ല</string>
<string name="detail_drag_description">വലിച്ചിഴയ്ക്കൂ!</string>
<string name="detail_drag_description">പുനക്രമീകരിക്കാൻ വലിച്ചിടുക</string>
<string name="empty_subscription_feed_subtitle">¡ഇബടെ ഒരു കുന്തോമില്ല!</string>
<string name="search_no_results">ഫലങ്ങൾ ലഭ്യമല്ല</string>
<string name="user_report">ഉപയോക്താവിന്റെ റിപോർട്ട്</string>
@ -574,7 +574,7 @@
<string name="max_retry_desc">ഡൗൺലോഡ് റദ്ദാക്കുന്നതിനുമുമ്പ് പരമാവധി ശ്രമങ്ങൾ</string>
<string name="max_retry_msg">പരമാവധി വീണ്ടും ശ്രമിക്കുന്നു</string>
<string name="stop">നിർത്തുക</string>
<string name="deleted_downloads">1$s ഡൗൺ‌ലോഡുകൾ ഇല്ലാതാക്കി</string>
<string name="deleted_downloads">%1$d ഡൗൺ‌ലോഡുകൾ ഇല്ലാതാക്കി</string>
<string name="delete_downloaded_files">ഡൗൺലോഡ് ചെയ്ത ഫയലുകൾ ഇല്ലാതാക്കുക</string>
<string name="confirm_prompt">നിങ്ങളുടെ ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കണോ ഡൗൺലോഡ് ചെയ്ത എല്ലാ ഫയലുകളും ഇല്ലാതാക്കണോ\?</string>
<string name="clear_download_history">ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കുക</string>
@ -606,4 +606,10 @@
<string name="download_finished">ഡൗൺലോഡ് പൂർത്തിയായി</string>
<string name="download_failed">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</string>
<string name="permission_denied">സിസ്റ്റം പ്രവർത്തനം തടഞ്ഞു</string>
<string name="video_detail_by">%s മുഖാന്തരം</string>
<string name="channel_created_by">%s സൃഷ്ടിച്ചത്</string>
<string name="detail_sub_channel_thumbnail_view_description">ചാനൽ ലഘുചിത്രം</string>
<string name="show_original_time_ago_summary">സേവനങ്ങളിൽ നിന്നുള്ള യഥാർത്ഥ വാചകങ്ങൾ സ്ട്രീം ഇനങ്ങളിൽ ദൃശ്യമാകും</string>
<string name="show_original_time_ago_title">ഇനങ്ങളിൽ യഥാർത്ഥ സമയം മുമ്പ് കാണിക്കുക</string>
<string name="youtube_restricted_mode_enabled_title">യുട്യൂബ് നിയന്ത്രിത മോഡ്</string>
</resources>

View File

@ -516,7 +516,7 @@
<string name="choose_instance_prompt">Velg en instans</string>
<string name="clear_download_history">Tøm nedlastingshistorikk</string>
<string name="delete_downloaded_files">Slett nedlastede filer</string>
<string name="deleted_downloads">Slettet %1$s nedlastninger</string>
<string name="deleted_downloads">Slettet %1$d nedlastninger</string>
<string name="enable_lock_screen_video_thumbnail_title">Aktiver videominiatyrbilde på låseskjerm</string>
<string name="enable_lock_screen_video_thumbnail_summary">Når du bruker bakgrunnsspilleren, vises ent videominiatyrbilde på låseskjermen</string>
<string name="peertube_instance_url_summary">Velg dine favoritter blandt PeerTube-instansene</string>
@ -582,4 +582,10 @@
<string name="artists">Artister</string>
<string name="albums">Album</string>
<string name="songs">Sanger</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>
<string name="video_detail_by">Av %s</string>
<string name="youtube_restricted_mode_enabled_title">Begrenset YouTube-modus</string>
</resources>

View File

@ -190,7 +190,7 @@
<string name="invalid_source">यस्तो कुनै फाइल / सामग्री स्रोत भेटिएन</string>
<string name="invalid_file">फाइल अवस्थित छैन वा पढ्न वा यो लेख्न अनुमति अभाव छ</string>
<string name="file_name_empty_error">फाइलको नाम खाली हुन सक्दैन</string>
<string name="error_occurred_detail">एउटा त्रुटि देखापर्यो:%1$</string>
<string name="error_occurred_detail">एउटा त्रुटि देखापर्यो:%s</string>
<string name="no_streams_available_download">कुनै धाराहरु डाउनलोड गर्न उपलब्ध छैनन्</string>
<string name="saved_tabs_invalid_json">बचत गरिएका ट्याबहरू पढ्न सकिएन, पूर्वनिर्धारित प्रयोग गरिदै</string>
<string name="restore_defaults">फेरी पहिलाकै अवस्थामा लैजाऊ</string>
@ -276,7 +276,7 @@
<string name="action_settings">सेटिङहरू</string>
<string name="action_about">बारेमा</string>
<string name="title_licenses">तेस्रो-पक्ष इजाजत पत्र</string>
<string name="copyright" formatted="true">©%1$ को %2$s द्वारा %3$ अन्तर्गत</string>
<string name="copyright" formatted="true">©%1$s को %2$s द्वारा %3$s अन्तर्गत</string>
<string name="error_unable_to_load_license">लाइसेन्स लोड गर्न सकेन</string>
<string name="action_open_website">वेबसाइट खुला</string>
<string name="tab_about">बारेमा</string>
@ -344,7 +344,7 @@
<string name="enqueue_on_popup">नयाँ पपअपमा लामबद्ध</string>
<string name="start_here_on_main">यहाँ प्ले सुरु</string>
<string name="start_here_on_background">पृष्ठभूमिमा बजाउन सुरु गर्नुहोस</string>
<string name="start_here_on_popup">नयाँ पपअपमा बजाउन सुरु गर्नुहोस</string>
<string name="start_here_on_popup">पपअपमा बजाउन सुरु गर्नुहोस</string>
<string name="drawer_open">ड्रअर खोल्नुहोस</string>
<string name="drawer_close">ड्रअर बन्द</string>
<string name="drawer_header_action_paceholder_text">यहाँ केही चाँडै प्रकट हुनेछ ;D</string>
@ -430,7 +430,7 @@
<string name="grid">ग्रिड</string>
<string name="auto">स्वतः</string>
<string name="switch_view">स्विच दृश्य</string>
<string name="app_update_notification_content_title">नयाँ पाइप अपडेट उपलब्ध छ!</string>
<string name="app_update_notification_content_title">NewPipe अपडेट उपलब्ध छ!</string>
<string name="app_update_notification_content_text">डाउनलोड गर्न ट्याप गर्नुहोस्</string>
<string name="missions_header_finished">समाप्त</string>
<string name="missions_header_pending">रोकिएको</string>
@ -528,7 +528,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">पृष्ठभूमिमा प्लेयर प्रयोग गर्दा एउटा भिडियो थम्बनेल लक स्क्रिनमा देखाइएको छ</string>
<string name="clear_download_history">डाउनलोड इतिहास मेटाउ</string>
<string name="delete_downloaded_files">डाउनलोड गरिएका फाइलहरु मेटाउ</string>
<string name="deleted_downloads">%1$ डाउनलोडहरु मेटियो</string>
<string name="deleted_downloads">%1$d डाउनलोडहरु मेटियो</string>
<string name="permission_display_over_apps">अन्य अनुप्रयोगहरूमा प्रदर्शन गर्न अनुमति दिने</string>
<string name="app_language_title">एप्सको भाषा</string>
<string name="systems_language">सिस्टम पूर्वनिर्धारित</string>
@ -576,7 +576,7 @@
<string name="feed_processing_message">फिड प्रशोधन गर्दै …</string>
<string name="feed_notification_loading">फिड लोड गर्दै …</string>
<string name="feed_subscription_not_loaded_count">लोड गरिएको छैन:%d</string>
<string name="feed_oldest_subscription_update">फिड पछिल्लो अपडेट गरिएको:%s</string>
<string name="feed_oldest_subscription_update">फिड पछिल्लोपटक अपडेट गरिएको:%s</string>
<string name="feed_groups_header_title">च्यानल समूहहरू</string>
<string name="fragment_feed_title">नयाँ के छ</string>
<plurals name="hours">
@ -591,4 +591,27 @@
<item quantity="one">%d मिनेट</item>
<item quantity="other">%d मिनेट</item>
</plurals>
<string name="detail_sub_channel_thumbnail_view_description">च्यानल अवतार थम्बनेल</string>
<string name="remove_watched_popup_warning">भिडियोहरू जुन प्लेलिस्टमा थपिनु अघि र पछि हेरिएको थियो हटाइनेछ।
\n…
\n के तपाईँ निश्चित हुनुहुन्छ\? यो उल्ट्याउन सकिदैन!</string>
<string name="remove_watched_popup_title">हेरिएका भिडियोहरू हटाउने हो\?</string>
<string name="remove_watched">हेरिसकेको हटाउनुहोस</string>
<string name="show_original_time_ago_summary">सेवाहरूबाट मूल पाठहरू स्ट्रिम वस्तुहरूमा देखिने छन्</string>
<string name="show_original_time_ago_title">आईटमहरूमा मूल समय पहिले देखाउनुहोस्</string>
<string name="infinite_videos">आनंत भिडियोहरू</string>
<string name="more_than_100_videos">१००+ भिडियोहरू</string>
<string name="artists">कलाकारहरू</string>
<string name="albums">एल्बमहरू</string>
<string name="songs">गित</string>
<string name="restricted_video">यो भिडियो उमेर प्रतिबन्धित छ।…
\n…
\nएदी तपैंलाई हेर्न परेमा, सेटिंगमा गई “उमेर प्रतिबन्धित समाग्री” सक्षम गर्नुहोस्।</string>
<string name="youtube_restricted_mode_enabled_title">यूट्यूब प्रतिबन्धित मोड</string>
<string name="video_detail_by">%s द्वारा</string>
<string name="channel_created_by">%s द्वारा सिर्जना गरिएको</string>
<string name="content_not_supported">यो सामग्री अझै NewPipeमा समर्थित छैन।
\n…
\nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ।</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">हो र आंशिक रूपमा हेरिएको भिडियोहरू</string>
</resources>

View File

@ -151,7 +151,7 @@
<string name="tab_about">Over</string>
<string name="tab_contributors">Bijdragers</string>
<string name="tab_licenses">Licenties</string>
<string name="app_description">Vrij en licht streamen voor Android.</string>
<string name="app_description">Open source en lichtgewicht streaming voor Android.</string>
<string name="view_on_github">Bekijken op GitHub</string>
<string name="app_license_title">Licentie van NewPipe</string>
<string name="contribution_encouragement">Hulp is altijd welkom. Of je nu nieuwe ideeën hebt, vertalingen kan aanleveren, wijzigingen in het ontwerp kan verrichten, code kan opschonen of van grote wijzigingen voorzien. Hoe meer hulp, hoe beter het wordt!</string>
@ -239,10 +239,10 @@
<string name="hold_to_append">Houd ingedrukt om toe te voegen aan de wachtrij</string>
<string name="unknown_content">[Onbekend]</string>
<string name="enqueue_on_background">Toevoegen aan wachtrij in de achtergrond</string>
<string name="enqueue_on_popup">Toevoegen aan wachtrij in nieuwe pop-up</string>
<string name="enqueue_on_popup">Toevoegen aan wachtrij in pop-up</string>
<string name="start_here_on_main">Begin hier met afspelen</string>
<string name="start_here_on_background">Begin hier met afspelen in de achtergrond</string>
<string name="start_here_on_popup">Begin met afspelen in nieuwe pop-up</string>
<string name="start_here_on_popup">Begin met afspelen in pop-up</string>
<string name="donation_title">Doneren</string>
<string name="donation_encouragement">NewPipe wordt door vrijwilligers in hun vrije tijd ontwikkeld om jou de beste ervaring te brengen. Geef wat terug zodat onze ontwikkelaars NewPipe nóg beter kunnen maken terwijl ze van hun kopje koffie genieten.</string>
<string name="give_back">Teruggeven</string>
@ -426,7 +426,7 @@
<string name="grid">Raster</string>
<string name="auto">Auto</string>
<string name="switch_view">Wissel van weergave</string>
<string name="app_update_notification_content_title">NewPipe-update beschikbaar!</string>
<string name="app_update_notification_content_title">NewPipe-update is beschikbaar!</string>
<string name="app_update_notification_content_text">Tik om te downloaden</string>
<string name="missions_header_finished">Voltooid</string>
<string name="missions_header_pending">In afwachting van</string>
@ -527,7 +527,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Een video afbeelding wordt weergegeven op het vergrendelscherm wanneer de achtergrond speler wordt gebruikt</string>
<string name="clear_download_history">Download geschiedenis verwijderen</string>
<string name="delete_downloaded_files">Verwijder gedownloade bestanden</string>
<string name="deleted_downloads">%1$s downloads verwijderd</string>
<string name="deleted_downloads">%1$d downloads verwijderd</string>
<string name="permission_display_over_apps">Geef toestemming voor weergave over andere apps</string>
<string name="app_language_title">Applicatie taal</string>
<string name="systems_language">Systeem taal gebruiken</string>
@ -610,4 +610,7 @@
<string name="show_original_time_ago_summary">Originele teksten van services zijn zichtbaar in stream-items</string>
<string name="youtube_restricted_mode_enabled_title">YouTube beperkte modus</string>
<string name="show_original_time_ago_title">Laat orginele tijd geleden zien</string>
<string name="detail_sub_channel_thumbnail_view_description">De avatar-miniatuur van het kanaal</string>
<string name="video_detail_by">Door %s</string>
<string name="channel_created_by">Gecreëerd door %s</string>
</resources>

View File

@ -247,10 +247,10 @@
<string name="play_queue_audio_settings">Ustawienia dźwięku</string>
<string name="hold_to_append">Przytrzymaj, aby zakolejkować</string>
<string name="enqueue_on_background">Kolejkuj w tle</string>
<string name="enqueue_on_popup">Kolejkuj w nowym wyskakującym okienku</string>
<string name="enqueue_on_popup">Kolejkuj w wyskakującym okienku</string>
<string name="start_here_on_main">Zacznij odtwarzać tutaj</string>
<string name="start_here_on_background">Zacznij odtwarzać w tle</string>
<string name="start_here_on_popup">Zacznij odtwarzać w nowym wyskakującym okienku</string>
<string name="start_here_on_popup">Zacznij odtwarzać w wyskakującym okienku</string>
<string name="no_player_found_toast">Nie znaleziono odtwarzacza strumieniowego (żeby odtworzyć, możesz zainstalować VLC).</string>
<string name="default_content_country_title">Domyślny kraj treści</string>
<string name="service_title">Usługa</string>
@ -315,7 +315,7 @@
<string name="resize_fill">Wypełnij</string>
<string name="resize_zoom">Powiększ</string>
<string name="caption_auto_generated">Wygenerowane automatycznie</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_title">Wyciek danych</string>
<string name="enable_leak_canary_summary">Monitorowanie wycieków pamięci może powodować niestabilność aplikacji podczas zrzutu pamięci</string>
<string name="enable_disposed_exceptions_title">Zgłaszanie błędów poza cyklem życia</string>
<string name="enable_disposed_exceptions_summary">Wymusza raportowanie niedostarczonych wyjątków Rx poza cyklem życia fragmentu lub aktywności</string>
@ -358,14 +358,12 @@
<string name="playback_pitch">Wysokość dźwięku</string>
<string name="import_soundcloud_instructions_hint">twojeID, soundcloud.com/yourid</string>
<string name="unhook_checkbox">Odłącz (może powodować zniekształcenia)</string>
<string name="import_soundcloud_instructions">Aby zaimportować obserwowane z SoundCloud, musisz znać identyfikator lub link do swojego profilu. Jeśli znasz którykolwiek z nich, po prostu wpisz go w polu poniżej.
\n
\nW przeciwnym wypadku spróbuj poniższych kroków:
\n
\n1. Włącz \"tryb stacjonarny\" w przeglądarce (strona, z której zaraz skorzystasz, nie jest dostępna w trybie mobilnym)
\n2. Odwiedź stronę: %1$s
\n3. Zaloguj się na swoje konto
\n4. Skopiuj adres, na który przeglądarka przekieruje cię po zalogowaniu (to jest adres twojego profilu).</string>
<string name="import_soundcloud_instructions">Zaimportuj profil SoundCloud, wpisując adres URL lub identyfikator:
\n
\n1. Włącz „tryb pulpitu” w przeglądarce internetowej (strona nie jest dostępna dla urządzeń mobilnych)
\n2. Przejdź do tego adresu URL: %1$s
\n3. Zaloguj się, gdy zostaniesz o to poproszony
\n4. Skopiuj adres URL profilu, na który zostałeś przekierowany.</string>
<string name="no_streams_available_download">Brak źródeł do pobrania</string>
<string name="preferred_open_action_settings_title">Preferowana akcja \'otwórz\'</string>
<string name="preferred_open_action_settings_summary">Domyślna akcja podczas otwierania zawartości - %s</string>
@ -384,7 +382,8 @@
<string name="app_license">NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz redystrybuować i/lub modyfikować go zgodnie z warunkami GNU General Public License opublikowanej przez Free Software Fundation w wersji 3, albo (według twojego wyboru) jakąkolwiek późniejszą wersją.</string>
<string name="import_settings">Czy chcesz zaimportować również ustawienia?</string>
<string name="privacy_policy_title">Polityka prywatności NewPipe</string>
<string name="privacy_policy_encouragement">Projekt NewPipe bardzo poważnie traktuję politykę prywatności. Aplikacja nie zbiera żadnych danych bez Twojej zgody. Polityka prywatności programu NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o błędach aplikacji.</string>
<string name="privacy_policy_encouragement">Projekt NewPipe bardzo poważnie traktuje Twoją prywatność. Dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody.
\nPolityka prywatności programu NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o błędach aplikacji.</string>
<string name="read_privacy_policy">Przeczytaj politykę prywatności</string>
<string name="start_accept_privacy_policy">Ze względu na wprowadzenie Ogólnego Rozporządzenia o ochronie danych (RODO), chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Proszę przeczytać ją uważnie.
\nMusisz ją zaakceptować, aby przesyłać raporty o błędach.</string>
@ -536,7 +535,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Podczas korzystania z odtwarzacza w tle na ekranie blokady wyświetlana jest miniatura filmu</string>
<string name="clear_download_history">Wyczyść historię pobierania</string>
<string name="delete_downloaded_files">Usuń pobrane pliki</string>
<string name="deleted_downloads">Usunięte %1$s pobrania</string>
<string name="deleted_downloads">Usunięte %1$d pobrania</string>
<string name="permission_display_over_apps">Zezwól na wyświetlanie w innych aplikacjach</string>
<string name="app_language_title">Język aplikacji</string>
<string name="systems_language">Domyślny systemu</string>
@ -624,4 +623,5 @@
<string name="video_detail_by">Przez %s</string>
<string name="channel_created_by">Utworzone przez %s</string>
<string name="detail_sub_channel_thumbnail_view_description">Miniatura awatara kanału</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Pokaż tylko niezgrupowane subskrypcje</string>
</resources>

View File

@ -310,7 +310,7 @@
<string name="drawer_header_action_paceholder_text">Algo aparecerá aqui em breve ;D</string>
<string name="caption_auto_generated">Gerado automaticamente</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_summary">A monitoração de vazamento de memória pode pode tornar o app instável</string>
<string name="enable_leak_canary_summary">A monitoração de vazamento de memória pode tornar o app instável</string>
<string name="enable_disposed_exceptions_title">Reportar erros fora do ciclo de vida</string>
<string name="enable_disposed_exceptions_summary">Força relatório de exceções Rx não entregues fora do ciclo de vida do fragmento ou atividade após o descarte</string>
<string name="use_inexact_seek_title">Usar avanço rápido</string>
@ -428,7 +428,7 @@
<string name="grid">Grade</string>
<string name="auto">Automático</string>
<string name="switch_view">Mudar exibição</string>
<string name="app_update_notification_content_title">Atualização do NewPipe disponível!</string>
<string name="app_update_notification_content_title">Atualização do NewPipe está disponível!</string>
<string name="app_update_notification_content_text">Toque para baixar</string>
<string name="missions_header_finished">Finalizado</string>
<string name="paused">pausado</string>
@ -440,7 +440,7 @@
<string name="download_finished">Download finalizado</string>
<string name="download_finished_more">%s downloads terminados</string>
<string name="generate_unique_name">Gerar nome único</string>
<string name="overwrite">"Sobrescrever "</string>
<string name="overwrite">Sobrescrever</string>
<string name="overwrite_finished_warning">Um arquivo baixado com esse nome já existe</string>
<string name="download_already_running">Existe um download em progresso com este nome</string>
<string name="show_error">Mostrar erro</string>
@ -530,7 +530,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">A capa do vídeo é exibida na tela de bloqueio ao usar o player em segundo plano</string>
<string name="clear_download_history">Limpar histórico de downloads</string>
<string name="delete_downloaded_files">Excluir arquivos baixados</string>
<string name="deleted_downloads">%1$s arquivos excluídos</string>
<string name="deleted_downloads">%1$d arquivos excluídos</string>
<string name="permission_display_over_apps">Permitir exibição sobre outros apps</string>
<string name="app_language_title">Idioma do app</string>
<string name="systems_language">Padrão do sistema</string>
@ -613,4 +613,5 @@
<string name="video_detail_by">Por %s</string>
<string name="channel_created_by">Criado por %s</string>
<string name="detail_sub_channel_thumbnail_view_description">Capa do avatar do canal</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Mostrar apenas inscrições não agrupadas</string>
</resources>

View File

@ -232,7 +232,7 @@
<string name="play_queue_audio_settings">Definições de áudio</string>
<string name="start_here_on_main">Iniciar reprodução aqui</string>
<string name="start_here_on_background">Iniciar reprodução em segundo plano</string>
<string name="start_here_on_popup">Iniciar reprodução numa nova janela</string>
<string name="start_here_on_popup">Iniciar reprodução num popup</string>
<string name="show_info">Mostrar informação</string>
<string name="tab_bookmarks">Listas de reprodução favoritas</string>
<string name="service_title">Serviço</string>
@ -369,7 +369,7 @@
<string name="import_settings">Também deseja importar as definições\?</string>
<string name="hold_to_append">Toque longo para enfileirar</string>
<string name="enqueue_on_background">Colocar em fila em segundo plano</string>
<string name="enqueue_on_popup">Colocar em fila num nova janela</string>
<string name="enqueue_on_popup">Pôr na fila num popup</string>
<string name="preferred_open_action_settings_title">Ação de \'abrir\' preferida</string>
<string name="preferred_open_action_settings_summary">Ação predefinida ao abrir o conteúdo — %s</string>
<string name="set_as_playlist_thumbnail">Definir como Miniatura da Lista de Reprodução</string>
@ -530,7 +530,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Uma miniatura de vídeo é mostrada no ecrã de bloqueio quando utilizando o leitor de fundo</string>
<string name="clear_download_history">Limpar histórico de transferências</string>
<string name="delete_downloaded_files">Apagar ficheiros transferidos</string>
<string name="deleted_downloads">%1$s transferências apagadas</string>
<string name="deleted_downloads">%1$d transferências apagadas</string>
<string name="permission_display_over_apps">Permitir sobreposição da janela sobre outras aplicações</string>
<string name="app_language_title">Idioma da aplicação</string>
<string name="systems_language">Predefinição do sistema</string>
@ -613,4 +613,5 @@
<string name="video_detail_by">Por %s</string>
<string name="channel_created_by">Criado por %s</string>
<string name="detail_sub_channel_thumbnail_view_description">Miniatura do avatar do canal</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Mostrar apenas assinaturas não agrupadas</string>
</resources>

View File

@ -344,11 +344,11 @@
<string name="previous_export">Предыдущий экспорт</string>
<string name="subscriptions_import_unsuccessful">Не удалось импортировать подписки</string>
<string name="subscriptions_export_unsuccessful">Не удалось экспортировать подписки</string>
<string name="import_youtube_instructions">Импортируйте подписки YouTube, загрузив файл экспорта:
\n
\n1. Перейдите по ссылке %1$s
\n2. Выполните вход.
\n3. Дождитесь завершения загрузки файла экспорта.</string>
<string name="import_youtube_instructions">Импортируйте подписки YouTube, загрузив файл экспорта:
\n
\n1. Перейдите по ссылке %1$s
\n2. Авторизуйтесь, если требуется
\n3. Загрузка (файла экспорта) должна начаться автоматически</string>
<string name="import_soundcloud_instructions">Импортируйте профиль SoundCloud, введя его URL или ID:
\n
\n1. Включите режим \"Полная версия сайта\" в браузере.
@ -534,7 +534,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Показать миниатюру видео на экране блокировки при воспроизведении в фоне</string>
<string name="clear_download_history">Очистить историю загрузок</string>
<string name="delete_downloaded_files">Удаление загруженных файлов</string>
<string name="deleted_downloads">Удалено загрузок: %1$s</string>
<string name="deleted_downloads">Удалено загрузок: %1$d</string>
<string name="permission_display_over_apps">Разрешите отображение поверх приложений</string>
<string name="app_language_title">Язык интерфейса</string>
<string name="systems_language">Как в системе</string>
@ -624,4 +624,5 @@
<string name="video_detail_by">От %s</string>
<string name="channel_created_by">Создано %s</string>
<string name="detail_sub_channel_thumbnail_view_description">Миниатюра значка канала</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Показывать только несгруппированные подписки</string>
</resources>

View File

@ -63,15 +63,15 @@
<string name="content">Obsah</string>
<string name="show_age_restricted_content_title">Vekovo obmedzený obsah</string>
<string name="video_is_age_restricted">Toto video je vekovo obmedzené. Povoľte zobrazenie obsahu v nastavení.</string>
<string name="duration_live">NAŽIVO</string>
<string name="duration_live">Naživo</string>
<string name="light_parsing_error">Nemožno kompletne zanalyzovať web</string>
<string name="could_not_setup_download_menu">Nemožno nastaviť menu preberania</string>
<string name="live_streams_not_supported">Živé vysielanie zatiaľ nie je podporované</string>
<string name="could_not_get_stream">Nemožno získať žiadny stream</string>
<string name="sorry_string">Pardon, toto sa nemalo stať.</string>
<string name="error_report_button_text">Nahlásiť chybu mejlom</string>
<string name="error_report_button_text">Nahlásiť túto chybu mejlom</string>
<string name="error_snackbar_message">Pardon, nastala chyba.</string>
<string name="error_snackbar_action">SPRÁVA</string>
<string name="error_snackbar_action">Nahlásiť</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">Čo sa stalo:</string>
<string name="your_comment">Váš komentár (v Angličtine):</string>
@ -81,7 +81,7 @@
<string name="video">Video</string>
<string name="audio">Zvuk</string>
<string name="retry">Znova</string>
<string name="storage_permission_denied">Prístup na úložisko bol zakázaný</string>
<string name="storage_permission_denied">Najskôr povoľte prístup na úložisko</string>
<string name="start">Štart</string>
<string name="pause">Pauza</string>
<string name="view">Prehrať</string>
@ -153,7 +153,7 @@
<string name="enable_search_history_summary">Hľadané výrazy ukladať lokálne</string>
<string name="enable_watch_history_title">História pozretí</string>
<string name="enable_watch_history_summary">Ukladať históriu pozretých videí</string>
<string name="resume_on_audio_focus_gain_title">Pokračovať po prepnutí zobrazenia</string>
<string name="resume_on_audio_focus_gain_title">Pokračovať v prehrávaní</string>
<string name="resume_on_audio_focus_gain_summary">Pokračovať po prerušeniach (napr. hlasový hovor)</string>
<string name="notification_channel_name">NewPipe notifikácie</string>
<string name="notification_channel_description">Notifikácie pre NewPipe na pozadí a v mini okne</string>
@ -267,8 +267,8 @@
<string name="select_a_channel">Vyberte si kanál</string>
<string name="no_channel_subscribed_yet">Zatiaľ nemáte žiadne odbery kanálov</string>
<string name="select_a_kiosk">Vyberte si kiosk</string>
<string name="export_complete_toast">Export je dokončený</string>
<string name="import_complete_toast">Import je dokončený</string>
<string name="export_complete_toast">Vyexportované</string>
<string name="import_complete_toast">Naimportované</string>
<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>
@ -313,7 +313,7 @@
<string name="resize_fill">Vyplniť</string>
<string name="resize_zoom">Zväčšiť</string>
<string name="use_inexact_seek_title">Používať rýchly posun</string>
<string name="use_inexact_seek_summary">Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou</string>
<string name="use_inexact_seek_summary">Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou. Posúvanie o 5,15 alebo 25 sekúnd s týmto nastavením nefunguje.</string>
<string name="download_thumbnail_title">Načítanie miniatúr</string>
<string name="download_thumbnail_summary">Vypnutím tejto funkcie sa nebudú vytvárať miniatúry a tým sa ušetrí miesto a pamäť. Zmena nastavení spôsobuje vyčistenie vyrovnávacej pamäte.</string>
<string name="thumbnail_cache_wipe_complete_notice">Vyrovnávacia pamäť obrázkov vymazaná</string>
@ -321,7 +321,7 @@
<string name="metadata_cache_wipe_summary">Odstrániť všetky údaje webových stránok vo vyrovnávacej pamäti</string>
<string name="metadata_cache_wipe_complete_notice">Vyrovnávacia pamäť metadát bola vymazaná</string>
<string name="auto_queue_title">Automaticky zaradiť daľší stream</string>
<string name="auto_queue_summary">Automaticky zaradí súvisiaci stream, keď prehrávanie začne na poslednom streame v neopakujúcich sa zoznamoch prehrávania</string>
<string name="auto_queue_summary">Pokračovať v prehrávaní súvisiacich streamov</string>
<string name="settings_category_debug_title">Ladenie</string>
<string name="file">Súbor</string>
<string name="invalid_directory">Neplatný adresár</string>
@ -337,7 +337,7 @@
<string name="caption_auto_generated">Automaticky vygenerované</string>
<string name="caption_setting_title">Titulky</string>
<string name="caption_setting_description">Upravte mierku textu titulkov prehrávača a štýly pozadia. Vyžaduje sa reštart aplikácie.</string>
<string name="enable_leak_canary_title">Povoliť službu LeakCanary</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_summary">Monitorovanie pretečenia pamäte môže spôsobiť, že aplikácia nebude reagovať</string>
<string name="enable_disposed_exceptions_title">Nahlásiť mimo-cyklické chyby</string>
<string name="enable_disposed_exceptions_summary">Vynútiť hlásenie výnimiek nedoručiteľných Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení</string>
@ -419,10 +419,10 @@
<string name="app_update_notification_channel_description">Upozornenia na novú verziu NewPipe</string>
<string name="download_to_sdcard_error_title">Externé úložisko je nedostupné</string>
<string name="download_to_sdcard_error_message">Sťahovanie na externú SD kartu nie je možné. Obnoviť umiestnenie priečinka na sťahovanie\?</string>
<string name="saved_tabs_invalid_json">Chyba pri načítavaní uložených kariet, použijú sa predvolené</string>
<string name="saved_tabs_invalid_json">Nemožno načítať uložené karty, použijú sa predvolené</string>
<string name="restore_defaults">Obnoviť predvolené nastavenia</string>
<string name="restore_defaults_confirmation">Chcete obnoviť predvolené hodnoty\?</string>
<string name="subscribers_count_not_available">Počet účastníkov nie je k dispozícii</string>
<string name="subscribers_count_not_available">Počet odberateľov nie je k dispozícii</string>
<string name="main_page_content_summary">Karty, ktoré sa zobrazujú na hlavnej stránke</string>
<string name="selection">Výber</string>
<string name="conferences">Konferencie</string>
@ -455,7 +455,7 @@
<string name="error_path_creation">Adresár nemožno vytvoriť</string>
<string name="error_file_creation">Nemožno vytvoriť súbor</string>
<string name="error_permission_denied">Povolenie odmietnuté systémom</string>
<string name="error_ssl_exception">Bezpečnostné pripojenie zlyhalo</string>
<string name="error_ssl_exception">Nepodarilo sa vytvoriť zabezpečené pripojenie</string>
<string name="error_unknown_host">Server sa nepodarilo nájsť</string>
<string name="error_connect_host">Nepodarilo sa pripojiť k serveru</string>
<string name="error_http_no_content">Server neposiela údaje</string>
@ -537,7 +537,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Pri prehrávaní videa na pozadí sa na zamknutej obrazovke zobrazí náhľad</string>
<string name="clear_download_history">Vymazať históriu sťahovania</string>
<string name="delete_downloaded_files">Vymazať stiahnuté súbory</string>
<string name="deleted_downloads">%1$s odstránených</string>
<string name="deleted_downloads">%1$d odstránených</string>
<string name="permission_display_over_apps">Súhlas pre zobrazenie cez ďalšie aplikácie</string>
<string name="app_language_title">Jazyk aplikácie</string>
<string name="systems_language">Predvolený</string>
@ -568,8 +568,8 @@
<item quantity="few">%d dni</item>
<item quantity="other">%d dní</item>
</plurals>
<string name="feed_groups_header_title">Skupiny zdrojov</string>
<string name="feed_oldest_subscription_update">Najstaršia aktualizácia odberu: %s</string>
<string name="feed_groups_header_title">Skupiny kanálov</string>
<string name="feed_oldest_subscription_update">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>
@ -622,4 +622,7 @@
\n
\nPokiaľ ho chcete pozerať, musíte povoliť \"Vekovo obmedzený obsah\" v nastaveniach.</string>
<string name="youtube_restricted_mode_enabled_title">YouTube v obmedzenom režime</string>
<string name="video_detail_by">%s</string>
<string name="channel_created_by">Vytvoril %s</string>
<string name="detail_sub_channel_thumbnail_view_description">Minuatúrny avatar kanála</string>
</resources>

View File

@ -90,7 +90,7 @@
<string name="max_retry_desc">Numri maksimal i provave para se të anulohet shkarkimi</string>
<string name="max_retry_msg">Provat maksimale</string>
<string name="stop">Ndalo</string>
<string name="deleted_downloads">U fshinë %1$s shkarkime</string>
<string name="deleted_downloads">U fshinë %1$d shkarkime</string>
<string name="delete_downloaded_files">Fshij skedarët e shkarkuar</string>
<string name="confirm_prompt">A dëshironi të boshatisni historikun e shkarkimeve apo të fshini të gjithë skedarët e shkarkuar\?</string>
<string name="clear_download_history">Boshatis historikun e shkarkimeve</string>
@ -610,4 +610,7 @@
<string name="show_original_time_ago_summary">Tekstet origjinale nga shërbimet do të jenë të dukshme në objektet e stream</string>
<string name="show_original_time_ago_title">Shfaq titullin origjinal \"kohë më parë\" në objekte</string>
<string name="youtube_restricted_mode_enabled_title">Modaliteti i kufizuar i NewPipe</string>
<string name="detail_sub_channel_thumbnail_view_description">Pamja statike e avatarit të kanalit</string>
<string name="video_detail_by">Nga %s</string>
<string name="channel_created_by">Krijuar nga %s</string>
</resources>

View File

@ -239,10 +239,10 @@
<string name="play_queue_audio_settings">Ljudinställningar</string>
<string name="hold_to_append">Håll för att placera i kön</string>
<string name="enqueue_on_background">Placera i bakgrunds-kön</string>
<string name="enqueue_on_popup">Placera i popup-kön</string>
<string name="enqueue_on_popup">Bifoga i en popup</string>
<string name="start_here_on_main">Börja spela här</string>
<string name="start_here_on_background">Börja spela i bakgrunden</string>
<string name="start_here_on_popup">Börja spela i en ny popup</string>
<string name="start_here_on_popup">Börja spela i en popup</string>
<string name="donation_title">Donera</string>
<string name="donation_encouragement">NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe.</string>
<string name="give_back">Ge tillbaka</string>
@ -352,7 +352,7 @@
<string name="caption_auto_generated">Autogenererade</string>
<string name="caption_setting_title">Textning</string>
<string name="caption_setting_description">Ändra spelarens textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft.</string>
<string name="enable_leak_canary_title">Aktivera LeakCanary</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_summary">Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning</string>
<string name="enable_disposed_exceptions_title">Rapportera out-of-lifecycle fel</string>
<string name="enable_disposed_exceptions_summary">Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning</string>
@ -439,7 +439,7 @@
<string name="download_already_running">Det finns en pågående nedladdning med det här namnet</string>
<string name="show_error">Visa fel</string>
<string name="label_code">Kod</string>
<string name="error_ssl_exception">Säker anslutning misslyckades</string>
<string name="error_ssl_exception">Kunde inte fastställa en säker anslutning</string>
<string name="error_unknown_host">Kunde inte hitta servern</string>
<string name="error_connect_host">Kunde inte ansluta till servern</string>
<string name="error_http_no_content">Servern skickar ingen data</string>
@ -522,4 +522,76 @@
<string name="youtube_restricted_mode_enabled_title">YouTube begränsat läge</string>
<string name="localization_changes_requires_app_restart">Språket ändras när appen har startats om.</string>
<string name="error_unable_to_load_comments">Det gick inte att ladda kommentarer</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Inaktivera snabbläge</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Aktivera snabbläge</string>
<string name="feed_use_dedicated_fetch_method_summary">Tillgängligt i vissa tjänster det är vanligtvis mycket snabbare men kan returnera en begränsad mängd artiklar och ofta ofullständig information (t.ex. ingen varaktighet, objekttyp, ingen live-status).</string>
<string name="feed_use_dedicated_fetch_method_title">Hämta från dedikerat flöde när det finns tillgängligt</string>
<string name="feed_update_threshold_option_always_update">Uppdatera alltid</string>
<string name="feed_update_threshold_summary">Tid efter senaste uppdatering innan en prenumeration anses vara föråldrad — %s</string>
<string name="feed_update_threshold_title">Tröskel för uppdatering av flöde</string>
<string name="settings_category_feed_title">Flöde</string>
<string name="feed_create_new_group_button_title">Ny</string>
<string name="feed_group_dialog_delete_message">Vill du ta bort den här gruppen\?</string>
<string name="feed_group_dialog_name_input">Namn</string>
<string name="feed_group_dialog_empty_name">Tomt gruppnamn</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="one">%d vald</item>
<item quantity="other">%d valda</item>
</plurals>
<string name="feed_group_dialog_empty_selection">Ingen prenumeration vald</string>
<string name="feed_group_dialog_select_subscriptions">Välj prenumerationer</string>
<string name="feed_processing_message">Bearbetar flöde …</string>
<string name="feed_notification_loading">Läser in flöde …</string>
<string name="feed_subscription_not_loaded_count">Ej laddad: %d</string>
<string name="feed_oldest_subscription_update">Flödet senast uppdaterat: %s</string>
<string name="feed_groups_header_title">Kanalgrupper</string>
<plurals name="days">
<item quantity="one">%d dag</item>
<item quantity="other">%d dagar</item>
</plurals>
<plurals name="hours">
<item quantity="one">%d timme</item>
<item quantity="other">&amp;d timmar</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%d minut</item>
<item quantity="other">%d minuter</item>
</plurals>
<plurals name="seconds">
<item quantity="one">%d sekund</item>
<item quantity="other">%d sekunder</item>
</plurals>
<string name="new_seek_duration_toast">På grund av ExoPlayer-begränsningar sattes söktiden till %d sekunder</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ja, och delvis tittade videor</string>
<string name="remove_watched_popup_warning">Videor som har tittats före och efter att de har lagts till i spellistan kommer att tas bort.
\nÄr du säker\? Detta kan inte göras ogjort!</string>
<string name="remove_watched_popup_title">Ta bort tittade videor\?</string>
<string name="remove_watched">Ta bort tittade</string>
<string name="systems_language">Systems standard</string>
<string name="app_language_title">Appspråk</string>
<string name="choose_instance_prompt">Välj en instans</string>
<string name="downloads_storage_use_saf_summary">\"Storage Access Framework\" tillåter nedladdningar till ett externt SD-kort.
\nVissa enheter är inkompatibla</string>
<string name="downloads_storage_use_saf_title">Använd SAF</string>
<string name="downloads_storage_ask_summary_kitkat">Du blir frågad var du vill spara varje nedladdning.
\nVälj SAF om du vill ladda ner till ett externt SD-kort</string>
<string name="downloads_storage_ask_summary">Du blir frågad var du vill spara varje nedladdning</string>
<string name="downloads_storage_ask_title">Fråga var du ska ladda ner</string>
<string name="pause_downloads">Pausa nedladdningar</string>
<string name="start_downloads">Starta nedladdningar</string>
<string name="enable_queue_limit_desc">En nedladdning körs samtidigt</string>
<string name="enable_queue_limit">Begränsa nedladdningskön</string>
<string name="close">Stäng ner</string>
<string name="pause_downloads_on_mobile_desc">Användbart när du byter till mobildata, även om vissa nedladdningar inte kan avbrytas</string>
<string name="pause_downloads_on_mobile">Avbryt i en uppmätt nätverk</string>
<string name="deleted_downloads">Rensa %1$d nedladdningarna</string>
<string name="delete_downloaded_files">Radera nedladdade filer</string>
<string name="confirm_prompt">Vill du rensa din nedladdningshistorik eller radera alla nerladdade filer\?</string>
<string name="clear_download_history">Rensa nedladdningshistorik</string>
<string name="error_download_resource_gone">Kunde inte återfinna nedladdningen</string>
<string name="error_timeout">Anslutnings avbrott</string>
<string name="error_progress_lost">Framsteg förlorat, För att filen blev borttagen</string>
<string name="error_insufficient_storage">Inget utrymme kvar på enhet</string>
<string name="error_postprocessing_stopped">NewPipe stängdes under arbete med en fil</string>
<string name="error_permission_denied">Tillåtelse nekat av systemet</string>
</resources>

View File

@ -21,4 +21,5 @@
<!-- Paddings & Margins -->
<dimen name="video_item_detail_like_margin">10dp</dimen>
<dimen name="search_suggestion_text_size">14sp</dimen>
</resources>

View File

@ -5,7 +5,7 @@
<string name="upload_date_text">Yayınlanma: %1$s</string>
<string name="no_player_found">Akış oynatıcısı bulunamadı. VLC yüklensin mi\?</string>
<string name="install">Yükle</string>
<string name="cancel">Vazgeç</string>
<string name="cancel">İptal</string>
<string name="open_in_browser">Tarayıcıda aç</string>
<string name="share">Paylaş</string>
<string name="download">İndir</string>
@ -422,7 +422,7 @@
<string name="grid">Izgara</string>
<string name="auto">Otomatik</string>
<string name="switch_view">Görünümü Değiştir</string>
<string name="app_update_notification_content_title">NewPipe Güncellemesi Var!</string>
<string name="app_update_notification_content_title">NewPipe güncellemesi var!</string>
<string name="app_update_notification_content_text">İndirmek için dokunun</string>
<string name="missions_header_finished">Tamamlandı</string>
<string name="paused">durduruldu</string>
@ -530,7 +530,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">Arka plan oynatıcıyı kullanırken kilit ekranında bir video küçük resmi gösterilir</string>
<string name="clear_download_history">İndirme geçmişini temizle</string>
<string name="delete_downloaded_files">İndirilen dosyaları sil</string>
<string name="deleted_downloads">%1$s indirme silindi</string>
<string name="deleted_downloads">%1$d indirme silindi</string>
<string name="permission_display_over_apps">Diğer uygulamaların üzerinde görüntüleme izni ver</string>
<string name="app_language_title">Uygulama dili</string>
<string name="systems_language">Sistem öntanımlısı</string>
@ -613,4 +613,5 @@
<string name="video_detail_by">%s tarafından</string>
<string name="channel_created_by">%s tarafından oluşturuldu</string>
<string name="detail_sub_channel_thumbnail_view_description">Kanalın avatar küçük resmi</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Yalnızca kümelenmemiş abonelikleri göster</string>
</resources>

View File

@ -618,5 +618,8 @@
<string name="restricted_video">Це відео з віковим обмеженням.
\n
\nЩоб побачити його потрібно включите \"Контент 18+\" в налаштуваннях.</string>
<string name="deleted_downloads">Видалено %1$s завантажень</string>
<string name="deleted_downloads">Видалено %1$d завантажень</string>
<string name="detail_sub_channel_thumbnail_view_description">Ескіз аватара каналу</string>
<string name="show_original_time_ago_summary">Оригінальні тексти сервісів будуть видимі в потокових елементах</string>
<string name="youtube_restricted_mode_enabled_title">Режим обмеженого доступу YouTube</string>
</resources>

View File

@ -529,5 +529,5 @@
<string name="enable_lock_screen_video_thumbnail_summary">بیک گراؤنڈ پلیئر استعمال کرتے وقت ایک ویڈیو تھمب نیل کو لاک اسکرین پر دکھایا جائے گا</string>
<string name="clear_download_history">ڈاؤن لوڈ کی سرگزشت صاف کریں</string>
<string name="delete_downloaded_files">ڈاؤن لوڈ شدہ فائلیں حذف کریں</string>
<string name="deleted_downloads">%1$s ڈاؤن لوڈز کو حذف کیا گیا</string>
<string name="deleted_downloads">%1$d ڈاؤن لوڈز کو حذف کیا گیا</string>
</resources>

View File

@ -34,19 +34,19 @@
<!-- PeerTube -->
<style name="LightTheme.PeerTube" parent="LightTheme">
<item name="colorPrimary">@color/light_peertube_primary_color</item>
<item name="colorPrimaryDark">@color/light_peertube_dark_color</item>
<item name="colorPrimaryDark">@color/light_peertube_statusbar_color</item>
<item name="colorAccent">@color/light_peertube_accent_color</item>
</style>
<style name="DarkTheme.PeerTube" parent="DarkTheme">
<item name="colorPrimary">@color/dark_peertube_primary_color</item>
<item name="colorPrimaryDark">@color/dark_peertube_dark_color</item>
<item name="colorPrimaryDark">@color/dark_peertube_statusbar_color</item>
<item name="colorAccent">@color/dark_peertube_accent_color</item>
</style>
<style name="BlackTheme.PeerTube" parent="BlackTheme">
<item name="colorPrimary">@color/dark_peertube_primary_color</item>
<item name="colorPrimaryDark">@color/dark_peertube_dark_color</item>
<item name="colorPrimaryDark">@color/dark_peertube_statusbar_color</item>
<item name="colorAccent">@color/dark_peertube_accent_color</item>
</style>

View File

@ -520,7 +520,7 @@
<string name="downloads_storage_use_saf_summary">\'Storage Access Framework\' cho phép tải về thẻ SD.
\nMột số thiết bị có thể không tương thích</string>
<string name="downloads_storage_use_saf_title">Dùng SAF</string>
<string name="deleted_downloads">Đã xóa %1$s file tải về</string>
<string name="deleted_downloads">Đã xóa %1$d file tải về</string>
<string name="delete_downloaded_files">Xóa file đã tải về</string>
<string name="clear_download_history">Xóa lịch sử tải về</string>
<string name="error_download_resource_gone">Không thể khôi phục bản download này</string>

View File

@ -524,5 +524,5 @@
<string name="enable_lock_screen_video_thumbnail_summary">在后台播放时,锁屏上将会显示视频的缩略图</string>
<string name="clear_download_history">清除下载历史记录</string>
<string name="delete_downloaded_files">删除下载了的文件</string>
<string name="deleted_downloads">已删除 %1$s 下载</string>
<string name="deleted_downloads">已删除 %1$d 下载</string>
</resources>

View File

@ -135,7 +135,8 @@
<string name="msg_wait">請稍候…</string>
<string name="msg_copied">已複製至剪貼簿</string>
<string name="no_available_dir">稍後請在設定中選擇下載資料夾</string>
<string name="msg_popup_permission">使用懸浮視窗模式需要此權限</string>
<string name="msg_popup_permission">使用懸浮視窗模式
\n需要此權限</string>
<string name="title_activity_recaptcha">reCAPTCHA 驗證</string>
<string name="recaptcha_request_toast">已請求 reCAPTCHA 驗證</string>
<string name="controls_popup_title">懸浮視窗</string>
@ -524,7 +525,7 @@
<string name="enable_lock_screen_video_thumbnail_summary">使用背景播放器時,鎖定畫面上將會顯示影片縮圖</string>
<string name="clear_download_history">清除下載歷史紀錄</string>
<string name="delete_downloaded_files">刪除已下載的檔案</string>
<string name="deleted_downloads">已刪除 %1$s 個下載</string>
<string name="deleted_downloads">已刪除 %1$d 個下載</string>
<string name="permission_display_over_apps">給予顯示在其他應用程式上層的權限</string>
<string name="app_language_title">應用程式語言</string>
<string name="systems_language">系統預設值</string>
@ -602,4 +603,5 @@
<string name="video_detail_by">由 %s</string>
<string name="channel_created_by">由 %s 建立</string>
<string name="detail_sub_channel_thumbnail_view_description">頻道大頭貼縮圖</string>
<string name="feed_group_show_only_ungrouped_subscriptions">僅顯示未分組的訂閱</string>
</resources>

View File

@ -4,44 +4,44 @@
<color name="light_youtube_primary_color">#e53935</color>
<color name="light_youtube_dark_color">#992722</color>
<color name="light_youtube_accent_color">#000000</color>
<color name="light_youtube_statusbar_color">#ff4336</color>
<color name="light_youtube_statusbar_color">#e53935</color>
<color name="dark_youtube_primary_color">#CD322E</color>
<color name="dark_youtube_dark_color">#992722</color>
<color name="dark_youtube_accent_color">#FFFFFF</color>
<color name="dark_youtube_statusbar_color">#ff4336</color>
<color name="dark_youtube_statusbar_color">#CD322E</color>
<!-- SoundCloud -->
<color name="light_soundcloud_primary_color">#f57c00</color>
<color name="light_soundcloud_dark_color">#995700</color>
<color name="light_soundcloud_accent_color">#000000</color>
<color name="light_soundcloud_statusbar_color">#ff9100</color>
<color name="light_soundcloud_statusbar_color">#f57c00</color>
<color name="dark_soundcloud_primary_color">#f57c00</color>
<color name="dark_soundcloud_dark_color">#995700</color>
<color name="dark_soundcloud_accent_color">#FFFFFF</color>
<color name="dark_soundcloud_statusbar_color">#ff9100</color>
<color name="dark_soundcloud_statusbar_color">#f57c00</color>
<!-- PeerTube -->
<color name="light_peertube_primary_color">#ff6f00</color>
<color name="light_peertube_dark_color">#c43e00</color>
<color name="light_peertube_accent_color">#000000</color>
<color name="light_peertube_statusbar_color">#ff833a</color>
<color name="light_peertube_statusbar_color">#ff6f00</color>
<color name="dark_peertube_primary_color">#ff6f00</color>
<color name="dark_peertube_dark_color">#c43e00</color>
<color name="dark_peertube_accent_color">#FFFFFF</color>
<color name="dark_peertube_statusbar_color">#ff833a</color>
<color name="dark_peertube_statusbar_color">#ff6f00</color>
<!-- Media.CCC -->
<color name="light_media_ccc_primary_color">#9e9e9e</color>
<color name="light_media_ccc_dark_color">#616161</color>
<color name="light_media_ccc_accent_color">#000000</color>
<color name="light_media_ccc_statusbar_color">#afafaf</color>
<color name="light_media_ccc_statusbar_color">#9e9e9e</color>
<color name="dark_media_ccc_primary_color">#9e9e9e</color>
<color name="dark_media_ccc_dark_color">#616161</color>
<color name="dark_media_ccc_accent_color">#FFFFFF</color>
<color name="dark_media_ccc_statusbar_color">#afafaf</color>
<color name="dark_media_ccc_statusbar_color">#9e9e9e</color>
</resources>

Some files were not shown because too many files have changed in this diff Show More