diff --git a/README.md b/README.md index f78725338..987327ab8 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@


ScreenshotsDescriptionFeaturesUpdatesContributionDonateLicense

-

WebsiteBlogPress

+

WebsiteBlogFAQPress


WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY. diff --git a/app/build.gradle b/app/build.gradle index f7017a6df..77b27f50a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 800 - versionName "0.18.0" + versionCode 830 + versionName "0.18.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -53,6 +53,7 @@ ext { okHttpLibVersion = '3.12.6' icepickLibVersion = '3.2.0' stethoLibVersion = '1.5.0' + markwonVersion = '4.2.1' } dependencies { @@ -62,7 +63,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:8e53fda' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:fc9f031' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' @@ -94,7 +95,7 @@ dependencies { implementation 'io.reactivex.rxjava2:rxjava:2.2.2' implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' - implementation 'org.ocpsoft.prettytime:prettytime:4.0.1.Final' + implementation 'org.ocpsoft.prettytime:prettytime:4.0.3.Final' implementation "androidx.room:room-runtime:${roomDbLibVersion}" implementation "androidx.room:room-rxjava2:${roomDbLibVersion}" @@ -108,4 +109,7 @@ dependencies { implementation "com.squareup.okhttp3:okhttp:${okHttpLibVersion}" debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoLibVersion}" + + implementation "io.noties.markwon:core:${markwonVersion}" + implementation "io.noties.markwon:linkify:${markwonVersion}" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9052dabab..f27f4bad0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -112,7 +112,7 @@ + android:label="@string/recaptcha"/> + diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 7f050e6c7..dae143b6c 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -99,7 +99,7 @@ public class App extends Application { NewPipe.init(getDownloader(), Localization.getPreferredLocalization(this), Localization.getPreferredContentCountry(this)); - Localization.init(); + Localization.init(getApplicationContext()); StateSaver.init(this); initNotificationChannel(); diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 90d299c7f..7cd620faa 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -31,7 +31,6 @@ import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; @@ -56,7 +55,6 @@ import androidx.fragment.app.FragmentManager; import com.google.android.material.navigation.NavigationView; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance; @@ -67,6 +65,7 @@ import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.KioskTranslator; +import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PeertubeHelper; import org.schabi.newpipe.util.PermissionHelper; @@ -78,6 +77,8 @@ import org.schabi.newpipe.util.ThemeHelper; import java.util.ArrayList; import java.util.List; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); @@ -113,9 +114,9 @@ public class MainActivity extends AppCompatActivity { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { TLSSocketFactoryCompat.setAsDefault(); } - ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this)); + assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -419,6 +420,8 @@ public class MainActivity extends AppCompatActivity { @Override protected void onResume() { + assureCorrectAppLanguage(this); + Localization.init(getApplicationContext()); //change the date format to match the selected language on resume super.onResume(); // close drawer on return, and don't show animation, so its looks like the drawer isn't open @@ -449,6 +452,16 @@ public class MainActivity extends AppCompatActivity { sharedPreferences.edit().putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false).apply(); NavigationHelper.openMainActivity(this); } + + if (sharedPreferences.getBoolean(Constants.KEY_ENABLE_WATCH_HISTORY, true)) { + if (DEBUG) Log.d(TAG, "do not show History-menu as its disabled in settings"); + drawerItems.getMenu().findItem(ITEM_ID_HISTORY).setVisible(true); + } + + if (!sharedPreferences.getBoolean(Constants.KEY_ENABLE_WATCH_HISTORY, true)) { + if (DEBUG) Log.d(TAG, "show History-menu as its enabled in settings"); + drawerItems.getMenu().findItem(ITEM_ID_HISTORY).setVisible(false); + } } @Override @@ -551,8 +564,6 @@ public class MainActivity extends AppCompatActivity { if (!(fragment instanceof SearchFragment)) { findViewById(R.id.toolbar).findViewById(R.id.toolbar_search_container).setVisibility(View.GONE); - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main_menu, menu); } ActionBar actionBar = getSupportActionBar(); @@ -574,14 +585,6 @@ public class MainActivity extends AppCompatActivity { case android.R.id.home: onHomeButtonPressed(); return true; - case R.id.action_show_downloads: - return NavigationHelper.openDownloads(this); - case R.id.action_history: - NavigationHelper.openStatisticFragment(getSupportFragmentManager()); - return true; - case R.id.action_settings: - NavigationHelper.openSettings(this); - return true; default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index 0a2d51b53..d72f729b5 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -1,20 +1,25 @@ package org.schabi.newpipe; -import android.app.Activity; import android.content.Intent; -import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import androidx.core.app.NavUtils; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; + +import android.util.Log; +import android.view.Menu; import android.view.MenuItem; import android.webkit.CookieManager; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; +import org.schabi.newpipe.util.ThemeHelper; + +import javax.annotation.Nonnull; + /* * Created by beneth on 06.12.16. * @@ -37,48 +42,46 @@ import android.webkit.WebViewClient; public class ReCaptchaActivity extends AppCompatActivity { public static final int RECAPTCHA_REQUEST = 10; public static final String RECAPTCHA_URL_EXTRA = "recaptcha_url_extra"; - public static final String TAG = ReCaptchaActivity.class.toString(); public static final String YT_URL = "https://www.youtube.com"; - private String url; + private WebView webView; + private String foundCookies = ""; @Override protected void onCreate(Bundle savedInstanceState) { + ThemeHelper.setTheme(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_recaptcha); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); - url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA); + String url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA); if (url == null || url.isEmpty()) { url = YT_URL; } - - // Set return to Cancel by default + // set return to Cancel by default setResult(RESULT_CANCELED); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setTitle(R.string.reCaptcha_title); - actionBar.setDisplayShowTitleEnabled(true); - } + webView = findViewById(R.id.reCaptchaWebView); - WebView myWebView = findViewById(R.id.reCaptchaWebView); - - // Enable Javascript - WebSettings webSettings = myWebView.getSettings(); + // enable Javascript + WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); - ReCaptchaWebViewClient webClient = new ReCaptchaWebViewClient(this); - myWebView.setWebViewClient(webClient); + webView.setWebViewClient(new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + handleCookies(url); + } + }); - // Cleaning cache, history and cookies from webView - myWebView.clearCache(true); - myWebView.clearHistory(); + // cleaning cache, history and cookies from webView + webView.clearCache(true); + webView.clearHistory(); android.webkit.CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.removeAllCookies(aBoolean -> {}); @@ -86,77 +89,82 @@ public class ReCaptchaActivity extends AppCompatActivity { cookieManager.removeAllCookie(); } - myWebView.loadUrl(url); + webView.loadUrl(url); } - private class ReCaptchaWebViewClient extends WebViewClient { - private final Activity context; - private String mCookies; + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_recaptcha, menu); - ReCaptchaWebViewClient(Activity ctx) { - context = ctx; + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(false); + actionBar.setTitle(R.string.title_activity_recaptcha); + actionBar.setSubtitle(R.string.subtitle_activity_recaptcha); } - @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - // TODO: Start Loader - super.onPageStarted(view, url, favicon); - } + return true; + } - @Override - public void onPageFinished(WebView view, String url) { - String cookies = CookieManager.getInstance().getCookie(url); - - // TODO: Stop Loader - - // find cookies : s_gl & goojf and Add cookies to Downloader - if (find_access_cookies(cookies)) { - // Give cookies to Downloader class - DownloaderImpl.getInstance().setCookies(mCookies); - - // Closing activity and return to parent - setResult(RESULT_OK); - finish(); - } - } - - private boolean find_access_cookies(String cookies) { - boolean ret = false; - String c_s_gl = ""; - String c_goojf = ""; - - String[] parts = cookies.split("; "); - for (String part : parts) { - if (part.trim().startsWith("s_gl")) { - c_s_gl = part.trim(); - } - if (part.trim().startsWith("goojf")) { - c_goojf = part.trim(); - } - } - if (c_s_gl.length() > 0 && c_goojf.length() > 0) { - ret = true; - //mCookies = c_s_gl + "; " + c_goojf; - // Youtube seems to also need the other cookies: - mCookies = cookies; - } - - return ret; - } + @Override + public void onBackPressed() { + saveCookiesAndFinish(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { - case android.R.id.home: { - Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - NavUtils.navigateUpTo(this, intent); + case R.id.menu_item_done: + saveCookiesAndFinish(); return true; - } default: return false; } } + + private void saveCookiesAndFinish() { + handleCookies(webView.getUrl()); // try to get cookies of unclosed page + if (!foundCookies.isEmpty()) { + // give cookies to Downloader class + DownloaderImpl.getInstance().setCookies(foundCookies); + setResult(RESULT_OK); + } + + Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + NavUtils.navigateUpTo(this, intent); + } + + + + private void handleCookies(String url) { + String cookies = CookieManager.getInstance().getCookie(url); + if (MainActivity.DEBUG) Log.d(TAG, "handleCookies: url=" + url + "; cookies=" + (cookies == null ? "null" : cookies)); + if (cookies == null) return; + + addYoutubeCookies(cookies); + // add other methods to extract cookies here + } + + private void addYoutubeCookies(@Nonnull String cookies) { + if (cookies.contains("s_gl=") || cookies.contains("goojf=") || cookies.contains("VISITOR_INFO1_LIVE=")) { + // youtube seems to also need the other cookies: + addCookie(cookies); + } + } + + private void addCookie(String cookie) { + if (foundCookies.contains(cookie)) { + return; + } + + if (foundCookies.isEmpty() || foundCookies.endsWith("; ")) { + foundCookies += cookie; + } else if (foundCookies.endsWith(";")) { + foundCookies += " " + cookie; + } else { + foundCookies += "; " + cookie; + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java index 2326e795e..edfc54375 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java @@ -22,27 +22,30 @@ import android.widget.TextView; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; -import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ThemeHelper; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class AboutActivity extends AppCompatActivity { /** * List of all software components */ private static final SoftwareComponent[] SOFTWARE_COMPONENTS = new SoftwareComponent[]{ - new SoftwareComponent("Giga Get", "2014", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2), - new SoftwareComponent("NewPipe Extractor", "2017", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3), + new SoftwareComponent("Giga Get", "2014 - 2015", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2), + new SoftwareComponent("NewPipe Extractor", "2017 - 2020", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3), new SoftwareComponent("Jsoup", "2017", "Jonathan Hedley", "https://github.com/jhy/jsoup", StandardLicenses.MIT), new SoftwareComponent("Rhino", "2015", "Mozilla", "https://www.mozilla.org/rhino/", StandardLicenses.MPL2), new SoftwareComponent("ACRA", "2013", "Kevin Gaudin", "http://www.acra.ch", StandardLicenses.APACHE2), new SoftwareComponent("Universal Image Loader", "2011 - 2015", "Sergey Tarasevich", "https://github.com/nostra13/Android-Universal-Image-Loader", StandardLicenses.APACHE2), - new SoftwareComponent("CircleImageView", "2014 - 2017", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2), + new SoftwareComponent("CircleImageView", "2014 - 2020", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2), new SoftwareComponent("NoNonsense-FilePicker", "2016", "Jonas Kalderstam", "https://github.com/spacecowboy/NoNonsense-FilePicker", StandardLicenses.MPL2), - new SoftwareComponent("ExoPlayer", "2014-2017", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2), - new SoftwareComponent("RxAndroid", "2015", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2), - new SoftwareComponent("RxJava", "2016-present", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2), - new SoftwareComponent("RxBinding", "2015", "Jake Wharton", "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2) + new SoftwareComponent("ExoPlayer", "2014 - 2020", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2), + new SoftwareComponent("RxAndroid", "2015 - 2018", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2), + new SoftwareComponent("RxJava", "2016 - 2020", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2), + new SoftwareComponent("RxBinding", "2015 - 2018", "Jake Wharton", "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2), + new SoftwareComponent("PrettyTime", "2012 - 2020", "Lincoln Baxter, III", "https://github.com/ocpsoft/prettytime", StandardLicenses.APACHE2), + new SoftwareComponent("Markwon", "2017 - 2020", "Noties", "https://github.com/noties/Markwon", StandardLicenses.APACHE2) }; /** @@ -62,8 +65,10 @@ public class AboutActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); + this.setTitle(getString(R.string.title_activity_about)); setContentView(R.layout.activity_about); @@ -99,11 +104,6 @@ public class AboutActivity extends AppCompatActivity { case android.R.id.home: finish(); return true; - case R.id.action_settings: - NavigationHelper.openSettings(this); - return true; - case R.id.action_show_downloads: - return NavigationHelper.openDownloads(this); } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java index eeafc1f57..9a11b19cc 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java @@ -3,6 +3,7 @@ package org.schabi.newpipe.about; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; +import android.content.res.Resources; import android.os.AsyncTask; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -14,6 +15,8 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.lang.ref.WeakReference; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class LicenseFragmentHelper extends AsyncTask { final WeakReference weakReference; @@ -55,15 +58,15 @@ public class LicenseFragmentHelper extends AsyncTask { wv.loadData(webViewData, "text/html; charset=UTF-8", null); alert.setView(wv); - alert.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); + assureCorrectAppLanguage(activity.getApplicationContext()); + alert.setNegativeButton(getFinishString(activity), (dialog, which) -> dialog.dismiss()); alert.show(); } + private static String getFinishString(Activity activity) { + return activity.getApplicationContext().getResources().getString(R.string.finish); + } + /** * @param context the context to use * @param license the license diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java index 449a790e8..00dd45ac9 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java @@ -12,12 +12,13 @@ import android.view.MenuItem; import android.view.ViewTreeObserver; import org.schabi.newpipe.R; -import org.schabi.newpipe.settings.SettingsActivity; import org.schabi.newpipe.util.ThemeHelper; import us.shandian.giga.service.DownloadManagerService; import us.shandian.giga.ui.fragment.MissionsFragment; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class DownloadActivity extends AppCompatActivity { private static final String MISSIONS_FRAGMENT_TAG = "fragment_tag"; @@ -29,6 +30,7 @@ public class DownloadActivity extends AppCompatActivity { i.setClass(this, DownloadManagerService.class); startService(i); + assureCorrectAppLanguage(this); ThemeHelper.setTheme(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_downloader); @@ -78,11 +80,7 @@ public class DownloadActivity extends AppCompatActivity { onBackPressed(); return true; } - case R.id.action_settings: { - Intent intent = new Intent(this, SettingsActivity.class); - startActivity(intent); - return true; - } + default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 853bb6d68..c78e68597 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -11,15 +11,6 @@ import android.os.Bundle; import android.os.Environment; import android.os.IBinder; import android.preference.PreferenceManager; -import androidx.annotation.IdRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.fragment.app.DialogFragment; -import androidx.documentfile.provider.DocumentFile; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.view.menu.ActionMenuItemView; -import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; @@ -34,6 +25,16 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.view.menu.ActionMenuItemView; +import androidx.appcompat.widget.Toolbar; +import androidx.documentfile.provider.DocumentFile; +import androidx.fragment.app.DialogFragment; + import com.nononsenseapps.filepicker.Utils; import org.schabi.newpipe.MainActivity; @@ -78,6 +79,8 @@ import us.shandian.giga.service.DownloadManagerService; import us.shandian.giga.service.DownloadManagerService.DownloadManagerBinder; import us.shandian.giga.service.MissionState; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheckedChangeListener, AdapterView.OnItemSelectedListener { private static final String TAG = "DialogFragment"; private static final boolean DEBUG = MainActivity.DEBUG; @@ -527,10 +530,11 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck } private void showFailedDialog(@StringRes int msg) { + assureCorrectAppLanguage(getContext()); new AlertDialog.Builder(context) .setTitle(R.string.general_error) .setMessage(msg) - .setNegativeButton(android.R.string.ok, null) + .setNegativeButton(getString(R.string.finish), null) .create() .show(); } @@ -832,7 +836,6 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck psArgs = new String[]{ selectedStream.getFormat().getSuffix(), "false",// ignore empty frames - "false",// detect youtube duplicate lines }; } break; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 14e989625..3c594bdfa 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -2,7 +2,6 @@ package org.schabi.newpipe.fragments.detail; import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; @@ -18,7 +17,6 @@ import androidx.fragment.app.Fragment; import androidx.core.content.ContextCompat; import androidx.viewpager.widget.ViewPager; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.text.Html; import android.text.Spanned; @@ -58,6 +56,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.Description; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; @@ -79,6 +78,7 @@ import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.InfoCache; +import org.schabi.newpipe.util.KoreUtil; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; @@ -95,6 +95,8 @@ import java.util.List; import java.util.concurrent.TimeUnit; import icepick.State; +import io.noties.markwon.Markwon; +import io.noties.markwon.linkify.LinkifyPlugin; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; @@ -482,7 +484,6 @@ public class VideoDetailFragment videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view); videoDescriptionView = rootView.findViewById(R.id.detail_description_view); videoDescriptionView.setMovementMethod(LinkMovementMethod.getInstance()); - videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS); thumbsUpTextView = rootView.findViewById(R.id.detail_thumbs_up_count_view); thumbsUpImageView = rootView.findViewById(R.id.detail_thumbs_up_img_view); @@ -624,7 +625,7 @@ public class VideoDetailFragment url.replace("https", "http"))); } catch (Exception e) { if (DEBUG) Log.i(TAG, "Failed to start kore", e); - showInstallKoreDialog(activity); + KoreUtil.showInstallKoreDialog(activity); } return true; default: @@ -632,16 +633,6 @@ public class VideoDetailFragment } } - private static void showInstallKoreDialog(final Context context) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setMessage(R.string.kore_not_found) - .setPositiveButton(R.string.install, (DialogInterface dialog, int which) -> - NavigationHelper.installKore(context)) - .setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> { - }); - builder.create().show(); - } - private void setupActionBarOnError(final String url) { if (DEBUG) Log.d(TAG, "setupActionBarHandlerOnError() called with: url = [" + url + "]"); Log.e("-----", "missing code"); @@ -928,28 +919,41 @@ public class VideoDetailFragment return sortedVideoStreams != null ? sortedVideoStreams.get(selectedVideoStreamIndex) : null; } - private void prepareDescription(final String descriptionHtml) { - if (TextUtils.isEmpty(descriptionHtml)) { + private void prepareDescription(Description description) { + if (TextUtils.isEmpty(description.getContent()) || description == Description.emptyDescription) { return; } - disposables.add(Single.just(descriptionHtml) - .map((@io.reactivex.annotations.NonNull String description) -> { - Spanned parsedDescription; - if (Build.VERSION.SDK_INT >= 24) { - parsedDescription = Html.fromHtml(description, 0); - } else { - //noinspection deprecation - parsedDescription = Html.fromHtml(description); - } - return parsedDescription; - }) - .subscribeOn(Schedulers.computation()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> { - videoDescriptionView.setText(spanned); - videoDescriptionView.setVisibility(View.VISIBLE); - })); + if (description.getType() == Description.HTML) { + disposables.add(Single.just(description.getContent()) + .map((@io.reactivex.annotations.NonNull String descriptionText) -> { + Spanned parsedDescription; + if (Build.VERSION.SDK_INT >= 24) { + parsedDescription = Html.fromHtml(descriptionText, 0); + } else { + //noinspection deprecation + parsedDescription = Html.fromHtml(descriptionText); + } + return parsedDescription; + }) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> { + videoDescriptionView.setText(spanned); + videoDescriptionView.setVisibility(View.VISIBLE); + })); + } else if (description.getType() == Description.MARKDOWN) { + final Markwon markwon = Markwon.builder(getContext()) + .usePlugin(LinkifyPlugin.create()) + .build(); + markwon.setMarkdown(videoDescriptionView, description.getContent()); + videoDescriptionView.setVisibility(View.VISIBLE); + } else { + //== Description.PLAIN_TEXT + videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS); + videoDescriptionView.setText(description.getContent(), TextView.BufferType.SPANNABLE); + videoDescriptionView.setVisibility(View.VISIBLE); + } } private void setHeightThumbnail() { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index 4d94ec392..58f1ab90d 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -1,9 +1,15 @@ package org.schabi.newpipe.info_list.holder; -import androidx.appcompat.app.AppCompatActivity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.text.util.Linkify; +import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; import org.jsoup.helper.StringUtil; import org.schabi.newpipe.R; @@ -120,6 +126,21 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { itemBuilder.getOnCommentsSelectedListener().selected(item); } }); + + + itemView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + + 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(); + return true; + + } + }); + } private void ellipsize() { diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 8f67367aa..761fa4360 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -1,8 +1,11 @@ package org.schabi.newpipe.local.bookmark; import android.app.AlertDialog; +import android.app.AlertDialog.Builder; import android.os.Bundle; import android.os.Parcelable; +import android.util.Log; +import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.FragmentManager; @@ -10,6 +13,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import io.reactivex.disposables.Disposable; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import org.schabi.newpipe.NewPipeDatabase; @@ -118,8 +122,7 @@ public final class BookmarkFragment @Override public void held(LocalItem selectedItem) { if (selectedItem instanceof PlaylistMetadataEntry) { - showLocalDeleteDialog((PlaylistMetadataEntry) selectedItem); - + showLocalDialog((PlaylistMetadataEntry) selectedItem); } else if (selectedItem instanceof PlaylistRemoteEntity) { showRemoteDeleteDialog((PlaylistRemoteEntity) selectedItem); } @@ -247,14 +250,30 @@ public final class BookmarkFragment // Utils /////////////////////////////////////////////////////////////////////////// - private void showLocalDeleteDialog(final PlaylistMetadataEntry item) { - showDeleteDialog(item.name, localPlaylistManager.deletePlaylist(item.uid)); - } - private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) { showDeleteDialog(item.getName(), remotePlaylistManager.deletePlaylist(item.getUid())); } + private void showLocalDialog(PlaylistMetadataEntry selectedItem) { + View dialogView = View.inflate(getContext(), R.layout.dialog_bookmark, null); + EditText editText = dialogView.findViewById(R.id.playlist_name_edit_text); + editText.setText(selectedItem.name); + + Builder builder = new AlertDialog.Builder(activity); + builder.setView(dialogView) + .setPositiveButton(R.string.rename_playlist, (dialog, which) -> { + changeLocalPlaylistName(selectedItem.uid, editText.getText().toString()); + }) + .setNegativeButton(R.string.cancel, null) + .setNeutralButton(R.string.delete, (dialog, which) -> { + showDeleteDialog(selectedItem.name, + localPlaylistManager.deletePlaylist(selectedItem.uid)); + dialog.dismiss(); + }) + .create() + .show(); + } + private void showDeleteDialog(final String name, final Single deleteReactor) { if (activity == null || disposables == null) return; @@ -271,6 +290,23 @@ public final class BookmarkFragment .show(); } + private void changeLocalPlaylistName(long id, String name) { + if (localPlaylistManager == null) { + return; + } + + if (DEBUG) { + Log.d(TAG, "Updating playlist id=[" + id + + "] with new name=[" + name + "] items"); + } + + localPlaylistManager.renamePlaylist(id, name); + final Disposable disposable = localPlaylistManager.renamePlaylist(id, name) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(longs -> {/*Do nothing on success*/}, this::onError); + disposables.add(disposable); + } + private static List merge(final List localPlaylists, final List remotePlaylists) { List items = new ArrayList<>( diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 9f21e05ff..17599a1ca 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -388,8 +388,10 @@ public class LocalPlaylistFragment extends BaseLocalListFragment { + .setPositiveButton(R.string.finish, (dialogInterface, i) -> { if (resultServiceIntent != null && getContext() != null) { getContext().startService(resultServiceIntent); } diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 76da7da36..9e23d9145 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -58,7 +58,7 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ThemeHelper; import static org.schabi.newpipe.player.helper.PlayerHelper.getTimeString; - +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; /** * Base players joining the common properties @@ -115,7 +115,7 @@ public final class BackgroundPlayer extends Service { notificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)); lockManager = new LockManager(this); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - + assureCorrectAppLanguage(this); ThemeHelper.setTheme(this); basePlayerImpl = new BasePlayerImpl(this); basePlayerImpl.setup(); diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java index 761b50d85..1b5b5d07c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java @@ -55,10 +55,7 @@ public final class BackgroundPlayerActivity extends ServicePlayerActivity { return true; } - this.player.setRecovery(); - getApplicationContext().sendBroadcast(getPlayerShutdownIntent()); - getApplicationContext().startService(getSwitchIntent(PopupVideoPlayer.class)); - return true; + return switchTo(PopupVideoPlayer.class); } return false; } diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 6452a9850..46ca3921d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -150,6 +150,8 @@ public abstract class BasePlayer implements @NonNull public static final String RESUME_PLAYBACK = "resume_playback"; @NonNull + public static final String START_PAUSED = "start_paused"; + @NonNull public static final String SELECT_ON_APPEND = "select_on_append"; /*////////////////////////////////////////////////////////////////////////// @@ -304,7 +306,7 @@ public abstract class BasePlayer implements } // Good to go... initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, - /*playOnInit=*/true); + /*playOnInit=*/!intent.getBooleanExtra(START_PAUSED, false)); } protected void initPlayback(@NonNull final PlayQueue queue, @@ -944,10 +946,10 @@ public abstract class BasePlayer implements public void onPlayPause() { if (DEBUG) Log.d(TAG, "onPlayPause() called"); - if (!isPlaying()) { - onPlay(); - } else { + if (isPlaying()) { onPause(); + } else { + onPlay(); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 7a3e60c66..31f7dd74a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -28,6 +28,7 @@ import android.database.ContentObserver; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.media.AudioManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -75,6 +76,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback; import org.schabi.newpipe.player.resolver.MediaSourceTag; import org.schabi.newpipe.player.resolver.VideoPlaybackResolver; import org.schabi.newpipe.util.AnimationUtils; +import org.schabi.newpipe.util.KoreUtil; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; @@ -93,6 +95,7 @@ import static org.schabi.newpipe.util.AnimationUtils.Type.SCALE_AND_ALPHA; import static org.schabi.newpipe.util.AnimationUtils.Type.SLIDE_AND_ALPHA; import static org.schabi.newpipe.util.AnimationUtils.animateRotation; import static org.schabi.newpipe.util.AnimationUtils.animateView; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import static org.schabi.newpipe.util.StateSaver.KEY_SAVED_STATE; /** @@ -123,6 +126,7 @@ public final class MainVideoPlayer extends AppCompatActivity @Override protected void onCreate(@Nullable Bundle savedInstanceState) { + assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); if (DEBUG) Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]"); defaultPreferences = PreferenceManager.getDefaultSharedPreferences(this); @@ -190,6 +194,7 @@ public final class MainVideoPlayer extends AppCompatActivity @Override protected void onResume() { if (DEBUG) Log.d(TAG, "onResume() called"); + assureCorrectAppLanguage(this); super.onResume(); if (globalScreenOrientationLocked()) { @@ -220,6 +225,7 @@ public final class MainVideoPlayer extends AppCompatActivity @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); + assureCorrectAppLanguage(this); if (playerImpl.isSomePopupMenuVisible()) { playerImpl.getQualityPopupMenu().dismiss(); @@ -364,8 +370,8 @@ public final class MainVideoPlayer extends AppCompatActivity } private boolean globalScreenOrientationLocked() { - // 1: Screen orientation changes using acelerometer - // 0: Screen orientatino is locked + // 1: Screen orientation changes using accelerometer + // 0: Screen orientation is locked return !(android.provider.Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 1); } @@ -435,6 +441,7 @@ public final class MainVideoPlayer extends AppCompatActivity private boolean queueVisible; private ImageButton moreOptionsButton; + private ImageButton kodiButton; private ImageButton shareButton; private ImageButton toggleOrientationButton; private ImageButton switchPopupButton; @@ -471,6 +478,7 @@ public final class MainVideoPlayer extends AppCompatActivity this.moreOptionsButton = rootView.findViewById(R.id.moreOptionsButton); this.secondaryControls = rootView.findViewById(R.id.secondaryControls); + this.kodiButton = rootView.findViewById(R.id.kodi); this.shareButton = rootView.findViewById(R.id.share); this.toggleOrientationButton = rootView.findViewById(R.id.toggleOrientation); this.switchBackgroundButton = rootView.findViewById(R.id.switchBackground); @@ -482,6 +490,9 @@ public final class MainVideoPlayer extends AppCompatActivity titleTextView.setSelected(true); channelTextView.setSelected(true); + boolean showKodiButton = PreferenceManager.getDefaultSharedPreferences(this.context).getBoolean( + this.context.getString(R.string.show_play_with_kodi_key), false); + kodiButton.setVisibility(showKodiButton ? View.VISIBLE : View.GONE); getRootView().setKeepScreenOn(true); } @@ -518,6 +529,7 @@ public final class MainVideoPlayer extends AppCompatActivity closeButton.setOnClickListener(this); moreOptionsButton.setOnClickListener(this); + kodiButton.setOnClickListener(this); shareButton.setOnClickListener(this); toggleOrientationButton.setOnClickListener(this); switchBackgroundButton.setOnClickListener(this); @@ -588,6 +600,17 @@ public final class MainVideoPlayer extends AppCompatActivity finish(); } + public void onKodiShare() { + onPause(); + try { + NavigationHelper.playWithKore(this.context, Uri.parse( + playerImpl.getVideoUrl().replace("https", "http"))); + } catch (Exception e) { + if (DEBUG) Log.i(TAG, "Failed to start kore", e); + KoreUtil.showInstallKoreDialog(this.context); + } + } + /*////////////////////////////////////////////////////////////////////////// // Player Overrides //////////////////////////////////////////////////////////////////////////*/ @@ -614,7 +637,8 @@ public final class MainVideoPlayer extends AppCompatActivity this.getPlaybackPitch(), this.getPlaybackSkipSilence(), this.getPlaybackQuality(), - false + false, + !isPlaying() ); context.startService(intent); @@ -637,7 +661,8 @@ public final class MainVideoPlayer extends AppCompatActivity this.getPlaybackPitch(), this.getPlaybackSkipSilence(), this.getPlaybackQuality(), - false + false, + !isPlaying() ); context.startService(intent); @@ -686,6 +711,8 @@ public final class MainVideoPlayer extends AppCompatActivity } else if (v.getId() == closeButton.getId()) { onPlaybackShutdown(); return; + } else if (v.getId() == kodiButton.getId()) { + onKodiShare(); } if (getCurrentState() != STATE_COMPLETED) { diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 969c47990..fc14e8d51 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -80,6 +80,7 @@ import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING; import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION; import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME; import static org.schabi.newpipe.util.AnimationUtils.animateView; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; /** * Service Popup Player implementing VideoPlayer @@ -142,6 +143,7 @@ public final class PopupVideoPlayer extends Service { @Override public void onCreate() { + assureCorrectAppLanguage(this); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); notificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)); @@ -169,6 +171,7 @@ public final class PopupVideoPlayer extends Service { @Override public void onConfigurationChanged(Configuration newConfig) { + assureCorrectAppLanguage(this); if (DEBUG) Log.d(TAG, "onConfigurationChanged() called with: newConfig = [" + newConfig + "]"); updateScreenSize(); updatePopupSize(popupLayoutParams.width, -1); @@ -567,7 +570,8 @@ public final class PopupVideoPlayer extends Service { this.getPlaybackPitch(), this.getPlaybackSkipSilence(), this.getPlaybackQuality(), - false + false, + !isPlaying() ); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); @@ -1123,4 +1127,4 @@ public final class PopupVideoPlayer extends Service { return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius(); } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java index 44fcdb8dd..b2af6d9d8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayerActivity.java @@ -48,10 +48,7 @@ public final class PopupVideoPlayerActivity extends ServicePlayerActivity { @Override public boolean onPlayerOptionSelected(MenuItem item) { if (item.getItemId() == R.id.action_switch_background) { - this.player.setRecovery(); - getApplicationContext().sendBroadcast(getPlayerShutdownIntent()); - getApplicationContext().startService(getSwitchIntent(BackgroundPlayer.class)); - return true; + return switchTo(BackgroundPlayer.class); } return false; } diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index 2207808ac..669d1c16c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -46,6 +46,7 @@ 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; public abstract class ServicePlayerActivity extends AppCompatActivity implements PlayerEventListener, SeekBar.OnSeekBarChangeListener, @@ -116,6 +117,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { + assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); setContentView(R.layout.activity_player_queue_control); @@ -157,18 +159,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity case R.id.action_append_playlist: appendAllToPlaylist(); return true; - case R.id.action_settings: - NavigationHelper.openSettings(this); - redraw = true; - return true; case R.id.action_system_audio: startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS)); return true; case R.id.action_switch_main: - this.player.setRecovery(); - getApplicationContext().sendBroadcast(getPlayerShutdownIntent()); - getApplicationContext().startActivity(getSwitchIntent(MainVideoPlayer.class)); - return true; + return switchTo(MainVideoPlayer.class); } return onPlayerOptionSelected(item) || super.onOptionsItemSelected(item); } @@ -189,8 +184,17 @@ public abstract class ServicePlayerActivity extends AppCompatActivity this.player.getPlaybackPitch(), this.player.getPlaybackSkipSilence(), null, + false, false - ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying()); + } + + protected boolean switchTo(final Class clazz) { + this.player.setRecovery(); + getApplicationContext().sendBroadcast(getPlayerShutdownIntent()); + getApplicationContext().startActivity(getSwitchIntent(clazz)); + return true; } //////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index 4feed74fe..3ada3a6be 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -17,6 +17,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.util.SliderStrategy; import static org.schabi.newpipe.player.BasePlayer.DEBUG; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; public class PlaybackParameterDialog extends DialogFragment { @NonNull private static final String TAG = "PlaybackParameterDialog"; @@ -108,6 +109,7 @@ public class PlaybackParameterDialog extends DialogFragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { + assureCorrectAppLanguage(getContext()); super.onCreate(savedInstanceState); if (savedInstanceState != null) { initialTempo = savedInstanceState.getDouble(INITIAL_TEMPO_KEY, DEFAULT_TEMPO); @@ -137,6 +139,7 @@ public class PlaybackParameterDialog extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + assureCorrectAppLanguage(getContext()); final View view = View.inflate(getContext(), R.layout.dialog_playback_parameter, null); setupControlViews(view); diff --git a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java index 0bb93c63f..c90aff1c9 100644 --- a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java @@ -46,6 +46,8 @@ import java.util.List; import java.util.TimeZone; import java.util.Vector; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + /* * Created by Christian Schabesberger on 24.10.15. * @@ -171,6 +173,7 @@ public class ErrorActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); setContentView(R.layout.activity_error); diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 0c7a4b46e..03d48ca5b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -7,11 +7,12 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; +import android.util.Log; +import android.widget.Toast; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.Preference; -import android.util.Log; -import android.widget.Toast; import com.nononsenseapps.filepicker.Utils; import com.nostra13.universalimageloader.core.ImageLoader; @@ -40,6 +41,8 @@ import java.util.Map; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class ContentSettingsFragment extends BasePreferenceFragment { private static final int REQUEST_IMPORT_PATH = 8945; @@ -56,6 +59,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { private Localization initialSelectedLocalization; private ContentCountry initialSelectedContentCountry; + private String initialLanguage; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -64,6 +68,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { initialSelectedLocalization = org.schabi.newpipe.util.Localization.getPreferredLocalization(requireContext()); initialSelectedContentCountry = org.schabi.newpipe.util.Localization.getPreferredContentCountry(requireContext()); + initialLanguage = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("app_language_key", "en"); } @Override @@ -125,9 +130,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment { .getPreferredLocalization(requireContext()); final ContentCountry selectedContentCountry = org.schabi.newpipe.util.Localization .getPreferredContentCountry(requireContext()); + final String selectedLanguage = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("app_language_key", "en"); if (!selectedLocalization.equals(initialSelectedLocalization) - || !selectedContentCountry.equals(initialSelectedContentCountry)) { + || !selectedContentCountry.equals(initialSelectedContentCountry) || !selectedLanguage.equals(initialLanguage)) { Toast.makeText(requireContext(), R.string.localization_changes_requires_app_restart, Toast.LENGTH_LONG).show(); NewPipe.setupLocalization(selectedLocalization, selectedContentCountry); @@ -136,6 +142,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { @Override public void onActivityResult(int requestCode, int resultCode, @NonNull Intent data) { + assureCorrectAppLanguage(getContext()); super.onActivityResult(requestCode, resultCode, data); if (DEBUG) { Log.d(TAG, "onActivityResult() called with: requestCode = [" + requestCode + "], resultCode = [" + resultCode + "], data = [" + data + "]"); @@ -150,7 +157,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { } else { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(R.string.override_current_data) - .setPositiveButton(android.R.string.ok, + .setPositiveButton(getString(R.string.finish), (DialogInterface d, int id) -> importDatabase(path)) .setNegativeButton(android.R.string.cancel, (DialogInterface d, int id) -> d.cancel()); @@ -189,7 +196,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - }finally { + } finally { try { if (output != null) { output.flush(); @@ -236,7 +243,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { } //If settings file exist, ask if it should be imported. - if(ZipHelper.extractFileFromZip(filePath, newpipe_settings.getPath(), "newpipe.settings")) { + if (ZipHelper.extractFileFromZip(filePath, newpipe_settings.getPath(), "newpipe.settings")) { AlertDialog.Builder alert = new AlertDialog.Builder(getContext()); alert.setTitle(R.string.import_settings); @@ -245,7 +252,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { // restart app to properly load db System.exit(0); }); - alert.setPositiveButton(android.R.string.yes, (dialog, which) -> { + alert.setPositiveButton(getString(R.string.finish), (dialog, which) -> { dialog.dismiss(); loadSharedPreferences(newpipe_settings); // restart app to properly load db @@ -291,7 +298,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); - }finally { + } finally { try { if (input != null) { input.close(); diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index 8becc79a8..b8ce0ec18 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -8,11 +8,12 @@ import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.preference.Preference; -import android.util.Log; -import android.widget.Toast; import com.nononsenseapps.filepicker.Utils; @@ -28,6 +29,8 @@ import java.nio.charset.StandardCharsets; import us.shandian.giga.io.StoredDirectoryHelper; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + public class DownloadSettingsFragment extends BasePreferenceFragment { private static final int REQUEST_DOWNLOAD_VIDEO_PATH = 0x1235; private static final int REQUEST_DOWNLOAD_AUDIO_PATH = 0x1236; @@ -159,7 +162,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { AlertDialog.Builder msg = new AlertDialog.Builder(ctx); msg.setTitle(title); msg.setMessage(message); - msg.setPositiveButton(android.R.string.ok, null); + msg.setPositiveButton(getString(R.string.finish), null); msg.show(); } @@ -202,6 +205,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { + assureCorrectAppLanguage(getContext()); super.onActivityResult(requestCode, resultCode, data); if (DEBUG) { Log.d(TAG, "onActivityResult() called with: requestCode = [" + requestCode + "], " + diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index a3f218074..53d60f86c 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -14,6 +14,7 @@ import android.view.MenuItem; import org.schabi.newpipe.R; import org.schabi.newpipe.util.ThemeHelper; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; /* * Created by Christian Schabesberger on 31.08.15. @@ -44,7 +45,7 @@ public class SettingsActivity extends AppCompatActivity implements BasePreferenc @Override protected void onCreate(Bundle savedInstanceBundle) { setTheme(ThemeHelper.getSettingsThemeStyle(this)); - + assureCorrectAppLanguage(this); super.onCreate(savedInstanceBundle); setContentView(R.layout.settings_layout); diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index 9bbdd650d..7bb931309 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -1,12 +1,64 @@ package org.schabi.newpipe.settings; +import android.content.SharedPreferences; +import android.os.Build; import android.os.Bundle; +import android.provider.Settings; +import android.view.View; + +import androidx.annotation.Nullable; + +import com.google.android.material.snackbar.Snackbar; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.PermissionHelper; public class VideoAudioSettingsFragment extends BasePreferenceFragment { + + private SharedPreferences.OnSharedPreferenceChangeListener listener; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + listener = (sharedPreferences, s) -> { + + // on M and above, if user chooses to minimise to popup player on exit and the app doesn't have + // display over other apps permission, show a snackbar to let the user give permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && + s.equals(getString(R.string.minimize_on_exit_key))) { + + String newSetting = sharedPreferences.getString(s, null); + if (newSetting != null + && newSetting.equals(getString(R.string.minimize_on_exit_popup_key)) + && !Settings.canDrawOverlays(getContext())) { + + Snackbar.make(getListView(), R.string.permission_display_over_apps, Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.settings, + view -> PermissionHelper.checkSystemAlertWindowPermission(getContext())) + .show(); + + } + } + }; + } + + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.video_audio_settings); } + + @Override + public void onResume() { + super.onResume(); + getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener); + + } + + @Override + public void onPause() { + super.onPause(); + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener); + } } diff --git a/app/src/main/java/org/schabi/newpipe/streams/DataReader.java b/app/src/main/java/org/schabi/newpipe/streams/DataReader.java index 0e62810c5..75b55cd73 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/DataReader.java +++ b/app/src/main/java/org/schabi/newpipe/streams/DataReader.java @@ -137,6 +137,7 @@ public class DataReader { position = 0; readOffset = readBuffer.length; + readCount = 0; } public boolean canRewind() { diff --git a/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java b/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java index 818f6148e..57a7aaa9c 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.streams.io.SharpStream; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.ArrayList; /** * @author kapodamy @@ -23,7 +24,6 @@ public class Mp4FromDashWriter { private final static byte SAMPLES_PER_CHUNK = 6;// ffmpeg uses 2, basic uses 1 (with 60fps uses 21 or 22). NewPipe will use 6 private final static long THRESHOLD_FOR_CO64 = 0xFFFEFFFFL;// near 3.999 GiB private final static int THRESHOLD_MOOV_LENGTH = (256 * 1024) + (2048 * 1024); // 2.2 MiB enough for: 1080p 60fps 00h35m00s - private final static short SINGLE_CHUNK_SAMPLE_BUFFER = 256; private final long time; @@ -46,6 +46,8 @@ public class Mp4FromDashWriter { private int overrideMainBrand = 0x00; + private ArrayList compatibleBrands = new ArrayList<>(5); + public Mp4FromDashWriter(SharpStream... sources) throws IOException { for (SharpStream src : sources) { if (!src.canRewind() && !src.canRead()) { @@ -57,6 +59,10 @@ public class Mp4FromDashWriter { readers = new Mp4DashReader[sourceTracks.length]; readersChunks = new Mp4DashChunk[readers.length]; time = (System.currentTimeMillis() / 1000L) + EPOCH_OFFSET; + + compatibleBrands.add(0x6D703431);// mp41 + compatibleBrands.add(0x69736F6D);// isom + compatibleBrands.add(0x69736F32);// iso2 } public Mp4Track[] getTracksFromSource(int sourceIndex) throws IllegalStateException { @@ -104,8 +110,8 @@ public class Mp4FromDashWriter { } } - public void setMainBrand(int brandId) { - overrideMainBrand = brandId; + public void setMainBrand(int brand) { + overrideMainBrand = brand; } public boolean isDone() { @@ -159,7 +165,13 @@ public class Mp4FromDashWriter { tablesInfo[i] = new TablesInfo(); } - boolean singleChunk = tracks.length == 1 && tracks[0].kind == TrackKind.Audio; + int single_sample_buffer; + if (tracks.length == 1 && tracks[0].kind == TrackKind.Audio) { + // near 1 second of audio data per chunk, avoid split the audio stream in large chunks + single_sample_buffer = tracks[0].trak.mdia.mdhd_timeScale / 1000; + } else { + single_sample_buffer = -1; + } for (int i = 0; i < readers.length; i++) { @@ -210,31 +222,10 @@ public class Mp4FromDashWriter { readers[i].rewind(); - int tmp = tablesInfo[i].stsz - SAMPLES_PER_CHUNK_INIT; - tablesInfo[i].stco = (tmp / SAMPLES_PER_CHUNK) + 1;// +1 for samples in first chunk - - tmp = tmp % SAMPLES_PER_CHUNK; - if (singleChunk) { - // avoid split audio streams in chunks - tablesInfo[i].stsc = 1; - tablesInfo[i].stsc_bEntries = new int[]{ - 1, tablesInfo[i].stsz, 1 - }; - tablesInfo[i].stco = 1; - } else if (tmp == 0) { - tablesInfo[i].stsc = 2;// first chunk (init) and succesive chunks - tablesInfo[i].stsc_bEntries = new int[]{ - 1, SAMPLES_PER_CHUNK_INIT, 1, - 2, SAMPLES_PER_CHUNK, 1 - }; + if (single_sample_buffer > 0) { + initChunkTables(tablesInfo[i], single_sample_buffer, single_sample_buffer); } else { - tablesInfo[i].stsc = 3;// first chunk (init) and successive chunks and remain chunk - tablesInfo[i].stsc_bEntries = new int[]{ - 1, SAMPLES_PER_CHUNK_INIT, 1, - 2, SAMPLES_PER_CHUNK, 1, - tablesInfo[i].stco + 1, tmp, 1 - }; - tablesInfo[i].stco++; + initChunkTables(tablesInfo[i], SAMPLES_PER_CHUNK_INIT, SAMPLES_PER_CHUNK); } sampleCount[i] = tablesInfo[i].stsz; @@ -259,7 +250,7 @@ public class Mp4FromDashWriter { boolean is64 = read > THRESHOLD_FOR_CO64; - // calculate the moov size; + // calculate the moov size int auxSize = make_moov(defaultMediaTime, tablesInfo, is64); if (auxSize < THRESHOLD_MOOV_LENGTH) { @@ -272,11 +263,6 @@ public class Mp4FromDashWriter { final int ftyp_size = make_ftyp(); // reserve moov space in the output stream - /*if (outStream.canSetLength()) { - long length = writeOffset + auxSize; - outStream.setLength(length); - outSeek(length); - } else {*/ if (auxSize > 0) { int length = auxSize; byte[] buffer = new byte[64 * 1024];// 64 KiB @@ -292,10 +278,10 @@ public class Mp4FromDashWriter { } // tablesInfo contains row counts - // and after returning from make_moov() will contain table offsets + // and after returning from make_moov() will contain those table offsets make_moov(defaultMediaTime, tablesInfo, is64); - // write tables: stts stsc + // write tables: stts stsc sbgp // reset for ctts table: sampleCount sampleExtra for (int i = 0; i < readers.length; i++) { writeEntryArray(tablesInfo[i].stts, 2, sampleCount[i], defaultSampleDuration[i]); @@ -305,6 +291,7 @@ public class Mp4FromDashWriter { sampleCount[i] = 1;// the index is not base zero sampleExtra[i] = -1; } + writeEntryArray(tablesInfo[i].sbgp, 1, sampleCount[i]); } if (auxBuffer == null) { @@ -314,8 +301,8 @@ public class Mp4FromDashWriter { outWrite(make_mdat(totalSampleSize, is64)); int[] sampleIndex = new int[readers.length]; - int[] sizes = new int[singleChunk ? SINGLE_CHUNK_SAMPLE_BUFFER : SAMPLES_PER_CHUNK]; - int[] sync = new int[singleChunk ? SINGLE_CHUNK_SAMPLE_BUFFER : SAMPLES_PER_CHUNK]; + int[] sizes = new int[single_sample_buffer > 0 ? single_sample_buffer : SAMPLES_PER_CHUNK]; + int[] sync = new int[single_sample_buffer > 0 ? single_sample_buffer : SAMPLES_PER_CHUNK]; int written = readers.length; while (written > 0) { @@ -329,8 +316,8 @@ public class Mp4FromDashWriter { long chunkOffset = writeOffset; int syncCount = 0; int limit; - if (singleChunk) { - limit = SINGLE_CHUNK_SAMPLE_BUFFER; + if (single_sample_buffer > 0) { + limit = single_sample_buffer; } else { limit = sampleIndex[i] == 0 ? SAMPLES_PER_CHUNK_INIT : SAMPLES_PER_CHUNK; } @@ -342,6 +329,7 @@ public class Mp4FromDashWriter { if (sample == null) { if (tablesInfo[i].ctts > 0 && sampleExtra[i] >= 0) { writeEntryArray(tablesInfo[i].ctts, 1, sampleCount[i], sampleExtra[i]);// flush last entries + outRestore(); } sampleIndex[i] = -1; break; @@ -390,10 +378,6 @@ public class Mp4FromDashWriter { } else { tablesInfo[i].stco = writeEntryArray(tablesInfo[i].stco, 1, (int) chunkOffset); } - - if (singleChunk) { - tablesInfo[i].stco = -1; - } } outRestore(); @@ -470,7 +454,42 @@ public class Mp4FromDashWriter { } } + private void initChunkTables(TablesInfo tables, int firstCount, int succesiveCount) { + // tables.stsz holds amount of samples of the track (total) + int totalSamples = (tables.stsz - firstCount); + float chunkAmount = totalSamples / (float) succesiveCount; + int remainChunkOffset = (int) Math.ceil(chunkAmount); + boolean remain = remainChunkOffset != (int) chunkAmount; + int index = 0; + tables.stsc = 1; + if (firstCount != succesiveCount) { + tables.stsc++; + } + if (remain) { + tables.stsc++; + } + + // stsc_table_entry = [first_chunk, samples_per_chunk, sample_description_index] + tables.stsc_bEntries = new int[tables.stsc * 3]; + tables.stco = remainChunkOffset + 1;// total entrys in chunk offset box + + tables.stsc_bEntries[index++] = 1; + tables.stsc_bEntries[index++] = firstCount; + tables.stsc_bEntries[index++] = 1; + + if (firstCount != succesiveCount) { + tables.stsc_bEntries[index++] = 2; + tables.stsc_bEntries[index++] = succesiveCount; + tables.stsc_bEntries[index++] = 1; + } + + if (remain) { + tables.stsc_bEntries[index++] = remainChunkOffset + 1; + tables.stsc_bEntries[index++] = totalSamples % succesiveCount; + tables.stsc_bEntries[index] = 1; + } + } private void outWrite(byte[] buffer) throws IOException { outWrite(buffer, buffer.length); @@ -585,19 +604,29 @@ public class Mp4FromDashWriter { private int make_ftyp() throws IOException { - byte[] buffer = new byte[]{ - 0x00, 0x00, 0x00, 0x1C, 0x66, 0x74, 0x79, 0x70,// ftyp - 0x6D, 0x70, 0x34, 0x32,// mayor brand (mp42) - 0x00, 0x00, 0x02, 0x00,// default minor version (512) - 0x6D, 0x70, 0x34, 0x31, 0x69, 0x73, 0x6F, 0x6D, 0x69, 0x73, 0x6F, 0x32// compatible brands: mp41 isom iso2 - }; + int size = 16 + (compatibleBrands.size() * 4); + if (overrideMainBrand != 0) size += 4; - if (overrideMainBrand != 0) - ByteBuffer.wrap(buffer).putInt(8, overrideMainBrand); + ByteBuffer buffer = ByteBuffer.allocate(size); + buffer.putInt(size); + buffer.putInt(0x66747970);// "ftyp" - outWrite(buffer); + if (overrideMainBrand == 0) { + buffer.putInt(0x6D703432);// mayor brand "mp42" + buffer.putInt(512);// default minor version + } else { + buffer.putInt(overrideMainBrand); + buffer.putInt(0); + buffer.putInt(0x6D703432);// "mp42" compatible brand + } - return buffer.length; + for (Integer brand : compatibleBrands) { + buffer.putInt(brand);// compatible brand + } + + outWrite(buffer.array()); + + return size; } private byte[] make_mdat(long refSize, boolean is64) { @@ -740,13 +769,12 @@ public class Mp4FromDashWriter { .array() ); - make_mdia(tracks[index].trak.mdia, tables, is64); + make_mdia(tracks[index].trak.mdia, tables, is64, tracks[index].kind == TrackKind.Audio); lengthFor(start); } - private void make_mdia(Mdia mdia, TablesInfo tablesInfo, boolean is64) throws IOException { - + private void make_mdia(Mdia mdia, TablesInfo tablesInfo, boolean is64, boolean isAudio) throws IOException { int start_mdia = auxOffset(); auxWrite(new byte[]{0x00, 0x00, 0x00, 0x00, 0x6D, 0x64, 0x69, 0x61});// mdia auxWrite(mdia.mdhd); @@ -766,7 +794,7 @@ public class Mp4FromDashWriter { // And stsz can be empty if has a default sample size // if (moovSimulation) { - make(0x73747473, -1, 2, 1); + make(0x73747473, -1, 2, 1);// stts if (tablesInfo.stss > 0) { make(0x73747373, -1, 1, tablesInfo.stss); } @@ -789,6 +817,11 @@ public class Mp4FromDashWriter { tablesInfo.stco = make(is64 ? 0x636F3634 : 0x7374636F, -1, is64 ? 2 : 1, tablesInfo.stco); } + if (isAudio) { + auxWrite(make_sgpd()); + tablesInfo.sbgp = make_sbgp();// during simulation the returned offset is ignored + } + lengthFor(start_stbl); lengthFor(start_minf); lengthFor(start_mdia); @@ -816,6 +849,48 @@ public class Mp4FromDashWriter { return buffer.array(); } + private int make_sbgp() throws IOException { + int offset = auxOffset(); + + auxWrite(new byte[] { + 0x00, 0x00, 0x00, 0x1C,// box size + 0x73, 0x62, 0x67, 0x70,// "sbpg" + 0x00, 0x00, 0x00, 0x00,// default box flags + 0x72, 0x6F, 0x6C, 0x6C,// group type "roll" + 0x00, 0x00, 0x00, 0x01,// group table size + 0x00, 0x00, 0x00, 0x00,// group[0] total samples (to be set later) + 0x00, 0x00, 0x00, 0x01// group[0] description index + }); + + return offset + 0x14; + } + + private byte[] make_sgpd() { + /* + * Sample Group Description Box + * + * ¿whats does? + * the table inside of this box gives information about the + * characteristics of sample groups. The descriptive information is any other + * information needed to define or characterize the sample group. + * + * ¿is replicabled 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) + */ + + ByteBuffer buffer = ByteBuffer.wrap(new byte[] { + 0x00, 0x00, 0x00, 0x1A,// box size + 0x73, 0x67, 0x70, 0x64,// "sgpd" + 0x01, 0x00, 0x00, 0x00,// box flags (unknown flag sets) + 0x72, 0x6F, 0x6C, 0x6C, // ¿¿group type?? + 0x00, 0x00, 0x00, 0x02,// ¿¿?? + 0x00, 0x00, 0x00, 0x01,// ¿¿?? + (byte)0xFF, (byte)0xFF// ¿¿?? + }); + + return buffer.array(); + } class TablesInfo { @@ -827,5 +902,6 @@ public class Mp4FromDashWriter { int stsz_default; int stss; int stco; + int sbgp; } } diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java new file mode 100644 index 000000000..6f1cceeed --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -0,0 +1,95 @@ +package org.schabi.newpipe.streams; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; +import org.jsoup.nodes.TextNode; +import org.jsoup.parser.Parser; +import org.jsoup.select.Elements; +import org.schabi.newpipe.streams.io.SharpStream; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * @author kapodamy + */ +public class SrtFromTtmlWriter { + private static final String NEW_LINE = "\r\n"; + + private SharpStream out; + private boolean ignoreEmptyFrames; + private final Charset charset = StandardCharsets.UTF_8; + + private int frameIndex = 0; + + public SrtFromTtmlWriter(SharpStream out, boolean ignoreEmptyFrames) { + this.out = out; + this.ignoreEmptyFrames = ignoreEmptyFrames; + } + + private static String getTimestamp(Element frame, String attr) { + return frame + .attr(attr) + .replace('.', ',');// SRT subtitles uses comma as decimal separator + } + + private void writeFrame(String begin, String end, StringBuilder text) throws IOException { + writeString(String.valueOf(frameIndex++)); + writeString(NEW_LINE); + writeString(begin); + writeString(" --> "); + writeString(end); + writeString(NEW_LINE); + writeString(text.toString()); + writeString(NEW_LINE); + writeString(NEW_LINE); + } + + private void writeString(String text) throws IOException { + out.write(text.getBytes(charset)); + } + + public void build(SharpStream ttml) throws IOException { + /* + * TTML parser with BASIC support + * multiple CUE is not supported + * styling is not supported + * tag timestamps (in auto-generated subtitles) are not supported, maybe in the future + * also TimestampTagOption enum is not applicable + * Language parsing is not supported + */ + + // parse XML + byte[] buffer = new byte[(int) ttml.available()]; + ttml.read(buffer); + Document doc = Jsoup.parse(new ByteArrayInputStream(buffer), "UTF-8", "", Parser.xmlParser()); + + StringBuilder text = new StringBuilder(128); + Elements paragraph_list = doc.select("body > div > p"); + + // check if has frames + if (paragraph_list.size() < 1) return; + + for (Element paragraph : paragraph_list) { + text.setLength(0); + + for (Node children : paragraph.childNodes()) { + if (children instanceof TextNode) + text.append(((TextNode) children).text()); + else if (children instanceof Element && ((Element) children).tagName().equalsIgnoreCase("br")) + text.append(NEW_LINE); + } + + if (ignoreEmptyFrames && text.length() < 1) continue; + + String begin = getTimestamp(paragraph, "begin"); + String end = getTimestamp(paragraph, "end"); + + writeFrame(begin, end, text); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/streams/SubtitleConverter.java b/app/src/main/java/org/schabi/newpipe/streams/SubtitleConverter.java deleted file mode 100644 index c41db4373..000000000 --- a/app/src/main/java/org/schabi/newpipe/streams/SubtitleConverter.java +++ /dev/null @@ -1,369 +0,0 @@ -package org.schabi.newpipe.streams; - -import org.schabi.newpipe.streams.io.SharpStream; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.Charset; -import java.text.ParseException; -import java.util.Locale; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPathExpressionException; - -/** - * @author kapodamy - */ -public class SubtitleConverter { - private static final String NEW_LINE = "\r\n"; - - public void dumpTTML(SharpStream in, final SharpStream out, final boolean ignoreEmptyFrames, final boolean detectYoutubeDuplicateLines - ) throws IOException, ParseException, SAXException, ParserConfigurationException, XPathExpressionException { - - final FrameWriter callback = new FrameWriter() { - int frameIndex = 0; - final Charset charset = Charset.forName("utf-8"); - - @Override - public void yield(SubtitleFrame frame) throws IOException { - if (ignoreEmptyFrames && frame.isEmptyText()) { - return; - } - out.write(String.valueOf(frameIndex++).getBytes(charset)); - out.write(NEW_LINE.getBytes(charset)); - out.write(getTime(frame.start, true).getBytes(charset)); - out.write(" --> ".getBytes(charset)); - out.write(getTime(frame.end, true).getBytes(charset)); - out.write(NEW_LINE.getBytes(charset)); - out.write(frame.text.getBytes(charset)); - out.write(NEW_LINE.getBytes(charset)); - out.write(NEW_LINE.getBytes(charset)); - } - }; - - read_xml_based(in, callback, detectYoutubeDuplicateLines, - "tt", "xmlns", "http://www.w3.org/ns/ttml", - new String[]{"timedtext", "head", "wp"}, - new String[]{"body", "div", "p"}, - "begin", "end", true - ); - } - - private void read_xml_based(SharpStream source, FrameWriter callback, boolean detectYoutubeDuplicateLines, - String root, String formatAttr, String formatVersion, String[] cuePath, String[] framePath, - String timeAttr, String durationAttr, boolean hasTimestamp - ) throws IOException, ParseException, SAXException, ParserConfigurationException, XPathExpressionException { - /* - * XML based subtitles parser with BASIC support - * multiple CUE is not supported - * styling is not supported - * tag timestamps (in auto-generated subtitles) are not supported, maybe in the future - * also TimestampTagOption enum is not applicable - * Language parsing is not supported - */ - - byte[] buffer = new byte[(int) source.available()]; - source.read(buffer); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document xml = builder.parse(new ByteArrayInputStream(buffer)); - - String attr; - - // get the format version or namespace - Element node = xml.getDocumentElement(); - - if (node == null) { - throw new ParseException("Can't get the format version. ¿wrong namespace?", -1); - } else if (!node.getNodeName().equals(root)) { - throw new ParseException("Invalid root", -1); - } - - if (formatAttr.equals("xmlns")) { - if (!node.getNamespaceURI().equals(formatVersion)) { - throw new UnsupportedOperationException("Expected xml namespace: " + formatVersion); - } - } else { - attr = node.getAttributeNS(formatVersion, formatAttr); - if (attr == null) { - throw new ParseException("Can't get the format attribute", -1); - } - if (!attr.equals(formatVersion)) { - throw new ParseException("Invalid format version : " + attr, -1); - } - } - - NodeList node_list; - - int line_break = 0;// Maximum characters per line if present (valid for TranScript v3) - - if (!hasTimestamp) { - node_list = selectNodes(xml, cuePath, formatVersion); - - if (node_list != null) { - // if the subtitle has multiple CUEs, use the highest value - for (int i = 0; i < node_list.getLength(); i++) { - try { - int tmp = Integer.parseInt(((Element) node_list.item(i)).getAttributeNS(formatVersion, "ah")); - if (tmp > line_break) { - line_break = tmp; - } - } catch (Exception err) { - } - } - } - } - - // parse every frame - node_list = selectNodes(xml, framePath, formatVersion); - - if (node_list == null) { - return;// no frames detected - } - - int fs_ff = -1;// first timestamp of first frame - boolean limit_lines = false; - - for (int i = 0; i < node_list.getLength(); i++) { - Element elem = (Element) node_list.item(i); - SubtitleFrame obj = new SubtitleFrame(); - obj.text = elem.getTextContent(); - - attr = elem.getAttribute(timeAttr);// ¡this cant be null! - obj.start = hasTimestamp ? parseTimestamp(attr) : Integer.parseInt(attr); - - attr = elem.getAttribute(durationAttr); - if (obj.text == null || attr == null) { - continue;// normally is a blank line (on auto-generated subtitles) ignore - } - - if (hasTimestamp) { - obj.end = parseTimestamp(attr); - - if (detectYoutubeDuplicateLines) { - if (limit_lines) { - int swap = obj.end; - obj.end = fs_ff; - fs_ff = swap; - } else { - if (fs_ff < 0) { - fs_ff = obj.end; - } else { - if (fs_ff < obj.start) { - limit_lines = true;// the subtitles has duplicated lines - } else { - detectYoutubeDuplicateLines = false; - } - } - } - } - } else { - obj.end = obj.start + Integer.parseInt(attr); - } - - if (/*node.getAttribute("w").equals("1") &&*/line_break > 1 && obj.text.length() > line_break) { - - // implement auto line breaking (once) - StringBuilder text = new StringBuilder(obj.text); - obj.text = null; - - switch (text.charAt(line_break)) { - case ' ': - case '\t': - putBreakAt(line_break, text); - break; - default:// find the word start position - for (int j = line_break - 1; j > 0; j--) { - switch (text.charAt(j)) { - case ' ': - case '\t': - putBreakAt(j, text); - j = -1; - break; - case '\r': - case '\n': - j = -1;// long word, just ignore - break; - } - } - break; - } - - obj.text = text.toString();// set the processed text - } - - callback.yield(obj); - } - } - - private static NodeList selectNodes(Document xml, String[] path, String namespaceUri) { - Element ref = xml.getDocumentElement(); - - for (int i = 0; i < path.length - 1; i++) { - NodeList nodes = ref.getChildNodes(); - if (nodes.getLength() < 1) { - return null; - } - - Element elem; - for (int j = 0; j < nodes.getLength(); j++) { - if (nodes.item(j).getNodeType() == Node.ELEMENT_NODE) { - elem = (Element) nodes.item(j); - if (elem.getNodeName().equals(path[i]) && elem.getNamespaceURI().equals(namespaceUri)) { - ref = elem; - break; - } - } - } - } - - return ref.getElementsByTagNameNS(namespaceUri, path[path.length - 1]); - } - - private static int parseTimestamp(String multiImpl) throws NumberFormatException, ParseException { - if (multiImpl.length() < 1) { - return 0; - } else if (multiImpl.length() == 1) { - return Integer.parseInt(multiImpl) * 1000;// ¡this must be a number in seconds! - } - - // detect wallclock-time - if (multiImpl.startsWith("wallclock(")) { - throw new UnsupportedOperationException("Parsing wallclock timestamp is not implemented"); - } - - // detect offset-time - if (multiImpl.indexOf(':') < 0) { - int multiplier = 1000; - char metric = multiImpl.charAt(multiImpl.length() - 1); - switch (metric) { - case 'h': - multiplier *= 3600000; - break; - case 'm': - multiplier *= 60000; - break; - case 's': - if (multiImpl.charAt(multiImpl.length() - 2) == 'm') { - multiplier = 1;// ms - } - break; - default: - if (!Character.isDigit(metric)) { - throw new NumberFormatException("Invalid metric suffix found on : " + multiImpl); - } - metric = '\0'; - break; - } - try { - String offset_time = multiImpl; - - if (multiplier == 1) { - offset_time = offset_time.substring(0, offset_time.length() - 2); - } else if (metric != '\0') { - offset_time = offset_time.substring(0, offset_time.length() - 1); - } - - double time_metric_based = Double.parseDouble(offset_time); - if (Math.abs(time_metric_based) <= Double.MAX_VALUE) { - return (int) (time_metric_based * multiplier); - } - } catch (Exception err) { - throw new UnsupportedOperationException("Invalid or not implemented timestamp on: " + multiImpl); - } - } - - // detect clock-time - int time = 0; - String[] units = multiImpl.split(":"); - - if (units.length < 3) { - throw new ParseException("Invalid clock-time timestamp", -1); - } - - time += Integer.parseInt(units[0]) * 3600000;// hours - time += Integer.parseInt(units[1]) * 60000;//minutes - time += Float.parseFloat(units[2]) * 1000f;// seconds and milliseconds (if present) - - // frames and sub-frames are ignored (not implemented) - // time += units[3] * fps; - return time; - } - - private static void putBreakAt(int idx, StringBuilder str) { - // this should be optimized at compile time - - if (NEW_LINE.length() > 1) { - str.delete(idx, idx + 1);// remove after replace - str.insert(idx, NEW_LINE); - } else { - str.setCharAt(idx, NEW_LINE.charAt(0)); - } - } - - private static String getTime(int time, boolean comma) { - // cast every value to integer to avoid auto-round in ToString("00"). - StringBuilder str = new StringBuilder(12); - str.append(numberToString(time / 1000 / 3600, 2));// hours - str.append(':'); - str.append(numberToString(time / 1000 / 60 % 60, 2));// minutes - str.append(':'); - str.append(numberToString(time / 1000 % 60, 2));// seconds - str.append(comma ? ',' : '.'); - str.append(numberToString(time % 1000, 3));// miliseconds - - return str.toString(); - } - - private static String numberToString(int nro, int pad) { - return String.format(Locale.ENGLISH, "%0".concat(String.valueOf(pad)).concat("d"), nro); - } - - - /****************** - * helper classes * - ******************/ - - private interface FrameWriter { - - void yield(SubtitleFrame frame) throws IOException; - } - - private static class SubtitleFrame { - //Java no support unsigned int - - public int end; - public int start; - public String text = ""; - - private boolean isEmptyText() { - if (text == null) { - return true; - } - - for (int i = 0; i < text.length(); i++) { - switch (text.charAt(i)) { - case ' ': - case '\t': - case '\r': - case '\n': - break; - default: - return false; - } - } - - return true; - } - } - -} diff --git a/app/src/main/java/org/schabi/newpipe/util/Constants.java b/app/src/main/java/org/schabi/newpipe/util/Constants.java index b01b6df6a..50350651d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Constants.java +++ b/app/src/main/java/org/schabi/newpipe/util/Constants.java @@ -11,5 +11,7 @@ public class Constants { public static final String KEY_THEME_CHANGE = "key_theme_change"; public static final String KEY_MAIN_PAGE_CHANGE = "key_main_page_change"; + public static final String KEY_ENABLE_WATCH_HISTORY = "enable_watch_history"; + public static final int NO_SERVICE_ID = -1; } diff --git a/app/src/main/java/org/schabi/newpipe/util/KoreUtil.java b/app/src/main/java/org/schabi/newpipe/util/KoreUtil.java new file mode 100644 index 000000000..2ed3c698d --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/KoreUtil.java @@ -0,0 +1,23 @@ +package org.schabi.newpipe.util; + + +import android.content.Context; +import android.content.DialogInterface; +import androidx.appcompat.app.AlertDialog; + +import org.schabi.newpipe.R; + + +public class KoreUtil { + private KoreUtil() { } + + public static void showInstallKoreDialog(final Context context) { + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setMessage(R.string.kore_not_found) + .setPositiveButton(R.string.install, + (DialogInterface dialog, int which) -> NavigationHelper.installKore(context)) + .setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> { + }); + builder.create().show(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 9274df848..6149118cc 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -1,9 +1,17 @@ package org.schabi.newpipe.util; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; import android.preference.PreferenceManager; import android.text.TextUtils; +import android.util.DisplayMetrics; + +import androidx.annotation.NonNull; +import androidx.annotation.PluralsRes; +import androidx.annotation.StringRes; import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.units.Decade; @@ -18,10 +26,6 @@ import java.util.Date; import java.util.List; import java.util.Locale; -import androidx.annotation.NonNull; -import androidx.annotation.PluralsRes; -import androidx.annotation.StringRes; - /* * Created by chschtsch on 12/29/15. * @@ -50,8 +54,8 @@ public class Localization { private Localization() { } - public static void init() { - initPrettyTime(); + public static void init(Context context) { + initPrettyTime(context); } @NonNull @@ -115,12 +119,13 @@ public class Localization { return nf.format(number); } - public static String formatDate(Date date) { - return DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()).format(date); + public static String formatDate(Date date, Context context) { + return DateFormat.getDateInstance(DateFormat.MEDIUM, getAppLocale(context)).format(date); } + @SuppressLint("StringFormatInvalid") public static String localizeUploadDate(Context context, Date date) { - return context.getString(R.string.upload_date_text, formatDate(date)); + return context.getString(R.string.upload_date_text, formatDate(date, context)); } public static String localizeViewCount(Context context, long viewCount) { @@ -199,21 +204,47 @@ public class Localization { // Pretty Time //////////////////////////////////////////////////////////////////////////*/ - private static void initPrettyTime() { - prettyTime = new PrettyTime(Locale.getDefault()); + private static void initPrettyTime(Context context) { + prettyTime = new PrettyTime(getAppLocale(context)); // Do not use decades as YouTube doesn't either. prettyTime.removeUnit(Decade.class); } private static PrettyTime getPrettyTime() { - // If pretty time's Locale is different, init again with the new one. - if (!prettyTime.getLocale().equals(Locale.getDefault())) { - initPrettyTime(); - } return prettyTime; } public static String relativeTime(Calendar calendarTime) { return getPrettyTime().formatUnrounded(calendarTime); } + + private static void changeAppLanguage(Locale loc, Resources res) { + DisplayMetrics dm = res.getDisplayMetrics(); + Configuration conf = res.getConfiguration(); + conf.setLocale(loc); + res.updateConfiguration(conf, dm); + } + + public static Locale getAppLocale(Context context) { + SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(context); + String lang = prefs.getString("app_language_key", "en"); + Locale loc; + if (lang.equals("system")) { + loc = Locale.getDefault(); + } else if (lang.matches(".*-.*")) { + //to differentiate different versions of the language + //for example, pt (portuguese in Portugal) and pt-br (portuguese in Brazil) + String[] localisation = lang.split("-"); + lang = localisation[0]; + String country = localisation[1]; + loc = new Locale(lang, country); + } else { + loc = new Locale(lang); + } + return loc; + } + + public static void assureCorrectAppLanguage(Context c) { + changeAppLanguage(getAppLocale(c), c.getResources()); + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index e2b03c8e8..a19aa92ae 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -109,12 +109,14 @@ public class NavigationHelper { final float playbackPitch, final boolean playbackSkipSilence, @Nullable final String playbackQuality, - final boolean resumePlayback) { + final boolean resumePlayback, + final boolean startPaused) { return getPlayerIntent(context, targetClazz, playQueue, playbackQuality, resumePlayback) .putExtra(BasePlayer.REPEAT_MODE, repeatMode) .putExtra(BasePlayer.PLAYBACK_SPEED, playbackSpeed) .putExtra(BasePlayer.PLAYBACK_PITCH, playbackPitch) - .putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence); + .putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence) + .putExtra(BasePlayer.START_PAUSED, startPaused); } public static void playOnMainPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) { diff --git a/app/src/main/java/us/shandian/giga/get/DownloadMission.java b/app/src/main/java/us/shandian/giga/get/DownloadMission.java index c0f85b321..9ad73050b 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMission.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMission.java @@ -223,6 +223,7 @@ public class DownloadMission extends Mission { conn.setInstanceFollowRedirects(true); conn.setRequestProperty("User-Agent", DownloaderImpl.USER_AGENT); conn.setRequestProperty("Accept", "*/*"); + conn.setRequestProperty("Accept-Encoding", "*"); if (headRequest) conn.setRequestMethod("HEAD"); diff --git a/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java b/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java index 773ff92d1..e93e83a87 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java @@ -80,7 +80,7 @@ public abstract class Postprocessing implements Serializable { private transient DownloadMission mission; - private File tempFile; + private transient File tempFile; Postprocessing(boolean reserveSpace, boolean worksOnSameFile, String algorithmName) { this.reserveSpace = reserveSpace; @@ -95,8 +95,12 @@ public abstract class Postprocessing implements Serializable { public void cleanupTemporalDir() { if (tempFile != null && tempFile.exists()) { - //noinspection ResultOfMethodCallIgnored - tempFile.delete(); + try { + //noinspection ResultOfMethodCallIgnored + tempFile.delete(); + } catch (Exception e) { + // nothing to do + } } } diff --git a/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java b/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java index 5a5b687f7..8ed0dfae5 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java @@ -2,15 +2,10 @@ package us.shandian.giga.postprocessing; import android.util.Log; -import org.schabi.newpipe.streams.SubtitleConverter; +import org.schabi.newpipe.streams.SrtFromTtmlWriter; import org.schabi.newpipe.streams.io.SharpStream; -import org.xml.sax.SAXException; import java.io.IOException; -import java.text.ParseException; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPathExpressionException; /** * @author kapodamy @@ -27,33 +22,16 @@ class TtmlConverter extends Postprocessing { int process(SharpStream out, SharpStream... sources) throws IOException { // check if the subtitle is already in srt and copy, this should never happen String format = getArgumentAt(0, null); + boolean ignoreEmptyFrames = getArgumentAt(1, "true").equals("true"); if (format == null || format.equals("ttml")) { - SubtitleConverter ttmlDumper = new SubtitleConverter(); + SrtFromTtmlWriter writer = new SrtFromTtmlWriter(out, ignoreEmptyFrames); try { - ttmlDumper.dumpTTML( - sources[0], - out, - getArgumentAt(1, "true").equals("true"), - getArgumentAt(2, "true").equals("true") - ); + writer.build(sources[0]); } catch (Exception err) { Log.e(TAG, "subtitle parse failed", err); - - if (err instanceof IOException) { - return 1; - } else if (err instanceof ParseException) { - return 2; - } else if (err instanceof SAXException) { - return 3; - } else if (err instanceof ParserConfigurationException) { - return 4; - } else if (err instanceof XPathExpressionException) { - return 7; - } - - return 8; + return err instanceof IOException ? 1 : 8; } return OK_RESULT; diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java index e8bc468e9..994c6ee63 100644 --- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java @@ -139,6 +139,9 @@ public class DownloadManager { Log.d(TAG, "Loading pending downloads from directory: " + mPendingMissionsDir.getAbsolutePath()); } + File tempDir = pickAvailableTemporalDir(ctx); + Log.i(TAG, "using '" + tempDir + "' as temporal directory"); + for (File sub : subs) { if (!sub.isFile()) continue; if (sub.getName().equals(".tmp")) continue; @@ -184,7 +187,7 @@ public class DownloadManager { if (mis.psAlgorithm != null) { mis.psAlgorithm.cleanupTemporalDir(); - mis.psAlgorithm.setTemporalDir(pickAvailableTemporalDir(ctx)); + mis.psAlgorithm.setTemporalDir(tempDir); } mis.metadata = sub; @@ -513,13 +516,21 @@ public class DownloadManager { } static File pickAvailableTemporalDir(@NonNull Context ctx) { - if (isDirectoryAvailable(ctx.getExternalFilesDir(null))) - return ctx.getExternalFilesDir(null); - else if (isDirectoryAvailable(ctx.getFilesDir())) - return ctx.getFilesDir(); + File dir = ctx.getExternalFilesDir(null); + if (isDirectoryAvailable(dir)) return dir; + + dir = ctx.getFilesDir(); + if (isDirectoryAvailable(dir)) return dir; // this never should happen - return ctx.getDir("tmp", Context.MODE_PRIVATE); + dir = ctx.getDir("muxing_tmp", Context.MODE_PRIVATE); + if (isDirectoryAvailable(dir)) return dir; + + // fallback to cache dir + dir = ctx.getCacheDir(); + if (isDirectoryAvailable(dir)) return dir; + + throw new RuntimeException("Not temporal directories are available"); } @Nullable diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 8420e343b..852c29835 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -5,6 +5,7 @@ import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; @@ -35,6 +36,8 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.Adapter; import androidx.recyclerview.widget.RecyclerView.ViewHolder; +import com.google.android.material.snackbar.Snackbar; + import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; @@ -46,6 +49,7 @@ import java.io.File; import java.lang.ref.WeakReference; import java.net.URI; import java.util.ArrayList; +import java.util.Iterator; import us.shandian.giga.get.DownloadMission; import us.shandian.giga.get.FinishedMission; @@ -104,8 +108,12 @@ public class MissionAdapter extends Adapter implements Handler.Callb private MenuItem mPauseButton; private View mEmptyMessage; private RecoverHelper mRecover; + private View mView; + private ArrayList mHidden; + private Snackbar mSnackbar; private final Runnable rUpdater = this::updater; + private final Runnable rDelete = this::deleteFinishedDownloads; public MissionAdapter(Context context, @NonNull DownloadManager downloadManager, View emptyMessage, View root) { mContext = context; @@ -122,6 +130,10 @@ public class MissionAdapter extends Adapter implements Handler.Callb mDeleter = new Deleter(root, mContext, this, mDownloadManager, mIterator, mHandler); + mView = root; + + mHidden = new ArrayList<>(); + checkEmptyMessageVisibility(); onResume(); } @@ -522,7 +534,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb ); } - builder.setNegativeButton(android.R.string.ok, (dialog, which) -> dialog.cancel()) + builder.setNegativeButton(R.string.finish, (dialog, which) -> dialog.cancel()) .setTitle(mission.storage.getName()) .create() .show(); @@ -557,9 +569,50 @@ public class MissionAdapter extends Adapter implements Handler.Callb ); } - public void clearFinishedDownloads() { - mDownloadManager.forgetFinishedDownloads(); - applyChanges(); + public void clearFinishedDownloads(boolean delete) { + if (delete && mIterator.hasFinishedMissions() && mHidden.isEmpty()) { + for (int i = 0; i < mIterator.getOldListSize(); i++) { + FinishedMission mission = mIterator.getItem(i).mission instanceof FinishedMission ? (FinishedMission) mIterator.getItem(i).mission : null; + if (mission != null) { + mIterator.hide(mission); + mHidden.add(mission); + } + } + applyChanges(); + + String msg = String.format(mContext.getString(R.string.deleted_downloads), mHidden.size()); + mSnackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE); + mSnackbar.setAction(R.string.undo, s -> { + Iterator i = mHidden.iterator(); + while (i.hasNext()) { + mIterator.unHide(i.next()); + i.remove(); + } + applyChanges(); + mHandler.removeCallbacks(rDelete); + }); + mSnackbar.setActionTextColor(Color.YELLOW); + mSnackbar.show(); + + mHandler.postDelayed(rDelete, 5000); + } else if (!delete) { + mDownloadManager.forgetFinishedDownloads(); + applyChanges(); + } + } + + private void deleteFinishedDownloads() { + if (mSnackbar != null) mSnackbar.dismiss(); + + Iterator i = mHidden.iterator(); + while (i.hasNext()) { + Mission mission = i.next(); + if (mission != null) { + mDownloadManager.deleteMission(mission); + mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri())); + } + i.remove(); + } } private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem option) { diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 921eaff5c..be0b0bb25 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -17,6 +17,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; import android.widget.Toast; import androidx.annotation.NonNull; @@ -189,10 +190,12 @@ public class MissionsFragment extends Fragment { return true; case R.id.clear_list: AlertDialog.Builder prompt = new AlertDialog.Builder(mContext); - prompt.setTitle(R.string.clear_finished_download); + prompt.setTitle(R.string.clear_download_history); prompt.setMessage(R.string.confirm_prompt); - prompt.setPositiveButton(android.R.string.ok, (dialog, which) -> mAdapter.clearFinishedDownloads()); - prompt.setNegativeButton(R.string.cancel, null); + // Intentionally misusing button's purpose in order to achieve good order + prompt.setNegativeButton(R.string.clear_download_history, (dialog, which) -> mAdapter.clearFinishedDownloads(false)); + prompt.setPositiveButton(R.string.delete_downloaded_files, (dialog, which) -> mAdapter.clearFinishedDownloads(true)); + prompt.setNeutralButton(R.string.cancel, null); prompt.create().show(); return true; case R.id.start_downloads: diff --git a/app/src/main/res/drawable/ic_done_black_24dp.xml b/app/src/main/res/drawable/ic_done_black_24dp.xml new file mode 100644 index 000000000..7affe9ba9 --- /dev/null +++ b/app/src/main/res/drawable/ic_done_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_done_white_24dp.xml b/app/src/main/res/drawable/ic_done_white_24dp.xml new file mode 100644 index 000000000..cab2aed1a --- /dev/null +++ b/app/src/main/res/drawable/ic_done_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout-large-land/activity_main_player.xml b/app/src/main/res/layout-large-land/activity_main_player.xml index b535db2b8..98017b132 100644 --- a/app/src/main/res/layout-large-land/activity_main_player.xml +++ b/app/src/main/res/layout-large-land/activity_main_player.xml @@ -305,7 +305,7 @@ tools:text="English" /> + + + + - - + app:titleTextAppearance="@style/Toolbar.Title"/> + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/download_menu.xml b/app/src/main/res/menu/download_menu.xml index f91f8ad7b..27d9bfe29 100644 --- a/app/src/main/res/menu/download_menu.xml +++ b/app/src/main/res/menu/download_menu.xml @@ -24,11 +24,7 @@ - - diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml deleted file mode 100644 index 05920099a..000000000 --- a/app/src/main/res/menu/main_menu.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_about.xml b/app/src/main/res/menu/menu_about.xml index 673cef94b..dbe91a04f 100644 --- a/app/src/main/res/menu/menu_about.xml +++ b/app/src/main/res/menu/menu_about.xml @@ -3,14 +3,4 @@ xmlns:tools="http://schemas.android.com/tools" tools:context="org.schabi.newpipe.about.AboutActivity"> - - - - diff --git a/app/src/main/res/menu/menu_play_queue.xml b/app/src/main/res/menu/menu_play_queue.xml index 6261b8c18..5413794be 100644 --- a/app/src/main/res/menu/menu_play_queue.xml +++ b/app/src/main/res/menu/menu_play_queue.xml @@ -10,11 +10,6 @@ android:visible="true" app:showAsAction="ifRoom"/> - - + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b1dad5672..79fe2a6fe 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -20,7 +20,7 @@ يتم تخزين ملفات الفيديو التي تم تنزيلها هنا مجلد تحميل الفيديو "لا يمكن إنشاء مجلد للتنزيلات في '%1$s'" - دليل التنزيل الذي تم إنشاؤه \'%1$s\' + إنشاء دليل التحميل \'%1$s\' تثبيت تطبيق Kore غير موجود. هل تريد تثبيته ؟ مضيء @@ -42,7 +42,7 @@ مشاركة مشاركة بواسطة عرض مقاطع الفيديو \"التالية\" و \"المشابهة\" - عرض خيارات تشغيل الفيديو من خلال مركز كودي ميديا + اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi عرض خيار التشغيل بواسطة كودي السمة تم النشر يوم %1$s @@ -57,7 +57,7 @@ خطأ تعذرت عملية تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو - اضغط بحث للبدء + انقر فوق بحث لتبدأ اشتراك مشترك الرئيسية @@ -69,8 +69,8 @@ مراقبة السجل التاريخ و ذاكرة التخزين المؤقت محتوى - الملفات المحملة - الملفات المحملة + التحميلات + التحميلات الجميع القناة الفيديو @@ -80,7 +80,7 @@ التاريخ التاريخ فتح في وضع منبثق - إزالة الصوت في بعض مستوى الدقة + يزيل الصوت في بعض القرارات وضع النوافذ المنبثقة NewPipe تم إلغاء الاشتراك في القناة تعذر تغيير حالة الاشتراك @@ -113,7 +113,7 @@ محتوى مقيد بحسب العمر "إظهار الفيديو المقيد بحسب العمر. يمكن السماح باستخدام هذه المواد من \"الإعدادات\"." بث مباشر - تقرير عن مشكلة + تقرير خطأ قائمة التشغيل نعم لاحقاً @@ -155,15 +155,15 @@ تم رفض إذن الوصول إلى التخزين ألف مليون - G + B ليس هناك مشترِكون - %s لا يوجد مشاركين + %s لا يوجد مشترك %s مشترك - %s مشاريكان - %s اشتراكات - %s مشاركون - %s اشتراك + %s المشتركين + %s المشتركين + %s المشتركين + %s المشتركين دون مشاهدات لاتوجد فيديوهات @@ -187,7 +187,7 @@ يرجى تحديد مجلد التنزيل لاحقا في الإعدادات هذا الإذن مطلوب \nللفتح في وضع النافذة المنبثقة - اختبار reCAPTCHA + اختبار reCAPTCHA السماح بالرموز في أسماء الملفات يتم استبدال الرموز غير المسموح بها بهذه القيمة استبدال الحرف @@ -200,7 +200,7 @@ فتح الموقع المساهمون التراخيص - تطبيق مجاني خفيف الوزن وبث حي على نظام أندرويد. + تطبيق مجاني خفيف البث على أندرويد. ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية ، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل ! عرض على GitHub @@ -235,23 +235,23 @@ الإعدادات الصوتية تشغيل هنا بدأ التشغيل في نافذة منبثقة جديدة - تحدي الكابتشا + تحدي الكابتشا ضغط مطول للإدراج الى قائمة الانتظار - %s بدون مشهد - %s شاهد - %s مشاهدتان - %s مشاهدات - %s مشاهدون - %s شاهدو + %s بدون مشهادة + %s مشاهدة + %s مشاهدة + %s مشاهدة + %s مشاهدة + %s مشاهدة - فيديوهات - فيديوهات - فيديوهات - فيديوهات - فيديوهات - فيديوهات + %s فيديو + %s أشرطة فيديو + %s أشرطة فيديو + %s أشرطة فيديو + %s أشرطة فيديو + %s أشرطة فيديو طلب اختبار الكابتشا مطلوب © %1$sبواسطة%2$sتحت%3$s @@ -425,7 +425,7 @@ تتبيه تحديث التطبيق إيماءة التحكم بالصوت الأحداث - إخطارات لنسخة NewPipe الجديدة + الإخطارات لإصدار NewPipe الجديد وحدة التخزين الخارجية غير متوفرة "التنزيل على بطاقة SD الخارجية غير ممكن. إعادة تعيين موقع مجلد التحميل؟" باستخدام علامات التبويب الافتراضية ، خطأ أثناء قراءة علامات التبويب المحفوظة @@ -449,7 +449,7 @@ متوقف في قائمة الانتظار قيد المعالجة - قائمه انتظار + طابور تم رفضها من قبل النظام فشل التنزيل تم الانتهاء من التحميل @@ -504,7 +504,7 @@ لم يتبقى مساحة في الجهاز تم فقد التقدم بسبب حذف الملف انتهى وقت الاتصال - هل أنت واثق؟ + هل تريد محو سجل التنزيل أو حذف جميع الملفات التي تم تنزيلها؟ حد قائمة انتظار التنزيل سيتم تشغيل تنزيل واحد في نفس الوقت بدء التنزيلات @@ -542,11 +542,11 @@ تسريع إلى الأمام/-ترجيع وقت البحث مثيلات خوادم پيرتيوب - عيّن مثيلات خوادم پيرتيوب التي تُفضّلها + حدد مثيلات PeerTube المفضلة لديك إضافة نموذج - أدخل رابط مثيل الخادم - فشل في التحقق من مثيل الخادم - فقط عناوين https المدعومة + أدخل عنوان URL للمثيل + لا يمكن التحقق من صحة المثال + يتم دعم عناوين URL HTTPS فقط مثيل الخادم موجود بالفعل محلي أضيف مؤخرا @@ -554,5 +554,16 @@ تم إنشاؤه-تلقائيًا (لم يتم العثور على برنامج تحميل) استرد لا يمكن استرداد هذا التنزيل - اختيار مثيل خادم + اختيار مثيل + ابحث عن الحالات التي تناسبك على %s + تمكين قفل شاشة الصور المصغرة الفيديو + عند استخدام مشغل الخلفية ، سيتم عرض صورة مصغرة للفيديو على شاشة القفل + تنظيف تاريخ التحميل + حذف الملفات التي تم تنزيلها + التنزيلات %1$s المحذوفة + إعطاء إذن لعرضه على التطبيقات الأخرى + لغة التطبيق + النظام الافتراضي + اضغط على \"تم\" عند حلها + منجز \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 08b22c616..5ddfa7ead 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -58,8 +58,8 @@ Mil mill. Precísase esti permisu \np\'abrir nel mou ventanu - reCAPTCHA - Retu de reCAPTCHA + reCAPTCHA + Retu de reCAPTCHA Solicitóse\'l retu de reCAPTCHA En segundu planu Ventanu diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index e246d54eb..d4119e83c 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -6,7 +6,7 @@ 在浏览器中打开 在悬浮窗模式下打开 您是不是要找:%1$s? - 找不到串流播放器 (您可以安裝并使用VLC播放)。 + 找不到串流播放器 (您可以安装 VLC 进行播放)。 下载串流文件 安装 取消 @@ -16,7 +16,7 @@ 设置 分享给... 选择浏览器 - 视频下载文件夹 + 视频下载路径 已下载的视频存储在这里 请选择下载视频的保存位置 已下载的音频存储在这里 @@ -42,7 +42,7 @@ 禁用 - 背景 + 后台播放 过滤器 刷新 搜索建议 @@ -110,7 +110,7 @@ 点击了解详情 请稍候… 复制至剪贴板 - reCAPTCHA验证码 + reCAPTCHA验证码 悬浮窗播放 关于NewPipe 设置 @@ -130,7 +130,7 @@ 没有结果 没有订阅者 - %s个订阅者 + %s 位订阅者 没有视频 @@ -148,7 +148,7 @@ 等待中… 已暂停 排队中 - 已加入队列 + 加入队列 操作已被系统拒绝 下载失败 下载完成 @@ -157,8 +157,8 @@ 切换服务,当前选择: 找不到串流播放器。您想安装 VLC 吗? 旋转 - 使用第三方视频播放器 - 使用第三方视频播放器 + 使用外部视频播放器 + 使用外部音频播放器 音频下载文件夹 从其他应用调用 NewPipe 时播放视频 默认分辨率 @@ -207,9 +207,9 @@ 请稍后在设置中设定下载目录 用悬浮窗模式 \n需要此权限 - reCAPTCHA验证 + reCAPTCHA验证 请求的新的CAPTCHA验证 - NewPipe悬浮窗模式 + NewPipe 悬浮窗模式 在悬浮窗中播放 默认悬浮窗分辨率 使用更高的分辨率 @@ -219,7 +219,7 @@ 记住最后一次使用悬浮窗的大小和位置 悬浮窗 调整大小 - 删除“某些”分辨率的音频 + 隐藏部分没有音频的分辨率 播放器手势控制 使用手势控制播放器的亮度和音量 显示搜索建议 @@ -234,9 +234,9 @@ 取消订阅频道 无法修改订阅 无法更新订阅 - 主页面 + 主页 订阅 - 新增功能 + 最新 恢复前台焦点 中断后继续播放(例如突然来电后) 搜索历史记录 @@ -321,7 +321,7 @@ 警告:无法导入所有文件。 这将覆盖当前设置。 显示信息 - 已收藏 + 书签 确定要从观看历史记录中删除该项吗? 是否确实要从历史记录中删除所有项目? 最后播放 @@ -410,13 +410,13 @@ NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。 \nNewPipe 的隐私政策详细解释了在发送崩溃报告时发送和存储的数据。 阅读隐私政策 - 为了遵守欧洲一般数据保护条例 (GDPR),我们提请您注意 NewPipe 的隐私政策。请仔细阅读。 -\n您必须接受它才能向我们发送错误报告。 + 为了遵守欧盟的《通用数据保护条例》(GDPR),我们特此提醒您注意 NewPipe 的隐私政策。请您仔细阅读。 +\n您必须在同意以后才能向我们发送错误报告。 接受 拒绝 无限制 使用移动数据时限制分辨率 - 切换应用时最小化 + 退出应用时最小化 从主播放器切换到其他应用时的操作 - %s 静音时快进 滑块[比例尺] @@ -487,7 +487,7 @@ 设备上没有剩余储存空间 进度丢失,文件已被删除 连接超时 - 你确定吗? + 是否要清除下载历史记录或删除所有下载的文件? 最大下载队列 同时只允许一个下载进行 开始下载 @@ -504,24 +504,24 @@ 删除所有播放位置记录? 更改下载目录让内容生效 『时下流行』页-默认 - 无人在线观看 + 没有人在观看 %s 人在观看 - 没人在听 + 没有人在听 %s 人在听 - + 重新启动应用后,语言将更改。 PeerTube 服务器 - 设置自己喜欢的peertube服务器 - 查找最适合你的服务器https://joinpeertube.org/instances#instances-list + 设置自己喜欢的PeerTube服务器 + 查找最适合你的服务器%s 添加服务器 - 输入服务器网址 + 输入服务器网址(URL) 无法验证服务器 - 仅支持 https URL + 仅支持 HTTPS和URL 该服务器已存在 本地 最近添加 @@ -531,4 +531,9 @@ 无法恢复此下载 选择一个服务器 快进 / 快退的单位时间 + 在锁屏上显示视频缩略图 + 在后台播放时,锁屏上将会显示视频的缩略图 + 清除下载历史记录 + 删除下载了的文件 + 已删除 %1$s 下载 \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 1cf3abd7e..b3a09cb8f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -247,8 +247,8 @@ Гэтае разрозненне трэба для \nпрайгравання ў акне 1 элемент выдалены. - reCAPTCHA - Запыт reCAPTCHA + reCAPTCHA + Запыт reCAPTCHA Запытаны ўвод reCAPTCHA Загрузкі Дапушчальныя сімвалы назвы файлаў diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 1eb9222ec..7c813d0a9 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -269,8 +269,8 @@ Това разрешение се изисква за \nвъзпроизвеждане в отделен прозорец 1 елемент е изтрит. - преКАПЧА - reCAPTCHA заявка + преКАПЧА + reCAPTCHA заявка Изисква се въвеждане на reCAPTCHA Изтегляне Повечето специални символи diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 3a623f2c3..37938334c 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -145,8 +145,8 @@ - রিক্যাপচা - reCAPTCHA চ্যালেঞ্জ + রিক্যাপচা + reCAPTCHA চ্যালেঞ্জ reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর: diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index bcc816577..20deb3160 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -67,7 +67,7 @@ D\'acord Nom de fitxer Error - reCAPTCHA + reCAPTCHA Baixades Paràmetres Quant a @@ -307,7 +307,7 @@ Feu un toc aquí per a més detalls Defineix una carpeta de baixades més endavant als paràmetres Es necessita aquest permís per a obrir el mode emergent - Camp reCAPTCHA + Camp reCAPTCHA S\'ha sol·licitat l\'emplenament d\'un camp reCAPTCHA Se substituiran els caràcters no vàlids amb aquest valor Caràcter de substitució diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml deleted file mode 100644 index 3ff479bfd..000000000 --- a/app/src/main/res/values-cmn/strings.xml +++ /dev/null @@ -1,504 +0,0 @@ - - - 点击搜索按钮即可开始使用 - %1$s 次观看 - 发布于 %1$s - 找不到媒体播放器。您要安装 VLC 吗? - 找不到媒体播放器(您可以安装 VLC 来播放)。 - 安装 - 取消 - 在浏览器中打开 - 在悬浮窗模式下打开 - 分享 - 下载 - 下载媒体文件 - 搜索 - 设置 - 您是不是要找:%1$s? - 分享至 - 选择浏览器 - 旋转 - 使用外部视频播放器 - 删除某些分辨率下的音频 - 使用外部音频播放器 - NewPipe 悬浮窗模式 - 订阅 - 已订阅 - 退订成功 - 无法更改订阅 - 无法更新订阅 - 显示信息 - 主页 - 订阅 - 已添加书签到播放列表 - 新功能 - 转到后台 - 悬浮窗 - 添加到 - 视频下载文件夹 - 已下载的视频储存在此处 - 选择视频文件的下载文件夹 - 音频下载文件夹 - 已下载的音频存储在此处 - 选择音频文件的下载文件夹 - 自动播放 - NewPipes被其它程序调用时播放视频 - 默认分辨率 - 默认悬浮窗分辨率 - 显示更高的分辨率 - 只有部分设备支持播放 2K/4K 视频 - 用 Kodi 播放 - 没找到 Kore 应用,需要安装它吗? - 显示“用 Kodi 播放”选项 - 显示以 Kodi 媒体中心播放视频的选项 - 音频 - 默认音频格式 - 默认视频格式 - 主题 - 亮色 - 酷黑 - 黑色 - 记住悬浮窗的尺寸与位置 - 记住上一次悬浮窗的位置以及大小 - 已清除图像缓存 - 最小化悬浮窗播放器 - 清除观看历史 - 搜索记录已删除。 - 错误 - 网络错误 - 举报错误 - 没有结果 - 开始 - 暂停 - 播放 - 创建 - 删除 - 删除所有 - 新任务 - 好 -\n - 错误 -\n - 不支持的服务器 - 文件已存在 - NewPipe 下载中 - 请稍等… - 字母与数字 - 最特别的字符 - 这个文件里没有已下载应用程式 - 关于NewPipe - 设置 - 关于 - 第三方执照 - 打开网页 - 删除书签 - 确定删除该播放列表吗? - 已创建播放列表 - 播放列表 - 步骤 - 重置 - 为了遵守欧洲通用数据保护法规(GDPR,我们请你注意NewPipe的隐私政策.请仔细阅读. -\n你必须接受它才能将错误报告发送给我们. - 接受 - 拒绝 - 没有限制 - 使用移动数据时的解析度限制 - 最小化应用程序切换 - 从主视频播放器切换到其他应用时的操作 - %s - 没有 - 最小化后台播放 - 使用快速粗略定位 - 粗略定位功能允许播放器以略低的精确度为代价换取更快的定位速度 - 下载缩略图 - 清除缓存的元数据 - 移除所有缓存的网页数据 - 已清除缓存的元数据 - 不加载缩略图时,可以节省数据和存储空间。更改后将清除存储空间和扩展空间的缓存。 - 自动排列下一个媒体 - 在非重复排列中播放最后一个媒体时自动推荐相关媒体 - 玩家手势控制 - 使用手势控制播放器的亮度和音量 - 搜索建议 - 搜索时显示建议 - 搜索历史记录 - 在本地存储搜索 - 观看历史 - 记录观看过的视频 - 取得视窗焦点时继续播放 - 在被打断后继续播放(例如有来电) - 下载 - 下一部 - 显示「下一部」及「相关」的视频 - 显示「长按以新增」的提示 - 在视频详细信息页按下后台播放或悬浮窗按钮时提示 - 不支持该网址 - 默认内容的国家 - 服务 - 播放器 - 行为 - 视频与音频 - 历史记录和缓存数据 - 悬浮窗 - 外观 - 其他 - 调试 - 在后台播放 - 在悬浮窗下播放 - 已添加到后台播放队列 - 已添加到悬浮窗播放队列 - 播放 - 内容 - 年龄限制内容 - 显示有年龄限制的视频。可以从设置中允许该内容。 - 直播 - 下载 - 下载 - 错误报告 - 所有 - 频道 - 频道 - 播放列表 - 播放列表 - 曲目 - 用户 - 是的 - 稍等 - 不适用 - 过滤 - 刷新 - 清除 - 调整 - 最佳分辨率 - 复原 - 全部播放 - 总是 - 仅一次 - 文件 - NewPipe 通知 - NewPipe 后台播放和悬浮窗播放的通知 - [未知] - 切换方向 - 切换到后台 - 切换到悬浮窗 - 切换到首页 - 导入数据库 - 导出数据库 - 覆盖您当前的历史记录和订阅 - 导出历史记录、订阅和播放列表 - 删除播放过的媒体的历史记录及回放位置 - 确定要清除所有观看历史记录吗? - 观看历史记录已清除。 - 清除搜索历史记录 - 清除搜索关键词的历史记录 - 确定要清除所有搜索历史记录吗? - 无法加载所有缩略图 - 无法解析视频网址签名 - 无法解析网站 - 无法完全解析网站 - 内容不可用 - 无法设置下载菜单 - 目前还不支持观看直播 - 无法获得任何媒体 - 无法加载图片 - 应用程序或界面出现崩溃了 - 无法播放此媒体 - 发生了无法恢复的播放器错误 - 正在从播放器错误中恢复 - 外部播放器不支持此类型的链接 - 无效的网址 - 找不到视频串流 - 找不到音频串流 - 无效的文件夹 - 无效的文件/内容来源 - 该文件不存在或缺少读写权限 - 文件名不能为空 - 发生错误:%1$s - 没有可供下载的串流 - 抱歉,这不应该发生的。 - 通过电子邮件报告错误 - 抱歉,发生了一些错误。 - 报告 - 信息: - 发生了什么: - 事件:\\n请求:\\n内容语言:\\n服务:\\nGMT 时间:\\n组件:\\n版本:\\n系统版本: - 您的评论(请用英语): - 详细: - 视频预览缩略图 - 视频预览缩略图 - 上传者的头像缩略图 - 喜欢 - 不喜欢 - 使用 Tor - (实验性)通过 Tor 强制下载流量以增加隐私(暂不支持视频媒体)。 - 用户报告 - 这里什么都没有 - 拖动以重新排序 - 无法创建下载目录「%1$s」 - 已成功创建下载目录「%1$s」 - 视频 - 音频 - 重试 - 手机存储访问权限被拒绝 - - - 十亿 - 没有订阅者 - - %s 位订阅者 - - - 无观看次数 - - %s 次观看 - - - 没有视频 - 删除 - 校验 - 退出 - 重命名 - 文件名 - 线程 - 错误的网址或网络不可用 - 点按以查看详细信息 - 复制到剪贴板 - 请稍后在设置中定义一个下载文件夹 - 在悬浮窗模式打开 -\n需要此权限 - 已删除一个项目。 - reCAPTCHA 验证 - reCAPTCHA 验证 - 需完成 reCAPTCHA 验证 - 下载 - 文件名中允许的字符 - 无效字符将替换为该值 - 替换字符 - © %1$s 由 %2$s 使用 %3$s 版权所有 - 无法加载许可证 - 关于 - 贡献者 - 许可证 - 安卓上开源且轻便的媒体播放器。 - 贡献 - 您是否有想法帮助我们:翻译、界面设计、代码优化以及真正繁重的功能扩展 - 我们随时欢迎您提供帮助。让 NewPipe 越变越好! - 在 GitHub 上查看 - 捐赠 - NewPipe 由社区人员维护和开发额,他们耗费时间务求为您带来最佳体验。现在是时候回过头来,让我们的开发人员能够在使 NewPipe 更加完美的同时,享受一杯咖啡。 - 回馈 - 网站 - 访问 NewPipe 网站了解更多信息和新闻。 - NewPipe 的隐私政策 - NewPipe 项目是非常重视您的隐私。因此,未经您的同意,该应用程序不会收集任何数据。 -\nNewPipe 的隐私政策详细说明了当您发送崩溃报告时,什么资料会被传送及储存。 - 阅读隐私政策 - NewPipe 的许可证 - NewPipe 是一个 Copyleft 的自由软件:您可以随意使用、研究、分享或改进它。在遵守由自由软件基金会所发布的 GNU 通用公共授权条款的状况下,您可以自由地再发布或修改它;授权条款预设使用第三版,但您也可以选择更新的版本。 - 阅读许可证 - 历史记录 - 搜索 - 观看 - 历史记录被关闭了 - 历史记录 - 没有历史记录 - 清除历史记录 - 项目已删除 - 确定要从搜索历史记录中删除该项吗? - 确定要从观看历史记录中删除该项吗? - 您确定要删除历史记录中的所有项吗? - 上一次播放 - 最受欢迎 - 首页内容 - 空白页面 - 互动页面 - 订阅页面 - Feed 页面 - 频道页面 - 选择一个频道 - 尚未订阅任何频道 - 选择一个互动 - 输出 - 接入 - 无效的压缩文件 - 警告:无法导入所有文件。 - 这将覆盖您当前的设定。 - 您是否要导入设定? - 互动 - 趋势 - 前 50 - 最新和热门 - 转到后台播放 - 悬浮窗播放 - 移除 - 详细 - 音频设置 - 长按加入队列 - 加入后台播放列表 - 加入悬浮窗播放列表 - 从这里开始播放 - 开始在后台播放 - 开始在新悬浮窗播放 - 打开抽屉 - 关闭抽屉 - 很快就会出现在这里 ;D - 偏好的「开启」动作 - 开启内容时的默认动作 - %s - 视频播放器 - 后台播放器 - 悬浮窗播放器 - 总是询问 - 正在获取信息… - 正在载入请求的内容 - 新的播放列表 - 删除 - 重命名 - 名称 - 添加到播放列表 - 设为播放列表缩略图 - 将播放列表加入书签 - 播放列表缩略图已更改。 - 无法删除播放列表。 - 没有字幕 - 合适 - 填满 - 缩放 - 自动生成 - 字幕 - 修改播放器字幕文本比列和背景样式。需要重启才能生效。 - 启用 LeakCanary - 内存泄漏监视可能导致应用程序在存储时无响应 - 报告活动周期外错误 - 强制报告在处理完片段或活动周期外发生的无法传递的 Rx 异常 - 导入/导出 - 导入 - 导入至 - 导出到 - 正在导入… - 正在导出… - 导入文件 - 之前的导出 - 无法导入订阅 - 无法导出订阅 - 通过下载导出文件来导入 YouTube 订阅: -\n -\n1.移至该网址:%1$s -\n2.当被询问时登入帐号 -\n3.应该开始下载(这是导出文件) - 通过输入 URL 或 ID 来导入 SoundCloud的配置文件: -\n -\n1.在浏览器中启用「桌面模式」(该网站不适用于移动设备) -\n2.移至该网址:%1$s -\n3.当被询问时登入帐号 -\n4.复制您重定向的配置文件到网址。 - 您的 ID,soundcloud.com/yourid - 请记住,此操作可能造成昂贵的网络花费。 -\n -\n您是否要继续? - 播放速度控制 - 速度 - 音量 - 取消链接(可能会导致扭曲) - 静音时快进 - 退订 - 新标签 - 选择标签 - 音量手势控制 - 用手势控制播放器的音量 - 手势控制亮度 - 用手势控制播放器的亮度 - 默认的内容语言 - 升级 - 文件已删除 - 应用升级通知 - 新 NewPipe 版本通知 - 外储存不可行 - 无法下载到外部SD卡。重置下载文件夹位置? - 恢复默认 - 您真的要恢复至默认吗? - 选择 - 升级 - 列表 - 自动 - 轻按以下载 - 已完成 - 有待 - 已暂停 - 已加入队列 - 后处理 - 队列 - 系统拒绝该行动 - 下载失败 - 下载完成 - %s已下载完毕 - 生成独特的名字 - 覆写 - 同名的已下载文件已经存在 - 同名下载进行中 - 显示错误 - 代码 - 无法创建该文件 - 系统拒绝此批准 - 安全连接失败 - 找不到服务器 - 连不上服务器 - 伺服器没回送数据 - 找不到 - 后处理失败 - 清除已完毕的下载 - - 重试上限 - 取消下载前可以尝试的最多次数 - 换成手机数据时中断 - 事件 - 使用默认选项卡, 读取保存的选项卡时出错 - 订阅者计数不可用 - 主页上显示的选项卡 - 会议 - 显示通知, 以便在新版本可用时提示应用更新 - 列表视图模式 - 网格 - 切换视图 - NewPipe 更新可用! - 无法创建目标文件夹 - 服务器不接受多线程下载, 请使用 @string/msg_threads = 1重试 - 切换至移动数据时有用,尽管一些下载无法被暂停 - 显示评论 - 禁用停止显示评论 - 自动播放 - - 评论 - - - 没有评论 - 无法加载评论 - 关闭 - 继续播放 - 恢复上次播放位置 - 列表中的位置 - 在列表中显示播放位置指示符 - 清除数据 - 播放位置已删除。 - 文件被移动或删除 - 已存在具有此名称的文件 - 无法覆盖该文件 - 同名文件正在等待下载 - 处理此文件时 NewPipe 已关闭 - 设备上没有剩余空间 - 进度丢失,因为文件已被删除 - 连接超时 - 你确定吗? - 限制下载队列 - 同时只有一个下载进行 - 开始全部下载 - 暂停全部下载 - 询问下载位置 - 每次下载将询问保存的位置 - 每次下载将询问保存的位置. -\n如果要下载到外部SD卡,请选择外部存储访问框架 - 使用存储访问框架 - 存储访问框架(SAF)允许下载文件到外部SD卡。 -\n注:一些设备不兼容SAF - 删除回放位置 - 删除所有回放位置 - 删除所有的回放位置吗? - 更改要生效的下载文件夹 - \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 66c952a26..ff89170ac 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -64,7 +64,7 @@ Zobrazit video s věkovým omezením. Povolit tento obsah lze v \"Nastavení\". ŽIVĚ Nebylo možné kompletně analyzovat stránku - Začni stiskem hledat + Začni klepnutím na hledat Zkopírováno do schránky Počkejte prosím… NewPipe stahuje @@ -102,8 +102,8 @@ Přehrát Nová mise OK - reCAPTCHA - Výzva reCAPTCHA + reCAPTCHA + Výzva reCAPTCHA Požadována výzva reCAPTCHA Černé Kontrolní součet @@ -143,7 +143,7 @@ otevření ve vyskakovacím okně Zobrazovat návrhy při vyhledávání Historie vyhledávání Hledané výrazy lokálně uchovávat - Historie zhlédnutí + Historie sledování Evidovat zhlédnutá videa Přehrávat po přechodu do popředí Pokračovat v přehrávání po přerušení (např. hovor) @@ -319,7 +319,7 @@ otevření ve vyskakovacím okně Povolit službu LeakCanary Monitoring úniku paměti může způsobit nereagování aplikace při heap dumpingu Nahlásit mimo-cyklické chyby - Vynutit vykazování výjimek Rx mimo fragment nebo životnost cyklu po odstranění + Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění Použít rychlé nepřesné hledání Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností Načítat náhledy @@ -365,7 +365,7 @@ otevření ve vyskakovacím okně \n \nChcete pokračovat? Ovládání rychlosti přehrávání - Rychlost + Tempo Výška tónu Rozpojit (může způsobit zkreslení) Výchozí nastavení @@ -483,8 +483,8 @@ otevření ve vyskakovacím okně Zavřít Stahování na externí SD kartu není možné. Resetovat umístění složky pro stahování\? Pokračovat v přehrávání - Obnovit poslední přehrávanou pozici - Pořadí v seznamech + Obnovit poslední pozici přehrávání + Pozice v seznamech Vymazat data Soubor přemístěn nebo smazán soubor nelze přepsat @@ -492,7 +492,7 @@ otevření ve vyskakovacím okně NewPipe byl ukončen v průběhu zpracovávání souboru V zařízení nezbývá žádné místo Postup ztracen, protože soubor byl smazán - Jste si jisti\? + Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů\? Omezit frontu stahování Najednou se bude stahovat pouze jeden soubor Začít stahování @@ -504,7 +504,7 @@ otevření ve vyskakovacím okně Použít SAF Storage Access Framework umožňuje stahovat na externí SD kartu. \nUpozornění: některá zařízení jsou nekompatibilní - Ukázat poziční indikátory playbacku v seznamech + Zobrazit pozici přehrávání v seznamech Pozice playbacku smazány. Timeout spojení Smazat pozice playbacku @@ -526,4 +526,30 @@ otevření ve vyskakovacím okně Ke změně jazyka dojde po restartu aplikace. Výchozí kiosek + Délka přetočení vpřed/zpět + Instance PeerTube + Vybrat oblíbené instance PeerTube + Vyhledat nejvhodnější instance na %s + Přidat instanci + Zadat URL instance + Instanci nebylo možno potvrdit + Podporujeme pouze URL s HTTPS + Instance již existuje + Místní + Přidány nedávno + Nejoblíbenější + Autogenerovány (uploader nenalezen) + obnovuji + Toto stahování nelze obnovit + Vyberte instanci + Zapnout náhled videa na zamknuté obrazovce + Hraje-li video na pozadí, náhled videa se ukáže na zamknuté obrazovce + Smazat historii stahování + Smazat stažené soubory + Smazat %1$s stahování + Souhlasit se zobrazením přes jiné aplikace + Jazyk aplikace + Jazyk systému + Po vyřešení stiskni \"Hotovo\" + Hotovo \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 5e44aab61..ff2fea8c9 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -249,8 +249,8 @@ Vælg venligst en tilgængelig downloadmappe Denne tilladelse er nødvendig for at kunne åbne i pop op-tilstand 1 element slettet. - reCAPTCHA - reCAPTCHA-udfordring + reCAPTCHA + reCAPTCHA-udfordring Der blev anmodet om en reCAPTCHA-udfordring Download Tilladte tegn i filnavne diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 17c2e55d0..fbd3f676f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -14,7 +14,7 @@ Meintest du: %1$s\? Teilen mit Browser auswählen - Drehen des Geräts + Bildschirm drehen Downloadordner für Videos Heruntergeladene Videodateien werden hier gespeichert Wähle den Downloadordner für Videodateien aus @@ -79,7 +79,7 @@ Dein Kommentar (auf englisch): Konnte keinen Stream abrufen Automatische Wiedergabe - Wiedergabe eines Videos, wenn NewPipe von einer anderen App aufgerufen wurde + Video abspielen, wenn NewPipe von einer anderen App aufgerufen wird Einen Fehler melden Anwenderbericht LIVE @@ -110,9 +110,9 @@ NewPipe lädt herunter Für Details antippen Ungültige URL oder Internet nicht verfügbar - reCAPTCHA + reCAPTCHA Schwarz - reCAPTCHA-Aufgabe + reCAPTCHA-Aufgabe reCAPTCHA-Aufgabe angefordert Später Ja @@ -123,7 +123,8 @@ Bevorzugtes Videoformat Im Pop-up Modus abspielen NewPipe-Pop-up-Modus - Diese Berechtigung ist für das Öffnen im Pop-up-Modus erforderlich + Diese Berechtigung ist für das +\nÖffnen im Pop-up-Modus erforderlich Standardauflösung des Pop-ups Höhere Auflösungen anzeigen Nur manche Geräte unterstützen das Abspielen von 2K-/4K-Videos @@ -154,7 +155,7 @@ Über Freies und schlankes Streaming für Android. NewPipes Lizenz - Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen – Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe! + Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen — Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe! Drittanbieter-Lizenzen Auf GitHub ansehen Beitragen @@ -202,8 +203,8 @@ Keine Videos - Video - Videos + %s Video + %s Videos Die meisten Sonderzeichen Element gelöscht @@ -278,7 +279,7 @@ Dies wird deine aktuellen Einstellungen überschreiben. Infos anzeigen Lesezeichen für Wiedergabelisten - Hinzufügen zu + Hinzufügen Zum Neuordnen ziehen Erstellen Einen löschen @@ -365,7 +366,7 @@ yourID, soundcloud.com/yourid Keine Streams zum Download verfügbar Bevorzugte \"Öffnen\" Aktion - Standardaktion beim Öffnen von Inhalten - %s + Standardaktion beim Öffnen von Inhalten — %s Untertitel Textgröße und Hintergrund der Untertitel im Player anpassen. Wird erst nach Neustart der App wirksam. Keine App zum Abspielen dieser Datei installiert @@ -391,11 +392,11 @@ Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen Minimieren beim Appwechsel - Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer - %s + Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer — %s Keine Zum Hintergrund-Player minimieren Zum Popup-Player minimieren - Vorspulen während der Stille + Vorspulen bei Stille Schritt Zurücksetzen Kanäle @@ -483,20 +484,20 @@ Wiedergabeposition gelöscht. Datei verschoben oder gelöscht Eine heruntergeladene Datei mit diesem Namen existiert bereits - kann die Datei nicht überschreiben + Datei kann nicht überschrieben werden Es gibt einen ausstehenden Download mit diesem Namen NewPipe wurde während der Verarbeitung der Datei geschlossen Kein Speicherplatz mehr auf dem Gerät Vorgang abgebrochen, da die Datei gelöscht wurde - Bist Du sicher\? + Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen\? Downloadwarteschlange begrenzen Ein Download wird zur gleichen Zeit ausgeführt Downloads starten Downloads anhalten Frage, wohin heruntergeladen werden soll - Du wirst gefragt, wohin Du jeden Download speichern willst - Du wirst gefragt, wohin Du jeden Download speichern willst. -\nAktiviere diese Option, wenn Du auf die externe SD-Karte herunterladen möchtest + Du wirst gefragt, wohin du jeden Download speichern willst + Du wirst gefragt, wohin du jeden Download speichern willst. +\nAktiviere diese Option, wenn du auf die externe SD-Karte herunterladen möchtest SAF verwenden Das Storage Access Framework erlaubt Downloads auf eine externe SD-Karte. \nHinweis: Manche Geräte sind nicht kompatibel @@ -505,7 +506,7 @@ Alle Wiedergabepositionen löschen\? Ändere die Downloadordner, damit sie wirksam werden Dienst umschalten, aktuell ausgewählt: - Quiosque Predefinido + Standard-Kiosk Niemand schaut zu %s Zuschauer @@ -518,19 +519,29 @@ Die Sprache ändert sich, sobald die App neu gestartet wird. PeerTube-Instanzen - Finde auf https://joinpeertube.org/instances#instances-list die Instanzen, die am besten zu dir passen + Finde auf %s die Instanzen, die am besten zu dir passen Instanz hinzufügen - Gib die URL der Instanz ein - Validieren der Instanz fehlgeschlagen - Diese Instanz existiert bereits + URL der Instanz eingeben + Validierung der Instanz fehlgeschlagen + Instanz existiert bereits Lokal Kürzlich hinzugefügt Auto-generiert (kein Uploader gefunden) Wähle eine Instanz - Bevorzugte Peertube-Instanzen festlegen - Es werden nur https-Adressen unterstützt + Bevorzugte Peertube-Instanzen auswählen + Es werden nur HTTPS-Adressen unterstützt Dauer der Suche bei schnellem Vor-/Zurückspulen Am beliebtesten Wiederherstellen Dieser Download kann nicht wiederhergestellt werden + Video-Vorschaubild für Sperrbildschirm aktivieren + Bei Verwendung des Hintergrundplayers wird ein Video-Miniaturbild auf dem Sperrbildschirm angezeigt + Downloadverlauf löschen + Heruntergeladene Dateien löschen + %1$s Downloads gelöscht + Berechtigung zur Anzeige über andere Apps erteilen + Sprache der App + Systemstandard + \"Fertig\" drücken, wenn es gelöst wurde + Fertig \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index dd6643755..915e1902d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -251,8 +251,8 @@ Αυτή η άδεια είναι απαραίτητη για \nτο άνοιγμα αναδυόμενων παραθύρων 1 αντικείμενο διαγράφηκε. - Αυτόματο τεστ - Πρόκληση reCAPTCHA + Αυτόματο τεστ + Πρόκληση reCAPTCHA Ζητήθηκε πρόκληση reCAPTCHA Επιτρεπόμενοι χαρακτήρες σε ονόματα αρχείων Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή @@ -522,4 +522,6 @@ Δημιουργήθηκε αυτόματα (δεν βρέθηκε χρήστης μεταφόρτωσης) Ανάκτηση Δεν είναι δυνατή η ανάκτηση αυτής της λήψης + Ενεργοποίηση μικρογραφίας βίντεο στην οθόνη κλειδώματος + Όταν χρησιμοποιείται αναπαραγωγή παρασκηνίου μια μικρογραφία βίντεο θα εμφανίζεται στην οθόνη κλειδώματος \ No newline at end of file diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 784357da3..33f24695f 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -4,20 +4,20 @@ Eldonita je %1$s Instali Nuligi - Malfermi per krozilo + Malfermi en retumilo Konigi Elŝuti Serĉi Agordoj Ĉu vi signifis: %1$s\? Konigi kun - Elekti krozilon + Elekti retumilon turno Uzi eksteran filmetoludilon Uzi eksteran sonludilon - Defaŭlta distingivo - Legi per Kodi - Montri \"Legi per Kodi\"-opcion + Defaŭlta rezolucio + Ludi per Kodi + Montri \"Ludi per Kodi\"-opcion Sono Defaŭlta sondosierformo Etoso @@ -30,8 +30,8 @@ Filmeto kaj sono Apero Alia - Ludado fone - Legi + Ludanta fone + Ludi Eraro Reteraro Enhavo malhavebla @@ -41,12 +41,12 @@ Neniu elsendlflua ludilo trovita. Ĉu vi volas instali la aplikaĵon VLC\? La aplikaĵo Kore ne estas trovita. Ĉu instali ĝin? Montri la sekvan filmeton kaj similajn filmetojn - Ĉiuj miniaturoj ne ŝargeblas + Ĉiuj bildetoj ne ŝargeblas La subskribo de la ligilo de la filmeto ne malĉifreblas La retejo ne analizeblas - Miniaturo de la antaŭrigardo de la filmeto - Legi filmeton, daŭro: - Miniaturo de la bildo de la alŝutinto + Bildeto de la antaŭrigardo de la filmeto + Ludi filmeton, daŭro: + Bildeto de la alŝutinto La elŝutujo \'%1$s\' ne kreeblas Elŝutujo \'%1$s\' kreita Elŝutujo por filmetoj @@ -61,17 +61,17 @@ Signali eraron per retpoŝto SIGNALI Informoj: - Via komento (angle): + Vian komenton (angle): Detaloj: Signali eraron Filmeto Reprovi - Premu serĉo por komenci + Premi serĉon por komenci Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin). - Malfermi en ŝprucfenestron modon - Forigas aŭdion ĉe KELKAJ distingivoj - NewPipe ŝprucfenestron modon - Abonu + Malfermi en ŝprucfenestran modon + Forigas aŭdon ĉe KELKAJ rezolucioj + NewPipe ŝprucfenestran modon + Aboni Abonita Kanalo malabonita Ne povis ŝanĝi abonon @@ -86,13 +86,13 @@ Ŝprucfenestro Aldonu al Aŭtomata play - Legas filmeton kiam NewPipe vokas de alia programo - Defaŭlta distingivo de la ŝprucfenestro - Montri pli altajn distingivojn - Nur kelkaj aparatoj subtenas legante 2K / 4K filmetojn + Ludas filmeton kiam NewPipe vokas el alia programo + Defaŭlta rezolucio de la ŝprucfenestra ludilo + Montri pli altajn rezoluciojn + Nur kelkaj aparatoj subtenas ludi 2K / 4K filmetojn Defaŭlta fomato de filmeto Nigra - Memoru ŝprucfenestron kaj pozicion + Memoru ŝprucfenestran grandecon kaj pozicion Memoru lastan grandecon kaj pozicion de ŝprucfenestro Uzu rapide, ne preciza serĉon Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco @@ -109,8 +109,8 @@ Erarosignalo Ne povis ŝarĝi bildon Apo kraŝis - reCAPTCHA - reCAPTCHA defio + reCAPTCHA + reCAPTCHA defio reCAPTCHA defio petita Ĉiuj Kanalo @@ -120,10 +120,10 @@ Jes Poste - Tiu permeso estas necesa por -\nmalfermi en ŝprucfenestro modo - Leganta en ŝprucfenestro modo - Malaktiva + Tiu permeso estas necesa por +\nmalfermi en ŝprucfenestra modo + Ludante en ŝprucfenestra modo + Malŝatitaj Filtri Aktualigi Forviŝi @@ -133,19 +133,19 @@ Uzu gestojn por kontroli la brilon kaj volumenon de la ludilo Serĉi sugestojn Montri sugestojn kiam serĉanto - Plej bona distingivo + Plej bona rezolucio Libera malpeza torentado ĉe Android. Elŝuti Leteroj kaj ciferoj Plej specialaj karakteroj - Rekomencu en fokusa gajno - Daŭrigi la legon post la interrompaĵoj (ekzemple telefonadoj) + Rekomenci en fokusa gajno + Daŭrigi la ludon post la interrompaĵoj (ekzemple telefonadoj) Serĉa historio Konservi la historio de serĉo lokale Rigardu historion Spuri la viditajn filmetojn - Newpipe Sciifo - Sciigoj por NewPipe fono kaj ŝprucfenestroj ludiloj + NewPipe Sciigo + Sciigoj por NewPipe fonaj kaj ŝprucfenestraj ludiloj Ludilo Konduto Historio kaj kaŝmemoro @@ -156,23 +156,23 @@ Supro 50 Nova & varma Montri la indiko « Tenu por aldoni » - Montri indikon kiam la fono aŭ ŝprucfenestro butono estas premita en la retpaĝo de dalatadoj de la filmeto - Viciĝita en la ludilo en fono - Viciĝita en ŝprucfenestro ludilo - Ludi ĉiuj + Montri indikon kiam la fona aŭ ŝprucfenestra butono estas premita en la retpaĝo de dalatadoj de la filmeto + Viciĝita en la fona ludilo + Viciĝita en ŝprucfenestra ludilo + Ludi ĉiujn Ne povis ludi tion torenton Neatendebla eraro de ludilo okazis Reakiri el eraro de la ludilo Fona ludilo - Ŝprucfenestro ludilo + Ŝprucfenestra ludilo Retiri Detalado Sonaj parametroj Teni por viciĝi [Nekonata] - Viciĝi en la fono + Viciĝi en la fona ludilo Viciĝi en nova ŝprucfenestro - Komencu ludi en nova ŝprucfenestro + Komenci ludi en nova ŝprucfenestro Defaŭlta enhava lando Ŝangi Orientiĝon Ŝanĝi al Fono @@ -180,46 +180,46 @@ Ŝangi al Ĉefa Servo Ĉiam - Nur unfoje + Nur unufoje Nevalida ligilo Neniuj filmeta torentoj trovitaj Neniuj sonaj torentoj trovis - Ŝprucfenestro ludilo + Ŝprucfenestra ludilo Importi la datumbazon Eksporti la datumbazon Anstataŭigas vian aktualan historion kaj abonojn Eksporti historion, abonojn kaj ludlistoj Ĉiam peti Nova ludlisto - Forigi + Forviŝi Alinomi Nomo Aldoni al la ludlisto Meti kiel bildeto de ludlisto Legosigno Ludlisto - Forigi Legosignon - Ĉu forigi ĉi tiun ludliston \? + Forviŝi Legosignon + Ĉu forviŝi ĉi tiun ludliston \? Ludlisto kreita Ludlistita Bildeto de ludlisto ŝanĝiĝita. - Ne povis forigi ludlisto. + Ne povis forviŝi ludliston. Malcimigi Auto-vico sekva fluo - Aŭto-aldoni rilatan enhavon kiam leganta la lasta enhavo en malrepetita atendovico + Aŭto-aldoni rilatan enhavon kiam ludanta la lasta enhavo en malrepetita atendovico Dosiero Tia dosierujo ne ekzistas Tia dosiero/enhavo ne ekzistas Dosiernomo ne povas esti malplena - Eraro okazis : %1$s - Importu Jutubajn abonaĵojn per elŝuti la dosieron de eksporto : -\n -\n1. Iru ĉe tie retpaĝo : %1$s -\n2. Ensalutu kiam oni petas vin -\n3. Elŝuto devus komenci (ĝi estas la dosiero de eksporto) - Importu Soundcloud-n profilon per elŝuti la dosieron de eksporto : + Eraro okazis: %1$s + Importu Jutubajn abonaĵojn per elŝuti la dosieron de eksporto : \n -\n1. Ebligu komputilon modon en krozilo (la retejo malhaveblas por poŝtelefonoj) -\n2. Iru al tie retpaĝo : %1$s +\n1. Iru ĉe tiu retpaĝo: %1$s +\n2. Ensalutu kiam oni petas vin +\n3. Elŝuto devus komenci (ĝi estas la dosiero de eksporto) + Importu Soundcloud-n profilon tajpante ĉu la ligilon, ĉu vian ID : +\n +\n1. Ebligu komputilon modon en retumilon (la retejo malhaveblas por poŝtelefonoj) +\n2. Iru tien: %1$s \n3. Ensalutu kiam oni petas vin \n4. Kopiu la ligilon de profilo ke oni kondikis vin. Malŝaltu por malebligi ŝarĝajn bildetojn, konservi datumojn kaj uzadon de memoro. Ŝanĝoj forviŝas ambaŭ en-memoro kaj sur-disko bildo kaŝmemoro. @@ -236,13 +236,13 @@ Forviŝi la serĉajn ŝlosilvortojn Ĉu vi volas forviŝi la totalon de la historio de serĉo \? Historio de serĉo forviŝita. - Limigi distingivo kiam uzanta moveblan datumon - Minimumigi al ŝprucfenestro ludilo + Limigi rezolucio kiam uzanta moveblan datumon + Minimumigi al ŝprucfenestra ludilo Kanaloj Ludlistoj Spuroj Uzantoj - Malabonu + Malaboni Nova ongleto Elektu ongleton Kontrolo de volumena gesto @@ -252,7 +252,7 @@ Ĝisdatigoj Dosiero forviŝita Sciigo por ĝisdatigi apon - Sciigo por nova versio de Newpipe + Sciigo por nova versio de NewPipe Ekstera konservejo malhavebla Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon \? viciĝita @@ -265,7 +265,7 @@ Konferencoj Montri komentojn Malebligu por malvidigi komentojn - Aŭtolego + Aŭtoludo Komentoj @@ -281,7 +281,7 @@ Ludaj pozicioj forviŝitaj. Dosiero movita aŭ forviŝita ne povas dispremi la dosieron - Ĉu vi certas\? + Ĉu vi volas forviŝi vian historion de elŝutoj aŭ forviŝi la tutajn elŝutitajn dosierojn\? Limigi la elŝutan atendovicon Unu elŝuto ruliĝos en la sama tempo Komenci elŝutojn @@ -291,8 +291,8 @@ Oni petos vin kie konservi ĉion elŝutaĵon. \nElektu AFM se vi volas elŝuti al ekstera SD-karto Uzu AFM - La Atinga Framo al la Memoro ebligas elŝuti al ekstera SD-karto. -\nKomento : kelkaj aparatoj ne kongruas + La Atinga Framo al la Memoro ebligas elŝuti al ekstera SD-karto. +\nKomento: kelkaj aparatoj ne kongruas Forviŝi ludajn poziciojn Forviŝi la totalon de ludaj pozicioj Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \? @@ -307,7 +307,7 @@ Komenci Paŭzigi Ludi - Forigi + Forviŝi Kontrolsumo Nova misio Bone @@ -341,8 +341,8 @@ Permesiloj Rigardu ĉe GitHub Permesilo de NewPipe - Ĉu vi havas ideojn pri; traduko, desegnaĵoj ŝanĝoj, purigado de kodo, aŭ realaj masivaj ŝanĝoj—helpo estas ĉiam bonvena. Ju pli oni faras, des pli bonas! - Legu permesilon + Ĉu vi havas ideojn pri; traduko, desegnaĵoj ŝanĝoj, purigado de kodo, aŭ realaj masivaj ŝanĝoj—helpo ĉiam estas bonvena. Ju pli oni faras, des pli bonas! + Legi permesilon Kontribui Permesitaj karakteroj en dosiernomoj Nevalidaj karakteroj estas anstataŭigita kun ĉi tiu valoro @@ -353,7 +353,7 @@ La historio estas malŝatita Historio La historio estas malplena - Historio vakigita + Historio forviŝita Neniuj rezultoj Neniu enhavo Neniuj abonantoj @@ -375,12 +375,12 @@ Neniuj kanalaj abonoj ankoraŭ Elekti kioskon Komenci ludi ĉi tie - Komenci ludi en la fono + Komenci ludi fone Donaci - NewPipe estas programada par volontuoj, elspezante tempo por alporti vin la plej bona sperto. Redonu por helpi programistojn plibonigi NewPipe dum ĝuante tason da kafo. + NewPipe estas programadita par volontuoj, elspezante tempo por alporti vin la plej bona sperto. Redoni por helpi programistojn plibonigi NewPipe dum ĝuante tason da kafo. Redoni Retejo - Vizitu la retejon de NewPipe por pli da informoj kaj novaĵoj. + Viziti la retejon de NewPipe por pli da informoj kaj novaĵoj. Malfermi la tirkeston Fermi la tirtekston Ekstaraj ludantoj ne suportas tiajn ligilojn @@ -395,8 +395,8 @@ Ĉi tio nuligos vian nunan aranĝon. Trenu por reorgidi Krei - Forigi Unu - Forigi ĉiujn + Forviŝi Unu + Forviŝi ĉiujn Rezigni Alinomi Ĉu vi volas forviŝi tion eron el la spekta historio \? @@ -413,7 +413,7 @@ La monitorado de la memorlikadoj povas frostigi la apon dum la hejta dumpingo Signali ekster-vivciklajn erarojn Perforti signalante neenretigaj Rx esceptoj eksere la fragmento aŭ aktiveco vivciklo post dispono - La dosiero ne ekzistas aŭ la legopermeso mankas + La dosiero ne ekzistas aŭ la ludopermeso mankas Importi/eksporti Importi Importi el @@ -437,14 +437,14 @@ Subtitoloj Modifi la dimension de la teksto kaj la fonajn stilojn de la subtitoloj de la ludilo. Ĝi bezonas restarto de la apo por efektiviĝi. 1 ero forviŝita. - NewPipe estas programaro sub rajtoceda permesilo: Vi povas uzi, studi, komuniki kaj plibonigi ĝin kiel vi volas. Precize, vi povas redistribui kaj/aŭ modifi ĝin sub la kondiĉojn de la Ĝenerala Publika Permesilo de GNU, kiel publikigita per la Free Software Foundation, ĉu en la versio 3, ĉu (se vi volas) ajna posta versio. + NewPipe estas programaro sub rajtoceda permesilo: Vi povas uzi, studi, komuniki kaj plibonigi ĝin kiel vi volas. Precize, vi povas redistribui kaj/aŭ modifi ĝin sub la kondiĉoj de la Ĝenerala Publika Permesilo de GNU, kiel publikigita per la Free Software Foundation, ĉu en la versio 3, ĉu (se vi volas) ajna posta versio. Ĉu vi volas ankaŭ importi agordojn\? Privateca politiko de NewPipe - La NewPipe projekto respektas vian privatecon serioze. Konsekvence, la apo ne kolektas ajnan datumo sen via konsento. -\nLa privateco politiko de Newpipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon. + La NewPipe projekto serioze respektas vian privatecon. Konsekvence, la apo ne kolektas ajnan datumon sen via konsento. +\nLa privateco politiko de NewPipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon. Legi la privatecan politikon - Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atento al la privateca politiko de NewPipe. Bonvolu legi ĝin atentive. -\nVi devas akcepti ĝin por sendi nin la cimsignalo. + Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atenton al la privateca politiko de NewPipe. Bonvolu atentive legi ĝin. +\nVi devas akcepti ĝin por sendi la cimsignalon al ni. Akcepti Rifuzi Neniu limo @@ -455,7 +455,7 @@ Plirapidigi dum silentoj Paŝo Restarigi - Uzante defaŭltajn ongletojn, eraro dum leganta savajn ongletojn + Uzante defaŭltajn ongletojn, eraro ludante savajn ongletojn Restaŭri la defaŭltojn Ĉu vi volas restaŭri la defaŭltojn \? Kalkulo de abonantoj malhavebla @@ -468,8 +468,8 @@ Krado Aŭto Ŝanĝi vidon - Ĝisdatigo de NewPipe havebla ! - Premu por elŝuti + Ĝisdatigo de NewPipe havebla! + Premi por elŝuti Finita Pritraktata Paŭzigita @@ -507,8 +507,8 @@ Defaŭlta Kiosko Neniu spektas - %s spektanta - %s spektanta + %s spektanto + %s spektantoj Neniu aŭskultas @@ -518,18 +518,28 @@ La lingvo ŝanĝos kiam la apo restartos. Rapida antaŭen / posten daŭron Instancoj de PeerTube - Registri viajn preferitajn instancojn de PeerTube - Trovu la instancojn kiu vi povus ŝati ĉe https://joinpeertube.org/instances#instances-list + Elekti viajn preferitajn instancojn de PeerTube + Trovu la instancojn kiu vi povus ŝati ĉe %s Aldoni instanco Eniri la ligilon de la instanco - Malsukcesis validigi instanco - Nur https ligiloj estas subtenitaj + Ne povis validigi instanco + Nur HTTPS ligiloj estas subtenitaj La instanco jam ekzistas - Loka - Freŝdate ĝisdatigita - La plej ŝatitatj + Lokaj + Freŝe aldonitaj + La plej ŝatitaj Aŭtomate generita (neniu alŝutilo trovita) Reakiranta Ne povas reakiri tion elŝuton Elektu instancon + Enablu bildeta filmeton ĉe ŝlosita ekrano + Uzante la fona ludilo, bildeta filmeto vidiĝos ĉe ŝlosita ekrano + Forviŝi la historion de elŝutoj + Forviŝi elŝutitajn dosierojn + %1$s elŝutoj forviŝitaj + Doni la permeson por afiŝiĝi supre aliaj apoj + Lingvo de la apo + Sistemnormo + Premu « Finita » kiam solvita + Finita \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index eacda9f4a..17ef8b5b7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -115,11 +115,11 @@ k M MM - reCAPTCHA + reCAPTCHA Abrir en modo emergente Se necesita este permiso \npara abrir en modo emergente - Reto reCAPTCHA + Reto reCAPTCHA Reto reCAPTCHA requerido Modo emergente de NewPipe Reproduciendo en modo emergente @@ -221,7 +221,7 @@ Seleccione un canal No hay suscripciones a canales todavía Seleccione un kiosco - Kiosco + Quiosco Tendencias 50 mejores Mostrar sugerencia cuando se presiona el botón de 2.º plano o emergente en la página de detalles del vídeo @@ -425,7 +425,7 @@ Mostrar como grilla Mostrar como lista Limpiar descargas finalizadas - ¿Lo confirma\? + ¿Quiere limpiar su historial de descargas o eliminar todos los ficheros descargados\? Detener Intentos máximos Cantidad máxima de intentos antes de cancelar la descarga @@ -517,19 +517,29 @@ %s escucha %s escuchas - El idioma cambiará luego de que la app sea reiniciada. + El idioma cambiará luego de que se reinicie la aplicación. Duración de búsqueda al avanzar y/o retroceder Instancias de PeerTube - Elige tus instancias favoritas de PeerTube - Encuentra las mejores instancias para ti en https://joinpeertube.org/instances#instances-list + Selecciona tus instancias favoritas de PeerTube + Encuentra las mejores instancias para ti en %s Agregar instancia - Dirección URL de la instancia - Error al validar la instancia - Sólo URLs con HTTPS + Ingresar URL de la instancia + No se pudo validar la instancia + Solo se admiten URL HTTPS La instancia ya existe Local Agregados recientemente Más gustados Generado automáticamente (no se encontró creador) Elige una instancia + Habilitar miniatura de video de la pantalla de bloqueo + Al usar el reproductor de fondo, se mostrará una miniatura de video en la pantalla de bloqueo + Limpiar historial de descargas + Eliminar archivos descargados + Eliminadas %1$s descargas + Dar permisos para que se muestre por sobre otras apps + Idioma de aplicación + Predeterminado del sistema + Pulse en «Hecho» cuando esté resuelto + Hecho \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 99dc6cc80..79442f421 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -238,7 +238,7 @@ Need õigused on vajalikud \nhüpikakna avamiseks Kustutati 1 element. - "reCAPTCHA " + "reCAPTCHA " Laadi alla Lubatud tähemärgid failinimedes Vigased tähemärgid asendatakse selle väärtusega @@ -370,7 +370,7 @@ Lood Kasutajad Lülitu peamisele - reCAPTCHA nõue + reCAPTCHA nõue reCAPTCHA nõude taotlus © %1$s %2$s %3$s alla Vaba kergekaaluline Androidi voogesitus. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 2233c42ba..8e74ed126 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -139,8 +139,8 @@ Ezarri deskargetarako karpeta bat ezarpenetan geroago Baimen hau beharrezkoa da \nlaster-leiho moduan irekitzeko - reCAPTCHA - reCAPTCHA erronka + reCAPTCHA + reCAPTCHA erronka reCAPTCHA erronka eskatu da NewPipe aplikazioari buruz Ezarpenak @@ -199,8 +199,8 @@ Bideorik ez - Bideoa - Bideoak + Bideo % + % bideo Historiala Bilatuta @@ -488,7 +488,7 @@ NewPipe itxi egin da fitxategian lanean zegoela Ez dago lekurik gailuan Progresioa galdu da, fitxategia ezabatu delako - Ziur al zaude\? + Zure deskargen historiala garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu\? Mugatu deskargen ilara Deskarga bakarra aldi berean Hasi deskargak @@ -519,12 +519,12 @@ Kiosko Lehenetsia Aurreratze/atzeratze bilaketaren iraupena PeerTube instantziak - Ezarri zure gogoko peertube instantziak - Aurkitu instantziak hemen: https://joinpeertube.org/instances#instances-list + Hautatu zure gogoko PeerTube instantziak + Aurkitu instantziak hemen: %s Gehitu instantzia Sartu instantziaren URLa - Huts egin du instantzia balioztatzean - https URLak onartzen dira soilik + Ezin izan da instantzia balioztatu + HTTPS URLak onartzen dira soilik Instantzia badago aurretik Lokala Berriki gehitua @@ -533,4 +533,14 @@ berreskuratzen Ezin da deskarga hau berreskuratu Aukeratu instantzia + Gaitu bideoaren iruditxoa blokeo pantailan + Bigarren planoko erreproduzigailua erabiltzean bideoaren iruditxo bat bistaratuko da blokeo pantailan + Garbitu deskargen historiala + Ezabatu deskargatutako fitxategiak + %1$s deskarga ezabatuta + Eman beste aplikazioen gainean erakusteko baimena + Aplikazioaren hizkuntza + Sisteman lehenetsia + Sakatu \"Egina\" konponduta dagoenean + Egina \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b2a04e14c..790c47669 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -296,7 +296,7 @@ زمان فعلی پخش کننده را به صورت تقریبی و سریع جلو ببر این گزینه باعث می شود هنگام جلو/عقب کردن زمان تصویر، به جای زمان دقیق انتخاب شده، به زمان غیر دقیق و نزدیک به مکان انتخاب شده برود که این کار سریع تر انجام می شود کاره یا رابط کاربری با خطا مواجه شد - ریکپچا + ریکپچا بارگیری تغییر جهت تغییر وضعیت به پس‌زمینه @@ -361,7 +361,7 @@ بازگردانی در صف پخش کننده پس‌زمینه قرار گرفت چه:\\nدرخواست:\\nزبان درخواست:\\nخدمت:\\nزمان GMT:\\nنگارش:\\nنگارش س.ع:\\nبازه آی‌پی: - چالش ری‌کپچا + چالش ری‌کپچا نیاز به چالش ری‌کپچا است این مجوز مورد نیاز است \nتا بتوان به حالت تصویر در تصویر رفت diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1e91fa55a..edf10c6f0 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -173,8 +173,8 @@ Kopioitu leikepöydälle Valitse saatavilla oleva latauskansio Tämä käyttöoikeus tarvitaan ponnahdusikkunan käytölle - reCAPTCHA - reCAPTCHA Haaste + reCAPTCHA + reCAPTCHA Haaste reCAPTCHA Haaste pyydetty Lataus Sallitut merkit tiedostonimissä diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 40412ac11..9813b6922 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -39,4 +39,7 @@ Popup Idagdag sa Folder ng pag-download ng video + Pumili ng folder kung saan ido-download ang mga bidyo + Nakaimbak sa folder na ito ang mga nai-download na mga audio files + Pumili ng folder kung saan ido-download ang mga audio files \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c8e238487..c200b1b8b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -19,14 +19,14 @@ Partager Partager avec Affiche une option pour lire une vidéo via Kodi - Afficher l’option « Lire avec Kodi » + Afficher l’option « Lire avec Kodi » Publiée le %1$s %1$s vues Audio Format audio par défaut Télécharger Suivant - Afficher les vidéos « Suivantes » et « Similaires » + Afficher les vidéos « Suivantes » et « Similaires » URL non pris en charge Vidéo et audio Autre @@ -50,8 +50,8 @@ Dossier de téléchargement audio Les fichiers audio téléchargés sont stockés ici Choisissez le dossier de téléchargement des fichiers audio - Impossible de créer le répertoire de téléchargement « %1$s » - Répertoire de téléchargement « %1$s » créé + Impossible de créer le répertoire de téléchargement « %1$s » + Répertoire de téléchargement « %1$s » créé Erreur Impossible d’analyser le site web Contenu indisponible @@ -105,24 +105,24 @@ Veuillez définir ultérieurement un dossier de téléchargement dans les paramètres Impossible de charger l’image L’application a planté - reCAPTCHA + reCAPTCHA Noir Tout Chaîne - Défi reCAPTCHA + Défi reCAPTCHA Défi reCAPTCHA demandé Ouvrir en mode flottant Mode flottant NewPipe Lecture en mode flottant Oui Plus tard - Désactivé + Désactivés Quoi :\\nRequête :\\nLangue du contenu :\\nService :\\nHeure UTC :\\nPaquet :\\nVersion :\\nVersion du système d’exploitation : k M Cette autorisation est nécessaire pour \nutiliser le mode flottant - Arrière-plan + Lire l\'audio Flottant Définition de la fenêtre flottante par défaut Afficher des définitions plus élevées @@ -185,7 +185,7 @@ Notification NewPipe Annuler Garde un suivi des vidéos vues - Reprendre à l’obtention de la cible de saisie + Reprendre lors du retour dans l\'application Lecteur Comportement Historique et cache @@ -205,8 +205,8 @@ Aucune vidéo - Vidéo - Vidéos + %s vidéo + %s vidéos Caractères spéciaux Élément supprimé @@ -231,8 +231,8 @@ Retirer Détails Paramètres audios - Afficher l’astuce « Maintenir pour ajouter » - Affiche l’astuce lors de l’appui du bouton « Arrière-plan » ou « Mode flottant » sur la page de détails d’une vidéo + Afficher l’astuce « Maintenir pour ajouter » + Affiche l’astuce lors de l’appui du bouton « Arrière-plan » ou « Mode flottant » sur la page de détails d’une vidéo [Inconnu] Récupération depuis l’erreur du lecteur Kiosque @@ -310,7 +310,7 @@ Utiliser la recherche rapide approximative Permet au lecteur d’accéder plus rapidement à une position au détriment de la précision Charger les miniatures - Désactiver pour empêcher le chargement des miniatures afin d\'économiser vos données. Modifier cette option vide le cache en mémoire vive et sur le disque. + Désactivez pour empêcher le chargement des miniatures afin de réduire l’utilisation de la bande passante et de la mémoire. La modification de cette option, vide le cache en mémoire vive et sur le disque. Images en cache effacées Effacer les métadonnées en cache Efface toutes les données de pages Web en cache @@ -348,11 +348,11 @@ \n1. Suivez ce lien : %1$s. \n2. Connectez-vous à votre compte. \n3. Un téléchargement va démarrer (celui du fichier d’exportation). - Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant. -\n -\n1. Activez le « mode bureau » dans votre navigateur web (le site n’est pas disponible pour les appareils mobiles). -\n2. Suivez cette URL : %1$s. -\n3. Connectez-vous à votre compte. + Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant. +\n +\n1. Activez le « mode bureau » dans votre navigateur web (le site n’est pas disponible pour les appareils mobiles). +\n2. Suivez cette URL : %1$s. +\n3. Connectez-vous à votre compte. \n4. Copiez l’URL du profil vers lequel vous venez d’être redirigé. votre identifiant, soundcloud.com/votreidentifiant Cette opération peut charger énormément la connexion réseau. @@ -484,7 +484,7 @@ NewPipe a été fermé alors qu’il travaillait sur le fichier Aucun espace disponible sur le périphérique Progression perdue, car le fichier a été effacé - Êtes-vous sûr \? + Voulez-vous effacer l\'historique de téléchargement ou supprimer tous les fichiers téléchargés \? Limiter la file d’attente de téléchargement Un téléchargement s’exécutera en même temps Démarrer les téléchargements @@ -508,8 +508,8 @@ Kiosque par défaut Personne ne regarde - %s regarde - %s regardent + %s spectateur + %s spectateurs Personne n\'écoute @@ -519,12 +519,12 @@ La langue changera lors du redémarrage de l\'application. Avance/rembobinage rapide sur une durée Instances PeerTube - Définissez vos instances peertube préférées - Cherchez des instances qui pourraient vous intéresser sur https://joinpeertube.org/instances#instances-list + Choisissez vos instances PeerTube préférées + Cherchez des instances qui pourraient vous intéresser sur %s Ajouter une instance Entrez l’URL de l’instance Échec de validation de l’instance - Sont prises en charge uniquement les URLs en https + Sont prises en charge uniquement les URLs en HTTPS L’instance existe déjà Local Ajoutées récemment @@ -532,4 +532,15 @@ récupération Impossible de récupérer ce téléchargement Choisissez une instance + Généré automatiquement (pas de téléverseur trouvé) + Activer la vidéo miniaturisée sur l\'écran de verrouillage + En utilisant le lecteur audio, la miniature de la vidéo sera affichée sur l\'écran de verrouillage + Effacer l\'historique de téléchargement + Supprimer les fichiers téléchargés + %1$s téléchargements supprimés + Autoriser la superposition d\'applis + Langue de l\'application + Prédéfini par le système + Appuyez sur « Terminé » une fois résolu + Terminé \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 899a9be10..6427e1378 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -266,8 +266,8 @@ \npara abrir o vídeo no modo «popup» 1 elemento foi eliminado. - reCAPTCHA - Desafío reCAPTCHA + reCAPTCHA + Desafío reCAPTCHA Desafío reCAPTCHA solicitado Descarregar diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index f98fb7b3e..72b6a92ab 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -167,10 +167,10 @@ אין סרטונים - סרטון %s - %s סרטונים - %s סרטונים - %s סרטונים + סרטון + סרטונים + סרטונים + סרטונים התחלה השהיה @@ -192,8 +192,8 @@ נא לציין תיקיית הורדה בהגדרות בהמשך הרשאה זו נדרשת לטובת \nפתיחה בחלון צף - reCAPTCHA - אתגר reCAPTCHA + reCAPTCHA + אתגר reCAPTCHA התקבלה בקשה לאתגר reCAPTCHA הורדה רשימת תווים אפשרית בשמות קבצים @@ -496,7 +496,7 @@ לא נשאר מקום במכשיר התהליך אבד כיוון שהקובץ נמחק החיבור המתין זמן רב מדי - בוודאות\? + למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת\? הגבלת תור ההורדה רק הורדה אחת תרוץ בו־זמנית התחלת הורדות @@ -531,12 +531,12 @@ קיוסק בררת מחדל משך קפיצה מהירה קדימה/אחורה מופעים של PeerTube - נא להגדיר את מופעי ה־peertube המועדפים עליך - איתור המופעים שהכי מתאימים לך תחת https://joinpeertube.org/instances#instances-list + נא לבחור את מופעי ה־PeerTube המועדפים עליך + איתור המופעים שהכי מתאימים לך תחת %s הוספת מופע נא להכניס כתובת מופע - אימות המופע נכשל - יש תמיכה בכתובות https בלבד + לא ניתן לאמת את המופע + יש תמיכה בכתובות HTTPS בלבד המופע כבר קיים מקומי נוספו לאחרונה @@ -545,4 +545,14 @@ בשחזור לא ניתן לשחזר את ההורדה הזאת נא לבחור מופע + הפעלת תמונה מוקטנת של הסרטון במסך הנעילה + בעת השימוש בנגן הרקע תופיע תמונה מוקטנת של הסרטון על מסך הנעילה + מחיקת היסטוריית ההורדות + למחוק את הקבצים שהורדתי + נמחקו %1$s הורדות + יש להעניק הרשאה להציג על גבי יישומונים אחרים + שפת היישומון + בררת המחדל של המערכת + יש ללחוץ על „סיום” לאחר הפתירה + סיום \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 82b2db1b5..a7746330a 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -206,8 +206,8 @@ क्लिपबोर्ड पर कॉपी हो गया है कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुने पॉपअप के तरीके में खोलने के लिए अनुमति की जरुरत है - reCAPTCHA - reCAPTCHA चुनौती + reCAPTCHA + reCAPTCHA चुनौती reCAPTCHA चुनौती का अनुरोध किया डाउनलोड फाइल के नाम के लिए आवश्यक characters(जैसे - १२३, abc) की अनुमति है diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index a981dcf5e..d5e751262 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -30,12 +30,12 @@ Što je novo Pozadina Skočni prozor - Put za preuzimanje videozapisa - Put za spremanje videozapisa u - Unesi put za preuzimanje videozapisa + Mapa za preuzimanje videozapisa + Preuzete video datoteke se spremaju ovdje + Odaberi mapu za preuzimanje video datoteka Mapa za preuzimanje zvuka - Preuzeti zvuk je spremljen ovdje - Unesi put za preuzimanje zvučne datoteke + Preuzete audio datoteke se spremaju ovdje + Odaberi mapu za preuzimanje audio datoteka Automatska reprodukcija Reproducira videozapis kad je NewPipe pozvan iz druge aplikacije Zadana razlučivost @@ -61,7 +61,7 @@ Prikaži prijedloge pri traženju Povijest pretraživanja Svaku pretragu spremi lokalno - Povijest & Predmemorija + Prati povijest Pratite pogledane videozapise Nastavi nakon dobivanja fokusa Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi) @@ -116,7 +116,7 @@ Vaš komentar (na engleskom): Detalji: Sličica pregleda videozapisa - Sličica pregleda videozapisa + Pokreni video, trajanje: Profilna slika prenositelja Goreglasovi Doljeglasovi @@ -130,9 +130,9 @@ Zvuk Ponovno pokušaj Dozvola za pisanje po pohrani je odbijena - tis + tis. mil - mlrd + mlrd. Počni Pauziraj Reproduciraj @@ -150,11 +150,11 @@ Dodirni za detalje Molimo pričekajte… Kopirano u međuspremnik - Molimo odaberite dostupnu mapu za preuzimanje + Kasnije odredite mapu za preuzimanje u postavkama Ova dozvola je potrebna za \notvaranje skočnog prozora - reCAPTCHA - reCAPTCHA zadatak + reCAPTCHA + reCAPTCHA zadatak Traži se reCAPTCHA zadatak Preuzimanja Dozvoljeni znakovi u nazivima datoteka @@ -209,8 +209,8 @@ Nema videozapisa %s video - %s videozapisa - %s videozapisi + %s videa + %s videa Stavka je izbrisana U redu čekanja za reprod. u pozadini @@ -397,7 +397,7 @@ Otkrivanje grešaka Obavijest o ažuriranju aplikacije Uključite ili isključite orijentaciju - Preuzimanje na vanjsku SD karticu još nije moguće. Poništite lokaciju mape za preuzimanje\? + Preuzimanje na vanjsku SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje\? Vanjski playeri ne podržavaju ove vrste veza Nije pronađen nijedan videozapis Nije pronađen nijedan zvuk @@ -433,7 +433,7 @@ Način prikaza popisa Automatski Gotovo - U redu za čekanje + Na čekanju pauzirano Na redu za čekanje naknadna obrada @@ -446,8 +446,8 @@ Preuzeta datoteka s tim nazivom već postoji U tijeku je preuzimanje s ovim nazivom Kod - Datoteku nije moguće izraditi - Odredišnu mapu nije moguće izraditi + Odredišnu mapu nije moguće stvoriti + Datoteku nije moguće stvoriti Sustav je odbio dozvolu Sigurna veza nije uspjela Nije moguće pronaći server @@ -460,7 +460,7 @@ Stop Maksimalnih ponovnih pokušaja Maksimalni broj pokušaja prije poništavanja preuzimanja - Pauziraj prilikom prebacivanja na mobilne podatke + Prekini na mrežama s ograničenim prometom Preuzimanja koja se ne mogu zaustaviti ponovno će se pokrenuti Prikaži komentare Onemogućite da biste prestali prikazivati komentare diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 4d7ff986e..1fda2a515 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -14,9 +14,9 @@ Megosztás ezzel Válasszon böngészőt forgatás - Videófájlok letöltési helye - Útvonal a letöltött videók tárolásához - Adja meg a videófájlok letöltési helyét + Videók letöltési helye + Ide kerülnek a letöltött videók + Válassza ki a videófájlok letöltési helyét Alapértelmezett felbontás Lejátszás Kodi-val A Kore alkalmazás nem található. Telepíted a Kore lejátszót? @@ -29,7 +29,7 @@ Nem támogatott webcím Külső videólejátszó használata Külső hanglejátszó használata - Add meg a hangfájlok letöltési helyét + Válaszd ki a hangfájlok letöltési helyét Tor használata (Kísérleti) Adatforgalom Tor-on keresztüli kényszerítése a biztonság fokozása érdekében (a videó stream-elés még nem támogatott). Lejátszás @@ -44,7 +44,7 @@ Világos Téma Hangfájlok letöltési helye - Letöltött hangfájlok itt találhatók + A letöltött hangfájlok itt találhatóak Tetszik Nem tetszik Előnézeti kép @@ -123,8 +123,7 @@ Mutassa a magasabb felbontásokat Csak néhány eszköz támogatja a 2K/4K videók lejátszását Alapértelmezett videó formátum - Fekete -\n + Fekete Jegyezze meg a felugró ablak helyét és méretét Jegyezze meg a felugró ablak előző helyét és méretét Keresési javaslatok @@ -233,8 +232,8 @@ Átnevezés Ez az engedély szükséges a felugró ablakban történő megnyitáshoz 1 elem törölve. - reCAPTCHA - reCAPTCHA rejtvény + reCAPTCHA + reCAPTCHA rejtvény reCAPTCHA rejtvény igényelve Letöltés Fájlnevekben engedélyezett karakterek @@ -382,4 +381,8 @@ Figyelmen kívül hagy Lejátszási lista könyvjelzők közé Hasonló videó beadása az utolsó videó után egy nem ismétlődő sorban + Sor + a fájl nem írható felül + Az előre- és visszatekerés időtartama + Videó előnézet megjelenítése a lezárási képernyőn \ No newline at end of file diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 981724304..6bbcac7b3 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -32,4 +32,6 @@ Initiar discargas Pausar le discargas Seliger un instantia + Non poteva connecter con le servitor + %1$s vistas \ No newline at end of file diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-in/strings.xml similarity index 94% rename from app/src/main/res/values-id/strings.xml rename to app/src/main/res/values-in/strings.xml index 938837bd5..7c3cce473 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -105,8 +105,8 @@ Apa:\\nPermintaan:\\nBahasa Konten:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS: Laporan pengguna Thread - reCAPTCHA - Tantangan reCAPTCHA + reCAPTCHA + Tantangan reCAPTCHA Meminta kode reCAPTCHA Hitam Semua @@ -480,7 +480,7 @@ NewPipe telah ditutup saat sedang memproses berkas Tidak ada ruang kosong tersisa pada perangkat Kehilangan laju, karena berkas telah dihapus - Apakah anda yakin\? + Apakah anda yakin ingin menghapus semua riwayat unduhan dan berkas yang telah diunduh\? Batasi antrean unduhan Satu unduhan akan berjalan pada waktu yang bersamaan Mulai unduh @@ -498,7 +498,7 @@ Hapus semua posisi pemutaran\? Ubah folder unduhan - Video + %s video Aktif/Nonaktifkan layanan, saat ini aktif: Tidak ada yang menonton @@ -510,4 +510,29 @@ %s mendengarkan Bahasa akan diterapkan setelah aplikasi dimulai ulang. + Situs PeerTube + Pilih situs PeerTube favorit anda + Temukan situs yang sesuai dengan anda di %s + Tambah situs + Masukkan URL situs + Tidak bisa memvalidasi situs + Hanya mendukung URL HTTPS + Situs sudah ada + Lokal + Baru-baru ini ditambahkan + Disukai terbanyak + Dibuat otomatis (pengunggah tidak ditemukan) + memulihkan + Tidak bisa memulihkan unduhan ini + Pilih situs + Aktifkan kunci layar thumbnail video + Ketika menggunakan pemutar latar belakang, thumbnail video akan ditampilkan di tampilan kunci layar + Kiosk Default + Hapus riwayat unduhan + Hapus berkas yang diunduh + %1$s unduhan dihapus + Izinkan untuk ditampilkan di atas aplikasi lain + Bahasa apl + Default sistem + Selesai \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4942f4720..eef99d93f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -30,9 +30,9 @@ URL non supportato Lingua Predefinita per Contenuti Video e Audio - Miniatura anteprima video + Copertina di anteprima video Riproduci video, durata: - Miniatura dell\'immagine di profilo dell\'utente + Immagine di profilo dell\'utente Non mi piace Mi piace Impossibile creare la cartella di download \'%1$s\' @@ -51,7 +51,7 @@ Riproduci Errore Errore di connessione - Impossibile caricare tutte le miniature + Impossibile caricare tutte le copertine Impossibile decriptare la firma dell\'URL del video Contenuto non disponibile Usa Tor @@ -106,8 +106,8 @@ Impossibile caricare l\'immagine L\'app/UI si è interrotta Cosa:\\nRichiesta:\\nLingua contenuto:\\nServizio:\\nOrario GMT:\\nPacchetto:\\nVersione:\\nVersione SO: - reCAPTCHA - Risoluzione reCAPTCHA + reCAPTCHA + Risoluzione reCAPTCHA Nero Tutto Canale @@ -117,19 +117,19 @@ È richiesta la risoluzione del reCAPTCHA Più tardi - Apri in modalità popup - Modalità popup di NewPipe - Riproduzione in Modalità Popup + Apri in modalità Popup + Modalità Popup di NewPipe + Riproduzione in modalità Popup Disattivato L\'audio potrebbe non essere disponibile per ALCUNE risoluzioni - In sottofondo + In Sottofondo Popup Risoluzione Predefinita Popup Mostra Altre Risoluzioni Solo alcuni dispositivi supportano la riproduzione video in 2K e 4K Formato Video Predefinito Ricorda Dimensione e Posizione Popup - Ricorda l\'ultima dimensione e posizione della finestra popup + Ricorda dimensione e posizione della finestra Popup Controllo Movimenti Lettore Multimediale Usa i movimenti per controllare luminosità e volume del lettore multimediale Suggerimenti Ricerca @@ -140,8 +140,8 @@ Cancella Ridimensionamento Risoluzione migliore - Questo permesso è necessario -\nper riprodurre in modalità popup + Questo permesso è necessario +\nper utilizzare il lettore Popup Impostazioni Informazioni Licenze di Terze Parti @@ -191,7 +191,7 @@ Playlist Annulla Notifiche NewPipe - Notifiche per NewPipe in background e per il lettore a comparsa + Notifiche per lettore in Sottofondo e Popup Nessun risultato Nessun iscritto @@ -225,25 +225,25 @@ Top 50 New & hot Mostra Suggerimento \"Tieni Premuto per Accocodare\" - Mostra suggerimento quando il pulsante per la riproduzione \"popup\" o \"in sottofondo\" viene premuto nella pagina dei dettagli del video - In Coda in Sottofondo - In Coda in Modalità Popup + Nella pagina dei dettagli del video, mostra un suggerimento alla pressione dei pulsanti per la riproduzione Popup o in Sottofondo + Accoda in Sottofondo + Accodato in Popup Riproduci tutto Impossibile riprodurre questo flusso Si è verificato un errore irreversibile Ripristino dell\'errore del lettore multimediale - Riproduzione in sottofondo - Riproduzione in modalità a comparsa + Riproduzione in Sottofondo + Lettore Popup Rimuovi Dettagli - Impostazioni audio - Tenere premuto per aggiungere alla coda + Impostazioni Audio + Tenere premuto per accodare [Sconosciuto] - In coda in sottofondo - In coda nel riproduttore a comparsa + Accoda in Sottofondo + Accoda in Popup Inizia la riproduzione qui Avvia riproduzione in sottofondo - Avvia riproduzione a comparsa + Avvia subito in Popup Dona Sito Visita il sito di NewPipe per informazioni e novità. @@ -251,9 +251,9 @@ Restituisci Paese Predefinito per Contenuti Cambia orientamento - Passa alla riproduzione in background + Passa in Sottofondo Passa a Popup - Passa alla produzione predefinita + Passa a Principale Servizio Apri il menu Chiudi il menu @@ -265,8 +265,8 @@ Nessun flusso video trovato Nessun flusso audio trovato Lettore video - Riproduzione in sottofondo - Riproduzione in modalità popup + Riproduzione in Sottofondo + Lettore Popup Raccogliendo informazioni… Caricamento del contenuto richiesto Importa database @@ -298,13 +298,13 @@ Rinomina Nome Aggiunti alla playlist - Imposta come miniatura della playlist + Imposta come Copertina della Playlist Segnalibri playlist Rimuovi segnalibro Eliminare la playlist\? Playlist creata Aggiunto alla Playlist - Miniatura della Playlist cambiata. + Copertina playlist cambiata. Impossibile eliminare la Playlist. Nessun Sottotitolo Rientrato @@ -352,7 +352,7 @@ Tieni presente che questa operazione può consumare una grande quantità di traffico dati. \n \nVuoi continuare? - Carica Anteprime + Carica Copertine Disabilita per prevenire il caricamento delle anteprime, risparmiando dati e memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco. Cache immagini svuotata Pulisci Cache Metadati @@ -393,11 +393,11 @@ Avanzamento veloce durante il silenzio Step Reset - Minimizza al cambio dell\'applicazione - Azione quando si passa ad un\'altra app dal lettore video principale — %s - Nessuna - Minimizza al lettore in sottofondo - Minimizza al lettore popup + Riduci Cambiando App + Azione da eseguire cambiando app dal lettore video principale — %s + Niente + Riduci in Sottofondo + Riduci a Popup Canali Playlist Tracce @@ -423,7 +423,7 @@ Selezione Aggiornamenti Mostra una notifica per suggerire l\'aggiornamento dell\'app se una nuova versione è disponibile - Visualizzazione a lista + Modalità Visualizzazione Lista Lista Griglia Automatica @@ -433,14 +433,14 @@ Finito In attesa in pausa - in coda + accodato post-processo Accoda Azione negata dal sistema Download fallito Download terminato %s download terminati - Genera un nome unico + Genera Nome Univoco Sovrascrivi Esiste già un file scaricato con lo stesso nome C\'è un download in corso con questo nome @@ -484,11 +484,11 @@ File spostato o cancellato Esiste già un file con questo nome impossibile sovrascrivere il file - C\'è un download in corso con questo nome + C\'è un download in attesa con questo nome NewPipe è stato chiuso mentre lavorava sul file Spazio insufficiente sul dispositivo Progresso perso poiché il file è stato eliminato - Sei sicuro\? + Pulire la cronologia dei download o eliminare tutti i file scaricati\? Sarà avviato un solo dowload per volta Avvia downloads Metti in pausa i downloads @@ -519,10 +519,10 @@ Contenuti in Evidenza Predefiniti Durata Avanzamento e Riavvolgimento Rapidi Istanze PeerTube - Imposta le tue istanze PeerTube preferite - Trova le istanze più adatte a te su https://joinpeertube.org/instances#instances-list + Seleziona le istanze PeerTube preferite + Trova le istanze più adatte a te su %s Aggiungi Istanza - Inserisci URL Istanza + Inserisci URL istanza Impossibile convalidare l\'istanza Sono supportati solo gli URL HTTPS L\'istanza esiste già @@ -533,4 +533,14 @@ recupero Impossibile recuperare questo download Scegli un\'Istanza + Abilita Copertine sulla Schermata di Blocco + Durante la riproduzione in sottofondo, verrà mostrata la copertina del video sulla schermata di blocco + Svuota Cronologia Download + Elimina File Scaricati + %1$s download eliminati + Consentire la visualizzazione sopra altre applicazioni + Lingua Applicazione + Predefinita di Sistema + Premere \"Fatto\" quando risolto + Fatto \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 553a54f1e..adaaa3828 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -106,8 +106,8 @@ 画像を読み込みできません アプリ/UI がクラッシュしました 何:\\\\n提案:\\\\nコンテンツ言語:\\\\nサービス:\\\\nGMT 時間:\\\\nパッケージ:\\\\nバージョン:\\\\nOSバージョン: - reCAPTCHA - reCAPTCHA の要求 + reCAPTCHA + reCAPTCHA の要求 reCAPTCHA を要求しました ブラック すべて @@ -212,7 +212,7 @@ フィードページ チャンネルページ チャンネルを選択 - 購読しているチャンネルはありません + 登録しているチャンネルはありません Kioskを選択 Kiosk 人気 @@ -232,8 +232,8 @@ 一度だけ データベースをインポート データベースをエクスポート - 既存の履歴と購読リストは上書きされます - 履歴や購読リスト、プレイリストをエクスポートします + 既存の履歴と登録リストは上書きされます + 履歴や登録リスト、プレイリストをエクスポートします 再生エラーからの回復中 外部プレイヤーは、これらのタイプのリンクをサポートしていません 無効なURL @@ -254,7 +254,7 @@ コンテンツを読み込んでいます 動画ファイルをダウンロード 情報を表示 - ブックマーク + プレイリスト サムネイルを読み込む 画像キャッシュを消去しました キャッシュを消去 @@ -301,8 +301,8 @@ エクスポートしています… ファイルからインポート 前回のエクスポート先 - 購読リストがインポートできませんでした - 購読リストがエクスポートできませんでした + 登録リストがインポートできませんでした + 登録リストがエクスポートできませんでした 速度 音程 デフォルト @@ -330,7 +330,7 @@ すべての検索履歴を削除しますか? このファイル/コンテンツはありません - 登録者数 %s 人 + %s を登録しています 視聴なし @@ -339,7 +339,7 @@ 1 つのアイテムが削除されました。 支援する NewPipe プロジェクトはあなたのプライバシーを非常に大切にしています。あなたの同意がない限り、アプリはいかなるデータも収集しません。NewPipe のプライバシー・ポリシーでは、クラッシュリポート送信時にどのような種類のデータが送信・記録されるかを詳細に説明しています。 - NewPipe は著作権が自由のソフトウェアです。あなたは自由にそれを使用し、研究し、そして改善することができます。あなたは、GNU フリーソフトウェア財団が公開する GNU General Public ライセンス バージョン3以降の下に、自由に再配布・修正を行うことができます。 + NewPipe はコピーレフトなソフトウェアです。あなたは自由にそれを使用し、研究し、そして改善することができます。あなたは、GNU フリーソフトウェア財団が公開する GNU General Public ライセンス バージョン3以降の下に、自由に再配布・修正を行うことができます。 最終再生日時 最も再生した動画 ズーム @@ -360,10 +360,10 @@ 自動生成 プレーヤーのキャプションテキストの縮尺と背景スタイルを変更します。有効にするには、アプリの再起動が必要です。 何もありません - 保存したエクスポートファイルからYouTubeの購読をインポート: -\n -\n1. このURLを開きます: %1$s -\n2. ログインしていなければログインします + 保存したエクスポートファイルからYouTubeの登録をインポート: +\n +\n1. このURLを開きます: %1$s +\n2. ログインしていなければログインします \n3. ダウンロードが始まります (これがエクスポートファイルです) リセット 同意する @@ -393,7 +393,7 @@ 速度と音程を連動せずに変更 (歪むかもしれません) 無音の間に早送り 音程幅 - 購読解除 + 登録解除 新しいタブ タブを選択 アプリの更新 @@ -402,7 +402,7 @@ 外部記憶装置は利用できません 既定値に戻す 既定の設定を復元しますか\? - 登録者数は表示できません + 登録者数は利用できません 選択 会議 ヨーロッパの一般データ保護規制(GDPR)に準拠するために、NewPipeの個人情報保護方針にご注意ください。よく読んでください。 @@ -415,7 +415,7 @@ スイッチビュー NewPipeのアップデートがあります! タップでダウンロード - 終了しました + 完了 保留中 一時停止 順番待ちに追加しました @@ -480,7 +480,7 @@ ファイルの作業中に NewPipe が閉じられました デバイスに空き容量がありません ファイルが削除されたため、進行状況が失われました - よろしいですか\? + ダウンロード履歴、またはダウンロードしたファイルを消去しますか\? ダウンロード キューの制限 同時に1つのダウンロードが実行されます ダウンロードの開始 @@ -498,16 +498,42 @@ ダウンロードフォルダーを変更して有効にします サービスの切り替え、現在の選択: - 動画 + %s つの動画 デフォルトのキオスク 誰も見ていません - %s 見ています + %s 視聴中 誰も聞いていません %s リスナー アプリを再起動すると、言語が変更されます。 + 高速早送り/巻き戻し時間 + PeerTube インスタンス + PeerTube インスタンスを選択する + あなたに最適なインスタンスを探せます: %s + インスタンスを追加 + インスタンスの URL を入力 + インスタンスを検証することができませんでした + HTTPS な URL のみがサポートされています + インスタンスはすでに存在しています + ローカル + 最近追加された + 高評価 + 修復中 + ダウンロードが修復できません + インスタンスを選択 + ロック画面の動画サムネイルを有効にする + バックグラウンドプレイヤーを使用中、ロック画面に動画のサムネイルが表示されるようになります + ダウンロード履歴を消去 + ダウンロードしたファイルを消去 + %1$s 個削除しました + 自動生成 (アップローダーが見つかりません) + 他のアプリの上に表示する権限を与えてください + アプリの言語 + システムの既定 + 解けたら \"完了\" を押してください + 完了 \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index e8a2a9c51..54437a375 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -180,7 +180,7 @@ 다운로드 할 폴더를 설정에서 지정하세요 이 권한은 팝업 모드에서 \n열기 위해 필요합니다 - reCAPTCHA + reCAPTCHA reCAPTCHA 확인 요청됨 다운로드 파일명에 허용되는 문자 @@ -274,7 +274,7 @@ 모두 삭제하기 취소 이름 바꾸기 - reCAPTCHA 확인 + reCAPTCHA 확인 이 항목을 시청 기록에서 삭제하시겠습니까? 모든 항목을 시청 기록에서 삭제하시겠습니까? 마지막으로 재생 @@ -482,7 +482,7 @@ 남은 저장공간이 없습니다 파일이 삭제되어 진행이 중지되었습니다 연결시간 초과 - 확실합니까\? + 모든 다운로드 기록과 파일을 삭제합니다.확실합니까\? 다운로드 대기 제한 다운로드 시작 다운로드 일시정지 @@ -497,10 +497,40 @@ 매 다운로드 마다 저장경로를 묻습니다. \n외장 SD카드에 다운로드 하고자 한다면 SAF를 선택하십시오 - %s개의 동영상 + 동영상 하나의 다운로드가 동시에 진행됩니다 적용하려면 다운로드 폴더를 변경하세요 서비스 토글, 현재 선택된 서비스: 기본 키오스크 + 시청자가 없습니다. + + %s 시청 + + 듣고 있는 사람이 없습니다. + + %s 듣는사람 + + 앱을 재시작하면 언어가 변경됩니다. + 빠른-감기/되감기 찾는 시간 + 피어튜브 인스턴스 + 당신이 선호하는 피어튜브 인스턴스를 선택하세요. + %s에서 당신에게 가장 잘 어울리는 인스턴스를 찾으세요. + 인스턴스 추가하기 + 인스턴스 URL을 입력하세요. + 인스턴스를 검증할 수 없습니다. + 오직 HTTPS URL들만 지원합니다. + 인스턴스가 이미 존재합니다. + 로컬 + 최근에 추가됨. + 가장 선호하는 + 자동생성된(업로더를 찾지못함) + 복구하기 + 이 다운로드를 복구할 수 없습니다 + 인스턴스를 선택하세요 + 비디어 썸네일 화면 고정을 가능하게 한다 + 백그라운드 플레이어를 사용하는 경우 비디오 썸네일은 고정된 스크린 위에 표시됩니다. + 다운로드 기록 삭제 + 다운로드된 파일 삭제 + %1$s 다운로드 삭제 \ No newline at end of file diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 938175f71..20ce04100 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -3,20 +3,20 @@ گرته‌ له‌ گه‌ڕان بكه‌ بۆ ده‌ستپێكردن %1$s بینراو بڵاوكراوه‌ته‌وه‌ له‌ %1$s - هیچ كارپێكه‌رێكی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC داگریت؟ - هیچ کارپێکەرێکی ڤیدیۆ نەدۆزرایەوە (دەتوانی کارپێکەری VLC دامەزرێنی) . + هیچ كارپێكه‌رێكی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟ + هیچ کارپێکەرێکی ڤیدیۆیی نەدۆزرایەوە (دەتوانی کارپێکەری VLC دامەزرێنی) . دامەزراندن پاشگه‌زبوونه‌وه‌ كردنه‌وه‌ له‌ وێبگه‌ر كردنه‌وه‌ له‌ په‌نجه‌ره‌ی بچووک هاوبه‌شپێكردن داگرتن - داگرتنی فایلی پەخش + داگرتنی پەڕگەی پەخش گه‌ڕان ڕێكخستنه‌كان مەبەستت ئەمەیە: \n%1$s\? - "هاوبه‌شپێكردن له‌گه‌ڵ " + هاوبه‌شپێكردن له‌گه‌ڵ هه‌ڵبژاردنی وێبگه‌ر لاربوونەوە به‌كارهێنانی كارپێكه‌ری ڤیدیۆی ده‌ره‌كی @@ -31,7 +31,7 @@ پیشاندانی زانیاری سه‌ره‌كی به‌شدارییه‌كان - لیستی کارپێکردنەکان نیشانەکران + خشتەی کارپێکردنەکان نیشانەکران چی نوێ هه‌یه‌ لە پاشبنەما په‌نجه‌ره‌ی بچووک @@ -215,8 +215,8 @@ تکایە فۆڵدەرێک بۆ شوێنی داگرتن دیاریبکە لە ڕێکخستنەکان ئەم دەسەڵاتە پێویستە بۆ \nکردنەوەی پەنجەرەی بچووک - reCAPTCHA - reCAPTCHA داواکاری + reCAPTCHA + reCAPTCHA داواکاری reCAPTCHA داواکراوە داگرتن پیت و ژمارەکان @@ -497,8 +497,8 @@ کیۆسکی بنەڕەتی خێرا بردنە پێشەوە\\ گێڕانەوە بۆکاتی سەرەتا دۆخی PeerTube - ئارەزوومەندییەکانی دۆخی PeerTube ڕێکبخە - ئەو دۆخانە بدۆزەرەوە کە لەگەڵ خۆتدا دەگونجێن لە https://joinpeertube.org/instances#instances-list + ئارەزوومەندییەکانی دۆخی پێرتوبی ڕێکبخە + ئەو دۆخانە بدۆزەرەوە کە لەگەڵ خۆتدا دەگونجێن لە %s زیادکردنی دۆخ بەستەری دۆخ دابنێ ناتوانرێ پشتگیری دۆخەکە بکرێ @@ -517,7 +517,7 @@ بیرگەی ناوەکیت پڕبووە کردارەکە شکستی هێنا, چونکە ئەو فایلە سڕاوەتەوە هێڵی ئینتەرنێت نەما - ئایا دڵنیای؟ + ئایا دەتەوێ مێژووی داگرتنەکانت بسڕدرێنەوە یان هەموو فایلە داگیراوەکان بسڕدرێنەوە؟ سنوری ڕیزبوونی داگرتنەکان تەنها یەک داگرتن کاردەکات لەیەک کاتدا دەستپێکردنەوەی داگرتنەکان @@ -536,4 +536,14 @@ دەگەڕێنرێتەوە ناتوانرێ ئەم داگرتنە بهێنرێتەوە دۆخێک هەڵبژێرە + چالاککردنی وێنۆچکەی ڤیدیۆی داخستنی ڕوونما + کاتێ کارپێکەری پاشبنەما کاردەکات ئەوا وێنۆچکەی ڤیدیۆکە لە ڕوونما داخراوەکەدا نیشاندەدرێت + سڕینەوەی مێژووی داگرتن + سڕینەوەی فایلە داگیراوەکان + %1$ لە داگرتنەکان سڕانەوە + دەسەڵاتی پێبدە بۆ پیشاندان لەسەرووی ئەپەکانیترەوە + زمانی ئەپ + بنەڕەتی سیستەم + گرتە بکە لەسەر ”تەواو” کاتێ کە چارەسەرکرا + تەواو \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 43fe9d862..f84a3c23c 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -153,8 +153,8 @@ Prašome pasirinkti galimą atsisiuntimų aplankalą Šis leidimas nereikalingas, kad atidarytiviššokančio lango rėžime - reCAPTCHA - reCAPTCHA iššūkis + reCAPTCHA + reCAPTCHA iššūkis reCAPTCHA prašomas iššūkis Prenumeruoti diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index c9388a78a..96b4c8819 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -230,8 +230,8 @@ Одберете достапна локација за превземања Оваа привилегија е потребна за \nотворање во подпрозорче - „reCAPTCHA“ - reCAPTCHA Предизвик + „reCAPTCHA“ + reCAPTCHA Предизвик Потребен е reCAPTCHA предизвик Превземања Дозволени знаци во имињата на датотеките diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 354e7b7de..d8d291759 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -1,5 +1,6 @@ -Tekan carian untuk bermula + + Tekan carian untuk bermula %1$s tontonan Diterbitkan pada %1$s Tiada pemain strim ditemui. Adakah anda mahu memasang VLC\? @@ -27,7 +28,6 @@ Tidak dapat menukar langganan Tidak dapat mengemaskini langganan Papar maklumat - Utama Langganan Penanda halaman Senarai main @@ -38,12 +38,12 @@ Latar Belakang Popup Tambahkan Ke - Lokasi muat turun video - Lokasi untuk menyimpan video yang dimuat turun - Memasukkan lokasi muat turun video + Folder muat turun video + Fail video yang dimuat turun disimpan di sini + Pilih folder muat turun untuk fail video Lokasi muat turun audio - Audio yang dimuat turun disimpan sini - Memasukkan lokasi muat turun fail audio + Fail audio yang dimuat turun disimpan di sini + Pilih folder muat turun untuk fail audio Main secara automatik Memain video apabila NewPipe dipanggil dari app lain Resolusi utama @@ -224,13 +224,13 @@ B Tiada pelanggan - %s pelanggan - + %s pelanggan + Kira pelanggan tidak tersedia Tiada tontonan - %s tontonan - + %s tontonan + Tiada video Mula Jeda @@ -258,8 +258,8 @@ Kebenaran ini diperlukan untuk \nbuka dalam mod popup 1 item dipadamkan. - reCAPTCHA - Cabaran reCAPTCHA + reCAPTCHA + Cabaran reCAPTCHA Meminta kod reCAPTCHA Muat turun Karakter yang dibenarkan dalam nama fail @@ -459,4 +459,6 @@ Jeda semasa beralih ke data mudah alih Muat turun yang tidak dapat dihentikan akan dimulakan semula Menunggu + Ubah folder muat turun untuk melihat kesan + Dayakan lakaran kecil video skrin kunci \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d874e9b0e..9757df2ad 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -106,8 +106,8 @@ Nytt mål Feilaktig nettadresse eller manglende internettilknytning Definer en nedlastingsmappe senere i innstillingene - reCAPTCHA - reCAPTCHA-oppgave + reCAPTCHA + reCAPTCHA-oppgave Åpne i oppsprettsmodus NewPipe oppsprettsmodus Forvalgt oppsprettsoppløsning @@ -516,4 +516,30 @@ Språk vil ikke bli endret før programmet startes på ny. Forvalgt kiosk + PeerTube-instanser + Lokal + Nylig lagt til + Mest likt + Velg en instans + Tøm nedlastingshistorikk + Slett nedlastede filer + Slettet %1$s nedlastninger + Aktiver videominiatyrbilde på låseskjerm + Når du bruker bakgrunnsspilleren, vises ent videominiatyrbilde på låseskjermen + Velg dine favoritter blandt PeerTube-instansene + Finn instansene som passer deg best på %s + Legg til instans + Skriv inn nettadresse til instans + Kunne ikke bekrefte instans + Kun HTTPS-nettadresser støttes + Instansen finnes allerede + Autogenerert (fant ingen opplaster) + gjenoppretter + Kan ikke gjenopprette denne nedlastingen + Hurtigframoverspoling/-tilbakeblafringsvarighet + Gi tilgang til visning over andre programmer + Programspråk + Systemforvalg + Trykk \"Ferdig\" når den er løst + Ferdig \ No newline at end of file diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 198979def..de96152ec 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -230,8 +230,8 @@ Gekopieerd naar klembord Kies een beschikbare downloadmap Deze toestemming is vereist voor te openen in pop-upmodus - reCAPTCHA - reCAPTCHA-uitdaging + reCAPTCHA + reCAPTCHA-uitdaging reCAPTCHA-uitdaging gevraagd Download Toegelaten tekens in bestandsnamen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 9ecc936eb..1cd1391a0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -107,8 +107,8 @@ Gekopieerd naar klembord Kies een beschikbare downloadmap Zwart - reCAPTCHA - reCAPTCHA-uitdaging + reCAPTCHA + reCAPTCHA-uitdaging reCAPTCHA-uitdaging gevraagd Openen in pop-upmodus Alles diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 0e5b7ccd6..e69e43b44 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -1,2 +1,76 @@ - - + + + %1$s vistas + Publicat lo %1$s + Cap de legidor de flus trobat. Volètz installar VLC\? + Cap de legidor de flus trobat (podètz installar VLC per lo legir). + Installar + Anullar + Dobrir dins lo navegador + Dobrir en mòde fenestron + Partejar + Telecargar + Telecargar lo fichièr de flus + Recercar + Paramètres + Voliatz dire: %1$s\? + Partejar amb + Causir un navegador + rotacion + Utilizar un legidor de vidèo extèrne + Mòde fenestron de NewPipe + S\'abonar + Abonat + Anullar abonament + Impossible de cambiar l\'abonament + Impossible d\'actualizar l\'abonament + Afichar las informacions + Principal + Abonaments + Clicatz sul boton de recèrca per començar + Lèva l\'àudio per CÈRTAS resolucions + Utilizar lo legidor àudio extèrne + Abonament a la cadena anullat + Listas de lectura enregistradas + Onglet novèl + Causir un onglet + Çò novèl + Rèireplan + Fenestron + Apondre a + Dorsièr de telecargament de vidèos + Los fichièrs vidèo telecargats son aquí + Causissètz lo dorsièr de telecargament de las vidèos + Dorsièr de telecargament dels àudios + Los fichièrs àudio telecargats son estremats aicí + Causissètz lo dorsièr de telecargament pels àudios + Cambiatz los dorsièrs de telecargament per venga efectiu + Lectura automatica + Legís una vidèo quand NewPIpe es apelat dempuèi una autra aplicacion + Resolucion per defaut + Resolucion per defaut dels fenestrons + Afichar de resolucions mai nautas + Totes los dispositius pòdon pas legir de vidèos 2K/4K + Jogar amb Kodi + Trobam pas l\'aplicacion Kore. La volètz installar\? + Afichar l\'opcion \"Legir amb Kodi\" + Activar la vidèo miniatura sus l\'ecran de blocatge + Afichar una opcion per legir una vidèo dempuèi Kodi + En utilizant lo legidor de rèireplan, una vidèo miniatura s\'aficharà sus l\'ecran de blocatge + Àudio + Format àudio per defaut + Format vidèo per defaut + Tèma + Clar + Escur + Negre + Se remembrar la talha e la posicion del fenestron + Se remembrar las darrièras talha e posicion del fenestron + Utilzar la recèrca rapida inexacta + La recèrca inexacta permet a l\'utilizaire de recercar mai rapidament una posicion amb mens de precision + Durada d\'avançada/reculada rapida + Cargar las miniaturas + Afichar los comentaris + Desactivar per afichar pas mai los comentaris + Apondre la vidèo seguenta dins la coa de lectura + \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 0e579720a..7e39321e0 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -237,8 +237,8 @@ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ ਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ 1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ. - ReCaptcha - ReCaptcha ਚੁਣੌਤੀ + ReCaptcha + ReCaptcha ਚੁਣੌਤੀ ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ ਡਾਊਨਲੋਡ ਫਾਈਲ ਨਾਮ ਵਿੱਚ ਪ੍ਰਵਾਨਿਤ ਅੱਖਰ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 75ce1029d..53de33521 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -106,8 +106,8 @@ Awaria aplikacji/interfejsu (Eksperymentalne) Wymuś pobieranie przez Tora w celu zwiększenia prywatności (strumieniowe wideo nie jest jeszcze obsługiwane). Start - CAPTCHA - Wyzwanie reCAPTCHA + CAPTCHA + Wyzwanie reCAPTCHA Wymagane wyzwanie dotyczące reCAPTCHA Usuwa dźwięk w niektórych rozdzielczościach Tło @@ -491,7 +491,7 @@ NewPipe został zamknięty podczas pracy nad plikiem Brak miejsca na urządzeniu Postęp został utracony ze wzgledu na usunięcie pliku - Czy jesteś pewien\? + Czy chcesz wyczyścić historię pobierania lub usunąć wszystkie pobrane pliki\? Ogranicz kolejkę pobierania Tylko jedno pobieranie będzie realizowane jednocześnie Rozpocznij pobieranie @@ -525,12 +525,12 @@ Język zmieni się po ponownym uruchomieniu aplikacji. Krok czasu przewijania Wystąpienia PeerTube - Ustaw swoje ulubione instancje peertube - Znajdź instancje, które najbardziej Ci odpowiadają, na https://joinpeertube.org/instances#instances-list + Wybierz swoje ulubione instancje PeerTube + Znajdź wystąpienia, które najbardziej Ci odpowiadają na %s Dodaj instancję Wprowadź adres URL instancji - Nie udało się sprawdzić poprawności instancji - Obsługiwane są tylko adresy URL https + Nie można sprawdzić poprawności instancji + Obsługiwane są tylko adresy URL HTTPS Instancja już istnieje Lokalny Ostatnio dodane @@ -539,4 +539,14 @@ odzyskiwanie Nie można odzyskać tego pobrania Wybierz instancję + Włącz miniaturę wideo na ekranie blokady + Podczas korzystania z odtwarzacza w tle na ekranie blokady zostanie wyświetlona miniatura filmu + Wyczyść historię pobierania + Usuń pobrane pliki + Usunięte %1$s pobrania + Zezwól na wyświetlanie w innych aplikacjach + Język aplikacji + Domyślny systemu + Po rozwiązaniu naciśnij „Gotowe” + Gotowe \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9aeb53b3b..04f73b7e4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -23,7 +23,7 @@ Noite Formato de áudio padrão Resolução padrão - Excluir + Apagar Não curtidas Curtidas Baixar @@ -50,8 +50,8 @@ Próximo Abrir no navegador Pausar - reCAPTCHA - Desafio reCAPTCHA + reCAPTCHA + Desafio reCAPTCHA Desafio reCAPTCHA solicitado Reportar um erro Tentar novamente @@ -134,7 +134,7 @@ abrir em modo popup Popup Segundo plano Lembrar tamanho e posição do popup - Lembrar do último tamanho e posição definido para o popup + Lembra da última posição e o tamanho usado no popup Popup Redimensionando Remove o áudio em ALGUMAS resoluções @@ -256,7 +256,7 @@ abrir em modo popup Sempre Uma vez Alterar orientação - Alterar para segundo plano + Trocar para segundo plano Trocar para popup Trocar para principal Players externos não suportam estes tipos de links @@ -271,7 +271,7 @@ abrir em modo popup Importar base de dados Exportar base de dados Sobrescreve seus dados como históricos e inscrições - Exportar históricos, inscrições e playlists + Exporta históricos, inscrições e playlists Exportado Importado Não há nenhum arquivo ZIP válido @@ -318,7 +318,7 @@ abrir em modo popup Usar pesquisa rápida A pesquisa rápida permite que o player procure resultados mais rapidamente porém com precisão reduzida Adicionar o próximo vídeo à fila automaticamente - Adicionar automaticamente um vídeo relacionado ao último da lista quando a repetição estiver desativada + Adiciona automaticamente um vídeo relacionado ao último da lista quando a repetição estiver desativada Arquivo Pasta não encontrada Origem do arquivo/conteúdo não encontrada @@ -361,7 +361,7 @@ abrir em modo popup Carregar capas Cache de imagens limpo Limpar metadados em cache - Exclui todos os dados de páginas em cache + Apaga todos os dados de páginas em cache Cache de metadados limpo Controles de velocidade de reprodução "Tempo " @@ -377,7 +377,7 @@ abrir em modo popup Altere o tamanho da legenda e o estilo da tela de fundo. É necessário reiniciar o aplicativo para ter efeito. Nenhum player instalado para reproduzir este arquivo Limpar histórico de assistidos - Apaga o histórico de vídeos assistidos e a lista de reprodução + Apaga o histórico de vídeos assistidos e a posição nas reproduções Apagar todo o histórico de assistidos\? Histórico de assistidos limpo. Limpar histórico de pesquisas @@ -485,9 +485,9 @@ abrir em modo popup Retomar a reprodução Retorna para a última posição em reprodução Posições em listas - Mostrar indicadores de posição em listas + Mostra indicadores de posição em listas Limpar dados - Posições de reprodução apagadas. + Posição nas reproduções apagadas. Arquivo movido ou excluído Já existe um arquivo com este nome Não foi possível sobrescrever o arquivo @@ -496,7 +496,7 @@ abrir em modo popup Não há espaço disponível no dispositivo Progresso perdido devido ao arquivo ter sido apagado Tempo limite de conexão - Tem certeza\? + Apagar todo o histórico de downloads ou excluir todos os arquivos baixados\? Limitar tamanho da fila de download Um download será executado ao mesmo tempo Iniciar downloads @@ -508,9 +508,9 @@ abrir em modo popup Usar SAF A Estrutura de Acesso ao Armazenamento permite baixar para um cartão SD. \nAviso: alguns dispositivos não são compatíveis - Apagar lista de reprodução - Deletar todo o histórico de reprodução - Deletar todo o histórico de reprodução\? + Limpar posição nas reproduções + Apaga o histórico de posição nas reproduções + Apagar toda posição nas reproduções\? Mude as pastas de download para surtir efeito Alterar serviço, selecionados: Quiosque Padrão @@ -527,4 +527,28 @@ abrir em modo popup O idioma será atualizado assim que o aplicativo for reiniciado. Duração do avançar/retroceder rápido Instâncias PeerTube + Selecione instâncias PeerTube favoritas + Encontre instâncias PeerTube em %s + Adicionar instância + Insira o link aqui + Não foi possível acessá-la + Apenas HTTPS são suportados + Instância já existe + Local + Recentes + Em alta + Gerado automaticamente (sem criador) + recuperando + Não foi possível recuperar o download + Escolha uma instância + Ativar capa do vídeo na tela de bloqueio + Mostra capa do vídeo na tela de bloqueio ao usar player em segundo plano + Limpar histórico de downloads + Excluir arquivos baixados + %1$s arquivos excluídos + Permita sobreposição a outros aplicativos + Idioma do aplicativo + Padrão do sistema + Toque em \"Feito\" ao resolver + Feito \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 4bf692801..c06a1909d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -23,7 +23,7 @@ Reproduzir no Kodi Aplicação Kore não encontrada. Instalar? Mostrar opção \"Reproduzir no Kodi\" - Exibe uma opção para reproduzir o vídeo no Kodi + Exibir uma opção para reproduzir o vídeo via Kodi media center Áudio Formato de áudio predefinido Transferir @@ -109,7 +109,7 @@ Abrir no modo de janela autónoma Preto Tudo - Canais + Canal Sim Depois k @@ -117,8 +117,8 @@ B Esta permissão é necessária \npara o modo de janela - reCAPTCHA - Desafio reCAPTCHA + reCAPTCHA + Desafio reCAPTCHA Desafio reCAPTCHA solicitado Modo de janela autónoma do NewPipe Reproduzir no modo de janela autónoma @@ -152,7 +152,7 @@ Sobre Colaboradores Licenças - Aplicação de reprodução de emissões livre para Android. + Aplicação livre de reprodução de emissões para Android. Ver no GitHub Licença do NewPipe Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! @@ -217,7 +217,7 @@ A recuperar de um erro do reprodutor Conteúdo da página principal Página vazia - Página de subscrições + Subscrições Página do canal Selecione um canal Não existem canais subscritos @@ -225,7 +225,7 @@ Kiosk Tendências Top 50 - Novo e popular + Tendências Reprodutor em segundo plano Reprodutor \'popup\' Remover @@ -266,7 +266,7 @@ Carregar miniaturas Desative para parar o carregamento das miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagem do disco e da memória. Cache de imagens limpa - País do conteúdo predefinido + País predefinido dos conteúdos Depuração Não foram encontradas emissões de vídeo Não foram encontradas emissões de áudio @@ -279,7 +279,7 @@ Rejeitar Site Visite ao site NewPipe para obter mais informação e novidades. - Página \"kiosk\" + Página de Quiosque Página de \"Feed\" Exportados Importados @@ -372,8 +372,8 @@ Colocar em fila em segundo plano Colocar em fila num nova janela Ação de \'abrir\' preferida - Ação predefinida para abrir o conteúdo — %s - Definir como miniatura da lista de reprodução + Ação predefinida ao abrir o conteúdo — %s + Definir como Miniatura da Lista de Reprodução Não foi possível eliminar a lista de reprodução. Ajustar Preencher @@ -487,7 +487,7 @@ Não há espaço disponível no dispositivo Progresso perdido, porque o ficheiro foi eliminado Tempo limite de conexão - Tem a certeza\? + Quer limpar o seu histórico de descarregamentos ou apagar todos os ficheiros descarregados\? Limitar a fila de transferências Uma transferências será executada ao mesmo tempo Iniciar transferências @@ -518,12 +518,12 @@ O idioma mudará quando a app for reiniciada. Duração da busca de avanço/retrocesso rápido Instâncias do PeerTube - Defina as suas instâncias favoritas de peertube - Encontre as instâncias que lhe melhor convêm em https://joinpeertube.org/instances#instances-list + Defina as suas instâncias favoritas de PeerTube + Encontre as instâncias que lhe melhor convêm em %s Adicionar instância Digite o URL da instância Falha ao validar a instância - Somente URLs HTTPS são suportadas + Somente URLs HTTPS são suportada A instância já existe Local Recentemente adicionado @@ -532,4 +532,14 @@ recuperando Não é possível recuperar este descarregamento Escolha uma instância + Ativar miniatura do vídeo no ecrã de bloqueio + Ao usar o reprodutor de fundo, uma miniatura de vídeo será exibida no ecrã de bloqueio + Limpar histórico de descarregamentos + Apagar ficheiros descarregados + %1$s descarregamentos apagados + Permitir sobreposição da janela sobre outras aplicações + Idioma da aplicação + Predefinição do sistema + Pressionar \"Aceitar\" quando terminar + Aceitar \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 358de0ca8..e304e862d 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -106,8 +106,8 @@ Deschide in modul popup Aceasta permisiune este necesara pentru a deschide în mod pop-up - ReCAPTCHA - Provocare reCAPTCHA + ReCAPTCHA + Provocare reCAPTCHA reCAPTCHA nouă cerută NewPipe mod pop-up "Rezoluție pop-up inițială " diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5230f00a2..f21e0e074 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -124,7 +124,7 @@ Что:\\nЗапрос:\\nЯзык контента:\\nСервис:\\nВремя по Гринвичу:\\nПакет:\\nВерсия:\\nВерсия ОС: Это разрешение нужно для \nвоспроизведения в окне - reCAPTCHA + reCAPTCHA Открыть во всплывающем окне Предлагать варианты при поиске Позже @@ -138,7 +138,7 @@ Помнить последние размер и позицию всплывающего окна Поисковые предложения Лучшее разрешение - Запрос reCAPTCHA + Запрос reCAPTCHA Запрошен ввод reCAPTCHA Высокие разрешения NewPipe во всплывающем окне @@ -313,7 +313,7 @@ Текущие данные будут заменены Скоро здесь кое-что появится ;D Всегда спрашивать - Создать плейлист + Новый плейлист Удалить Переименовать Имя @@ -330,7 +330,7 @@ Подогнать Заполнить Приблизить - Созданы автоматически + Создано автоматически Включить LeakCanary Мониторинг утечки памяти может привести к зависанию приложения Сообщать об ошибках жизненного цикла @@ -492,7 +492,7 @@ NewPipe была закрыта во время работы над файлом Закончилось свободное место на устройстве Прогресс потерян, так как файл был удалён - Вы уверены\? + Действительно удалить историю загрузок и загруженные файлы\? Ограничить очередь загрузки Только одна одновременная загрузка Начать загрузку @@ -522,20 +522,30 @@ %s слушателей Язык будет изменён после перезапуска - Перемотка двойным нажатием + Шаг перемотки Серверы PeerTube - Настройте предпочтительные серверы PeerTube - Выберите подходящие серверы на https://joinpeertube.org/instances#instances-list + Выберите предпочтительные серверы + Каталог серверов: %s Новый сервер URL сервера Не удалось проверить сервер - Поддерживается только https + Поддерживается только HTTPS Сервер уже существует Локальное Новое Популярное - Создан автоматически (автор не найден) + Создано автоматически (автор не найден) восстановление Не удалось восстановить загрузку Выберите сервер + Миниатюра на экране блокировки + Показать миниатюру видео на экране блокировки при воспроизведении в фоне + Очистить историю загрузок + Удаление загруженных файлов + Удалено загрузок: %1$s + Разрешите отображение поверх приложений + Язык интерфейса + Как в системе + По завершении нажмите Готово + Готово \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6624f7a3b..a6a20a48f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -17,11 +17,11 @@ Použiť externý prehrávač videa Použiť externý prehrávač zvuku Prevzaté video ukladať do - Cesta kam sa budú ukladať prevzaté videá - Vložte cestu kam sa budú ukladať videá - Prevzaté audio ukladať do + Tu sú uložené stiahnuté video súbory + Vyberte adresár pre ukladanie video súborov + Adresár pre stiahnuté audio Vložte cestu kam sa budú ukladať zvukové súbory - Cesta kam sa bude ukladať prevzaté audio + Tu sú uložené stiahnuté audio súbory Štandardné rozlíšenie Prehrať cez Kodi Aplikácia Kore nie je nainštalovaná. Chcete ju nainštalovať? @@ -49,7 +49,7 @@ Nemožno analyzovať webovú stránku Obsah nie je dostupný Náhľad videa - Náhľad videa + Prehrať video, dĺžka: Náhľad avataru uploadera Lajky Dislajky @@ -66,7 +66,7 @@ NAŽIVO Nemožno kompletne zanalyzovať web Nemožno nastaviť menu preberania - Toto je ŽIVÉ VYSIELANIE, ktoré ešte nie je podporované. + Živé vysielanie zatiaľ nie je podporované Nemožno získať žiadny stream Pardon, toto sa nemalo stať. Nahlásiť chybu mejlom @@ -99,19 +99,19 @@ Dotykom zobraziť detaily Čakajte prosím… Skopírované do schránky - Vyberte si dostupný adresár na preberanie + Priečinok na sťahovanie zadefinujte prosím neskôr v nastaveniach Prevzaté Prevzaté Hlásenie o chybe Nemožno načítať obrázok Aplikácia/UP zlyhalo Čo:\\nPožiadavka:\\nJazyk obsahu:\\nSlužba:\\nČas v GMT:\\nBalík:\\nVerzia:\\nVerzia OS: - reCAPTCHA - Výzva reCAPTCHA + reCAPTCHA + Výzva reCAPTCHA Čierna Všetko Kanál - K + k M B Požiadavka reCAPTCHA @@ -183,7 +183,7 @@ História Vyhľadávané Pozreté - História je zakázaná + História je vypnutá História História je prázdna História bola vyčistená @@ -213,7 +213,7 @@ %s videí Položka bola odstránená - Nebol nájdený žiadny prehrávač pre stream (môžete si nainštalovať napr. VLC) + Nebol nájdený žiadny prehrávač pre stream (môžete si nainštalovať napr. VLC). Stiahnuť súbor stream Zobraziť info Uložené zoznamy @@ -266,7 +266,7 @@ Novinky Kanál Vyberte si kanál - Žiadny kanál nie je odoberaný + Zatiaľ nemáte žiadne odbery kanálov Vyberte si kiosk Export je dokončený Import je dokončený @@ -285,9 +285,9 @@ Podržaním pridať do zoznamu Zaradiť na pozadie Zaradiť do mini okna - Video odtiaľto - Zvuk odtiaľto - Mini okno odtiaľto + Prehrať odtiaľto + Prehrať (zvuk) odtiaľto na pozadí + Prehrať odtiaľto v mini-okne Otvoriť zásuvku Zavrieť zásuvku Prehrávač videa @@ -296,7 +296,7 @@ Vždy sa opýtať Získavajú sa informácie… Načítanie požadované obsahu - Vytvoriť nový zoznam skladieb + Nový zoznam skladieb Vymazať Premenovať Názov @@ -304,11 +304,11 @@ Nastaviť ako miniatúru zoznamu skladieb Záložka zoznamu skladieb Odstrániť Záložku - Chcete odstrániť tento zoznam skladieb? + Odstrániť tento zoznam skladieb\? Zoznam skladieb vytvorený - Pridané do zoznamu skladieb - Miniatúra zoznamu skladieb bola zmenená - Nemožno odstrániť zoznam skladieb + V playliste + Miniatúra zoznamu skladieb bola zmenená. + Zoznam skladieb nemožno zmazať. Bez titulkov Prispôsobiť Vyplniť @@ -316,7 +316,7 @@ Používať rýchly posun Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou Načítanie miniatúr - 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 + 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. Vyrovnávacia pamäť obrázkov vymazaná Vymazať metadáta uložené vo vyrovnávacej pamäti Odstrániť všetky údaje webových stránok vo vyrovnávacej pamäti @@ -337,12 +337,12 @@ Predvolená akcia pri otváraní obsahu — %s Automaticky vygenerované Titulky - Upravte mierku textu titulkov a štýly pozadia. Vyžaduje reštart prehrávača + Upravte mierku textu titulkov prehrávača a štýly pozadia. Vyžaduje sa reštart aplikácie. Povoliť službu LeakCanary Monitorovanie pretečenia pamäte môže spôsobiť, že aplikácia nebude reagovať Nahlásiť mimo-cyklické chyby Vynútiť hlásenie výnimiek nedoručiteľných Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení - Import/Export + Import/export Import \n Importovať z @@ -376,12 +376,12 @@ "Spomalenie (môže spôsobovať skreslenie)" Predvolené Vymazať históriu pozretí - Odstráni históriu prehrávaných streamov - Vymazať celú históriu pozretí. + Odstráni históriu a pozície prehrávaných streamov + Vymazať celú históriu pozretí\? História pozretí bola vymazaná. Vymazať históriu vyhľadávania Vymaže históriu vyhľadávania kľúčových slov - Vymazať celú históriu vyhľadávania. + Vymazať celú históriu vyhľadávania\? História vyhľadávaní bola vymazaná. 1 položka bola vymazaná. "NewPipe je slobodný softvér pod licenciou copyleft. Môžete ho používať, študovať a vylepšovať ako len chcete. Konkrétne ho môžete šíriť a/alebo upravovať pod podmienkami Všeobecnej verejnej licencie GNU, ako ju publikuje Free Software Foundation, buď verzia 3 licencie, alebo (podľa vašej voľby) ktorákoľvek neskoršia verzia." @@ -420,7 +420,7 @@ Oznámenie o aktualizácii aplikácie Upozornenia na novú verziu NewPipe Externé úložisko je nedostupné - Sťahovanie na externú SD kartu ešte nie je možné. Obnoviť umiestnenie priečinka na prevzatie\? + Sťahovanie na externú SD kartu nie je možné. Obnoviť umiestnenie priečinka na sťahovanie\? Chyba pri načítavaní uložených kariet, použijú sa predvolené Obnoviť predvolené nastavenia Chcete obnoviť predvolené hodnoty\? @@ -454,8 +454,8 @@ Sťahovanie s týmto názvom už prebieha Zobraziť chybu Kód - Súbor sa nedá vytvoriť - Cieľový priečinok nie je možné vytvoriť + Adresár nemožno vytvoriť + Nemožno vytvoriť súbor Povolenie odmietnuté systémom Bezpečnostné pripojenie zlyhalo Server sa nepodarilo nájsť @@ -469,7 +469,7 @@ Maximum opakovaní Maximálny počet pokusov pred zrušením stiahnutia Pozastaviť pri prechode na mobilné dáta - Preberania, ktoré nie je možné pozastaviť, budú reštartované + Je to užitočné pri prechode na mobilné dáta, niektoré sťahovania však nemožno pozastaviť Zobraziť komentáre Vypnutím tejto funkcie sa nebudú zobrazovať komentáre Automatické prehrávanie @@ -494,7 +494,7 @@ Máš plnú pamäť Nemožno pokračovať, súbor bol vymazaný Spojenie vypršalo - Ste si istý\? + Chcete vymazať históriu sťahovania alebo odstrániť všetky stiahnuté súbory\? Limitovať počet položiek pri sťahovaní Súbory sa budú sťahovať jeden po druhom Spustite sťahovanie @@ -512,4 +512,41 @@ Zmeniť miesto pre stiahnuté súbory Prepnúť službu, práve vybraté: Predvolený kiosk + Toto nikto nesleduje + + %s sleduje + %s sledujú + %s sleduje + + Toto nikto nepočúva + + %s poslucháč + %s poslucháči + %s poslucháčov + + Zmena jazyka sa prejaví po reštarte aplikácie. + Dĺžka rýchleho pretáčania + Inštancie PeerTube + Vyberte si svoje obľúbené inštancie PeerTube + Nájdite najvyhovujúcejšie inštancie na %s + Pridať inštanciu + Vložiť URL inštancie + Nepodarilo sa overiť inštanciu + Podporované sú iba adresy URL s HTTPS + Inštancia už existuje + Miestne + Nedávno pridané + Najobľúbenejšie + Automaticky generované (používateľ sa nenašiel) + obnovovanie + Sťahovanie nemožno obnoviť + Vyberte inštanciu + Náhľad videa na uzamknutej obrazovke + Pri videu na pozadí sa na zamknutej obrazovke zobrazí náhľad + Vymazať históriu sťahovania + Vymazať stiahnuté súbory + %1$s odstránených + Súhlas pre zobrazenie cez ďalšie aplikácie + Jazyk aplikácie + Predvolený \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index a67b48a62..f318ca77e 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -124,8 +124,8 @@ Slike ni mogoče naložiti Program se je sesul! - reCAPTCHA - Izziv reCAPTCHA + reCAPTCHA + Izziv reCAPTCHA Zahteva izziva reCAPTCHA Predmet:\\nZahteva:\\nJezik vsebine:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS: diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index d5f031ad8..ee999d779 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -14,9 +14,9 @@ Подели помоћу Отвори помоћу ротација - Одредиште преузимања за видео - Путања за упис преузетих видеа - Унесите путању за преузимање видеа + Одредиште преузимања снимака + Преузети снимци се чувају овде + Изаберите фолдер за преузимање видео снимака Подразумевана резолуција Пусти помоћу Кодија Апликација Кор (Kore) није нађена. Инсталирати је? @@ -57,7 +57,6 @@ Не могу да дешифрујем потпис видео урл-а Не могу да рашчланим веб-сајт Садржај није доступан - Садржај Прикажи старосно-ограничени садржај Старосно-ограничени видео. Премошћавање је доступно у поставкама. @@ -82,7 +81,7 @@ уживо Тапните на претрагу за почетак Аутопуштање - Аутоматско пуштање видеа по позиву друге апликације + Пушта видео по позиву друге апликације Почни Паузирај Пусти @@ -107,8 +106,8 @@ Не могох да учитам слику Апликација/УИ је краховала Шта:\\nЗахтев:\\nЈезик садржаја:\\nУслуга:\\nГМТ време:\\nПакет:\\nИздање:\\nИздање ОС-а:\\nГлоб. ИП распон: - Стопка - reCAPTCHA стопка + Стопка + reCAPTCHA стопка Решите reCAPTCHA стопку Црна Сви @@ -179,7 +178,7 @@ Не могу да учитам лиценцу Одјављен са канала Не могу да изменим претплату - Не могу да ажурирам претплату + Није могуће ажурирати претплату Плејер Понашање Историјат diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 89d51493e..0848d9b7a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -186,8 +186,8 @@ Ange en hämtningsmapp senare i inställningar Denna tillåtelse behövs för att \nöppna i popup-läge - reCAPTCHA - reCAPTCHA utmaning + reCAPTCHA + reCAPTCHA utmaning reCAPTCHA utmaning begärd Nedladdning Tillåtna tecken i filnamn @@ -463,4 +463,9 @@ Återställ den senaste uppspelningspositionen Positioner i listor Ändra nedladdningsmapp för att träda i kraft + Spela automatiskt + Töm data + Snabb spola -framåt/-bakåt + Aktivera video på låsskärmen + När bakgrundsspelaren används så visas videon på låsskärmen \ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 0dee99ad0..41e683545 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -36,10 +36,10 @@ சேர் காணிலி தரவிறக்கப் பாதை தரவிறக்கப்பட்ட காணொலிகளின் சேமிப்புப் பாதை - காணொலியின் தரவிறக்கப் பாதையை உள்ளிடு + காணொலியின் தரவிறக்கப் பாதையை தேர்வு செய்க ஒலி பதிவிறக்க அடைவு தரவிறக்கப்பட்ட ஒலி இங்கே சேமிக்கப்பட்டுள்ளது - ஒலி கோப்புகளுக்கான தரவிறக்கப் பாதையை உள்ளிடு + ஒலி கோப்புகளுக்கான தரவிறக்கப் பாதையை தேர்வு செய்க தானே இயக்கு NewPipe மற்றொரு செயலியில் இருந்து அழைக்கப்படும் போது காணொலியை இயக்கும் முதல் பிரிதிறன் @@ -180,7 +180,7 @@ காணொளிகள் - + முதற்பக்கத்துக்கு மாற்று சரியில்லாத URL @@ -208,7 +208,7 @@ தானாக ஓட்டு கருத்துக்கள் - + திரையிடலை தொடங்கு பட்டியலில் இடங்கள் @@ -220,4 +220,7 @@ %s பார்க்கிறார் %s பார்க்கிறார்கள் + வேகமாக முன்னோக்கி / திரும்பத் தேடும் காலம் + பூட்டு திரை வீடியோ சிறுபடத்தை இயக்கவும் + பின்னணி பிளேயரைப் பயன்படுத்தும் போது பூட்டுத் திரையில் வீடியோ சிறுபடம் காண்பிக்கப்படும் \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 533c0d736..1dd9deff6 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -5,7 +5,7 @@ Yayınlanma: %1$s Akış oynatıcısı bulunamadı. VLC\'yi yüklemek ister misiniz\? Yükle - İptal et + Vazgeç Tarayıcıda aç Paylaş İndir @@ -23,14 +23,14 @@ Ses indirme dizini İndirilen ses dosyaları burada depolanır Ses dosyaları için indirme dizinini seçin - Otomatik oynat - NewPipe başka bir uygulamadan çağrıldığında bir video oynatır - Varsayılan çözünürlük + Kendiliğinden oynat + NewPipe başka uygulamadan çağrıldığında video oynatır + Öntanımlı çözünürlük Kodi ile oynat Kore uygulaması bulunamadı. Yüklensin mi\? \"Kodi ile oynat\" seçeneğini göster Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster - Varsayılan ses formatı + Öntanımlı ses biçimi Tema Koyu Açık @@ -38,7 +38,7 @@ Sonraki \'Sonraki\' ve \'Benzer\' videoları göster Desteklenmeyen URL - Varsayılan içerik dili + Öntanımlı içerik dili Ses Video ve ses Görünüm @@ -103,14 +103,14 @@ Panoya kopyalandı Lütfen daha sonra ayarlardan uygun bir indirme dizini belirleyin İndirme menüsü ayarlanamadı - Açılır pencere modunda aç - NewPipe açılır pencere modu - Varsayılan açılır pencere çözünürlüğü + Açılır pencere kipinde aç + NewPipe açılır pencere kipi + Öntanımlı açılır pencere çözünürlüğü Yüksek çözünürlükleri göster - Sadece bazı cihazlar 2K/4K video oynatmayı desteklemektedir - Varsayılan video formatı + Yalnızca bazı aygıtlar 2K/4K video oynatmayı desteklemektedir + Öntanımlı video biçimi Siyah - Açılır pencere modunda oynatılıyor + Açılır pencere kipinde oynatılıyor Tümü Kanal Evet @@ -122,10 +122,10 @@ b M B - Bu izin, açılır pencere modunda + Bu izin, açılır pencere kipinde \naçmak için gereklidir - reCAPTCHA - reCAPTCHA formu + reCAPTCHA + reCAPTCHA formu reCAPTCHA formu istendi Arka plan Açılır pencere @@ -245,7 +245,7 @@ Bağışta bulunun Web sitesi Daha çok bilgi ve haber için NewPipe web sitesini ziyaret edin. - Varsayılan içerik ülkesi + Öntanımlı içerik ülkesi Hizmet Yönlendirmeyi Değiştir Arka Plana Geç @@ -340,7 +340,7 @@ \n3. İndirme başlamalı (bu, dışa aktarma dosyasıdır) URL\'yi veya ID\'nizi yazarak SoundCloud profilini içe aktarın: \n -\n1. Web tarayıcısında \"masaüstü modu\" etkinleştirin (site, mobil aygıtlar için mevcut değildir) +\n1. Web tarayıcısında \"masaüstü kipi\" etkinleştirin (site, mobil aygıtlar için uygun değildir) \n2. Şu adrese gidin: %1$s \n3. Sorulduğunda giriş yapın \n4. Yönlendirildiğiniz profil URL\'sini kopyalayın. @@ -360,8 +360,8 @@ Ses yüksekliği Bağlantısız (bozulmaya neden olabilir) İndirilebilecek akış yok - Tercih edilen \'aç\' eylemi - İçerik açılırken varsayılan eylem — %s + Yeğlenen \'aç\' eylemi + İçerik açılırken öntanımlı eylem — %s Altyazılar Oynatıcı altyazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir. Bu dosyayı oynatmak için herhangi bir uygulama yüklü değil @@ -411,15 +411,15 @@ Yeni NewPipe sürümü için bildirimler Harici depolama kullanılamıyor Harici SD karta indirmek mümkün değil. İndirme dizini konumu sıfırlansın mı\? - Varsayılan sekmeleri kullanarak, kaydedilen sekmeleri okurken hata - Varsayılanları geri yükle - Varsayılanları geri yüklemek istiyor musunuz\? + Öntanımlı sekmeler kullanılıyor, kaydedilen sekmeler okunurken hata + Öntanımlıları geri yükle + Öntanımlıları geri yüklemek istiyor musunuz\? Abone sayısı mevcut değil Ana sayfada hangi sekmeler gösterilir Seçim Güncellemeler Yeni bir sürüm mevcut olduğunda uygulama güncellemesi için bir bildirim göster - Liste görünümü modu + Liste görünümü kipi Liste Izgara Otomatik @@ -430,7 +430,7 @@ durduruldu sırada son işlemler uygulanıyor - Kuyruk + Sıra İşlem sistem tarafından reddedildi İndirme başarısız İndirme bitti @@ -454,7 +454,7 @@ Tamamlanan indirmeleri temizle Durdur Azami deneme sayısı - İndirmeyi iptal etmeden önce maksimum deneme sayısı + İndirmeyi iptal etmeden önce azami deneme sayısı Kotalı bağlantılarda durdur Bazı indirmelerin bekletilememesine rağmen mobil veriye geçerken kullanışlıdır Olaylar @@ -484,28 +484,28 @@ Aygıt üzerinde yer yok İlerleme kaybedildi, çünkü dosya silinmiş Bağlantı zaman aşımı - Emin misiniz\? + İndirme geçmişinizi temizlemek veya indirilen tüm dosyaları silmek istiyor musunuz\? İndirme kuyruğunu sınırla Aynı anda yalnızca bir indirme yürütülecek İndirmeleri başlat İndirmeleri duraklat Nereye indirileceğini sor - Her indirme için nereye kaydedileceği sorulacak + Her indirmede nereye kaydedileceği sorulacak Her indirme için nereye kaydedileceği sorulacak. -\nEğer bir harici SD karta indirmek istiyorsanız DEÇ\'i seçin +\nEğer harici SD karta indirmek istiyorsanız DEÇ\'i seçin DEÇ\'i kullan Depolama Erişimi Çerçevesi harici SD karta indirmelere izin verir. -\nNot: Bazı cihazlar uyumlu değildir +\nNot: Bazı aygıtlar uyumlu değildir Oynatım konumlarını sil Tüm oynatım konumlarını siler Tüm oynatım konumları silinsin mi\? Etkili olması için indirme dizinlerini değiştirin Hizmeti değiştir, şu anda seçili olan: - Videolar - Videolar + %s video + %s video - Varsayılan Kiosk + Öntanımlı Kiosk Kimse izlemiyor %s izliyor @@ -519,12 +519,12 @@ Uygulama yeniden başlatıldıktan sonra dil değişecektir. Hızlı ileri/geri sarma süresi PeerTube örnekleri - Favori peertube örneklerinizi ayarlayın - https://joinpeertube.org/instances#instances-list adresinde size en uygun örnekleri bulun + Favori PeerTube örneklerinizi seçin + %s adresinde size en uygun örnekleri bulun Örnek ekle Örnek URL\'sini girin Örnek doğrulanamadı - Yalnızca https URL\'leri desteklenmektedir + Yalnızca HTTPS URL\'leri desteklenmektedir Örnek zaten var Yerel Son eklenen @@ -532,5 +532,15 @@ Otomatik oluşturulan (yükleyen bulunamadı) kurtarılıyor Bu indirme kurtarılamıyor - Bir örnek seçin + Oluşum seçin + Kilit ekranı video küçük resmini etkinleştir + Arka plan oynatıcıyı kullanırken kilit ekranında bir video küçük resmi görüntülenecektir + İndirme geçmişini temizle + İndirilen dosyaları sil + %1$s indirme silindi + Diğer uygulamaların üzerinde görüntüleme izni ver + Uygulama dili + Sistem öntanımlısı + Çözüldüğünde \"Bitti\" butonuna basın + Bitti \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6aea1ad79..a041a5496 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -184,7 +184,7 @@ Помилковий URL або немає доступу в Інтернет Цей дозвіл потрібен для перегляду \nу віконному режимі - reCAPTCHA + reCAPTCHA Завантаження Допустимі символи у іменах файлів Недопустимі символи замінити на цей @@ -233,9 +233,9 @@ %s підписників - Відео - Відео - Відео + %s відео + %s відео + %s відео Створити Видалити одне @@ -256,7 +256,7 @@ %s переглядів Нове завдання - Перевірка reCAPTCHA + Перевірка reCAPTCHA Запит на перевірку reCAPTCHA © %1$s, %2$s під %3$s Учасники @@ -491,7 +491,7 @@ На пристрої не залишилося вільного місця Прогрес втрачено через видалення файлу Час очікування з\'єднання вичерпано - Ви впевнені\? + Очистити історію завантажень, чи завантажені файли\? Обмежити чергу завантажень В кожен момент часу виконуватиметься одне завантаження Почати завантаження @@ -524,8 +524,24 @@ Мова зміниться після перезапуску програми. Швидке перемотування Не вдалося перевірити екземпляр - Оберіть ваш улюблений екземпляр peertube. - Знайдіть екземпляри, які найбільше підходять вам на https://joinpeertube.org/instance#instance-list + Оберіть сервер PeerTube + Знайти найбільш підходящий сервер можна на %s Додати екземпляр - Введіть посилання на екземпляр + Введіть посилання на сервер + Підтримуються лише HTTP посилання + Сервер уже додано + Недавно додані + Найбільш вподобані + відновлюється + Неможливо відновити це завантаження + Оберіть сервер + Прев\'ю на екрані блокування + При використанні фонового плеєра, прев\'ю відео буде показано на екрані блокування + Очистити історію завантажень + Видалити завантажені файли + Потрібен дозвіл показувати поверх інших додатків + Мова + Мова телефону + Натисніть \"Готово\" по закінченню + Готово \ No newline at end of file diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 089b793c8..627def4d3 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -1,210 +1,209 @@ شروع کرنے کے لیے تلاش پر ٹیپ کریں - ملاحظات - کوشائع ہوا + %1$s ملاحظات + %1$s کو شائع ہوا انسٹال منسوخ کریں - بانٹیں - ڈاؤن لوڈکریں + اشتراک کریں + ڈاؤن لوڈ تلاش کریں - کیا آپ کا مطلب تھا: %1$s \? - انٹرنیٹ میں کھولیں + کیا آپ کا مطلب یہ ہے: s$1%\? + براؤزر میں کھولیں ترتیبات - کوئیstream پلیئر نہیں ملا.کیا آپ VLC انسٹال کرنا چاہتے ہیں؟ - کوئیstream پلیئر نہیں ملا(آپ VLC انسٹال کر سکتے ہیے)۔ - PopUp موڈ میں کھولیں - سٹریم فائل ڈاؤن لوڈ کریں - کے ساتھ بانٹیں - Internet Browser منتخب کریں -\n - rotation کرو - external video player استعمال کریں - کچھ ریذولوشن پر آڈیو ہٹاتا ہے - بیرونی سوتی عامل ایپ استعمال کریں - NewPipe ابھاری اسلوب - سبسکرائیب کریں - سبسکرائیب کر لیا + کوئی اسٹریم پلیئر نہیں ملا۔ کیا آپ VLC انسٹال کرنا چاہتے ہیں؟ + کوئی اسٹریم پلیئر نہیں ملا (آپ VLC انسٹال کر سکتے ہیں)۔ + پاپ اپ وضع میں کھولیں + اسٹریم فائل ڈاؤن لوڈ کریں + کے ساتھ اشتراک کریں + براؤزر منتخب کریں + گھماؤ + خارجی ویڈیو پلئیر استعمال کریں + کچھ ریزولوشن پر آڈیو ہٹاتا ہے + خارجی آڈیو پلیر استعمال کریں + NewPipe پاپ اپ اسلوب + رکنیت اختیار کریں + رکنیت شدہ چینل کی رکنیت ختم کردی گئی - رکنیت کو تبدیل نہیں کیا جاسکا - سبسکرپشن کو اپ ڈیٹ نہیں کیا جاسکا + رکنیت کو تبدیل نہیں کیا جا سکا + رکنیت کی تازہ کاری نہیں ہو سکی معلومات دکھائیں - بنیادی - سبسکرپشنز - بُک مارک کردہ پلے لسٹس - نئ آمد + مرکزی + رکنیتیں + نشان زدہ پلے لسٹس + نیا کیا ہے پس منظر پوپ اپ شامل کریں ویڈیو ڈاؤن لوڈ فولڈر - ڈاؤن لوڈ کی ویڈیو فائلوں کو یہاں ذخیرہ کیا جاتا ہے + ڈاؤن لوڈ کی گئی ویڈیو فائلیں یہاں محفوظ ہیں ویڈیو فائلوں کے لئے ڈاؤن لوڈ فولڈر کا انتخاب کریں آڈیو ڈاؤن لوڈ فولڈر ڈاؤن لوڈ کی گئی آڈیو فائلیں یہاں محفوظ ہیں آڈیو فائلوں کے لئے ڈاؤن لوڈ فولڈر کا انتخاب کریں آٹوپلے - ایک ویڈیو ادا کرتا ہے جب نیو پائپ کسی دوسرے ایپ سے بلایا جاتا ہے - طے شدہ جزیات - طے شدہ پوپ جزیات - اعلی قراردادیں دکھائیں - صرف کچھ آلات 2K / 4K ویڈیوز کھیلنے میں معاون ہیں + جب دوسرے ایپ سے نیو پائپ کال کی جاتی ہے تو ویڈیو چلاتا ہے + طے شدہ ریزولوشن + طے شدہ پوپ اپ ریزولوشن + اعلیٰ معیارات دکھائیں + صرف کچھ آلات 2K / 4K ویڈیوز چلانے میں معاون ہیں کوڈی کے ساتھ استعمال کریں کور ایپ نہیں ملی۔ اسے انسٹال کریں؟ - \"کودی کے ساتھ کھیلیں\" کا آپشن دکھائیں - کوڈی میڈیا سنٹر کے ذریعے ویڈیو چلانے کا آپشن دکھائیں + \"کودی کے ساتھ چلائیں\" آپشن دکھائیں + کوڈی کے ذریعے ویڈیو چلانے کا آپشن دکھائیں آڈیو - پہلے سے طے شدہ آڈیو فارمیٹ - طے شدہ وڈیو وضع + طے شدہ آڈیو فارمیٹ + طے شدہ وڈیو فارمیٹ خیالیہ - روشنی + روشن تاریک سیاہ - پاپ اپ سائز اور پوزیشن کو یاد رکھیں - آخری سائز اور پوپ اپ کی پوزیشن یاد رکھیں - تیز رفتار تلاش کریں - غیر معقول تلاش سے کھلاڑی کم ہونے والی صحت سے متعلق تیزی سے پوزیشن حاصل کرنے کی اجازت دیتا ہے - Thumbnailلوڈکریں - تھمب نیلز کو لوڈ کرنے ، اعداد و شمار کی بچت اور میموری کے استعمال کو روکنے کیلئے آف کریں۔ تبدیلیاں دونوں میموری میں اور آن ڈسک امیج کیشے کو صاف کرتی ہیں۔ - تصویری کیشے کا صفایا کردیا - کیشڈ میٹا ڈیٹا کو صاف کریں - ویب میں موجود سبھی ڈیٹا کو ہٹا دیں - میٹا ڈیٹا کیشے کا صفایا کردیا - آٹو قطار اگلا اسٹریم + پاپ اپ جسامت اور مقام کو یاد رکھیں + پچھلی جسامت اور پوپ اپ کا مقام یاد رکھیں + بالواسطہ رسائی استعمال کریں + بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے + نظرِ انگشتی لوڈ کریں + ڈیٹا کی بچت اور میموری کے استعمال کو روکنے کیلئے نظرِ انگشتی کو بند کریں۔ تبدیلیاں میموری اور آن ڈسک عکس کے کیشے کو صاف کرتی ہیں۔ + تصویری کیشے کی صفائی ہوئی + کیشے میٹا ڈیٹا کو صاف کریں + ویب پیج کے سبھی کیشے ڈیٹا کو ہٹا دیں + میٹا ڈیٹا کیشے کی صفائی ہوئی + اگلا سلسلہ خود قطار جب دوبارہ نہ چلنے والی قطار میں آخری سلسلہ جاری ہو تو متعلقہ سلسلے کو خود سے شامل کریں پلیر اشارہ کنٹرول اشارے کی چمک اور آواذکو کنٹرول کرنے کے لئے اشاروں کا استعمال کریں - تلاش کی تجاویز - تلاش کرتے وقت تجاویز دکھائیں - تاریخ تلاش کریں + تلاش کے اشارے + تلاش کرتے وقت اشارے دکھائیں + سرگزشت تلاش کریں تلاش کے استفسارات کو مقامی طور پر ذخیرہ کریں - واچ ہسٹری - دیکھے ہوئے ویڈیوز کا ریکارڈرکھیں + دیکھے جانے کی سرگزشت + دیکھی گئی ویڈیوز کی سرگزشت رکھیں فوکس حاصل پر دوبارہ شروع کریں - مداخلت کے بعد چلاناجاری رکھیں (جیسے فون کالز) + مداخلت کے بعد چلانا جاری رکھیں (مثلاً فون کالز) ڈاؤن لوڈ - اگلا - \'اگلا\' اور \'ملتے جلتے\' ویڈیوز دکھائیں - \"الحاق کرنے کے لئے منعقد\" ٹپ دکھائیں - ویڈیو تفصیلات کے صفحے پر جب بیک گراؤنڈ یا پاپ اپ بٹن دبائے جاتے ہیں تو ٹپ دکھائیں - غیر معاون URL - طے شدہ مواد والا ملک + اگلی + \'اگلی\' اور \'ملتی جلتی\' ویڈیوز دکھائیں + ’’شامل کرنے کے لئے پکڑیں‘‘ اشارہ دکھائیں + ویڈیو تفصیلات کے صفحے پر جب پس منظر یا پاپ اپ بٹن دبائے جانے پر ٹپ دکھائیں + غیر موافق URL + مشمولات کا طے شدہ ملک خدمت پلیئر - رویہ - ویڈیو & آڈیو - تاریخ اور کیشے + برتاؤ + ویڈیو اور آڈیو + سرگزشت اور کیشے پوپ اپ - ظہور + اظہار دیگر - ڈیبگ + ڈِیبَگ پس منظر میں چلائیں - پوپ اپ موڈ میں چلائیں - بیک گراؤنڈ پلیئر پر قطار ہے - پاپ اپ پلیئر پر قطارہے + پوپ اپ اسلوب میں جاری + پس منظر پلیئر میں شامل ہوئی + پاپ اپ پلیئر میں شامل ہوئی چلائیں - مواد - عمر محدود مواد - عمر پر پابندی والا ویڈیو دکھائیں۔ ترتیبات سے اس طرح کے مواد کی اجازت ممکن ہے۔ + مشمول + نازیبا مشمولات + نازیبا ویڈیو دکھائی دے گی۔ ترتیبات سے اس طرح کی مشمولات کی اجازت ممکن ہے۔ براہ راست - ڈاؤن لوڈ - ڈاؤن لوڈ - غلطی کی اطلاع + ڈاؤن لوڈز + ڈاؤن لوڈز + خرابی کی اطلاع تمام - چینل(ذریعہ) + چینل پلے لسٹ ہاں بعد میں غیر فعال فلٹر - تازہ + ازسرنو صاف - سائز تبدیل کریں + جسامت بدلیں بہترین ریزولوشن کالعدم کریں تمام چلائیں ہمیشہ صرف ایک بار فائل - نیو پائپ نوٹیفیکیشن + نیو پائپ اطلاعات نیو پائپ کے پس منظر اور پاپ اپ پلیئرز کیلئے اطلاعات [نامعلوم] - ترتیب وضع کریں + سمت بندی بدلیں پس منظر پر جائیں پاپ اپ پر جائیں - مین پر سوئچ کریں - کوائفیہ درآمد کریں - کوائفیہ برآمد کریں - اپنی موجودہ تاریخ اور رکنیت ضد - تاریخ ، خریداری اور پلے لسٹ برآمد کریں + مرکزی صفحہ پر جائیں + ڈیٹا بیس درآمد کریں + ڈیٹا بیس برآمد کریں + اپنی موجودہ سرگزشت اور رکنیت باطل کریں + سرگزشت، رکنیتیں اور پلے لسٹ برآمد کریں خرابی نیٹ ورک کی خرابی - تمام تمبنیلذلوڈ نہیں کر سکے + تمام نظرِ انگشتی لوڈ نہیں کر سکے ویڈیو یو آر ایل کے دستخط ڈکرپٹ نہیں ہو سکے ویب سائٹ کو تجزیہ نہیں کیا جاسکا ویب سائٹ کو مکمل طور پر تجزیہ نہیں کرسکے مواد دستیاب نہیں ہے ڈاؤن لوڈ مینو ترتیب نہیں دے سکتے - براہ راست سلسلے ابھی تک تعاون یافتہ نہیں ہیں - کوئی اسٹریم نہیں مل سکی + براہ راست سلسلے ابھی تک معاون نہیں ہیں + کوئی سلسلہ حاصل نہیں کر سکے تصویر کو لوڈ نہیں کر سکتا - ایپ/UI کریش - یہ اسٹریم نہیں چل سکا - انریکوورابلی پلیئر نقص واقع ہوا - پلیر نقص سے بازیافت کر رہا ہے - بیرونی پلیراس قسم کے لنکس کی حمایت نہیں کرتے + ایپ/UI تباہ + یہ سلسلہ نہیں چل سکا + پلیئر میں نا قابلِ تلافی نقص واقع ہوئی + پلیر نقص سے بازیافت کیا جارہا ہے + بیرونی پلیئر اس قسم کے روابط کی حمایت نہیں کرتے غلط URL - کوئی ویڈیو اسٹریمز نہیں ملے - کوئی آڈیو اسٹریمز نہیں ملے + کوئی ویڈیو سلسلے نہیں ملے + کوئی آڈیو سلسلے نہیں ملے ایسا کوئی فولڈر نہیں - ایسی کوئی فائل / مواد کا ذریعہ نہیں - فائل موجود نہیں ہے اور نہ ہی اسے پڑھنے یا لکھنے کی اجازت ہے + ایسی کوئی فائل/مواد کا ذریعہ نہیں + فائل موجود نہیں ہے یا اسے پڑھنے یا لکھنے کی اجازت کا فقدان ہے فائل کا نام ضروری ہے - ایک خامی پیش آگئی:٪ 1 $ s - کوئی اسٹریمز ڈاؤن لوڈ کرنے کے لئے دستیاب نہیں - معذرت ، ایسا نہیں ہونا چاہئے تھا۔ + ایک خامی پیش آگئی: %1$s + کوئی سلسلسہ ڈاؤن لوڈ کرنے کے لئے دستیاب نہیں + معذرت، ایسا نہیں ہونا چاہئے تھا۔ ای میل کے ذریعے غلطی کی اطلاع دیں - معذرت ، کچھ خرابی آگئی + معذرت، کچھ خرابی آگئی۔ رپورٹ کریں معلومات: - کوئی مسئلہ ہے - What:\\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + کیا ہوا: + کیا ہوا:\\nدرخواست:\\nمواد کی زبان:\\nخدمات:\\nGMT وقت:\\nپیکیج:\\nورژن:\\nاو ایس ورژن: آپ کا تبصرہ (انگریزی میں): تفصیلات: - ویڈیو پیش نظارہ تھمب نیل - وڈیو کادورانیہ: - اپ لوڈر کا اوتار تھمب نیل - پسند - ناپسند + ویڈیو پیش منظر انگشتی + ویڈیو چلائیں، دورانیہ: + اپ لوڈر کا اوتار نظرِ انگشتی + پسندیدگی + ناپسندیدگی Tor کا استعمال - (تجرباتی) بڑھتی ہوئی رازداری کے لئے ٹور کے ذریعہ ٹریفک کو ڈاؤن لوڈ کرنے پر مجبور کریں (ویڈیوز کو ابھی تک سپورٹ نہیں کیا گیا ہے)۔ + (تجرباتی) بڑھتی ہوئی رازداری کے لئے ٹور کے ذریعہ ٹریفک کو ڈاؤن لوڈ کرنے پر مجبور کریں (سلسلے کی ویڈیوز ابھی تک غیر موافق ہے)۔ غلطی کی اطلاع دیں صارف رپورٹ - کوئی نتیجہ نہیں - یہاں کچھ نہیں مگر اداسی کے + کوئی نتائج نہیں + یہاں کچھ نہیں سوائے میرے دوبارہ ترتیب دینے کیلئے کھینچں - ڈاؤن لوڈ ڈائریکٹری \'٪ 1 $ s\' تشکیل نہیں دے سکتے - ڈاؤن لوڈ ڈائریکٹری \'٪ 1 $ s\' بن گئی + ڈاؤن لوڈ ڈائریکٹری \'s$1%\' تشکیل نہیں دے سکتے + ڈاؤن لوڈ ڈائریکٹری \'s$1%\' بن گئی ویڈیو آڈیو دوبارہ کوشش کریں ذخیرہ رسائی اجازت مسترد - K - ایم - بی + ہزار + دہ لاکھ + ارب کوئی صارفین نہیں - % s صارف - % s صارفین + %s صارف + %s صارفین کوئی مناظر نہیں - % s منظر - % s مناظر + %s منظر + %s مناظر ویڈیوز دستیاب نہیں - ویڈیوز - + ویڈیو + ویڈیوز شروع کریں توقف @@ -216,7 +215,7 @@ تشخیص کریں برخاست کریں نام تبدیل کریں - نیا حدف + نیا مشن ٹھيک ہے فائل کا نام موضوعات @@ -227,70 +226,68 @@ نیو پائپ ڈاؤن لوڈ ہو رہا ہے تفصیلات کے لیے ٹیپ کریں براۓ مہربانی انتظار کريں… - کلپ بورڈ میں کاپی کریں + کلپ بورڈ میں نقل ہوا براہ کرم بعد میں ترتیبات میں ڈاؤن لوڈ فولڈر کی وضاحت رکھیں پوپ اپ موڈ میں کھولنے کیلئے اس اجازت کی ضرورت ہے - reCAPTCHA - reCAPTCHA چیلنج reCAPTCHA چیلینج کی درخواست کی گئی ڈاؤن لوڈ - فائل ناموں میں حروف کی اجازت ہے - ناجائز کریکٹر اس قدر کے ساتھ تبدیل کیےگئے ہیں + فائل کے ناموں میں ان حروف کی اجازت ہے + ناجائز کریکٹر اس قدر کے ساتھ تبدیل کیےگئے متبادل کریکٹر - خطوط اور ہندسے - سب سے خاص کردار + حروف اور ہندسے + اہم مخصوص حروف نیو پائپ کے بارے میں ترتیبات کے بارے میں - تیسری پارٹی کے لائسنس - 3٪ 1 $ s بذریعہ٪ 2 $ s٪ 3 $ s کے تحت + تیسری پارٹی کی لائسنس + © %1$s بذریعہ %2$s %3$s کے تحت لائسنس لوڈ نہیں کر سکا ویب سائٹ کھولیں کے بارے میں معاونین لائسنس - لوڈ ، اتارنا Android پر ہلکا پھلکا اسٹریمنگ۔ + اینڈروئیڈ پر لِبرے کی ہلکی اسٹریمنگ۔ تعاون کریں - چاہے آپ کے خیالات ہوں؛ ترجمہ ، ڈیزائن میں تبدیلیاں ، کوڈ صاف کرنا ، یا حقیقی ہیوی کوڈ میں تبدیلی — مدد کا ہمیشہ خیرمقدم کیا جاتا ہے۔ جتنا زیادہ ہوتا ہے اتنا ہی بہتر ہوتا ہے! + جو بھی آپ کے خیالات ہوں؛ ترجمہ، ڈیزائن میں تبدیلیاں، کوڈ کی درستی، یا حقیقتاً کوڈ میں بڑی تبدیلی—مدد کا ہمیشہ خیرمقدم ہے۔ جتنا زیادہ ہوگا اتنی ہی بہتری ہو گی! گٹ ہب پر دیکھیں عطیہ - نیا پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت گزارتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں مدد دینے کے لئے واپس دیں۔ - واپس دو + نیو پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت صرف کرتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں مدد دینے کے لئے بہتر بدلہ دیں۔ + بدلہ دیں ویب سائٹ مزید معلومات اور خبروں کے لئے نیو پائپ ویب سائٹ ملاحظہ کریں۔ نیو پائپ کا لائسنس لائسنس پڑھیں - تاریخ + سرگزشت تلاش کیا گیا - دیکھاھوا - تاریخ آف کردی گئی ہے - تاریخ - تاریخ خالی ہے - تاریخ صاف ہوگئی + دیکھا ہوا + سرگزشت بند کر دی گئی + سرگزشت + سرگزشت خالی ہے + سرگزشت مٹائی گئی آئٹم حذف ہوگیا - کیا آپ اس آئٹم کو تلاش کی تاریخ سے حذف کرنا چاہتے ہیں؟ - کیا آپ اس آئٹم کو دیکھنے کی تاریخ سے حذف کرنا چاہتے ہیں؟ - کیا آپ واقعی تاریخ سے سبھی اشیاء کو حذف کرنا چاہتے ہیں؟ - آخری پلے کیا گیا - سب سے زیادہ دیکھاگیا + کیا آپ اس آئٹم کو تلاش کی سرگزشت سے حذف کرنا چاہتے ہیں؟ + کیا آپ اس آئٹم کو دیکھے جانے کی سرگزشت سے حذف کرنا چاہتے ہیں؟ + کیا آپ واقعی سرگزشت سے سبھی اشیاء کو حذف کرنا چاہتے ہیں؟ + آخری چلائی گئی + سب سے زیادہ چلائی گئی مرکزی صفحہ کا مواد خالی صفحہ رجحان صفحہ - سکریپشن پیج + صفحۂ رکنیت فیڈ صفحہ چینل کا صفحہ ایک چینل منتخب کریں - کسی چینل کی رکنیت نہیں + اب تک چینل کی رکنیت نہیں ایک کیوسک منتخب کریں - برآمدشدہ + برآمد شدہ درآمدشدہ - کوئی درست زپ فائل نہیں ہے + درست زپ فائل نہیں ہے انتباہ: تمام فائلوں کو درآمد نہیں کیا جاسکا۔ - یہ آپ کے موجودہ سیٹ اپ کو اوور رائڈ کرے گا۔ + یہ آپ کی موجودہ سیٹ اپ کو باطل کر دے گا۔ کیوسک - رجحان سازی - Top 50 - نیا اور تاذہ + رجحان میں + اوّل 50 + نیا اور تازہ پس منظر پلیئر پوپ اپ پلیئر ہٹائیں @@ -299,14 +296,14 @@ انقطار کو پکڑو پس منظر میں قطار ایک نئی پوپ اپ میں انقطار - یہاں سےچلاناشروع کریں - پس منظر میں چلاناشروع کریں - نئے پاپ اپ میں چلاناشروع کریں + یہاں چلانا شروع کریں + پس منظر میں چلانا شروع کریں + نئے پاپ اپ میں چلانا شروع کریں دراز کھولیں دراز بند کریں - یہاں جلد ہی کچھ نظر آئے گا D D - ترجیح \' کھلی \' عمل - مواد کھولنے پر ڈیفالٹ کارروائی -٪ s + یہاں جلد ہی کچھ نظر آئے گا ;D + پسندیدہ \'کھلی\' کارروائی + مواد کھولنے پر طے شدہ کارروائی — %s ویڈیو پلیئر پس منظر پلیئر پوپ اپ پلیئر @@ -318,190 +315,224 @@ نام تبدیل کریں نام پلے لسٹ میں شامل - پلے لسٹ تھمب نیل کے بطور سیٹ کریں - پلے لسٹ کو بُک مارک کریں - بُک مارک کو حدف کریں - اس پلے لسٹ کو حذف کریں؟ + بطور پلے لسٹ انگشتی طے کریں + پلے لسٹ کو نشان زد کریں + نشان زد حدف کریں + کیا یہ پلے لسٹ حذف کریں؟ پلے لسٹ بنائی گئی فہرست میں شامل کر دیا - پلے لسٹ تھمب نیل تبدیل کر دیا گیا۔ - پلے لسٹ کو حذف نہیں کیا جاسکا۔ - کوئی کیپشن نہیں + پلے لسٹ انگشتی تبدیل ہوا۔ + پلے لسٹ حذف نہیں کیا جاسکا۔ + کوئی عنوانات نہیں فٹ بھریں زوم خود بخود تیار - لیک کینری کو قابل بنائیں - میموری لیک ہونے کی نگرانی ہیپ ڈمپنگ کے وقت ایپ کو غیرذمہ دار بننے کا باعث بن سکتی ہے - زندگی سے دور کی غلطیوں کی اطلاع دیں - ضائع ہونے کے بعد ٹکڑے یا سرگرمی زندگی سے دور کے ناقابل تسخیر Rx مستثنیات کی اطلاع دہندگی - درآمد برآمد - درآمد + لیک کیناری کو فعال کریں + میموری لیک ہونے کی مانیٹرنگ، ہیپ ڈمپنگ کے وقت ایپ کو غیرذمہ دار بننے کا باعث بن سکتی ہے + گردشِ حیات سے دوری کی غلطیوں کی اطلاع دیں + فریگمنٹ یا دائرۂ حیات کی سر گرمی کے بعد Rx پیغامات نہ پہنچایا جا سکے تو ضرور کوشش کریں + در آمد/بر آمد + در آمد سے درآمد کریں - کو برآمد کریں - درآمد کیا جا رہا ہے… - برآمد کر رہا ہے… - فائل درآمد کریں - پچھلی برآمد - سبسکرپشنز کو درآمد نہیں کیا جاسکا - رکنیت برآمد نہیں کر سکا - برآمد فائل کو ڈاؤن لوڈ کرکے YouTube کی رکنیت کو درآمد کریں: + کو بر آمد کریں + در آمد کیا جا رہا ہے… + بر آمد کر رہا ہے… + فائل در آمد کریں + پچھلی بر آمد + رکنیتوں کو در آمد نہیں کیا جا سکا + رکنیتوں بر آمد نہیں کر سکا + برآمد فائل کو ڈاؤن لوڈ کرکے YouTube کی رکنیت کو درآمد کریں: +\n +\n1. اس URL پر جائیں: +\n%1$s +\n2. جب پوچھا جائے تو لاگ ان کریں +\n3. ڈاؤن لوڈ شروع ہونا چاہئے (یہ برآمد فائل ہے) + ۔URL یا آپ کی ID ٹائپ کرکے ایک SoundCloud پروفائل درآمد کریں: +\n +\n1. ویب براؤزر میں \"ڈیسک ٹاپ موڈ\" کو فعال کریں (یہ سائٹ موبائل آلات کے لئے دستیاب نہیں ہے) +\n2. اس URL پر جائیں: +\n%1$s +\n3. جب پوچھا جائے تو لاگ ان کریں +\n4. پروفائل URL کاپی کریں جہاں تک آپ کی رہنمائی کی گئی تھی۔ + آپ کی آئی ڈی، soundcloud.com/yourid + اس بات کو ذہن میں رکھیں کہ اس عملیہ کا نیٹ ورک مہنگا ہو سکتا ہے۔ \n -\n1. اس یو آر ایل پر جائیں:٪ 1 $ s -\n2. جب پوچھا جائے تو لاگ ان کریں -\nA. ڈاؤن لوڈ شروع ہونا چاہئے (یہ برآمد فائل ہے) - URL یا آپ کی ID ٹائپ کرکے ایک SoundCloud پروفائل درآمد کریں: -\n -\n1. ویب براؤزر میں \"ڈیسک ٹاپ موڈ\" کو فعال کریں (سائٹ موبائل آلات کے لئے دستیاب نہیں ہے) -\n2. اس URL پر جائیں: %1 $ s -\n3. پوچھا گیا میں لاگ ان کریں -\n4. پروفائل یو آر ایل کاپی کریں جو آپ کو ہدایت کی گئی تھی. - yourID، soundcloud.com/yourid - یاد رکھیں کہ یہ آپریشن نیٹ ورک مہنگا ہوسکتا ہے۔ -\n -\nکیا آپ جاری رکھنا چاہتے ہیں؟ +\nکیا آپ جاری رکھنا چاہتے ہیں ؟ پلے بیک رفتار کنٹرول - Tempo - "آواز کو موٹا کرنا" - ختم (مسخ کا سبب بن سکتا ہے) - کیپشن + ٹیمپو + موٹی آواز + غیر مربوط (مسخ کا سبب بن سکتا ہے) + عنوانات پلیئر کیپشن ٹیکسٹ اسکیل اور بیک گراونڈ اسٹائل میں ترمیم کریں۔ اثر لینے کیلئے ایپ کو دوبارہ شروع کرنا ضروری ہے۔ اس فائل کو چلانے کے لئے کوئی ایپ انسٹال نہیں ہے - دیکھنے کی تاریخ صاف کریں - ادا شدہ اسٹریمز اور پلے بیک پوزیشنوں کی تاریخ کو خارج کریں - دیکھنے کی پوری تاریخ کو حذف کریں؟ - تلاش کی ہسٹری کو مٹا دیں - تلاش کے مطلوبہ الفاظ کی تاریخ کو حذف کریں - پوری تلاش کی تاریخ کو حذف کریں؟ - تلاش کی تاریخ حذف ہوگئی۔ - 1 شے حذف کر دی گئی ۔ - نیو پائپ کاپلیفٹ فری سافٹ ویئر ہے: آپ استعمال کرسکتے ہیں ، مطالعہ شیئر کرسکتے ہیں اور اپنی مرضی سے اسے بہتر کرسکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور / یا ترمیم کرسکتے ہیں ، جو لائسنس کا ورژن 3 ، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن ہے۔ - کیا آپ سیٹنگیں بھی درآمد کرنا چاہتے ہیں؟ + دیکھنے کی سرگزشت صاف کریں + چلائے گئے سلسلوں اور پلے بیک پوزیشنز کی سرگزشت کو حذف کیا گیا + دیکھے جانے کی تمام سرگزشت حذف کریں؟ + تلاش کی سرگزشت مٹائیں + تلاش کے الفاظ کی سرگزشت حذف کی گئیں + تلاش کی مکمل سرگزشت حذف کریں؟ + تلاش کی سرگزشت حذف ہوئی۔ + 1 شے حذف کر دی گئی۔ + نیو پائپ کاپلیفٹ فری سافٹ ویئر ہے: آپ استعمال کرسکتے ہیں، مطالعہ شیئر کرسکتے ہیں اور اپنی مرضی سے اسے بہتر کرسکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور / یا ترمیم کرسکتے ہیں، خواہ لائسنس کا ورژن 3، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن۔ + کیا آپ ترتیبات بھی درآمد کرنا چاہتے ہیں؟ نیو پائپ کی رازداری کی پالیسی - نیوپی پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا ، اپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا. -\nنیو پائپ کی رازداری کی پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کو کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔ + نیو پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا، ایپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا./nنیو پائپ کی رازداری پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کے کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔ رازداری کی پالیسی پڑھیں - یورپی جنرل ڈیٹا پروٹیکشن ریگولیشن (جی ڈی پی آر) کی تعمیل کرنے کیلئے ، ہم آپ کی توجہ نیو پائپ کی رازداری کی پالیسی کی طرف مبذول کراتے ہیں۔ برائے مہربانی اسے غور سے پڑھیں۔ -\nہمیں بگ رپورٹ بھیجنے کے ل it آپ کو اسے قبول کرنا چاہئے۔ - قبول کریں + یورپی جنرل ڈیٹا پروٹیکشن ریگولیشن (جی ڈی پی آر) کی تعمیل کرنے کیلئے، ہم آپ کی توجہ نیو پائپ کی رازداری کی پالیسی کی طرف مبذول کراتے ہیں۔ برائے مہربانی اسے غور سے پڑھیں۔ +\nہمیں بگ رپورٹ بھیجنے کے لیے آپ کو اسے قبول کرنا ضروری ہے۔ + قبول رد - کوئی حد نہیں - موبائل ڈیٹا کا استعمال کرتے وقت ریذولوشن کو محدود کریں - ایپ سوئچ کو کم سے کم کریں - اہم ویڈیو پلیئر سے دوسرے ایپ میں سوئچنگ کرتے وقت کارروائی-% s + لا محدود + موبائل ڈیٹا کا استعمال کرتے وقت ریزولوشن کو محدود کریں + ایپ بدلنے پر چھوٹا کریں + اصل ویڈیو پلیئر سے دوسرے ایپ میں تبدیل ہوتے وقت کارروائی — %s کوئی نہیں - پس منظری پلیر میں کم کریں - پاپ اپ پلیر میں کم کریں + پس منظر پلیئر میں کم کریں + پاپ اپ پلیئر میں کم کریں خاموشی کے دوران فاسٹ فارورڈ قدم ری سیٹ کریں چینلز پلے لسٹس - ویڈیو ذ + ویڈیوز صارفین - اندراج خارج کریں + رکنیت چھوڑیں نیا ٹیب - ٹیب کا انتخاب کریں - صوت اشارہ کنٹرول - پلیر کی آواذکنٹرول کرنے کے لیے اشاروں کا استعمال کریں - چمک اشارہ کنٹرول - پلیرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں - ڈیفالٹ مواد کی زبان + ٹیب منتخب کریں + صوتی اشارہ کنٹرول + پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں + چمک کا متحرک کنٹرول + پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں + مشمولات کی طےشدہ زبان تازہ کاریاں فائل حذف ہوگئی - ایپ اپ ڈیٹ نوٹیفکیشن - نئے نیو پائپ ورژن کیلئے نوٹیفیکیشن - بیرونی اسٹوریج دستیاب نہیں + ایپ کی تازہ کاری کی اطلاع + جدید نیو پائپ ورژن کیلئے اطلاعات + بیرونی ذخیرہ دستیاب نہیں بیرونی ایسڈی کارڈ پر ڈاؤن لوڈ ممکن نہیں۔ ڈاؤن لوڈ فولڈر کے مقام کو دوبارہ ترتیب دیں؟ - پہلے سے طے شدہ ٹیبز کا استعمال ، محفوظ ٹیبز کو پڑھنے کے دوران خرابی - ڈیفالٹس بحال کریں - کیا آپ ڈیفالٹس کو بحال کرنا چاہتے ہیں؟ + پہلے سے طے شدہ ٹیبز کا استعمال، محفوظ ٹیبز کو پڑھنے کے دوران خرابی + طے شدہ بحال کریں + کیا آپ پہلے سے طے شدہ کو بحال کرنا چاہتے ہیں؟ صارفین کا شمار دستیاب نہیں - مرکزی صفحہ پر کون کون سے ٹیبزدکھائے جاہیں + مرکزی صفحہ پر کون کون سے ٹیبز دکھائے جاہیں انتخاب - تازہ ترین - جب نیا ورژن دستیاب ہوتا ہے تو فوری طور پر ایپ اپڈیٹ کے لئے ایک اطلاع دکھائیں - فہرست منظردیکھیں + تازہ کاری + نیا ورژن دستیاب ہونے پر ایپ کی تازہ کاری کے لیے اجازتی اطلاع دکھائیں + فہرست نما اسلوب فہرست گرڈ خودکار - منظر سوئچ کریں - نیو پائپ اپ ڈیٹ دستیاب! + منظر بدلیں + نیو پائپ کی تازہ کاری دستیاب! ڈاؤن لوڈ کرنے کے لئے کلک کریں ختم ملتوی - موقوف - قطار میں کھڑا ہے - پوسٹ پروسیسنگ + توقف + قطار میں + بعد کا عمل جاری قطار - سسٹم نےکارروائی سے انکار کیا گیا + سسٹم کے ذریعہ کارروائی سے انکار کیا گیا ڈاؤن لوڈ ناکام - ڈاؤن لوڈ تکمیل - ٪ s ڈاؤن لوڈ مکمل ہوگئے + ڈاؤن لوڈ مکمل + %s ڈاؤن لوڈ مکمل ہوا منفرد نام بنائیں برتحریر اس نام کے ساتھ ایک ڈاؤن لوڈ جاری ہے غلطی دکھائیں کوڈ - مقصود پوشہ نہیں بنایا جا سکتا + مطلوبہ فولڈر نہیں بنایا جا سکتا فائل نہیں بنائی جاسکتی ہے - نظام نے اجازت نہیں دی + سسٹم نے اجازت نہیں دی محفوظ کنکشن ناکام سرور نہیں مل سکا - سرور سے متصل نہیں ہوسکتا + سرور سے متصل نہیں ہو سکتا سرور ڈیٹا نہیں بھیجتا ہے - سرور ملٹی تھریڈڈ ڈاؤن لوڈز کو قبول نہیں کرتا ہے ، @ سٹرنگ / msg_threads = 1 کے ساتھ دوبارہ کوشش کریں + سرور ملٹی تھریڈڈ ڈاؤن لوڈز کو قبول نہیں کرتا ہے، @string/msg_threads = 1 کے ساتھ دوبارہ کوشش کریں نہیں ملا - پوسٹ پروسیسنگ ناکام + بعد کا عمل نا کام ختم شدہ ڈاؤن لوڈ صاف کریں - رکو - زیادہ سے زیادہ دوبارہ کوشش کریں + روکیں + زیادہ سے زیادہ کوششیں ڈاؤن لوڈ منسوخ کرنے سے پہلے کوششوں کی زیادہ سے زیادہ تعداد - میٹرڈ نیٹ ورک پر مداخلت - موبائل ڈیٹا پر سوئچنگ کرتے وقت مفید ہے ، اگرچہ کچھ ڈاؤن لوڈ معطل نہیں ہوسکتی ہیں + میٹر والی نیٹ ورک پر مداخلت + موبائل ڈیٹا پر بدلتے وقت مفید ہے، اگرچہ کچھ ڈاؤن لوڈ معطل نہیں ہوسکتی ہیں تقریبات کانفرنسیں تبصرے دکھائیں - تبصرے دکھانا بند کرو + تبصرے دکھانا بند کریں آٹوپلے - تبصرے - + تبصرہ + تبصرے کوئی تبصرہ نہیں - تبصرے لوڈ نہیں ہوسکے + تبصرے لوڈ نہیں ہو سکے بند کریں پلے بیک دوبارہ شروع کریں آخری پلے بیک پوزیشن بحال کریں - فہرست میں پوزیشن - فہرستوں میں پلے بیک پوزیشن کے اشارے دکھائیں + فہرست میں مقامات + فہرستوں میں پلے بیک مقامات کے اشارے دکھائیں کوائف صاف کریں - دیکھنے کی تاریخ حذف ہوگئی۔ - پلے بیک پوزیشنیں حذف ہوگئیں۔ + دیکھے جانے کی سرگزشت حذف ہوگئی۔ + پلے بیک پوزیشنس حذف ہوئیں۔ فائل منتقل یا حذف ہوگئی اس نام والی فائل پہلے سے موجود ہے - اس نام والی ڈاؤن لوڈ کی فائل پہلے سے موجود ہے + اس نام کی ڈاؤن لوڈ کی گئی فائل پہلے سے موجود ہے فائل برتحریر نہیں کر سکتا اس نام کے ساتھ ڈاؤن لوڈ زیر التوا ہے فائل پر کام کرنے کے دوران نیو پائپ بند کردی گئی تھی - آلے میں کوئی جگہ نہیں بچی - پیشرفت ختم ہوگئی ، کیونکہ فائل کو حذف کردیا گیا تھا + آلہ میں کوئی جگہ نہیں بچی + پیشرفت ختم ہوگئی، کیونکہ فائل کو حذف کردیا گیا تھا رابطے کا وقت ختم - کیا تمہیں یقین ہے؟ + کیا آپ اپنی ڈاؤن لوڈ کی سرگزشت کو صاف کرنا چاہتے ہیں یا ڈاؤن لوڈ کی گئی تمام فائلوں کو حذف کرنا چاہتے ہیں؟ ڈاؤن لوڈ کی قطار کو محدود کریں ایک ڈاؤن لوڈ ایک ہی وقت میں چلے گا ڈاؤن لوڈ شروع کریں ڈاؤن لوڈ روکیں - کہاں پرڈاؤن لوڈ کریں - آپ سے پوچھا جائے گا کہ ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے + ڈاؤن لوڈ کہاں کریں، پوچھیں + ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے آپ سے پوچھا جائے گا آپ سے پوچھا جائے گا کہ ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے۔ \nاگر آپ کسی بیرونی SD کارڈ پر ڈاؤن لوڈ کرنا چاہتے ہیں تو SAF کا انتخاب کریں SAF استعمال کریں اسٹوریج ایکسیس فریم ورک ایک بیرونی SD کارڈ میں ڈاؤن لوڈ کی اجازت دیتا ہے۔ \nنوٹ: کچھ آلات مطابقت نہیں رکھتے ہیں پلے بیک پوزیشن حذف کریں - تمام پلے بیک پوزیشن حذف کریں - تمام پلے بیک پوزیشنوں کو حذف کریں ؟ - اثر لینے کے لئے ڈاؤن لوڈ فولڈرز کو تبدیل کریں - ٹوگل خدمت ، حالیہ منتخب: - \ No newline at end of file + تمام پلے بیک پوزیشن حذف کی گئی + تمام پلے بیک پوزیشنس حذف کریں؟ + مؤثر بنانے کے لئے ڈاؤن لوڈ فولڈرز کو تبدیل کریں + ٹوگل خدمت، حالیہ منتخب: + کوئی نہیں دیکھ رہا ہے + + %s دیکھ رہا + %s دیکھ رہے + + کوئی نہیں سن رہا ہے + + %s سننے والا + %s سننے والے + + جب ایپ دوبارہ شروع ہو گی تو زبان تبدیل ہو جائے گی۔ + طے شدہ کیوسک + آگے بھگانے /- پیچھے کرنے کی مدت + پیر ٹیوب واقعات + اپنے پسندیدہ پیر ٹیوب کی مثالیں منتخب کریں + ایسی مثالوں کی تلاش کریں جو آپ کو %s پر موزوں بنائیں + مثال شامل کریں + مثال کا URL درج کریں + مثال کی توثیق نہیں کی جا سکی + صرف HTTPS URLs موافق ہیں + مثال پہلے سے موجود ہے + مقامی + حال ہی میں شامل + زیادہ پسندیدہ + خود سے بنا (کوئی اپ لوڈر نہیں ملا) + بازیافتی ہو رہی + یہ ڈاؤن لوڈ بازیافت نہیں ہو سکتا + ایک مثال منتخب کریں + لاک اسکرین ویڈیو تھمب نیل کو فعال کریں + بیک گراؤنڈ پلیئر استعمال کرتے وقت ایک ویڈیو تھمب نیل کو لاک اسکرین پر دکھایا جائے گا + ڈاؤن لوڈ کی سرگزشت صاف کریں + ڈاؤن لوڈ شدہ فائلیں حذف کریں + %1$s ڈاؤن لوڈز کو حذف کیا گیا + diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index ab0983e7a..bfde056b0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -135,8 +135,8 @@ Chọn một thư mục tải về có sẵn trong cài đặt Cần quyền này để \nmở trong chế độ popup - ReCAPTCHA - reCAPTCHA + ReCAPTCHA + reCAPTCHA Yêu cầu reCAPTCHA Giới thiệu về NewPipe Cài đặt diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9aa4b9245..8be5dd967 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,457 +1,540 @@ - + - 点播%1$s次 - %1$s发布 - 找不到播放器。您是否要安装 VLC? + 点击搜索按钮即可开始使用 + %1$s 次观看 + 发布于 %1$s + 在浏览器中打开 + 在悬浮窗模式下打开 + 您是不是要找:%1$s? + 找不到串流播放器 (您可以安装 VLC 进行播放)。 + 下载串流文件 安装 取消 - 用浏览器打开 分享 下载 搜索 设置 - 您是不是要找: %1$s ? - 分享视频 + 分享给... 选择浏览器 - 旋转 - 使用外置视频播放器 - 使用外置音频播放器 视频下载路径 - 下载视频的存储路径 - 输入视频存储路径 - 默认分辨率 - 用Kodi播放 - 找不到Kore,您要安装Kore吗? - 显示“用Kodi播放”的选项 - 显示 Kodi 媒体中心播放视频的选项 - 音频 - 默认音频格式 + 已下载的视频存储在这里 + 请选择下载视频的保存位置 + 已下载的音频存储在这里 + 选择下载音频的储存位置 + 自动播放 + 使用Kodi播放 主题 - 灰暗 - 明亮 - + 浅色 + 暗黑 + 黑色 下载 - 即将播放 - 显示下一部和相似的视频 - 不支援此网址 - 默认内容语言 - 视频和音频 + 下一个 + 不支持的 URL 外观 其他 - 后台播放 - 播放 + 全部 + 频道 + + 稍后 网络错误 - - 视频预览缩略图 - 视频预览缩略图 - 上传者的头像缩图 + + %s 个视频 + %s 个视频 + + 禁用 + 后台播放 + 过滤器 + 刷新 + 搜索建议 + 订阅 + 已订阅 + 观看历史 + 播放器 + 历史记录与缓存 + 播放列表 + 撤销 + 全部播放 + 总是 + 仅一次 + 添加至 + 文件 + 加载缩略图 + 清除观看记录 + + 最小化后台播放器 + 最小化悬浮窗播放器 + 频道 + 播放列表 + 取消订阅 + 新标签 + 更新 + 文件已删除 + 无法得知订阅人数 + 每推出新版本时,弹出应用升级通知 + 网格 + 新版 NewPipe 已可升级! + 服务器不接受 接收 multi-threaded 下载, 以 @string/msg_threads = 1 重试 + 自动播放 + 清除数据 + 观看记录已删除 喜欢 不喜欢 - 使用 Tor - (实验性)强制下载流量使用 Tor 加强隐私(暂不支援流媒体视频)。 - 音频存储路径 - 下载音频的存储路径 - 输入音频文件存储路径 - - 未能建立下载路径 “%1$s” - 已创建下载目录 “%1$s” - 内容 - 显示年龄限制内容 - 视频有年龄限制。请先在设置中启用\"显示年龄限制内容\"。 - 错误 - 无法加载所有缩略图 - 无法解密视频网址签名 - 无法解析网站 - 无法完全解析网站 - 内容不可用 - 无法设置下载菜单 - 这是一个在线流媒体,尚不支持。 - 无法获取任何流媒体 - 抱歉,这本不应该发生。 - 使用邮件报告错误 - 抱歉,发生了一些错误。 - 报告 - 信息: - 发生什么: - 您的注释(英文): - 详细信息: - - + 使用Tor + (实验性)通过 Tor 强制下载流量以增强隐私(暂不支持串流视频)。 报告错误 用户报告 - + 无法创建下载目录\"%1$s\" + 已成功创建下载目录「%1$s」 视频 音频 重试 - 无权访问存储空间 - 自动播放 - 当NewPipe被其他应用调用时,自动播放视频 - 直播 - - 点击搜索开始NewPipe + 存储访问权限已被拒绝 + + %s 次观看 + %s 次观看 + + + 百万 开始 暂停 播放 删除 - 校验和 - - 确定 - - 文件名 - 线程 - 错误 - 服务器不支持 - 文件已经存在 - 网址不正确或网络不可用 - NewPipe 正在下载 - 点击了解细节 - 请稍候… - 已复制到剪贴板 - 请选择一个可用的下载目录 - + 校验 新任务 - 下载 - 下载 - 错误报告 - - 无法加载图像 - 应用/界面已崩溃 - 原因:\\n请求:\\n内容语言:\\n服务:\\nGMT时间:\\n包:\\n版本:\\n操作系统版本: - reCAPTCHA - reCAPTCHA 验证 - - 需要 reCAPTCHA 验证 - -以悬浮窗打开 - 选项启用时,某分辨率的视频将没有声音 - NewPipe悬浮窗模式 - 订阅 - 已订阅 - 已取消订阅频道 - 无法更改订阅 - 无法更新订阅 - - 首页 - 订阅 - - 新鲜事 - - 后台播放 - 悬浮窗 - - 窗口模式默认分辨率 - 显示更高的分辨率 - 只有部分设备支持 2K/4K 视频 - 首选视频格式 - 纯黑 - 记住悬浮窗大小和位置 - 记住上次悬浮窗的大小和位置 - 播放手势控制 - 使用手势操作控制播放器的亮度和音量 - 搜索建议 - 在搜索时显示搜索建议 - 搜索记录 - 在本地存储搜索请求 - 历史和缓存 - 记住观看的视频 - 焦点恢复 - 在打扰(例如来电)过后恢复视频播放 - - - 窗口模式 - 以窗口模式播放 - 所有 - 频道 - 是的 - 稍后 - 已禁用 - 筛选器 - 刷新 - 清除 - 重新调整大小 - 最佳分辨率 - - NewPipe 通知 - NewPipe 后台播放和窗口播放器的通知 - - K - M - B - - 该项权限用于 -\n以窗口模式打开 - - 下载 - 在文件名中允许的字符 - 无效的字符将以该值取代 - 替换字符 - - 字母和数字 - 特殊字符 - - 关于 NewPipe + OK + 文件名 + 线程数 + 错误 + 不支持的服务器 + 文件已存在 + 点击了解详情 + 请稍候… + 复制至剪贴板 + reCAPTCHA验证码 + 悬浮窗播放 + 关于NewPipe 设置 关于 第三方许可 - © %1$s by %2$s under %3$s - 无法加载许可 + © %1$s :作者 %2$s (使用 %3$s ) + 无法加载许可证 打开网站 关于 贡献者 - 许可 - 开源的轻量级流媒体Android客户端。 - 在 GitHub 上查看 - NewPipe 许可 - 无论你有什么想法:翻译程序,改进设计,优化代码或是想做出大量修改——我们都随时欢迎。做得越多它将变得越好! - 阅读许可 - 贡献 - - 历史记录 - 搜索记录 - 观看记录 - 历史记录已禁用 - 历史记录 - 没有历史记录 - 历史记录已清除 - -播放器 - 行为 - 历史记录 & 缓存 - 在后台播放器上排队 - 在弹出播放器上排队 - 播放列表 - 撤销 - 全部播放 - - [未知] - - 无法播放此流媒体 - 发生无法解决的播放器错误 + 许可证 + 下载 + 文件名中允许的字符 + 无效字符将会被替换为此 + 字母和数字 + 最特殊字符 没有结果 - 空空如也 - - 无订阅者 + 没有订阅者 - %s 位订阅者 - - - 无观看次数 - - %s 次观看 - - + %s 位订阅者 + %s 位订阅者 + 没有视频 - - %s 部视频 - - - 项目已删除 - 找不到播放器(你可以安装 VLC 来播放) - 下载串流文件。 - 显示详情 - - 书签 - - 添入 - - 使用粗略但快速的寻找 - 粗略寻找让播放器更快找到视频的进度位置 - 加载缩略图 - 停用后,NewPipe將不再加载缩略图,减少数据使用和腾空存储空间,亦会清除内存和内存卡上的缩略图缓存 - 已清除图像缓存 - 清除缓存元数据 - 移除所有网页的缓存数据 - 已清除元数据缓存 - 自动播放队列中下一个视频 - 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表 - 显示\"长按添加\"提示 - 当视频详情页中的背景或悬浮按钮被按下的时候显示提示 - 默认内容国家 - 服务 - 调试 - 总是 - 仅一次 - 文件 - - 切换方向 - 切换到后台 - 切换到悬浮窗 - 切换到主页 - - 导入数据库 - 导出数据库 - 将覆盖你现有历史记录和订阅 - 导出历史记录,订阅和播放列表 - 从播放器错误中恢复 - 外部播放器不支持这些链接类型 - 无效的链接 - 未找到视频 - 未找到音频 - 无效的目录 - 无效的文件/内容来源 - 文件不存在或无读写权限 - 文件名不能为空 - 发生了一个错误:%1$s - 无视频媒体可以下载 - - 拖拽以重新排列 - + 视频 + 拖动以重新排序 创建 - 删除一个 - 删除全部 + 仅删除一个 + 全部删除 解除 - 重命名 - - 捐赠 - NewPipe 是一群志愿者花费业余时间开发的,目的是为您带来最佳体验。你的一点心意,可以让开发者们在享受一杯 Java 的咖啡的同时让 NewPipe 变得更好用。 - 捐赠 - 网页 - 访问 NewPipe 网站以获取更多的信息和新闻。 - 你想从搜索历史中删除此项吗? - 你想从观看历史中删除此项吗? - 确实要删除历史记录的所有项目吗? - 上一次播放 - 最多播放 - - 主页内容 + 重 命名 + 未安装用于播放此文件的应用程序 + 已删除1个项目。 + 哪些标签需要在主页上展示 + 列表视图模式 + 已完成 + 等待中… + 已暂停 + 排队中 + 加入队列 + 操作已被系统拒绝 + 下载失败 + 下载完成 + %s 次下载已完成 + 没有评论 + 切换服务,当前选择: + 找不到串流播放器。您想安装 VLC 吗? + 旋转 + 使用外部视频播放器 + 使用外部音频播放器 + 音频下载文件夹 + 从其他应用调用 NewPipe 时播放视频 + 默认分辨率 + 找不到Kore。是否安装? + 显示“用Kodi播放”选项 + 显示“通过Kodi media center播放视频的选项” + 音频 + 默认音频格式 + 显示“下一个”和“类似的”视频 + 视频和音频 + 在后台播放 + 播放 + 内容 + 受年龄限制的内容 + 显示受年龄限制的视频。可从设置允许此类内容。 + 直播 + 下载 + 下载 + 错误报告 + 错误 + 无法加载所有缩略图 + 无法解密视频的 URL 签名 + 无法解析网址 + 无法完全解析网址 + 内容不可用 + 无法设置下载菜单 + 暂时不支持观看直播 + 无法获得任何信息流 + 无法加载图像 + App UI 崩溃 + 抱歉,这不应该发生的。 + 通过电子邮件报告错误 + 抱歉,发生了一些错误。 + 报告 + 信息: + 发生了什么: + 详情:\\n请求:\\n内容语言:\\n服务:\\nGMT时间:\\n包:\\n版本:\\n操作系统版本: + 您的注释(请用英文): + 详细信息: + 视频预览缩略图 + 播放视频,时长: + 视频上传者的头像缩略图 + 字节 + 错误的 URL 或未联网 + NewPipe下载中 + 请稍后在设置中设定下载目录 + 用悬浮窗模式 +\n需要此权限 + reCAPTCHA验证 + 请求的新的CAPTCHA验证 + NewPipe 悬浮窗模式 + 在悬浮窗中播放 + 默认悬浮窗分辨率 + 使用更高的分辨率 + 仅某些设备支持播放2K / 4K视频 + 清除 + 记住悬浮窗的尺寸与位置 + 记住最后一次使用悬浮窗的大小和位置 + 悬浮窗 + 调整大小 + 隐藏部分没有音频的分辨率 + 播放器手势控制 + 使用手势控制播放器的亮度和音量 + 显示搜索建议 + 最佳分辨率 + 开源小巧的Android媒体播放器。 + 在GitHub上查看 + NewPipe开源许可证 + 你是否有想:翻译、设计、清理或重型代码更改 ——我们始终欢迎你来贡献! + 阅读许可证 + 贡献 + 替换字符 + 取消订阅频道 + 无法修改订阅 + 无法更新订阅 + 主页 + 订阅 + 最新 + 恢复前台焦点 + 中断后继续播放(例如突然来电后) + 搜索历史记录 + 在本地存储搜索查询记录 + 记录已观看视频 + 历史 + 已搜索 + 已观看 + 历史记录功能已关闭 + 历史 + 历史记录为空 + 清除历史记录 + NewPipe 通知 + NewPipe 后台播放和悬浮窗播放的通知 + 默认视频格式 + 行为 + 空空如也... + 0次观看 + 项目已删除 + 是否要从搜索历史记录中删除此项目? + 显示在主页面内容 空白页 - Kiosk 页 + 『时下流行』页-自定义 订阅页 - Feed 页 + Feed 页面 频道页 - 选择频道 - 还没有订阅的频道 - 选择 kiosk - 导出完成 - 导入完成 - 无有效的 ZIP 文件 - 警告:无法导入所有文件。 - 将覆盖你现有设置。 - - Kiosk - 流行的 + 选择一个频道 + 尚未订阅频道 + 选择一个时下流行页 + 『时下流行』 + 趋势 前50 - 最新 & 最热 - 后台播放器 + 最新与热门 + 显示 \"长按添加\" 说明 + 在视频详情页中,按下背景播放或悬浮窗播放按钮时显示提示 + 已加入后台播放播放列表 + 已加入悬浮窗播放列表 + 无法播放此串流 + 发生无法恢复播放器错误 + 恢复播放器错误 + 后台播放 悬浮窗播放器 移除 详情 音频设置 - 按住以队列 - 在后台队列 - 在悬浮窗队列 - 从这里播放 - 从这里在后台播放 - 从这里在悬浮窗播放 - - 打开侧栏菜单 - 关闭侧栏菜单 - 精彩内容即将呈现 ;D - - - 偏好\"打开\"动作 - 打开内容的默认动作 — %s - + 长按队列 + [未知] + 添加到后台部分队列 + 添加至新悬浮窗列表 + 开始在此处开始播放 + 开始后台播放 + 开始在新悬浮窗中播放 + 捐赠 + NewPipe 是由志愿者花费时间为您带来最佳体验开发的。回馈帮助开发人员在享用一杯咖啡的同时,让 NewPipe 变得更好。 + 回馈 + 网站 + 请访问 NewPipe 网站了解更多信息和讯息。 + 默认国家/地区 + 切换方向 + 切换到背景播放 + 切换到悬浮窗播放 + 切换到主页面 + 服务 + 打开抽屉 + 关闭抽屉 + 第三方播放器不支持此类型链接 + 无效 URL + 未找到视频串流 + 找不到音频串流 视频播放器 后台播放器 悬浮窗播放器 - 总是询问 - - 获取信息中… - 正在加载请求内容 - - 创建新播放列表 - 删除播放列表 - 重命名播放列表 + 正在获取信息… + 正在加载请求的内容 + 导入数据库 + 导出数据库 + 覆盖当前历史记录和订阅 + 导出历史记录、订阅和播放列表 + 导出成功 + 导入成功 + 没有有效的ZIP文件 + 警告:无法导入所有文件。 + 这将覆盖当前设置。 + 显示信息 + 书签 + 确定要从观看历史记录中删除该项吗? + 是否确实要从历史记录中删除所有项目? + 最后播放 + 播放最多 + 总是寻问 + 新建播放列表 + 删除 + 重 命名 名称 - 加入播放列表 - 设置为播放列表缩略图 - - 书签播放列表 - 移除书签 - - 你想删除此播放列表吗? - 播放列表已创建 - 加入播放列表 - 播放列表缩略图已更改 + 添加到播放列表 + 设为播放列表缩略图 + 收藏播放列表 + 删除收藏 + 删除此播放列表? + 新建播放列表成功 + 加入播放列表成功 + 播放列表缩略图更改成功。 无法删除播放列表 - 无字幕 - 适应屏幕 填充屏幕 - 放大填充 - + 缩放 + 敬请等待 + 调试 自动生成 - - 启用 LeakCanary - 内存泄露监测可能会在heap dumping时导致应用失去响应 - - 报告生命周期外的错误 - 处理完无法送达的、发生在Fragment或activity生命周期之外的Rx异常后强制报告 - + 启用LeakCanary + 『内存泄漏监视』可能导致应用在『核心转储』时无响应 + 报告『提前结束Android生命周期』错误 + 强制报告处理后的未送达的Activity或Fragment生命周期之外的Rx异常 + 使用快速不精确搜索 + 粗略定位播放:允许播放器以略低的精确度为代价换取更快的定位速度 + 自动播放下一个 + 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表 + 没有此文件夹 + 无相似文件/内容源 + 该文件不存在 或 缺少读写该文件的权限 + 文件名不能为空 + 发生错误: %1$s 导入/导出 导入 - 从导入 - 导出至 - - 导入中… - 导出中… - + 从...导入 + 导出到... + 正在导入… + 正在导出… 导入文件 - 之前的导出 - + 以前的导出 无法导入订阅 无法导出订阅 - - 通过下载导出文件导入 YouTube 订阅: -\n1. 在浏览器打开URL:%1$s -\n2. 登录账户 -\n3. 下载应该会马上开始(这个就是导出文件) - 通过输入URL或您的ID导入SoundCloud配置: -\n1. 在浏览器中开启\"桌面模式\"(该网站不适用于移动设备) -\n2. 打开URL:%1$s -\n3. 登录账号 -\n3. 复制重定向后的URL。 - 你的ID 或 soundcloud.com/你的ID - - 请注意该操作可能消耗大量网络流量。 -\n您希望继续吗? - + 通过下载导出文件来导入 YouTube 订阅: +\n +\n1. 转到此网站: %1$s +\n2. 登录(如果需要) +\n3. 应该立即开始下载(即导出文件) + 通过键入网址或你的 ID 导入 SoundCloud 配置文件: +\n +\n1. 在浏览器中启用\"电脑模式\"(该网站不适用于移动设备) +\n2. 转到此 URL: %1$s +\n3. 登录(如果需要) +\n4. 复制重定向的配置文件下载地址。 + 你的 ID:soundcloud.com/[你的ID] + 该操作消耗大量流量, +\n你想继续吗? + 关闭可防止加载缩略图,节已省数据和内存使用。(若现在更改会清除内存和储存中缓存) + 清空图像缓存成功 + 清空已缓存元数据 + 清空已缓存的网页数据 + 清空元数据缓存成功 播放速度控制 - 速度 + 节奏 音调 - Unhook(可能导致失真) - 默认 -未安装能播放此文件的应用 - + 解除关联(可能导致失真) + 首选“打开”操作 + 打开内容时默认操作: = %s + 无可下载的串流内容 字幕 - 修改播放器的字幕文本大小和背景样式。需要重启应用程序以生效 - - 清除观看记录 - 删除视频观看记录 - 删除全部观看记录。 - 观看记录已删除。 - 清除搜索记录 - 删除搜索关键词记录 - 删除全部搜索记录。 - 搜索记录已删除。 - 已删除1项。 - - NewPipe的隐私策略 - NewPipe 项目非常重视您的隐私。因此, 未经您的同意,应用程序不会收集任何您的数据。 NewPipe 的隐私策略详细解释了您在发送崩溃报告时会发送和存储的哪些数据。 - 阅读隐私策略 - NewPipe 是 copyleft 的自由软件: 你可以按照自己的意愿使用、学习、分享和改进它。具体地说, 您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款(第3版或者任何更高版本), 重新发布和/或修改本软件。 - 您是否希望同时导入设置? - - 为了遵守欧洲通用数据保护条例(GDPR),我们提醒您注意NewPipe的隐私政策。 请仔细阅读。 -\n您必须接受它才能向我们发送错误报告。 + 修改播放器字幕比例和背景样式。需要重新启动应用程序才能生效。 + 删除串流的播放历史和播放位置 + 删除全部观看记录? + 清除搜索历史记录 + 清除搜索关键词的历史记录 + 是否删除全部搜索历史记录? + 搜索历史记录已删除。 + NewPipe 是版权自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证GPLv3或(由您选择的)任何更高版本的许可证重新分发或修改该许可证。 + 是否要同时导入设置? + NewPipe的隐私政策 + NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。 +\nNewPipe 的隐私政策详细解释了在发送崩溃报告时发送和存储的数据。 + 阅读隐私政策 + 为了遵守欧盟的《通用数据保护条例》(GDPR),我们特此提醒您注意 NewPipe 的隐私政策。请您仔细阅读。 +\n您必须在同意以后才能向我们发送错误报告。 接受 拒绝 - - 不限制 + 无限制 使用移动数据时限制分辨率 - 更多频道 - 更多频道 - 用户们 - + 退出应用时最小化 + 从主播放器切换到其他应用时的操作 - %s + 静音时快进 + 滑块[比例尺] + 重 置 + 曲目 + 用户 + 选择标签 + 音量手势控制 + 使用手势控制播放器的音量 + 亮度手势控制 + 使用手势控制播放器的亮度 + 视频默认语言 + 应用更新通知 + NewPipe有新版本的通知 + 外置存储不可用 + 无法下载到外部 SD 卡。重置下载文件夹位置? + 读取已保存标签时发生错误,因此使用者默认标签 + 恢复默认 + 是否恢复默认值? + 选择 + 更新 + 列表 + 自动 + 切换视图 + 点击下载 + 后期处理 + 生成唯一名称 + 覆盖 + 正在使用此名称进行下载 + 显示错误 + 代码 + 无法创建目标文件夹 + 无法创建文件 + 权限被系统拒绝 + 安全连接失败 + 找不到服务器 + 无法连接到服务器 + 服务器未发送数据 + 找不到 NOT FOUND + 后期处理失败 + 清除已完成的下载 + 停止 + 最大重试次数 + 取消下载前的最多尝试次数 + 在切换到移动流量网络时中断播放 + 切换至移动数据时可能有用,尽管一些下载无法被暂停 + 事件 + 近期大会 + 显示评论 + 禁用,以停止显示评论 + + %s 条评论 + %s 条评论 + + 无法加载评论 + 关闭 + 恢复播放 + 恢复上次播放位置 + 列表中的位置 + 在列表中,显示视频最后一次播放时的播放位置 + 已删除播放位置记录。 + 文件被已移动或删除 + 该名称的文件已经存在 + 命名冲突,已存在具有此名称文件 + 无法覆盖文件 + 有此名称的已暂停下载 + NewPipe 在处理文件时被关闭 + 设备上没有剩余储存空间 + 进度丢失,文件已被删除 + 连接超时 + 是否要清除下载历史记录或删除所有下载的文件? + 最大下载队列 + 同时只允许一个下载进行 + 开始下载 + 暂停下载 + 询问下载位置 + 系统将询问您将每次下载的保存位置 + 系统将询问您将每次下载的保存位置。 +\n(如果要下载到外部 SD 卡,请选择 SAF) + 使用 SAF + 存储访问框架(SAF)允许下载文件到外部SD卡。 +\n注:一些设备不兼容SAF + 删除播放位置记录 + 删除所有播放位置记录 + 删除所有播放位置记录? + 更改下载目录让内容生效 + 『时下流行』页-默认 + 没有人在观看 + + %s 人在观看 + %s 人在观看 + + 没有人在听 + + %s 人在听 + %s 人在听 + + 重新启动应用后,语言将更改。 + PeerTube 服务器 + 设置自己喜欢的PeerTube服务器 + 查找最适合你的服务器%s + 添加服务器 + 输入服务器网址(URL) + 无法验证服务器 + 仅支持 HTTPS和URL + 该服务器已存在 + 本地 + 最近添加 + 最喜欢的 + 自动生成的(未找到上传者) + 正在恢复 + 无法恢复此下载 + 选择一个服务器 + 快进 / 快退的单位时间 + 在锁屏上显示视频缩略图 + 在后台播放时,锁屏上将会显示视频的缩略图 + 清除下载历史记录 + 删除下载了的文件 + 已删除 %1$s 下载 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3294094dc..20b14d7ea 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -120,8 +120,8 @@ 事件:\\n請求:\\n內容語言:\\n服務:\\nGMT 時間:\\nPackage:\\n版本:\\n作業系統版本: K M - reCAPTCHA - reCAPTCHA 挑戰 + reCAPTCHA + reCAPTCHA 挑戰 畫中畫模式需要此權限 需完成 reCAPTCHA 挑戰 啟用此選項將導致某些解像度的影片失去聲音 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9713e4665..395a555e7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -136,8 +136,8 @@ 已複製至剪貼簿 稍後請在設定中選擇下載資料夾 使用懸浮視窗模式需要此權限 - reCAPTCHA 驗證 - reCAPTCHA 驗證 + reCAPTCHA 驗證 + reCAPTCHA 驗證 已請求 reCAPTCHA 驗證 懸浮視窗 直播 @@ -480,7 +480,7 @@ NewPipe 在處理檔案時被關閉 裝置上沒有剩餘的空間 進度遺失,因為檔案已被刪除 - 您確定? + 您想要清除您的下載歷史紀錄或刪除所有已下載的檔案嗎? 限制下載佇列 一次執行一個下載 開始下載 @@ -498,8 +498,8 @@ 變更下載資料夾以使其生效 切換服務,目前已選取: - 影片 - + %s 影片 + 預設 Kiosk 沒有人在看 @@ -515,12 +515,12 @@ 語言將會在重新啟動應用程式後變更。 快轉/快退搜尋持續時間 PeerTube 站臺 - 設定您最愛的 PeerTube 站臺 - 在 https://joinpeertube.org/instances#instances-list 上找到最適合您的站臺 + 選取您最愛的 PeerTube 站臺 + 在 %s 上找到最適合您的站臺 新增站臺 輸入站臺 URL - 驗證站臺失敗 - 僅支援 https URL + 無法驗證站臺 + 僅支援 HTTPS URL 站臺已存在 本機 最近新增 @@ -529,4 +529,14 @@ 正在恢復 無法復原此下載 選擇一個站臺 + 啟用鎖定畫面影片縮圖 + 使用背景播放器時,鎖定畫面上將會顯示影片縮圖 + 清除下載歷史紀錄 + 刪除已下載的檔案 + 已刪除 %1$s 個下載 + 給予顯示在其他應用程式上層的權限 + 應用程式語言 + 系統預設值 + 解決後請按「完成」 + 完成 \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index c64ed1256..88925a598 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -45,6 +45,7 @@ + diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 4813833d1..cdb29ca86 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -31,20 +31,20 @@ seek_duration 10000 - 5 seconds - 10 seconds - 15 seconds - 20 seconds - 25 seconds - 30 seconds + 5 seconds + 10 seconds + 15 seconds + 20 seconds + 25 seconds + 30 seconds - 5000 - 10000 - 15000 - 20000 - 25000 - 30000 + 5000 + 10000 + 15000 + 20000 + 25000 + 30000 minimize_on_exit_key @@ -175,6 +175,8 @@ main_page_content enable_playback_resume enable_playback_state_lists + + app_language_key enable_lock_screen_video_thumbnail import_data @@ -924,6 +926,138 @@ ZW + + + system + ar + az + ast + be + bg-bd + bn + ca + cs + da + de + el + en + eo + es + et + eu + fa + fi + fil + fr + gl + he + hi + hr + hu + hy + ia + in + it + ja + ko + ku + lt + mk + ms + nb-no + ne + nl + nl-be + oc + pa + pl + pr + pt + pt-br + ro + ru + sk + sl + sq + sr + sv + ta + te + th + tr + uk + ur + vi + zh-cn + zh-hk + zh-tw + + + @string/systems_language + العربية + Azərbaycan dili + Asturianu + Беларуская + български език + বাংলা + Català + Čeština + Dansk + Deutsch + Ελληνικά + English + Esperanto + Español + Eesti keel + Euskara + فارسی + Suomen kieli + Wikang Filipino + Français + Galego + עברית + हिन्दी + Hrvatski + magyar + Հայերեն + Interlingua + Bahasa Indonesia + Italiano + 日本語 + 한국어 + کوردی + Lietuvių kalba + македонски јазик + Bahasa Melayu + Norsk bokmål + Nनेपाली + Nederlands (NL) + Nederlands (BE) + Occitan + ਪੰਜਾਬੀ + Polski + Pirate Language + Português (PT) + Português (BR) + Română + русский язык + Slovenčina + Slovenščina + Shqip + Српски + Svenska + தமிழ் + తెలుగు + ไทย + Türkçe + українська мова + اردو + Tiếng Việt + 简体中文 + 繁體中文(廣東話) + 正體中文 + + limit_mobile_data_usage limit_data_usage_none diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb17fcd50..a2c303c17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -227,6 +227,7 @@ Could not read saved tabs, so using default ones Restore defaults Do you want to restore defaults? + Give permission to display over other apps Sorry, that should not have happened. Guru Meditation. @@ -326,10 +327,12 @@ MD5 SHA-1 - reCAPTCHA - reCAPTCHA challenge + + reCAPTCHA + reCAPTCHA challenge + Press \"Done\" when solved reCAPTCHA challenge requested - + Done Download Allowed characters in filenames @@ -569,8 +572,10 @@ Progress lost, because the file was deleted Connection timeout Cannot recover this download - Clear finished downloads - Are you sure? + Clear download history + Do you want to clear your download history or delete all downloaded files? + Delete downloaded files + Deleted %1$s downloads Stop Maximum retries Maximum number of attempts before canceling the download @@ -587,5 +592,6 @@ Use SAF The \'Storage Access Framework\' allows downloads to an external SD card.\nNote: Some devices are incompatible Choose an instance - + App language + System default diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 679d4d1cd..8047ef7f4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -60,6 +60,7 @@ @drawable/ic_grid_black_24dp @drawable/ic_delete_black_24dp @drawable/ic_settings_update_black + @drawable/ic_done_black_24dp @color/light_separator_color @color/light_contrast_background_color @@ -129,6 +130,7 @@ @drawable/ic_delete_white_24dp @drawable/ic_pause_white_24dp @drawable/ic_settings_update_white + @drawable/ic_done_white_24dp @color/dark_separator_color @color/dark_contrast_background_color diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 4044e92d8..197c14487 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -3,6 +3,16 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:title="@string/content"> + + +