diff --git a/app/build.gradle b/app/build.gradle index 12f1ac5fe..a1afd63a2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,7 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' android { compileSdkVersion 28 @@ -8,8 +11,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 780 - versionName "0.17.3" + versionCode 790 + versionName "0.17.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -44,20 +47,22 @@ android { ext { androidxLibVersion = '1.0.0' - exoPlayerLibVersion = '2.10.5' + exoPlayerLibVersion = '2.10.8' roomDbLibVersion = '2.1.0' leakCanaryLibVersion = '1.5.4' //1.6.1 - okHttpLibVersion = '3.12.5' //3.12.6 + okHttpLibVersion = '3.12.6' icepickLibVersion = '3.2.0' stethoLibVersion = '1.5.0' } dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { exclude module: 'support-annotations' }) - implementation 'com.github.teamnewpipe:NewPipeExtractor:06f2144e4daa10' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:5c420340ceb39' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' @@ -89,13 +94,14 @@ 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 "androidx.room:room-runtime:${roomDbLibVersion}" implementation "androidx.room:room-rxjava2:${roomDbLibVersion}" - annotationProcessor "androidx.room:room-compiler:${roomDbLibVersion}" + kapt "androidx.room:room-compiler:${roomDbLibVersion}" implementation "frankiesardo:icepick:${icepickLibVersion}" - annotationProcessor "frankiesardo:icepick-processor:${icepickLibVersion}" + kapt "frankiesardo:icepick-processor:${icepickLibVersion}" debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryLibVersion}" releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${leakCanaryLibVersion}" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 20596c6eb..53a9ecd5a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -17,6 +17,9 @@ #} -dontobfuscate +-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } +-keep class org.ocpsoft.prettytime.i18n.** { *; } + -keep class org.mozilla.javascript.** { *; } -keep class org.mozilla.classfile.ClassFileWriter diff --git a/app/src/debug/java/org/schabi/newpipe/DebugApp.java b/app/src/debug/java/org/schabi/newpipe/DebugApp.java index 154fb5a8c..66f73d1e9 100644 --- a/app/src/debug/java/org/schabi/newpipe/DebugApp.java +++ b/app/src/debug/java/org/schabi/newpipe/DebugApp.java @@ -15,7 +15,7 @@ import com.squareup.leakcanary.LeakCanary; import com.squareup.leakcanary.LeakDirectoryProvider; import com.squareup.leakcanary.RefWatcher; -import org.schabi.newpipe.extractor.Downloader; +import org.schabi.newpipe.extractor.downloader.Downloader; import java.io.File; import java.util.concurrent.TimeUnit; @@ -39,7 +39,7 @@ public class DebugApp extends App { @Override protected Downloader getDownloader() { - return org.schabi.newpipe.Downloader.init(new OkHttpClient.Builder() + return DownloaderImpl.init(new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor())); } diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index bdf1e7837..8698b3c93 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -21,13 +21,14 @@ import org.acra.config.ACRAConfiguration; import org.acra.config.ACRAConfigurationException; import org.acra.config.ConfigurationBuilder; import org.acra.sender.ReportSenderFactory; -import org.schabi.newpipe.extractor.Downloader; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.downloader.Downloader; import org.schabi.newpipe.report.AcraReportSenderFactory; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.settings.SettingsActivity; import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.StateSaver; import java.io.IOException; @@ -95,7 +96,10 @@ public class App extends Application { SettingsActivity.initSettings(this); NewPipe.init(getDownloader(), - org.schabi.newpipe.util.Localization.getPreferredExtractorLocal(this)); + Localization.getPreferredLocalization(this), + Localization.getPreferredContentCountry(this)); + Localization.init(); + StateSaver.init(this); initNotificationChannel(); @@ -109,7 +113,7 @@ public class App extends Application { } protected Downloader getDownloader() { - return org.schabi.newpipe.Downloader.init(null); + return DownloaderImpl.init(null); } private void configureRxJavaErrorHandler() { diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java index ccdb806ef..d4795cde2 100644 --- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java @@ -107,6 +107,7 @@ public abstract class BaseFragment extends Fragment { if (DEBUG) Log.d(TAG, "setTitle() called with: title = [" + title + "]"); if((!useAsFrontPage || mIsVisibleToUser) && (activity != null && activity.getSupportActionBar() != null)) { + activity.getSupportActionBar().setDisplayShowTitleEnabled(true); activity.getSupportActionBar().setTitle(title); } } diff --git a/app/src/main/java/org/schabi/newpipe/Downloader.java b/app/src/main/java/org/schabi/newpipe/Downloader.java deleted file mode 100644 index ae76d5623..000000000 --- a/app/src/main/java/org/schabi/newpipe/Downloader.java +++ /dev/null @@ -1,280 +0,0 @@ -package org.schabi.newpipe; - -import androidx.annotation.Nullable; -import android.text.TextUtils; - -import org.schabi.newpipe.extractor.DownloadRequest; -import org.schabi.newpipe.extractor.DownloadResponse; -import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; -import org.schabi.newpipe.extractor.utils.Localization; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; - - -/* - * Created by Christian Schabesberger on 28.01.16. - * - * Copyright (C) Christian Schabesberger 2016 - * Downloader.java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - -public class Downloader implements org.schabi.newpipe.extractor.Downloader { - public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"; - - private static Downloader instance; - private String mCookies; - private final OkHttpClient client; - - private Downloader(OkHttpClient.Builder builder) { - this.client = builder - .readTimeout(30, TimeUnit.SECONDS) - //.cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"), 16 * 1024 * 1024)) - .build(); - } - - /** - * It's recommended to call exactly once in the entire lifetime of the application. - * - * @param builder if null, default builder will be used - */ - public static Downloader init(@Nullable OkHttpClient.Builder builder) { - return instance = new Downloader(builder != null ? builder : new OkHttpClient.Builder()); - } - - public static Downloader getInstance() { - return instance; - } - - public String getCookies() { - return mCookies; - } - - public void setCookies(String cookies) { - mCookies = cookies; - } - - /** - * Get the size of the content that the url is pointing by firing a HEAD request. - * - * @param url an url pointing to the content - * @return the size of the content, in bytes - */ - public long getContentLength(String url) throws IOException { - Response response = null; - try { - final Request request = new Request.Builder() - .head().url(url) - .addHeader("User-Agent", USER_AGENT) - .build(); - response = client.newCall(request).execute(); - - String contentLength = response.header("Content-Length"); - return contentLength == null ? -1 : Long.parseLong(contentLength); - } catch (NumberFormatException e) { - throw new IOException("Invalid content length", e); - } finally { - if (response != null) { - response.close(); - } - } - } - - /** - * Download the text file at the supplied URL as in download(String), - * but set the HTTP header field "Accept-Language" to the supplied string. - * - * @param siteUrl the URL of the text file to return the contents of - * @param localization the language and country (usually a 2-character code) to set - * @return the contents of the specified text file - */ - @Override - public String download(String siteUrl, Localization localization) throws IOException, ReCaptchaException { - Map requestProperties = new HashMap<>(); - requestProperties.put("Accept-Language", localization.getLanguage()); - return download(siteUrl, requestProperties); - } - - /** - * Download the text file at the supplied URL as in download(String), - * but set the HTTP headers included in the customProperties map. - * - * @param siteUrl the URL of the text file to return the contents of - * @param customProperties set request header properties - * @return the contents of the specified text file - * @throws IOException - */ - @Override - public String download(String siteUrl, Map customProperties) throws IOException, ReCaptchaException { - return getBody(siteUrl, customProperties).string(); - } - - public InputStream stream(String siteUrl) throws IOException { - try { - return getBody(siteUrl, Collections.emptyMap()).byteStream(); - } catch (ReCaptchaException e) { - throw new IOException(e.getMessage(), e.getCause()); - } - } - - private ResponseBody getBody(String siteUrl, Map customProperties) throws IOException, ReCaptchaException { - final Request.Builder requestBuilder = new Request.Builder() - .method("GET", null).url(siteUrl); - - for (Map.Entry header : customProperties.entrySet()) { - requestBuilder.addHeader(header.getKey(), header.getValue()); - } - - if (!customProperties.containsKey("User-Agent")) { - requestBuilder.header("User-Agent", USER_AGENT); - } - - if (!TextUtils.isEmpty(mCookies)) { - requestBuilder.addHeader("Cookie", mCookies); - } - - final Request request = requestBuilder.build(); - final Response response = client.newCall(request).execute(); - final ResponseBody body = response.body(); - - if (response.code() == 429) { - throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); - } - - if (body == null) { - response.close(); - return null; - } - - return body; - } - - /** - * Download (via HTTP) the text file located at the supplied URL, and return its contents. - * Primarily intended for downloading web pages. - * - * @param siteUrl the URL of the text file to download - * @return the contents of the specified text file - */ - @Override - public String download(String siteUrl) throws IOException, ReCaptchaException { - return download(siteUrl, Collections.emptyMap()); - } - - - @Override - public DownloadResponse get(String siteUrl, DownloadRequest request) throws IOException, ReCaptchaException { - final Request.Builder requestBuilder = new Request.Builder() - .method("GET", null).url(siteUrl); - - Map> requestHeaders = request.getRequestHeaders(); - // set custom headers in request - for (Map.Entry> pair : requestHeaders.entrySet()) { - for(String value : pair.getValue()){ - requestBuilder.addHeader(pair.getKey(), value); - } - } - - if (!requestHeaders.containsKey("User-Agent")) { - requestBuilder.header("User-Agent", USER_AGENT); - } - - if (!TextUtils.isEmpty(mCookies)) { - requestBuilder.addHeader("Cookie", mCookies); - } - - final Request okRequest = requestBuilder.build(); - final Response response = client.newCall(okRequest).execute(); - final ResponseBody body = response.body(); - - if (response.code() == 429) { - throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); - } - - if (body == null) { - response.close(); - return null; - } - - return new DownloadResponse(body.string(), response.headers().toMultimap()); - } - - @Override - public DownloadResponse get(String siteUrl) throws IOException, ReCaptchaException { - return get(siteUrl, DownloadRequest.emptyRequest); - } - - @Override - public DownloadResponse post(String siteUrl, DownloadRequest request) throws IOException, ReCaptchaException { - - Map> requestHeaders = request.getRequestHeaders(); - if(null == requestHeaders.get("Content-Type") || requestHeaders.get("Content-Type").isEmpty()){ - // content type header is required. maybe throw an exception here - return null; - } - - String contentType = requestHeaders.get("Content-Type").get(0); - - RequestBody okRequestBody = null; - if(null != request.getRequestBody()){ - okRequestBody = RequestBody.create(MediaType.parse(contentType), request.getRequestBody()); - } - final Request.Builder requestBuilder = new Request.Builder() - .method("POST", okRequestBody).url(siteUrl); - - // set custom headers in request - for (Map.Entry> pair : requestHeaders.entrySet()) { - for(String value : pair.getValue()){ - requestBuilder.addHeader(pair.getKey(), value); - } - } - - if (!requestHeaders.containsKey("User-Agent")) { - requestBuilder.header("User-Agent", USER_AGENT); - } - - if (!TextUtils.isEmpty(mCookies)) { - requestBuilder.addHeader("Cookie", mCookies); - } - - final Request okRequest = requestBuilder.build(); - final Response response = client.newCall(okRequest).execute(); - final ResponseBody body = response.body(); - - if (response.code() == 429) { - throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); - } - - if (body == null) { - response.close(); - return null; - } - - return new DownloadResponse(body.string(), response.headers().toMultimap()); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java new file mode 100644 index 000000000..5738cf61a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -0,0 +1,156 @@ +package org.schabi.newpipe; + +import android.text.TextUtils; + +import org.schabi.newpipe.extractor.downloader.Downloader; +import org.schabi.newpipe.extractor.downloader.Request; +import org.schabi.newpipe.extractor.downloader.Response; +import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nonnull; + +import androidx.annotation.Nullable; +import okhttp3.OkHttpClient; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; + +public class DownloaderImpl extends Downloader { + public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"; + + private static DownloaderImpl instance; + private String mCookies; + private OkHttpClient client; + + private DownloaderImpl(OkHttpClient.Builder builder) { + this.client = builder + .readTimeout(30, TimeUnit.SECONDS) + //.cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"), 16 * 1024 * 1024)) + .build(); + } + + /** + * It's recommended to call exactly once in the entire lifetime of the application. + * + * @param builder if null, default builder will be used + */ + public static DownloaderImpl init(@Nullable OkHttpClient.Builder builder) { + return instance = new DownloaderImpl(builder != null ? builder : new OkHttpClient.Builder()); + } + + public static DownloaderImpl getInstance() { + return instance; + } + + public String getCookies() { + return mCookies; + } + + public void setCookies(String cookies) { + mCookies = cookies; + } + + /** + * Get the size of the content that the url is pointing by firing a HEAD request. + * + * @param url an url pointing to the content + * @return the size of the content, in bytes + */ + public long getContentLength(String url) throws IOException { + try { + final Response response = head(url); + return Long.parseLong(response.getHeader("Content-Length")); + } catch (NumberFormatException e) { + throw new IOException("Invalid content length", e); + } catch (ReCaptchaException e) { + throw new IOException(e); + } + } + + public InputStream stream(String siteUrl) throws IOException { + try { + final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder() + .method("GET", null).url(siteUrl) + .addHeader("User-Agent", USER_AGENT); + + if (!TextUtils.isEmpty(mCookies)) { + requestBuilder.addHeader("Cookie", mCookies); + } + + final okhttp3.Request request = requestBuilder.build(); + final okhttp3.Response response = client.newCall(request).execute(); + final ResponseBody body = response.body(); + + if (response.code() == 429) { + throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); + } + + if (body == null) { + response.close(); + return null; + } + + return body.byteStream(); + } catch (ReCaptchaException e) { + throw new IOException(e.getMessage(), e.getCause()); + } + } + + @Override + public Response execute(@Nonnull Request request) throws IOException, ReCaptchaException { + final String httpMethod = request.httpMethod(); + final String url = request.url(); + final Map> headers = request.headers(); + final byte[] dataToSend = request.dataToSend(); + + RequestBody requestBody = null; + if (dataToSend != null) { + requestBody = RequestBody.create(null, dataToSend); + } + + final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder() + .method(httpMethod, requestBody).url(url) + .addHeader("User-Agent", USER_AGENT); + + if (!TextUtils.isEmpty(mCookies)) { + requestBuilder.addHeader("Cookie", mCookies); + } + + for (Map.Entry> pair : headers.entrySet()) { + final String headerName = pair.getKey(); + final List headerValueList = pair.getValue(); + + if (headerValueList.size() > 1) { + requestBuilder.removeHeader(headerName); + for (String headerValue : headerValueList) { + requestBuilder.addHeader(headerName, headerValue); + } + } else if (headerValueList.size() == 1) { + requestBuilder.header(headerName, headerValueList.get(0)); + } + + } + + final okhttp3.Response response = client.newCall(requestBuilder.build()).execute(); + + if (response.code() == 429) { + response.close(); + + throw new ReCaptchaException("reCaptcha Challenge requested", url); + } + + final ResponseBody body = response.body(); + String responseBodyToReturn = null; + + if (body != null) { + responseBodyToReturn = body.string(); + } + + return new Response(response.code(), response.message(), response.headers().toMultimap(), responseBodyToReturn); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/ImageDownloader.java b/app/src/main/java/org/schabi/newpipe/ImageDownloader.java index eb5e92e88..dfb7d3276 100644 --- a/app/src/main/java/org/schabi/newpipe/ImageDownloader.java +++ b/app/src/main/java/org/schabi/newpipe/ImageDownloader.java @@ -40,7 +40,7 @@ public class ImageDownloader extends BaseImageDownloader { } protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException { - final Downloader downloader = (Downloader) NewPipe.getDownloader(); + final DownloaderImpl downloader = (DownloaderImpl) NewPipe.getDownloader(); return downloader.stream(imageUri); } } diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index 7f6af89c1..0a2d51b53 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -112,7 +112,7 @@ public class ReCaptchaActivity extends AppCompatActivity { // find cookies : s_gl & goojf and Add cookies to Downloader if (find_access_cookies(cookies)) { // Give cookies to Downloader class - Downloader.getInstance().setCookies(mCookies); + DownloaderImpl.getInstance().setCookies(mCookies); // Closing activity and return to parent setResult(RESULT_OK); 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 1d536ea1a..59bffa933 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -40,12 +40,12 @@ import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.localization.Localization; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.SubtitlesStream; import org.schabi.newpipe.extractor.stream.VideoStream; -import org.schabi.newpipe.extractor.utils.Localization; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.settings.NewPipeSettings; @@ -488,35 +488,24 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck } private int getSubtitleIndexBy(List streams) { - Localization loc = NewPipe.getPreferredLocalization(); + final Localization preferredLocalization = NewPipe.getPreferredLocalization(); + int candidate = 0; for (int i = 0; i < streams.size(); i++) { - Locale streamLocale = streams.get(i).getLocale(); - String tag = streamLocale.getLanguage().concat("-").concat(streamLocale.getCountry()); - if (tag.equalsIgnoreCase(loc.getLanguage())) { - return i; + final Locale streamLocale = streams.get(i).getLocale(); + + final boolean languageEquals = streamLocale.getLanguage() != null && preferredLocalization.getLanguageCode() != null && + streamLocale.getLanguage().equals(new Locale(preferredLocalization.getLanguageCode()).getLanguage()); + final boolean countryEquals = streamLocale.getCountry() != null && streamLocale.getCountry().equals(preferredLocalization.getCountryCode()); + + if (languageEquals) { + if (countryEquals) return i; + + candidate = i; } } - // fallback - // 1st loop match country & language - // 2nd loop match language only - int index = loc.getLanguage().indexOf("-"); - String lang = index > 0 ? loc.getLanguage().substring(0, index) : loc.getLanguage(); - - for (int j = 0; j < 2; j++) { - for (int i = 0; i < streams.size(); i++) { - Locale streamLocale = streams.get(i).getLocale(); - - if (streamLocale.getLanguage().equalsIgnoreCase(lang)) { - if (j > 0 || streamLocale.getCountry().equalsIgnoreCase(loc.getCountry())) { - return i; - } - } - } - } - - return 0; + return candidate; } StoredDirectoryHelper mainStorageAudio = null; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index e0661a49f..720e0f216 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.fragments; +import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -15,7 +16,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentPagerAdapter; +import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; @@ -52,32 +53,19 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte super.onCreate(savedInstanceState); setHasOptionsMenu(true); - destroyOldFragments(); - tabsManager = TabsManager.getManager(activity); tabsManager.setSavedTabsListener(() -> { if (DEBUG) { Log.d(TAG, "TabsManager.SavedTabsChangeListener: onTabsChanged called, isResumed = " + isResumed()); } if (isResumed()) { - updateTabs(); + setupTabs(); } else { hasTabsChanged = true; } }); } - private void destroyOldFragments() { - for (Fragment fragment : getChildFragmentManager().getFragments()) { - if (fragment != null) { - getChildFragmentManager() - .beginTransaction() - .remove(fragment) - .commitNowAllowingStateLoss(); - } - } - } - @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_main, container, false); @@ -90,23 +78,17 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte tabLayout = rootView.findViewById(R.id.main_tab_layout); viewPager = rootView.findViewById(R.id.pager); - /* Nested fragment, use child fragment here to maintain backstack in view pager. */ - pagerAdapter = new SelectedTabsPagerAdapter(getChildFragmentManager()); - viewPager.setAdapter(pagerAdapter); - tabLayout.setupWithViewPager(viewPager); tabLayout.addOnTabSelectedListener(this); - updateTabs(); + + setupTabs(); } @Override public void onResume() { super.onResume(); - if (hasTabsChanged) { - hasTabsChanged = false; - updateTabs(); - } + if (hasTabsChanged) setupTabs(); } @Override @@ -153,45 +135,42 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte // Tabs //////////////////////////////////////////////////////////////////////////*/ - public void updateTabs() { + public void setupTabs() { tabsList.clear(); tabsList.addAll(tabsManager.getTabs()); - pagerAdapter.notifyDataSetChanged(); - viewPager.setOffscreenPageLimit(pagerAdapter.getCount()); - updateTabsIcon(); - updateTabsContentDescription(); - updateCurrentTitle(); + if (pagerAdapter == null || !pagerAdapter.sameTabs(tabsList)) { + pagerAdapter = new SelectedTabsPagerAdapter(requireContext(), getChildFragmentManager(), tabsList); + } + // Clear previous tabs/fragments and set new adapter + viewPager.setAdapter(pagerAdapter); + viewPager.setOffscreenPageLimit(tabsList.size()); + + updateTabsIconAndDescription(); + updateTitleForTab(viewPager.getCurrentItem()); + + hasTabsChanged = false; } - private void updateTabsIcon() { + private void updateTabsIconAndDescription() { for (int i = 0; i < tabsList.size(); i++) { final TabLayout.Tab tabToSet = tabLayout.getTabAt(i); if (tabToSet != null) { - tabToSet.setIcon(tabsList.get(i).getTabIconRes(activity)); + final Tab tab = tabsList.get(i); + tabToSet.setIcon(tab.getTabIconRes(requireContext())); + tabToSet.setContentDescription(tab.getTabName(requireContext())); } } } - private void updateTabsContentDescription() { - for (int i = 0; i < tabsList.size(); i++) { - final TabLayout.Tab tabToSet = tabLayout.getTabAt(i); - if (tabToSet != null) { - final Tab t = tabsList.get(i); - tabToSet.setIcon(t.getTabIconRes(activity)); - tabToSet.setContentDescription(t.getTabName(activity)); - } - } - } - - private void updateCurrentTitle() { - setTitle(tabsList.get(viewPager.getCurrentItem()).getTabName(requireContext())); + private void updateTitleForTab(int tabPosition) { + setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } @Override public void onTabSelected(TabLayout.Tab selectedTab) { if (DEBUG) Log.d(TAG, "onTabSelected() called with: selectedTab = [" + selectedTab + "]"); - updateCurrentTitle(); + updateTitleForTab(selectedTab.getPosition()); } @Override @@ -201,29 +180,33 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public void onTabReselected(TabLayout.Tab tab) { if (DEBUG) Log.d(TAG, "onTabReselected() called with: tab = [" + tab + "]"); - updateCurrentTitle(); + updateTitleForTab(tab.getPosition()); } - private class SelectedTabsPagerAdapter extends FragmentPagerAdapter { + private static class SelectedTabsPagerAdapter extends FragmentStatePagerAdapter { + private final Context context; + private final List internalTabsList; - private SelectedTabsPagerAdapter(FragmentManager fragmentManager) { - super(fragmentManager); + private SelectedTabsPagerAdapter(Context context, FragmentManager fragmentManager, List tabsList) { + super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); + this.context = context; + this.internalTabsList = new ArrayList<>(tabsList); } @Override public Fragment getItem(int position) { - final Tab tab = tabsList.get(position); + final Tab tab = internalTabsList.get(position); Throwable throwable = null; Fragment fragment = null; try { - fragment = tab.getFragment(); + fragment = tab.getFragment(context); } catch (ExtractionException e) { throwable = e; } if (throwable != null) { - ErrorActivity.reportError(activity, throwable, activity.getClass(), null, + ErrorActivity.reportError(context, throwable, null, null, ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, "none", "", R.string.app_ui_crash)); return new BlankFragment(); } @@ -244,15 +227,11 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public int getCount() { - return tabsList.size(); + return internalTabsList.size(); } - @Override - public void destroyItem(ViewGroup container, int position, Object object) { - getChildFragmentManager() - .beginTransaction() - .remove((Fragment) object) - .commitNowAllowingStateLoss(); + public boolean sameTabs(List tabsToCompare) { + return internalTabsList.equals(tabsToCompare); } } } 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 37d8851ea..14e989625 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 @@ -1067,7 +1067,13 @@ public class VideoDetailFragment uploaderThumb.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.buddy)); if (info.getViewCount() >= 0) { - videoCountView.setText(Localization.localizeViewCount(activity, info.getViewCount())); + if (info.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) { + videoCountView.setText(Localization.listeningCount(activity, info.getViewCount())); + } else if (info.getStreamType().equals(StreamType.LIVE_STREAM)) { + videoCountView.setText(Localization.watchingCount(activity, info.getViewCount())); + } else { + videoCountView.setText(Localization.localizeViewCount(activity, info.getViewCount())); + } videoCountView.setVisibility(View.VISIBLE); } else { videoCountView.setVisibility(View.GONE); @@ -1120,9 +1126,15 @@ public class VideoDetailFragment videoTitleToggleArrow.setVisibility(View.VISIBLE); videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); videoDescriptionRootLayout.setVisibility(View.GONE); - if (!TextUtils.isEmpty(info.getUploadDate())) { - videoUploadDateView.setText(Localization.localizeDate(activity, info.getUploadDate())); + + if (info.getUploadDate() != null) { + videoUploadDateView.setText(Localization.localizeUploadDate(activity, info.getUploadDate().date().getTime())); + videoUploadDateView.setVisibility(View.VISIBLE); + } else { + videoUploadDateView.setText(null); + videoUploadDateView.setVisibility(View.GONE); } + prepareDescription(info.getDescription()); updateProgressInfo(info); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index 764af271a..9a8e1fd17 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -111,6 +111,8 @@ public abstract class BaseListInfoFragment super.startLoading(forceLoad); showListFooter(false); + infoListAdapter.clearStreamItemList(); + currentInfo = null; if (currentWorker != null) currentWorker.dispose(); currentWorker = loadResult(forceLoad) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java new file mode 100644 index 000000000..35b68b094 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java @@ -0,0 +1,51 @@ +package org.schabi.newpipe.fragments.list.kiosk; + +import android.os.Bundle; + +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.kiosk.KioskList; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.KioskTranslator; +import org.schabi.newpipe.util.ServiceHelper; + +public class DefaultKioskFragment extends KioskFragment { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (serviceId < 0) { + updateSelectedDefaultKiosk(); + } + } + + @Override + public void onResume() { + super.onResume(); + + if (serviceId != ServiceHelper.getSelectedServiceId(requireContext())) { + if (currentWorker != null) currentWorker.dispose(); + updateSelectedDefaultKiosk(); + reloadContent(); + } + } + + private void updateSelectedDefaultKiosk() { + try { + serviceId = ServiceHelper.getSelectedServiceId(requireContext()); + + final KioskList kioskList = NewPipe.getService(serviceId).getKioskList(); + kioskId = kioskList.getDefaultKioskId(); + url = kioskList.getListLinkHandlerFactoryByType(kioskId).fromId(kioskId).getUrl(); + + kioskTranslatedName = KioskTranslator.getTranslatedKioskName(kioskId, requireContext()); + name = kioskTranslatedName; + + currentInfo = null; + currentNextPageUrl = null; + } catch (ExtractionException e) { + onUnrecoverableError(e, UserAction.REQUESTED_KIOSK, "none", "Loading default kiosk from selected service", 0); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 6eaa2ea70..d082b8078 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -4,6 +4,8 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; + +import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -17,10 +19,12 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.KioskTranslator; +import org.schabi.newpipe.util.Localization; import icepick.State; import io.reactivex.Single; @@ -52,6 +56,8 @@ public class KioskFragment extends BaseListInfoFragment { @State protected String kioskId = ""; protected String kioskTranslatedName; + @State + protected ContentCountry contentCountry; /*////////////////////////////////////////////////////////////////////////// @@ -87,6 +93,7 @@ public class KioskFragment extends BaseListInfoFragment { kioskTranslatedName = KioskTranslator.getTranslatedKioskName(kioskId, activity); name = kioskTranslatedName; + contentCountry = Localization.getPreferredContentCountry(requireContext()); } @Override @@ -108,6 +115,15 @@ public class KioskFragment extends BaseListInfoFragment { return inflater.inflate(R.layout.fragment_kiosk, container, false); } + @Override + public void onResume() { + super.onResume(); + + if (!Localization.getPreferredContentCountry(requireContext()).equals(contentCountry)) { + reloadContent(); + } + } + /*////////////////////////////////////////////////////////////////////////// // Menu //////////////////////////////////////////////////////////////////////////*/ @@ -127,6 +143,7 @@ public class KioskFragment extends BaseListInfoFragment { @Override public Single loadResult(boolean forceReload) { + contentCountry = Localization.getPreferredContentCountry(requireContext()); return ExtractorHelper.getKioskInfo(serviceId, url, forceReload); 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 f2bf5df39..4d94ec392 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 @@ -14,6 +14,7 @@ import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.CommentTextOnTouchListener; import org.schabi.newpipe.util.ImageDisplayConstants; +import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import java.util.regex.Matcher; @@ -101,10 +102,17 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { ellipsize(); } - if (null != item.getLikeCount()) { + if (item.getLikeCount() >= 0) { itemLikesCountView.setText(String.valueOf(item.getLikeCount())); + } else { + itemLikesCountView.setText("-"); + } + + if (item.getPublishedTime() != null) { + itemPublishedTime.setText(Localization.relativeTime(item.getPublishedTime().date())); + } else { + itemPublishedTime.setText(item.getTextualPublishedTime()); } - itemPublishedTime.setText(item.getPublishedTime()); itemView.setOnClickListener(view -> { toggleEllipsize(); diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java index ea058bc0e..c48934d10 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.info_list.holder; +import android.preference.PreferenceManager; import android.text.TextUtils; import android.view.ViewGroup; import android.widget.TextView; @@ -7,10 +8,13 @@ import android.widget.TextView; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; +import static org.schabi.newpipe.MainActivity.DEBUG; + /* * Created by Christian Schabesberger on 01.08.16. *

@@ -53,15 +57,38 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder { private String getStreamInfoDetailLine(final StreamInfoItem infoItem) { String viewsAndDate = ""; if (infoItem.getViewCount() >= 0) { - viewsAndDate = Localization.shortViewCount(itemBuilder.getContext(), infoItem.getViewCount()); - } - if (!TextUtils.isEmpty(infoItem.getUploadDate())) { - if (viewsAndDate.isEmpty()) { - viewsAndDate = infoItem.getUploadDate(); + if (infoItem.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) { + viewsAndDate = Localization.listeningCount(itemBuilder.getContext(), infoItem.getViewCount()); + } else if (infoItem.getStreamType().equals(StreamType.LIVE_STREAM)) { + viewsAndDate = Localization.watchingCount(itemBuilder.getContext(), infoItem.getViewCount()); } else { - viewsAndDate += " • " + infoItem.getUploadDate(); + viewsAndDate = Localization.shortViewCount(itemBuilder.getContext(), infoItem.getViewCount()); } } + + final String uploadDate = getFormattedRelativeUploadDate(infoItem); + if (!TextUtils.isEmpty(uploadDate)) { + if (viewsAndDate.isEmpty()) { + return uploadDate; + } + + return Localization.concatenateStrings(viewsAndDate, uploadDate); + } + return viewsAndDate; } + + private String getFormattedRelativeUploadDate(final StreamInfoItem infoItem) { + if (infoItem.getUploadDate() != null) { + String formattedRelativeTime = Localization.relativeTime(infoItem.getUploadDate().date()); + + if (DEBUG && PreferenceManager.getDefaultSharedPreferences(itemBuilder.getContext()) + .getBoolean(itemBuilder.getContext().getString(R.string.show_original_time_ago_key), false)) { + formattedRelativeTime += " (" + infoItem.getTextualUploadDate() + ")"; + } + return formattedRelativeTime; + } else { + return infoItem.getTextualUploadDate(); + } + } } 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 b3c5716bc..a07afcea9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -55,7 +55,7 @@ import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import org.schabi.newpipe.BuildConfig; -import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.DownloaderImpl; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -209,7 +209,7 @@ public abstract class BasePlayer implements this.progressUpdateReactor = new SerialDisposable(); this.databaseUpdateReactor = new CompositeDisposable(); - final String userAgent = Downloader.USER_AGENT; + final String userAgent = DownloaderImpl.USER_AGENT; final DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); this.dataSource = new PlayerDataSource(context, userAgent, bandwidthMeter); 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 68446ed9f..969c47990 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -1036,7 +1036,7 @@ public final class PopupVideoPlayer extends Service { public boolean onTouch(View v, MotionEvent event) { popupGestureDetector.onTouchEvent(event); if (playerImpl == null) return false; - if (event.getPointerCount() == 2 && !isResizing) { + if (event.getPointerCount() == 2 && !isMoving && !isResizing) { if (DEBUG) Log.d(TAG, "onTouch() 2 finger pointer detected, enabling resizing."); playerImpl.showAndAnimateControl(-1, true); playerImpl.getLoadingPanel().setVisibility(View.GONE); 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 d05c23564..0c7a4b46e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -18,7 +18,8 @@ import com.nostra13.universalimageloader.core.ImageLoader; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.utils.Localization; +import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.localization.Localization; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.FilePickerActivityHelper; @@ -53,10 +54,16 @@ public class ContentSettingsFragment extends BasePreferenceFragment { private String thumbnailLoadToggleKey; + private Localization initialSelectedLocalization; + private ContentCountry initialSelectedContentCountry; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); thumbnailLoadToggleKey = getString(R.string.download_thumbnail_key); + + initialSelectedLocalization = org.schabi.newpipe.util.Localization.getPreferredLocalization(requireContext()); + initialSelectedContentCountry = org.schabi.newpipe.util.Localization.getPreferredContentCountry(requireContext()); } @Override @@ -108,20 +115,23 @@ public class ContentSettingsFragment extends BasePreferenceFragment { startActivityForResult(i, REQUEST_EXPORT_PATH); return true; }); + } - Preference setPreferredLanguage = findPreference(getString(R.string.content_language_key)); - setPreferredLanguage.setOnPreferenceChangeListener((Preference p, Object newLanguage) -> { - Localization oldLocal = org.schabi.newpipe.util.Localization.getPreferredExtractorLocal(getActivity()); - NewPipe.setLocalization(new Localization(oldLocal.getCountry(), (String) newLanguage)); - return true; - }); + @Override + public void onDestroy() { + super.onDestroy(); - Preference setPreferredCountry = findPreference(getString(R.string.content_country_key)); - setPreferredCountry.setOnPreferenceChangeListener((Preference p, Object newCountry) -> { - Localization oldLocal = org.schabi.newpipe.util.Localization.getPreferredExtractorLocal(getActivity()); - NewPipe.setLocalization(new Localization((String) newCountry, oldLocal.getLanguage())); - return true; - }); + final Localization selectedLocalization = org.schabi.newpipe.util.Localization + .getPreferredLocalization(requireContext()); + final ContentCountry selectedContentCountry = org.schabi.newpipe.util.Localization + .getPreferredContentCountry(requireContext()); + + if (!selectedLocalization.equals(initialSelectedLocalization) + || !selectedContentCountry.equals(initialSelectedContentCountry)) { + Toast.makeText(requireContext(), R.string.localization_changes_requires_app_restart, Toast.LENGTH_LONG).show(); + + NewPipe.setupLocalization(selectedLocalization, selectedContentCountry); + } } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java index 67295d8a5..6aba2783f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java @@ -231,7 +231,7 @@ public class ChooseTabsFragment extends Fragment { break; case DEFAULT_KIOSK: if (!tabList.contains(tab)) { - returnList.add(new ChooseTabListItem(tab.getTabId(), "Default Kiosk", + returnList.add(new ChooseTabListItem(tab.getTabId(), getString(R.string.default_kiosk_page_summary), ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_hot))); } break; @@ -305,23 +305,25 @@ public class ChooseTabsFragment extends Fragment { return; } - String tabName = tab.getTabName(requireContext()); + final String tabName; switch (type) { case BLANK: - tabName = requireContext().getString(R.string.blank_page_summary); - break; - case KIOSK: - tabName = NewPipe.getNameOfService(((Tab.KioskTab) tab).getKioskServiceId()) + "/" + tabName; - break; - case CHANNEL: - tabName = NewPipe.getNameOfService(((Tab.ChannelTab) tab).getChannelServiceId()) + "/" + tabName; + tabName = getString(R.string.blank_page_summary); break; case DEFAULT_KIOSK: - tabName = "Default Kiosk"; + tabName = getString(R.string.default_kiosk_page_summary); + break; + case KIOSK: + tabName = NewPipe.getNameOfService(((Tab.KioskTab) tab).getKioskServiceId()) + "/" + tab.getTabName(requireContext()); + break; + case CHANNEL: + tabName = NewPipe.getNameOfService(((Tab.ChannelTab) tab).getChannelServiceId()) + "/" + tab.getTabName(requireContext()); + break; + default: + tabName = tab.getTabName(requireContext()); break; } - tabNameView.setText(tabName); tabIconView.setImageResource(tab.getTabIconRes(requireContext())); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java index 64ba3683b..cba3c4534 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.settings.tabs; import android.content.Context; + import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -9,22 +10,26 @@ import androidx.fragment.app.Fragment; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonSink; -import org.jsoup.helper.StringUtil; -import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.fragments.BlankFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.local.bookmark.BookmarkFragment; import org.schabi.newpipe.local.feed.FeedFragment; import org.schabi.newpipe.local.history.StatisticsPlaylistFragment; import org.schabi.newpipe.local.subscription.SubscriptionFragment; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.util.Objects; + public abstract class Tab { Tab() { } @@ -40,10 +45,12 @@ public abstract class Tab { /** * Return a instance of the fragment that this tab represent. */ - public abstract Fragment getFragment() throws ExtractionException; + public abstract Fragment getFragment(Context context) throws ExtractionException; @Override public boolean equals(Object obj) { + if (obj == this) return true; + return obj instanceof Tab && obj.getClass().equals(this.getClass()) && ((Tab) obj).getTabId() == this.getTabId(); } @@ -115,12 +122,6 @@ public abstract class Tab { return new KioskTab(jsonObject); case CHANNEL: return new ChannelTab(jsonObject); - case DEFAULT_KIOSK: - DefaultKioskTab tab = new DefaultKioskTab(); - if(!StringUtil.isBlank(tab.getKioskId())){ - return tab; - } - return null; } } @@ -133,13 +134,13 @@ public abstract class Tab { public enum Type { BLANK(new BlankTab()), + DEFAULT_KIOSK(new DefaultKioskTab()), SUBSCRIPTIONS(new SubscriptionsTab()), FEED(new FeedTab()), BOOKMARKS(new BookmarksTab()), HISTORY(new HistoryTab()), KIOSK(new KioskTab()), - CHANNEL(new ChannelTab()), - DEFAULT_KIOSK(new DefaultKioskTab()); + CHANNEL(new ChannelTab()); private Tab tab; @@ -176,7 +177,7 @@ public abstract class Tab { } @Override - public BlankFragment getFragment() { + public BlankFragment getFragment(Context context) { return new BlankFragment(); } } @@ -201,7 +202,7 @@ public abstract class Tab { } @Override - public SubscriptionFragment getFragment() { + public SubscriptionFragment getFragment(Context context) { return new SubscriptionFragment(); } @@ -227,7 +228,7 @@ public abstract class Tab { } @Override - public FeedFragment getFragment() { + public FeedFragment getFragment(Context context) { return new FeedFragment(); } } @@ -252,7 +253,7 @@ public abstract class Tab { } @Override - public BookmarkFragment getFragment() { + public BookmarkFragment getFragment(Context context) { return new BookmarkFragment(); } } @@ -277,7 +278,7 @@ public abstract class Tab { } @Override - public StatisticsPlaylistFragment getFragment() { + public StatisticsPlaylistFragment getFragment(Context context) { return new StatisticsPlaylistFragment(); } } @@ -327,7 +328,7 @@ public abstract class Tab { } @Override - public KioskFragment getFragment() throws ExtractionException { + public KioskFragment getFragment(Context context) throws ExtractionException { return KioskFragment.getInstance(kioskServiceId, kioskId); } @@ -343,6 +344,13 @@ public abstract class Tab { kioskId = jsonObject.getString(JSON_KIOSK_ID_KEY, ""); } + @Override + public boolean equals(Object obj) { + return super.equals(obj) && + kioskServiceId == ((KioskTab) obj).kioskServiceId + && Objects.equals(kioskId, ((KioskTab) obj).kioskId); + } + public int getKioskServiceId() { return kioskServiceId; } @@ -394,7 +402,7 @@ public abstract class Tab { } @Override - public ChannelFragment getFragment() { + public ChannelFragment getFragment(Context context) { return ChannelFragment.getInstance(channelServiceId, channelUrl, channelName); } @@ -412,6 +420,14 @@ public abstract class Tab { channelName = jsonObject.getString(JSON_CHANNEL_NAME_KEY, ""); } + @Override + public boolean equals(Object obj) { + return super.equals(obj) && + channelServiceId == ((ChannelTab) obj).channelServiceId + && Objects.equals(channelUrl, ((ChannelTab) obj).channelUrl) + && Objects.equals(channelName, ((ChannelTab) obj).channelName); + } + public int getChannelServiceId() { return channelServiceId; } @@ -428,22 +444,6 @@ public abstract class Tab { public static class DefaultKioskTab extends Tab { public static final int ID = 7; - private int kioskServiceId; - private String kioskId; - - protected DefaultKioskTab() { - initKiosk(); - } - - public void initKiosk() { - this.kioskServiceId = ServiceHelper.getSelectedServiceId(App.getApp()); - try { - this.kioskId = NewPipe.getService(this.kioskServiceId).getKioskList().getDefaultKioskId(); - } catch (ExtractionException e) { - this.kioskId = ""; - } - } - @Override public int getTabId() { return ID; @@ -451,27 +451,31 @@ public abstract class Tab { @Override public String getTabName(Context context) { - return KioskTranslator.getTranslatedKioskName(kioskId, context); + return KioskTranslator.getTranslatedKioskName(getDefaultKioskId(context), context); } @DrawableRes @Override public int getTabIconRes(Context context) { - final int kioskIcon = KioskTranslator.getKioskIcons(kioskId, context); - - if (kioskIcon <= 0) { - throw new IllegalStateException("Kiosk ID is not valid: \"" + kioskId + "\""); - } - - return kioskIcon; + return KioskTranslator.getKioskIcons(getDefaultKioskId(context), context); } @Override - public KioskFragment getFragment() throws ExtractionException { - return KioskFragment.getInstance(kioskServiceId, kioskId); + public DefaultKioskFragment getFragment(Context context) throws ExtractionException { + return new DefaultKioskFragment(); } - public String getKioskId() { + private String getDefaultKioskId(Context context) { + final int kioskServiceId = ServiceHelper.getSelectedServiceId(context); + + String kioskId = ""; + try { + final StreamingService service = NewPipe.getService(kioskServiceId); + kioskId = service.getKioskList().getDefaultKioskId(); + } catch (ExtractionException e) { + ErrorActivity.reportError(context, e, null, null, + ErrorActivity.ErrorInfo.make(UserAction.REQUESTED_KIOSK, "none", "Loading default kiosk from selected service", 0)); + } return kioskId; } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java index 9553e47e1..9f54d59f6 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java @@ -1,7 +1,5 @@ package org.schabi.newpipe.settings.tabs; -import androidx.annotation.Nullable; - import com.grack.nanojson.JsonArray; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; @@ -9,18 +7,25 @@ import com.grack.nanojson.JsonParserException; import com.grack.nanojson.JsonStringWriter; import com.grack.nanojson.JsonWriter; -import org.jsoup.helper.StringUtil; - import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; +import androidx.annotation.Nullable; + /** * Class to get a JSON representation of a list of tabs, and the other way around. */ public class TabsJsonHelper { private static final String JSON_TABS_ARRAY_KEY = "tabs"; + private static final List FALLBACK_INITIAL_TABS_LIST = Collections.unmodifiableList(Arrays.asList( + Tab.Type.DEFAULT_KIOSK.getTab(), + Tab.Type.SUBSCRIPTIONS.getTab(), + Tab.Type.BOOKMARKS.getTab() + )); + public static class InvalidJsonException extends Exception { private InvalidJsonException() { super(); @@ -83,16 +88,6 @@ public class TabsJsonHelper { return returnTabs; } - public static List getDefaultTabs(){ - List tabs = new ArrayList<>(); - Tab.DefaultKioskTab tab = new Tab.DefaultKioskTab(); - if(!StringUtil.isBlank(tab.getKioskId())){ - tabs.add(tab); - } - tabs.add(Tab.Type.SUBSCRIPTIONS.getTab()); - tabs.add(Tab.Type.BOOKMARKS.getTab()); - return Collections.unmodifiableList(tabs); - } /** * Get a JSON representation from a list of tabs. * @@ -112,4 +107,8 @@ public class TabsJsonHelper { jsonWriter.end(); return jsonWriter.done(); } + + public static List getDefaultTabs(){ + return FALLBACK_INITIAL_TABS_LIST; + } } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index c4471942e..0cebe5af3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -32,7 +32,7 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.SuggestionExtractor; +import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; 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 08c9c6d98..9274df848 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -2,24 +2,26 @@ package org.schabi.newpipe.util; import android.content.Context; import android.content.SharedPreferences; -import android.content.res.Resources; import android.preference.PreferenceManager; -import androidx.annotation.NonNull; -import androidx.annotation.PluralsRes; -import androidx.annotation.StringRes; import android.text.TextUtils; +import org.ocpsoft.prettytime.PrettyTime; +import org.ocpsoft.prettytime.units.Decade; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.localization.ContentCountry; import java.text.DateFormat; import java.text.NumberFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Calendar; 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. * @@ -42,11 +44,16 @@ import java.util.Locale; public class Localization { - public final static String DOT_SEPARATOR = " • "; + private static PrettyTime prettyTime; + private static final String DOT_SEPARATOR = " • "; private Localization() { } + public static void init() { + initPrettyTime(); + } + @NonNull public static String concatenateStrings(final String... strings) { return concatenateStrings(Arrays.asList(strings)); @@ -69,16 +76,18 @@ public class Localization { return stringBuilder.toString(); } - public static org.schabi.newpipe.extractor.utils.Localization getPreferredExtractorLocal(Context context) { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + public static org.schabi.newpipe.extractor.localization.Localization getPreferredLocalization(final Context context) { + final String contentLanguage = PreferenceManager + .getDefaultSharedPreferences(context) + .getString(context.getString(R.string.content_language_key), context.getString(R.string.default_language_value)); + return org.schabi.newpipe.extractor.localization.Localization.fromLocalizationCode(contentLanguage); + } - String languageCode = sp.getString(context.getString(R.string.content_language_key), - context.getString(R.string.default_language_value)); - - String countryCode = sp.getString(context.getString(R.string.content_country_key), - context.getString(R.string.default_country_value)); - - return new org.schabi.newpipe.extractor.utils.Localization(countryCode, languageCode); + public static ContentCountry getPreferredContentCountry(final Context context) { + final String contentCountry = PreferenceManager + .getDefaultSharedPreferences(context) + .getString(context.getString(R.string.content_country_key), context.getString(R.string.default_country_value)); + return new ContentCountry(contentCountry); } public static Locale getPreferredLocale(Context context) { @@ -106,27 +115,12 @@ public class Localization { return nf.format(number); } - private static String formatDate(Context context, String date) { - Locale locale = getPreferredLocale(context); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date datum = null; - try { - datum = formatter.parse(date); - } catch (ParseException e) { - e.printStackTrace(); - } - - DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, locale); - - return df.format(datum); + public static String formatDate(Date date) { + return DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()).format(date); } - public static String localizeDate(Context context, String date) { - Resources res = context.getResources(); - String dateString = res.getString(R.string.upload_date_text); - - String formattedDate = formatDate(context, date); - return String.format(dateString, formattedDate); + public static String localizeUploadDate(Context context, Date date) { + return context.getString(R.string.upload_date_text, formatDate(date)); } public static String localizeViewCount(Context context, long viewCount) { @@ -153,6 +147,14 @@ public class Localization { } } + public static String listeningCount(Context context, long listeningCount) { + return getQuantity(context, R.plurals.listening, R.string.no_one_listening, listeningCount, shortCount(context, listeningCount)); + } + + public static String watchingCount(Context context, long watchingCount) { + return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, shortCount(context, watchingCount)); + } + public static String shortViewCount(Context context, long viewCount) { return getQuantity(context, R.plurals.views, R.string.no_views, viewCount, shortCount(context, viewCount)); } @@ -192,4 +194,26 @@ public class Localization { } return output; } + + /*////////////////////////////////////////////////////////////////////////// + // Pretty Time + //////////////////////////////////////////////////////////////////////////*/ + + private static void initPrettyTime() { + prettyTime = new PrettyTime(Locale.getDefault()); + // 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); + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java index 49a7125ed..312c47263 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -10,7 +10,7 @@ import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; -import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.DownloaderImpl; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; @@ -182,7 +182,7 @@ public class StreamItemAdapter extends BaseA continue; } - final long contentLength = Downloader.getInstance().getContentLength(stream.getUrl()); + final long contentLength = DownloaderImpl.getInstance().getContentLength(stream.getUrl()); streamsWrapper.setSize(stream, contentLength); hasChanged = true; } 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 57cd15e8c..d78f8e32b 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMission.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMission.java @@ -3,7 +3,9 @@ package us.shandian.giga.get; import android.os.Handler; import android.util.Log; -import org.schabi.newpipe.Downloader; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.DownloaderImpl; import java.io.File; import java.io.FileNotFoundException; @@ -15,7 +17,6 @@ import java.net.SocketTimeoutException; import java.net.URL; import java.net.UnknownHostException; -import javax.annotation.Nullable; import javax.net.ssl.SSLException; import us.shandian.giga.io.StoredFileHelper; @@ -211,7 +212,7 @@ public class DownloadMission extends Mission { HttpURLConnection openConnection(String url, int threadId, long rangeStart, long rangeEnd) throws IOException { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setInstanceFollowRedirects(true); - conn.setRequestProperty("User-Agent", Downloader.USER_AGENT); + conn.setRequestProperty("User-Agent", DownloaderImpl.USER_AGENT); conn.setRequestProperty("Accept", "*/*"); // BUG workaround: switching between networks can freeze the download forever diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index bf4867855..7156d08ba 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -42,7 +42,7 @@ مشاركة مشاركة بواسطة عرض مقاطع الفيديو \"التالية\" و \"المشابهة\" - عرض خيار تشغيل الفيديو عبر وسائط Kodi + عرض خيار تشغيل الفيديو عبر مركز وسائط كودي عرض خيار التشغيل بواسطة كودي السمة تم النشر يوم %1$s @@ -80,7 +80,7 @@ التاريخ التاريخ فتح في وضع منبثق - يزيل الصوت في بعض مستوى الدقة + إزالة الصوت في بعض مستوى الدقة وضع النوافذ المنبثقة NewPipe تم إلغاء الاشتراك في القناة تعذر تغيير حالة الاشتراك @@ -153,17 +153,17 @@ الصوت إعادة المحاولة تم رفض إذن الوصول إلى التخزين - K + ألف مليون G ليس هناك مشترِكون %s لا يوجد مشاركين %s مشترك - "%s مشتركتين" + %s مشاريكان %s اشتراكات - %s مشاركين - %s مشتركون + %s مشاركون + %s اشتراك دون مشاهدات لاتوجد فيديوهات @@ -200,7 +200,7 @@ فتح الموقع المساهمون التراخيص - تطبيق مجاني خفيف الوزن وبث حي على نظام أندرويد. + مجاني خفيف الوزن بث حي على أندرويد. ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية ، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل ! عرض على GitHub @@ -238,20 +238,20 @@ تحدي الكابتشا ضغط مطول للإدراج الى قائمة الانتظار - بدون مشاهدات - %s مشاهدة - %s مشاهدتين - %s مشاهدون - %s مشاهدات - %s مشاهدين + %s بدون مشهد + %s شاهد + %s مشاهدتان + %s مشاهدات + %s مشاهدون + %s شاهدو - %s لا يوجد فيديو - %s فيديو - %s فيديوان - %s فيديوات - %s فيديوهات - %s مزيد من الفيديوات + فيديو%s video + %s videosفيديوهات + %s videosفيديوهات + %s videosفيديوهات + %s videosفيديوهات + %s videosفيديوهات طلب اختبار الكابتشا مطلوب © %1$sبواسطة%2$sتحت%3$s @@ -522,4 +522,5 @@ حذف كل مواقف التشغيل؟ تغيير مجلدات التنزيل إلى حيز التنفيذ‮‮‮ تبديل الخدمة ، المحدد حاليًا: + الكشك الافتراضي \ 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 d38f5f9e0..4ea5dae26 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -1,31 +1,16 @@ - %1$s visualizaciones Espublizóse\'l %1$s - - Encaboxar Abrir nun restolador web Compartir - - Axustes ¿Quixesti dicir %1$s\? - - - Usar un reproductor esternu de videu Usar un reproductor esternu d\'audiu - - - - - - Resolución predeterminada Reproducir en Kodi - Amosar la opción «Reproducir en Kodi» Amuesa una opción pa reproducir un videu pel centru multimedia Kodi Audiu @@ -33,89 +18,41 @@ Estilu Escuridá Claridá - Darréu - - Llingua predeterminada del conteníu Videu y audiu Aspeutu - - - - + Conteníu Conteníu torgáu pola edá - EN DIREUTO - - - Fallu - Nun pudieron cargase toles miniatures Nun pudo descifrase la robla de la URL del videu Nun pudo analizase\'l sitiu web - - - Entá nun se sofiten los fluxos en direuto Nun pudo consiguise dengún fluxu Perdona pero eso nun debió asoceder. - Perdona pero asocedió dalgún fallu. - Información: - - Detalles: - - Préstames Usar TOR - - - - Creóse\'l direutoriu de descarga «%1$s» Videu Audiu - - - - - Desaniciar Suma de comprobación Misión nueva - - + Aceutar Filos Fallu - - - - Espera… Copióse al cartafueyu - - - - Tarrezmes - - - - - - Formatu predetermináu de videu Prietu - - Canal - - Mil Mill. Mil mill. @@ -124,48 +61,30 @@ reCAPTCHA Retu de reCAPTCHA Solicitóse\'l retu de reCAPTCHA - + En segundu planu Ventanu Resolución predeterminada del ventanu Amosar resoluciones más altes Namái dalgunos preseos sofiten la reproducción de vídeos en 2K/4K - - Llimpiar Quita l\'audiu en DALGUNES resoluciones - - - Usa xestos pa controlar el brilléu y volume del reproductor - - - - - - - - + Guetar suxerencies + Amuesa suxerencies al guetar + Soscribise Nun pudo anovase la soscripción - Soscripciones Qué hai nuevo - - - - + Historial de gueta Siguir al recuperar el focu Sigue cola reproducción dempués de les interrupciones (llamaes telefóniques, por exemplu) Reproductor Comportamientu Historial y caché - La meyor resolución - Avisu de NewPipe - Nun hai resultaos Equí nun hai más que grillos - %s soscriptor %s soscriptores @@ -175,11 +94,8 @@ %s visualización %s visualizaciones - Descarga - - - + Caráuteres almitíos nos nomes de ficheros Lletres y díxitos La mayoría de caráuteres especiales Tocante a NewPipe @@ -188,56 +104,31 @@ Llicencies de terceros © %1$s por %2$s so %3$s Nun pudo cargase la llicencia - Tocante a Collaboradores Llicencies - Ver en GitHub Llicencia de NewPipe - + Si sabes traducir, quies encuriosar el códigu, amestar carauteríques o proponer cambeos nel diseñu, vamos agradecételo siempres. ¡Cuánto más, meyor! Lleer la llicencia Collaboración Historial - Vióse - Historial L\'historial ta baleru - - - - + ¿Quies desaniciar esti elementu del historial de gueta\? + Reproducir too Nun pudo reproducise esti fluxu Asocedió un fallu irrecuperable del reproductor - Conteníu de la páxina principal Páxina balera - - - - - - - + Esbilla d\'un quioscu Quioscu Tendencies - - - + Destácase Detalles - - - - - - - - - - - - + Novedaes + [Desconozse] Reproducir en segundu planu Reproducir nun ventanu Donación @@ -245,68 +136,29 @@ Donar Sitiu web Visita\'l sitiu web de NewPipe pa más información y noticies. - País predetermináu del conteníu - Siempres - - - - - - - + Importar una base de datos + Esportar la base de datos Anula l\'historial y les soscripciones actuales - - + Esporta l\'historial, les soscripciones y les llistes de reproducción. URL nun ye válida - - - - - - Esto va anular la configuración actual. - - - - - - - - Amosar la información - Llistes de reproducción en marcadores - - - - - - + Llistes de reproducción + Crear Escartar - - - - + ¿De xuru que quies desaniciar tolos elementos del historial\? Equí va apaecer dalgo ceo ;D - - - - + Llista nueva de repoducción Nome - - - - + Amestar a una llista de repoducción ¿Desaniciar esta llista de reproducción\? Nun pudo desaniciase la llista de reproducción. Ensin sotítulos Axustar Rellenar Zoom - - - Ficheru El ficheru nun esiste o falta\'l permisu d\'escritura o llectura Asocedió un fallu: %1$s @@ -324,7 +176,7 @@ Llingüeta nueva Usa xestos pa controlar el volume del reproductor Usa xestos pa controlar el brilléu del reproductor - Valores predeterminaos + Reafitar El númberu de soscriptores nun ta disponible Esbilla Anovamientos @@ -358,4 +210,37 @@ El sirvidor nun aceuta descargues multifilu, volvi probar con @string/msg_threads = 1 Nun hai comentarios Llimpieza de datos - \ No newline at end of file + Amosar comentarios + Toca p\'alternar la so des/activación + Pa cumplir cola GDPR (Regulación Xeneral de Proteición de Datos) europea, pidímoste que revises la política de privacidá de NewPipe. Lléila con procuru. + ¿Desaniciar tol historial de gueta\? +\nHas aceutala unviándonos un informe de fallos. + Aición al cambiar a otra aplicación dende\'l reproductor de vídeos principal — %s + El númberu máximu d\'intentos enantes d\'encaboxar la descarga + Posiciones nes llistes + ¿De xuru\? + Esportación anterior + Importar el ficheru + Importa les soscripciones de YouTube baxando\'l ficheru d\'esportación: +\n +\n1.- Vete a esta URL: %1$s +\n2.- Anicia sesión cuando se te pida +\n3.- Debería aniciar una descarga (que ye\'l ficheru d\'esportación) + Importa un perfil de SoundCloud teclexando la URL o la ID de to: +\n1.- Activa\'l mou escritoriu nun restolador web (el sitiu nun ta disponible pa móviles) +\n +\n3.- Anicia sesión cuando se te pida +\n2.- Vete a esta URL: %1$s + LaToID, soundcloud.com/latoid +\n4.- Copia la URL del perfil al que se te redirixa. + Cargar miniatures + Desactiva esta opción pa evitar la carga de miniatures, aforrar datos y usu de la memoria. Los cambeos van llimpiar la memoria y la caché d\'imáxenes. + Minimizar al cambiar a otra aplicación + Minimizar al reproductor en segundu planu + Minimizar al reproductor en ventanu + Desoscribise + Escoyeta d\'una llingüeta + Siguir cola reproducción + Les llingüetes que s\'amuesen na páxina principal + Entrugar ánde baxar + 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 new file mode 100644 index 000000000..d97835b80 --- /dev/null +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -0,0 +1,158 @@ + + + 点击搜索按钮即可开始使用 + %1$s 次观看 + 发布于 %1$s + 在浏览器中打开 + 在悬浮窗模式下打开 + 您是不是要找:%1$s? + 找不到串流播放器 (您可以安裝并使用VLC播放)。 + 下载串流文件 + 安装 + 取消 + 分享 + 下载 + 搜索 + 设置 + 分享给... + 选择浏览器 + 视频下载文件夹 + 已下载的视频存储在这里 + 请选择下载视频的保存位置 + 已下载的音频存储在这里 + 选择下载音频的储存位置 + 自动播放 + 使用Kodi播放 + 主题 + 浅色 + 暗黑 + 黑色 + 下载 + 下一个 + 不支持的 URL + 外观 + 其他 + 全部 + 频道 + + 稍后 + 网络错误 + + %s 个视频 + + + 禁用 + 背景 + 过滤器 + 刷新 + 搜索建议 + 订阅 + 已订阅 + 观看历史 + 播放器 + 历史记录与缓存 + 播放列表 + 撤销 + 全部播放 + 总是 + 仅一次 + 添加至 + 文件 + 加载缩略图 + 清除观看记录 + + 最小化后台播放器 + 最小化小窗口播放器 + 频道 + 播放列表 + 取消订阅 + 新标签 + 更新 + 文件已删除 + 无法得知订阅人数 + 每推出新版本时,弹出应用升级通知 + 网格 + 新版 NewPipe 已可升级! + 服务器不接受 接收 multi-threaded 下载, 以 @string/msg_threads = 1 重试 + 自动播放 + 清除数据 + 观看记录已删除 + 喜欢 + 不喜欢 + 使用Tor + (实验性)通过 Tor 强制下载流量以增强隐私(暂不支持串流视频)。 + 报告错误 + 用户报告 + 无法创建下载目录\"%1$s\" + 已成功创建下载目录「%1$s」 + 视频 + 音频 + 重试 + 存储访问权限已被拒绝 + + %1$s 次观看 + + + + 百万 + 开始 + 暂停 + 播放 + 删除 + 校验 + 新任务 + OK + 文件名 + 线程数 + 错误 + 不支持的服务器 + 文件已存在 + 点击了解详情 + 请稍候… + 复制至剪贴板 + reCAPTCHA验证码 + 弹出 + 关于NewPipe + 设置 + 关于 + 第三方许可 + © %1$s :作者 %2$s (使用 %3$s ) + 无法加载许可证 + 打开网站 + 关于 + 贡献者 + 许可证 + 下载 + 文件名中允许的字符 + 无效字符将会替换为此字符 + 字母和数字 + 最特殊字符 + 没有结果 + 没有订阅者 + + %s个订阅者 + + + 没有视频 + 拖动以重新排序 + 创建 + 仅删除一个 + 全部删除 + 解除 + 重 命名 + 未安装用于播放此文件的应用程序 + 已删除1个项目。 + 哪些标签需要在主页上展示 + 列表观看模式 + 已完成 + 等待中… + 已暂停 + 排队中 + 已加入队列 + 操作已被系统拒绝 + 下载失败 + 下载完成 + %s 次下载已完成 + 没有评论 + 切换服务,当前选择: + \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index be52c0900..1eb9222ec 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -60,7 +60,7 @@ Показвай предложения за търсене История на търсенията Съхранявай заявките за търсене локално - История и кеш-памет + История на гледане Запаметявай кои видеота са гледани Възобнови при връщане на фокус Продължавай възпроизвеждането след прекъсване (например телефонно обаждане) @@ -254,7 +254,7 @@ Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма). Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита. Показвай подсказка, когато е избран фонов режим или режим в прозорец на страницата с детайли на съответния клип - Изтрива историята на възпроизвежданите стриймове + Изтрива историята на възпроизвежданите стриймове и позицията на възпроизвеждането Не са намерени видео стриймове Не са намерени аудио стриймове Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nУслуга:\\nВреме по GMT:\\nПакет:\\nВерсия:\\nОС версия: @@ -413,6 +413,11 @@ Автоматично пускане Коментари - + + Нов раздел + Избери раздел + Промени + Продължи възпроизвеждане + Изтрии данни \ 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 0a760af40..d539923fe 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -49,7 +49,7 @@ Nebylo možné analyzovat stránku Obsah není k dispozici Náhled videa - Náhled videa + Přehrát video, délka: Náhled avataru uploadera To se mi líbí To se mi nelíbí @@ -514,4 +514,5 @@ otevření ve vyskakovacím okně Smazat všechny pozice playbacku Smazat všechny pozice playbacku\? Změnit adresář pro stažené soubory + Přepnout službu, právě vybráno: \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 49fcc4506..2d6b5b6d2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -27,7 +27,7 @@ Bevorzugtes Audioformat Herunterladen Nächste - \'Nächste\' und \'ähnliche\' Videos anzeigen + \"Nächste\" und \"ähnliche\" Videos anzeigen Nicht unterstützte URL Video & Audio Bevorzugte Sprache des Inhalts @@ -51,8 +51,8 @@ Hell Aussehen Andere - Kann Downloadverzeichnis \'%1$s\' nicht anlegen - Downloadverzeichnis \'%1$s\' erstellt + Kann Downloadverzeichnis \"%1$s\" nicht anlegen + Downloadverzeichnis \"%1$s\" erstellt Fehler Konnte nicht alle Vorschaubilder laden Konnte Video-URL-Signatur nicht entschlüsseln @@ -364,7 +364,7 @@ \n4. Kopiere die Profil-URL, zu der Du weitergeleitet wurdest. yourID, soundcloud.com/yourid Keine Streams zum Download verfügbar - Bevorzugte \'Öffnen\' Aktion + Bevorzugte \"Öffnen\" Aktion Standardaktion beim Öffnen von Inhalten - %s Untertitel Textgröße und Hintergrund der Untertitel im Player anpassen. Wird erst nach Neustart der App wirksam. @@ -507,4 +507,5 @@ Alle Wiedergabepositionen löschen\? Ändere die Downloadordner, damit sie wirksam werden Dienst umschalten, aktuell ausgewählt: + Quiosque Predefinido \ 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 42d46cb95..d5cc38a1a 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -1,100 +1,510 @@ - %1$s vidoj + %1$s spektaĵoj Eldonita je %1$s Instali Nuligi - Malfermi per retumilo + Malfermi per krozilo Konigi Elŝuti Serĉi Agordoj - Ĉu vi intencis: %1$s? + Ĉu vi signifis: %1$s\? Konigi kun - Elekti retumilon + Elekti krozilon turno - Uzi eksteran videoludilon + Uzi eksteran filmetoludilon Uzi eksteran sonludilon Defaŭlta distingivo - Ludi per Kodi - Montri \"Ludi per Kodi\"-opcion + Legi per Kodi + Montri \"Legi per Kodi\"-opcion Sono Defaŭlta sondosierformo Etoso Malluma Luma Elŝuti - Sekva video + Vica filmeto Ligilo ne subtenita Preferata enhavlingvo - Video kaj sono + Filmeto kaj sono Apero Alia Ludado fone - Ludi + Legi Eraro Reteraro - Enhavo ne estas disponebla + Enhavo malhavebla Ŝatoj Malŝatoj Uzi la programon Tor - Neniu elsendlflua ludilo trovita. Ĉu instali la aplikaĵon VLC? + 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 videon kaj similajn videojn + Montri la sekvan filmeton kaj similajn filmetojn Ĉiuj miniaturoj ne ŝargeblas - La subskribo de la ligilo de la video ne malĉifreblas + La subskribo de la ligilo de la filmeto ne malĉifreblas La retejo ne analizeblas - Miniaturo de la antaŭrigardo de la video - Miniaturo de la antaŭrigardo de la video + Miniaturo de la antaŭrigardo de la filmeto + Legi filmeton, daŭro: Miniaturo de la bildo de la alŝutinto La elŝutujo \'%1$s\' ne kreeblas Elŝutujo \'%1$s\' kreita - Elŝutujo por videoj + Elŝutujo por filmetoj Elŝutujo por muziko - (Eksperimenta) Devigi elŝuttrafikon tra Tor por pli bona privateco (elsendfluaj videoj estas ankoraŭ ne subtenitaj). - Montri opcion por ludi videon per la aplikaĵo Kodi - Dosierujo por konservi elŝutitajn videojn - Dosierujo por konservi elŝutitan muzikon - Elektu lokon por konservi elŝutitajn videojn - Elektu lokon por konservi elŝutitan muzikon + (Eksperimenta) Devigi elŝuttrafikon tra Tor por pli bona privateco (elsendfluaj filmetoj estas ankoraŭ ne subtenitaj). + Montri opcion por ludi filmeton per la aplikaĵo Kodi + Elŝutitaj filmetoj estas konservitaj tie + Dosierujo por konservi elŝutitajn muzikojn + Elektu lokon por konservi elŝutitajn filmetojn + Elektu lokon por konservi elŝutitajn muzikojn Enhavo - Raporti eraron per retpoŝto - RAPORTI + Signali eraron per retpoŝto + SIGNALI Informoj: Via komento (en la angla): Detaloj: - Raporti eraron - Video + Signali eraron + Filmeto Reprovi - Tapu serĉo por komenci + Premu serĉo por komenci Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin). Malfermi en ŝprucfenestron modon - Iuj rezolucioj NE havos aŭdion kiam ĉi tiu eblo estas ebligita + Forigas aŭdion ĉe KELKAJ distingivoj NewPipe ŝprucfenestron modon - Aboni + Abonu Abonita Kanalo malabonita - Neebla ŝanĝi abonon + Ne povis ŝanĝi abonon Elŝutu dosieron - Ne eblas ĝisdatigi abonon - Montri informon + Ne povis ĝisdatigi abonon + Montri informojn Ĉefa Abonoj Legosigno Kio novas Fono - ŝprucfenestron + Ŝprucfenestro Aldonu al Aŭtomata play - Ludas video kiam NewPipe vokas de alia programo - Defaŭlta popup rezolucio - Montri pli altajn rezoluciojn - Nur kelkaj aparatoj subtenas ludante 2K / 4K filmetojn - Defaŭlta video-formato + 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 + Defaŭlta fomato de filmeto Nigra Memoru ŝprucfenestron 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 Ŝarĝi bildetojn - + Ne povis konstrui la dosierujon de elŝuto + Nunaj filmetoj ne estas ankoraŭ subtenataj + Enhavo limigita al aĝo + Montri limigitan al aĝo filmeto. Permesanta tian materialon eblas el Parametroj. + Ne povis tute analizi la retejon + Ne povis akiri ajnan torenton + NUNA + Elŝutoj + Elŝutoj + Erarosignalo + Ne povis ŝarĝi bildon + Apo kraŝis + reCAPTCHA + reCAPTCHA defio + reCAPTCHA defio petita + Ĉiuj + Kanalo + + %s filmeto + %s filmetoj + + Jes + Poste + Tiu permeso estas necesa por +\nmalfermi en ŝprucfenestro modo + Leganta en ŝprucfenestro modo + Malaktiva + Filtri + Aktualigi + Forviŝi + Ŝprucfenestro + Regrandiganta + Kontrolo de gesto de ludilo + Uzu gestojn por kontroli la brilon kaj volumenon de la ludilo + Serĉi sugestojn + Montri sugestojn kiam serĉanto + Plej bona distingivo + 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) + 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 + Ludilo + Konduto + Historio kaj kaŝmemoro + Ludlisto + Malfari + Kiosko + Tendencoj + 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 + Ne povis ludi tion torenton + Neatendebla eraro de ludilo okazis + Reakiri el eraro de la ludilo + Fona ludilo + Ŝprucfenestro ludilo + Retiri + Detalado + Sonaj parametroj + Teni por viciĝi + [Nekonata] + Viciĝi en la fono + Viciĝi en nova ŝprucfenestro + Komencu ludi en nova ŝprucfenestro + Defaŭlta enhava lando + Ŝangi Orientiĝon + Ŝanĝi al Fono + Ŝanĝi al ŝprucfenestro + Ŝangi al Ĉefa + Servo + Ĉiam + Nur unfoje + Nevalida ligilo + Neniuj filmeta torentoj trovitaj + Neniuj sonaj torentoj trovis + Ŝprucfenestro ludilo + Importi la datumbazon + Eksporti la datumbazon + Anstataŭigas vian aktualan historion kaj abonojn + Eksporti historion, abonojn kaj ludlistoj + Ĉiam peti + Nova ludlisto + Forigi + Alinomi + Nomo + Aldoni al la ludlisto + Meti kiel bildeto de ludlisto + Legosigno Ludlisto + Forigi Legosignon + Ĉu forigi ĉi tiun ludliston \? + Ludlisto kreita + Ludlistita + Bildeto de ludlisto ŝanĝiĝita. + Ne povis forigi ludlisto. + Malcimigi + Auto-vico sekva fluo + Aŭto-aldoni rilatan enhavon kiam leganta 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 : +\n +\n1. Ebligu komputilon modon en krozilo (la retejo malhaveblas por poŝtelefonoj) +\n2. Iru al tie retpaĝo : %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. + Bildoj en kaŝmemoro forviŝitaj + Forviŝi la metadatumojn kaŝitajn + Forviŝi ĉiojn retpaĝojn kaŝitajn + Metadatumoj kaŝitaj forviŝitaj + Neniuj torentoj haveblaj por elŝuti + Neniu apo instalita por ludi ĉi tiun dosieron + Forviŝi vidohistorion + Forviŝi la historion de viditaj filmetojn kaj ludajn poziciojn + Ĉu vi volas forviŝi la tutan historion \? + Forviŝi la historion de serĉoj + 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 + Kanaloj + Ludlistoj + Spuroj + Uzantoj + Malabonu + Nova ongleto + Elektu ongleton + Kontrolo de volumena gesto + Uzu gestojn por kontroli la volumon de la ludilo + Kontrolo de gesto de brilo + Uzu gestojn por kontroli la brilon de la ludilo + Ĝisdatigoj + Dosiero forviŝita + Sciigo por ĝisdatigi apon + 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 + Atendovico + Halti + Maksimuma nombro de provoj + Maksimuma nombro de provoj antaŭ fordecidi la elŝuton + interrompi ĉe limigitaj komputilaj retoj + Eventoj + Konferencoj + Montri komentojn + Malebligu por malvidigi komentojn + Aŭtolego + + Komentoj + + + Ne povis ŝarĝi komentojn + Fermi + Repreni la ludon + Restaŭri la lastan ludan pozicion + Pozicioj en listoj + Montri la indikilojn de pozicioj de ludoj en listoj + Forviŝi datumojn + Historio forviŝita. + Ludaj pozicioj forviŝitaj. + Dosiero movita aŭ forviŝita + ne povas dispremi la dosieron + Ĉu vi certas\? + Limigi la elŝutan atendovicon + Unu elŝuto ruliĝos en la sama tempo + Komenci elŝutojn + Paŭzigi elŝutojn + Peti kie elŝuti + Oni petos vin kie konservi ĉion elŝuton + 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 + Forviŝi ludajn poziciojn + Forviŝi la totalon de ludaj pozicioj + Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \? + Ŝanĝu la elŝutojn dosierujojn por efekti + Pardonu, eraro okazis. + Pardonu, kelkaj eraroj okazis. + Kio okazis: + Kio:\\nPeto:\\nEnhavlingvo:\\nServo:\\nGMT Horo:\\nPako:\\nVersio:\\nOperaciumo versio: + Aŭdio + Permeso por atingi la konservon rifuzita + Uzantosignalo + Komenci + Paŭzigi + Ludi + Forigi + Kontrolsumo + Nova misio + Bone + Dosiernomo + Fadenoj + Eraro + Nesubtenata servilo + Dosiero jam ekzistas + Malformita ligilo aŭ interreto malhavebla + NewPipe estas elŝutanta + Premu por detaladoj + Bonvolu atendi… + Enpoŝigita + Bonvolu difini elŝutan dosierujon poste en agordoj + + %s spektaĵo + %s spektaĵoj + + k + M + B + Pri NewPipe + Agordoj + Pri + Eksteraj permesiloj + © %1$s de %2$s sub %3$s + Ne povis ŝargi permisilon + Malfermi la retejon + Pri + Kontribuintoj + 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 + Kontribui + Permesitaj karakteroj en dosiernomoj + Nevalidaj karakteroj estas anstataŭigita kun ĉi tiu valoro + Anstataŭa karaktero + Historio + Serĉita + Spektita + La historio estas malŝatita + Historio + La historio estas malplena + Historio vakigita + Neniuj rezultoj + Neniu enhavo + Neniuj abonantoj + + %s abonanto + %s abonantoj + + Neniuj spektaĵoj + Neniu filmeto + Ero forviŝita + Ĉu vi volas forviŝi tion eron el la historio de serĉo \? + Enhavo de la ĉefpaĝo + Malplena Paĝo + Kioska Paĝo + Abonpaĝo + Paĝo de la fluo + Kanala Paĝo + Elekti kanalon + Neniuj kanalaj abonoj ankoraŭ + Elekti kioskon + Komenci ludi ĉi tie + Komenci ludi en la fono + 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. + Redoni + Retejo + Vizitu la retejon de NewPipe por pli da informoj kaj novaĵoj. + Malfermi la tirkeston + Fermi la tirtekston + Ekstaraj ludantoj ne suportas tiajn ligilojn + Filmetoludilo + Fona ludilo + Akiranta informoj… + Ŝarĝante petita enhavo + Eksportita + Importita + Neniu valida ZIP-dosiero + Averto: Ne povis importi ĉiujn dosierojn. + Ĉi tio nuligos vian nunan aranĝon. + Trenu por reorgidi + Krei + Forigi Unu + Forigi ĉiujn + Rezigni + Alinomi + Ĉu vi volas forviŝi tion eron el la spekta historio \? + Ĉu vi certas, ke vi volas forviŝi ĉiujn erojn el la historio\? + Lasta Ludado + Plej ludataj filmetoj + Neniuj Subtitoloj + Alĝustigi + Plenigi + Zomi + Io aperos ĉi tie baldaŭ ;D + Aŭtomate generita + Ebligi LeakCanary + 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 + Importi/eksporti + Importi + Importi el + Eksporti al + Importante … + Eksportante… + Importi la dosieron + Antaŭa eksportaĵo + Ne povis importi abonojn + Ne povis eksporti abonojn + via salutnomo, soundcloud.com/salutnomo + "Memoru, ke ĉi tiu operacio povas esti multekosta en la reto. +\n +\nĈu vi volas daŭrigi\?" + Kontroloj de rapideco de ludo + Tempoindiko + Ludkampo + Malligi (povas kaŭzi distordon) + Preferita \'malfermi\' ago + Defaŭlta ago malfermante enhavo — %s + 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. + Ĉ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. + 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. + Akcepti + Rifuzi + Neniu limo + Minimumigi dum la apo ŝanĝo + Ago dum ŝanĝante al alia apo el la ĉefa filmetludilo + Neniu + Minimumigi por ludi fone + Plirapidigi dum silentoj + Paŝo + Restarigi + Uzante defaŭltajn ongletojn, eraro dum leganta savajn ongletojn + Restaŭri la defaŭltojn + Ĉu vi volas restaŭri la defaŭltojn \? + Kalkulo de abonantoj malhavebla + Kioj ongletoj estas montritaj en la ĉefpaĝo + Elektaĵo + Ĝisdatigoj + Montri sciigon por proponi ĝisdatigon de la apo kiam nova versio estas havebla + Lista vido maniero + Listo + Krado + Aŭto + Ŝanĝi vidon + Ĝisdatigo de NewPipe havebla ! + Premu por elŝuti + Finita + Pritraktata + Paŭzigita + postprocesado + Ago rifuzita kaŭze de la sistemon + Elŝuto fiaskis! + Elŝuto finita + %s elĝutoj finitaj + Generu unikan nomon + Anstataŭigi + Estas elŝuto en progreso kun ĉi tiu nomo + Montri la eraron + Kodo + La celloko-dosierujo ne povas esti kreita + La dosiero ne povas esti kreita + Permeso rifuzita kaŭze de la sistemo + Sekura konekto malsukcesis + Ne povis trovi la servilon + Ne povas konektiĝi al la servilo + La servilo ne sendas datumojn + La servilo ne akceptas plurfadenajn elŝutojn, reprovu kun @string/msg_threads = 1 + Petita kampo ne estas havebla + Ne trovita + Postprocesado malsukcesis + Forviŝi la finitajn elŝutojn + Daŭrigi viajn %s pritraktajn delokigojn el Elŝutoj + Utila dum la ŝanĝo al poŝdatumoj, kvankam kelkaj elŝutoj ne povas esti interrompitaj + Neniu komento + Dosiero kun ĉi tiu nomo jam ekzistas + Elŝutita dosieron kun ĉi tiu nomo jam ekzistas + Estas pritraktata elŝuto kun ĉi tiu nomo + NewPipe estis fermita dum laborante sur la dosiero + Neniu spaco havebla sur la aparato + Progreso perdita, ĉar la dosiero estis forviŝita + Eltempiĝo de Konekto + Ŝangi la servon, nuntempe elektita: + Defaŭlta Kiosko + \ 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 f6771d26c..3aa0bac66 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -2,7 +2,7 @@ %1$s vistas Publicado el %1$s - No se encontró ningún reproductor de vídeo. ¿Desea instalar VLC? + No se encontró ningún reproductor de retransmisiones. ¿Quiere instalar VLC\? Instalar Cancelar Abrir en el navegador @@ -13,21 +13,21 @@ ¿Quiso decir: %1$s? Compartir con Elegir navegador - rotación + giro Carpeta de descarga de vídeo Aquí se almacenan los vídeos descargados Elegir carpeta de descarga para vídeos Cambie las carpetas de descarga para que tenga efecto - Resolución por defecto de vídeo + Resolución predeterminada Reproducir con Kodi - Aplicación Kore no encontrada. ¿Instalarla? - Mostrar opción \"Reproducir con Kodi\" - Mostrar una opción para reproducir vídeo en Kodi + No se encontró la aplicación Kore. ¿Quiere instalarla\? + Mostrar opción «Reproducir con Kodi» + Mostrar una opción para reproducir vídeo en el centro multimedia Kodi Audio - Formato de audio por defecto + Formato de audio predeterminado Descargar Siguiente - URL no soportada + No se admite el URL Usar reproductor de vídeo externo Usar reproductor de audio externo Tema @@ -39,9 +39,9 @@ Contenido no disponible Usar Tor (Experimental) Forzar la descarga a través de Tor para una mayor privacidad (transmisión de vídeos aún no compatible). - No se puede crear la carpeta de descarga \'%1$s\' - Carpeta de descarga creada \'%1$s\' - Los archivos de audio descargados se guardarán aquí + No se puede crear la carpeta de descargas «%1$s» + Se creó la carpeta de descargas «%1$s» + Aquí se almacenan los audios descargados Elegir carpeta de descarga para archivos de audio Carpeta de descarga de audio Vídeo y audio @@ -51,24 +51,24 @@ No se pudo cargar las miniaturas No se pudo descifrar la URL del vídeo No se pudo analizar el sitio web - Mostrar videos \'siguientes\' y \'similares\' - Idioma del contenido por defecto - Vista previa del vídeo - Reproducir vídeo, duración: + Mostrar vídeos «siguientes» y «similares» + Idioma predeterminado del contenido + Miniatura de previsualización del vídeo + Reproducir vídeo; duración: Me gusta No me gusta Miniatura del avatar del usuario - Las transmisiones en vivo aún no están soportadas + Aún no se admiten las transmisiones en vivo Contenido Contenido restringido por edad - Mostrar vídeo restringido por edad. Permitir este contenido es posible desde Ajustes. + Mostrar vídeo restringido por edad. Se puede permitir este tipo de material desde Ajustes. Toque en buscar para empezar Reproducción automática Reproducir un vídeo cuando NewPipe es llamado desde otra app EN DIRECTO Descargas Descargas - Reportar error + Informe de error No se pudo analizar el sitio web completamente No se pudo configurar el menú de descarga No se pudo obtener ninguna transmisión @@ -90,20 +90,20 @@ Pausar Reproducir Eliminar - Checksum - Nueva misión - OK + Suma de comprobación + Misión nueva + Aceptar Nombre del archivo - Hilos + Subprocesos Error - Servidor no soportado + Servidor incompatible El archivo ya existe - URL mal formada o Internet no disponible + URL mal escrito o Internet no disponible NewPipe está descargando Toque para ver detalles - Por favor espere… - Copiado al portapapeles - Por favor, defina un directorio de descarga más tarde en los ajustes + Espere… + Copiado en el portapapeles + Defina una carpeta de descargas más tarde en la configuración No se pudo cargar la imagen La interfaz de la app dejó de funcionar Lo sucedido:\\nPetición:\\nIdioma del contenido:\\nServicio:\\nHora GMT:\\nPaquete:\\nVersión:\\nVersión del SO: @@ -112,33 +112,33 @@ Canal Después - K + k M MM reCAPTCHA - Abrir en modo popup - Este permiso es necesario para -abrir en modo popup + Abrir en modo emergente + Se necesita este permiso +\npara abrir en modo emergente Reto reCAPTCHA Reto reCAPTCHA requerido - Modo popup de NewPipe - Reproduciendo en modo popup - Formato de vídeo por defecto + Modo emergente de NewPipe + Reproduciendo en modo emergente + Formato de vídeo predeterminado Desactivado Mostrar resoluciones más altas Solo algunos dispositivos soportan reproducción de vídeos en 2K/4K - Resolución por defecto del popup + Resolución predeterminada de emergente Segundo plano Popup Filtro Actualizar Limpiar - Recordar tamaño y posición del popup - Recordar el último tamaño y posición del popup - Popup + Recordar tamaño y posición del repr. emerg. + Recordar el último tamaño y posición del repr. emerg. + Emergente Redimensionando Elimina el audio en ALGUNAS resoluciones - Controles de gestos del reproductor + Controles del reproductor por gestos Usar gestos para controlar el brillo y volumen del reproductor Sugerencias de búsqueda Mostrar sugerencias cuando esté buscando @@ -153,10 +153,10 @@ abrir en modo popup Acerca de Colaboradores Licencias - Streaming gratuito y ligero en Android. + Reproducción de transmisiones ligera y libre para Android. Ver en GitHub Licencia de NewPipe - Si tienes ideas de; traducción, cambios de diseño, limpieza de código o grandes cambios de código—la ayuda siempre es bienvenida. Cuanto más se hace, mejor se pone! + Si puede traducir, quiere cambiar el diseño, tiene ideas para mejorar el código o proponer mejoras grandes, siempre agradeceremos su ayuda. ¡Mientras más manos participen, mejor! Leer licencia Contribuir Suscribirse @@ -174,23 +174,23 @@ abrir en modo popup Los caracteres no válidos se reemplazan por este valor Carácter de reemplazo Letras y dígitos - La mayoría de caracteres especiales - Historial de búsqueda + La mayoría de los caracteres especiales + Historial de búsquedas Almacenar búsquedas localmente Historial de vistas Almacenar historial de vídeos vistos Historial - Buscado - Visto - Historial desactivado + Búsquedas + Reproducciones + El historial está desactivado Historial El historial está vacío - Historial borrado + Se vació el historial Notificación de NewPipe - Notificaciones para NewPipe en segundo plano y reproductores popup + Notificaciones de reproductores en segundo plano o emergentes de NewPipe Reproductor Funcionamiento - Historial y caché + Historial y antememoria Lista de reproducción Deshacer No hay resultados @@ -210,23 +210,23 @@ abrir en modo popup %s vídeo %s vídeos - Elemento eliminado - ¿Desea eliminar este elemento del historial de búsqueda? + Se eliminó el elemento + ¿Quiere eliminar este elemento del historial de búsquedas\? Contenido de la página principal Página en blanco Página del kiosco Página de suscripción - Página de feed + Página de novedades Página del canal Seleccione un canal No hay suscripciones a canales todavía Seleccione un kiosco Kiosco Tendencias - Top 50 - Mostrar sugerencia cuando se presiona el botón de segundo plano o popup en la página de detalles del vídeo - En cola en el reproductor de fondo - En cola en el reproductor popup + 50 mejores + Mostrar sugerencia cuando se presiona el botón de 2.º plano o emergente en la página de detalles del vídeo + En cola en el reproductor de 2.º plano + En cola en el reproductor emergente Reproducir todo No se pudo reproducir este stream Se produjo un error irrecuperable del reproductor @@ -235,52 +235,52 @@ abrir en modo popup Reproductor emergente Quitar Detalles - Ajustes de audio + Configuración de audio [Desconocido] Añadir a cola en segundo plano - Añadir a cola en un popup nuevo + Añadir a cola en reproductor emergente Comenzar a reproducir aquí Comenzar a reproducir en segundo plano - Comenzar a reproducir en un popup nuevo - Muestra el consejo \"Manten para poner en la cola\" - Nuevo y popular + Comenzar a reproducir en modo emergente + Mostrar consejo «Mantener presionado para agregar» + Novedades Mantener presionado para agregar a la cola Donar - NewPipe es desarrollado por voluntarios que emplean su tiempo para brindarte la mejor experiencia. Devuelve el favor para ayudar a los desarrolladores a crear un NewPipe aún mejor mientras disfrutan de una taza de café. + NewPipe es desarrollado por voluntarios que emplean su tiempo libre para brindarle la mejor experiencia. Haga una aportación para ayudarlos a crear un NewPipe aún mejor mientras disfrutan de una taza de café. Donar - Página web - Visita el sitio web de NewPipe para más información y noticias. - País del contenido por defecto + Sitio web + Visite el sitio web de NewPipe para más información y noticias. + País predeterminado del contenido Alternar orientación Cambiar a segundo plano - Cambiar a popup + Cambiar a emergente Cambiar a principal Servicio Abrir cajón Cerrar cajón - No se ha encontrado ningún reproductor de vídeo (puede instalar VLC para reproducirlo). + No se encontró ningún reproductor de retransmisiones (puede instalar VLC para reproducirlo). Siempre - Sólo una vez + Solo una vez Los reproductores externos no soportan este tipo de enlaces URL no válida No se encontraron transmisiones de vídeo No se encontraron transmisiones de audio Reproductor de vídeo - Reproductor de fondo - Reproductor de popup + Reproductor en segundo plano + Reproductor emergente Obteniendo información… Cargando contenido solicitado Importar base de datos Exportar base de datos - Reemplaza tu historial actual y suscripciones + Anula su historial actual y suscripciones Exportar historial, suscripciones y listas de reproducción Exportado Importado Archivo ZIP no válido - ADVERTENCIA: no se pudieron importar todos los archivos. + Atención: no se pudieron importar todos los archivos. Esto reemplazará su configuración actual. - Descargar archivo de stream - Mostrar info + Descargar archivo de retransmisión + Mostrar información "Listas de reproducción en marcadores " Añadir a Arrastrar para reordenar @@ -288,21 +288,21 @@ abrir en modo popup Eliminar uno Eliminar todos Descartar - Renombrar - ¿Desea eliminar este elemento del historial de reproducciones? - ¿Seguro que desea eliminar todos los elementos del historial? + Cambiar nombre + ¿Quiere eliminar este elemento del historial de reproducciones\? + ¿Confirma que quiere eliminar todos los elementos del historial\? Última reproducción Más reproducido Preguntar siempre - Nueva lista de reproducción + Lista de reproducción nueva Eliminar - Renombrar + Cambiar nombre Nombre Añadir a la lista de reproducción Definir como miniatura de lista de reproducción Marcar lista de reproducción Eliminar marcador - ¿Borrar esta lista de reproducción\? + ¿Quiere eliminar esta lista\? Lista de reproducción creada Añadido a la lista de reproducción Miniatura de lista de reproducción cambiada. @@ -320,11 +320,11 @@ abrir en modo popup Forzar reporte de excepciones no entregables de RX fuera del fragmento o del ciclo de actividad después del descarte Usar búsqueda rápida inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión - Auto-encolar la siguiente transmisión - Añadir de forma automática un vídeo relacionado con el último vídeo reproducido en una cola no repetitiva + Poner en cola vídeo relacionado siguiente + Añadir de forma automática un vídeo relacionado con el último reproducido en una cola sin repetición Archivo Archivo movido o eliminado - No existe el directorio + La carpeta no existe No existe la fuente del archivo/contenido El archivo no existe o carece de los permisos para leer o escribir en él El nombre del archivo no puede estar vacío @@ -351,39 +351,39 @@ abrir en modo popup \n3. Inicie sesión cuando se le pida \n4. Copie la URL del perfil a la que fue redireccionado. suID, soundcloud.com/suID - Tenga en cuenta que esta operación puede ser costosa para la red. -\n -\n¿Desea continuar? + Observe que esta operación puede causar un uso intensivo de la red. +\n +\n¿Quiere continuar\? Cargar miniaturas - Desactívalo para evitar la carga de miniaturas, ahorrando datos y uso de memoria. Los cambios borrarán tanto la caché de imágenes en la memoria como en el disco. - Caché de imagen limpiado - Eliminar metadatos de la caché - Eliminar todos los datos de la página web en caché - Metadatos del caché limpiados + Desactívela para evitar la carga de miniaturas y ahorrar datos y memoria. Se vaciará la antememoria de imágenes en la memoria volátil y en el disco. + Se vació la antememoria de imágenes + Eliminar metadatos en antememoria + Eliminar todos los datos de páginas web en antememoria + Se vació la antememoria de metadatos Controles de velocidad de reproducción Tiempo Tono Desenganchar (puede causar distorsión) No hay streams disponibles para descargar - Acción \'abrir\' preferida - Acción por defecto al abrir contenido — %s - No hay ninguna app instalada para reproducir este archivo + Acción de apertura preferida + Acción predeterminada al abrir contenido: %s + No se encontró ninguna aplicación que reproduzca este archivo Subtítulos Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la app para que surta efecto. - Borrar historial de reproducciones + Vaciar historial de reproducciones Elimina el historial de contenido visto y posiciones de reproducción ¿Eliminar todo el historial de reproducciones\? - Historial de reproducciones eliminado. - Borrar historial de búsqueda + Se eliminó el historial de reproducciones. + Vaciar historial de búsquedas Elimina el historial de palabras clave de búsqueda ¿Eliminar todo el historial de búsqueda\? Historial de búsquedas eliminado. - 1 elemento eliminado. + Se eliminó 1 elemento. NewPipe es un software copyleft libre: puedes usarlo, estudiarlo, compartirlo y mejorarlo a voluntad. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior. - ¿Desea importar también los ajustes? - Política de Privacidad de NewPipe - El proyecto NewPipe toma su privacidad muy en serio. Por lo tanto, la aplicación no recopila ningún dato sin su consentimiento. La política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan cuando envía un informe de fallas. - Leer la Política de Privacidad + ¿Quiere importar también la configuración\? + Normativa de privacidad de NewPipe + El proyecto NewPipe toma su privacidad muy en serio. Por ello, la aplicación no recopila ningún dato sin su consentimiento. La normativa de privacidad de NewPipe explica en detalle qué datos se envían y almacenan cuando envía un informe de fallo. + Leer la normativa de privacidad Para cumplir con el Reglamento general europeo de protección de datos (GDPR), podemos llamar su atención sobre la política de privacidad de NewPipe. Por favor léelo cuidadosamente. Debe aceptarlo para enviarnos el informe de error. Aceptar Declinar @@ -405,10 +405,10 @@ abrir en modo popup Pendientes pausado en cola - post-procesado + posprocesamiento Añadir a cola Acción denegada por el sistema - Archivo borrado + Se eliminó el archivo Descarga fallida Descarga finalizada @@ -425,7 +425,7 @@ abrir en modo popup Mostrar como lista Limpiar descargas finalizadas Tienes %s descargas pendientes, ve a Descargas para continuarlas - ¿Estas seguro? + ¿Lo confirma\? Detener Intentos máximos Cantidad máxima de intentos antes de cancelar la descarga @@ -444,12 +444,12 @@ abrir en modo popup Fallo la conexión segura No se pudo encontrar el servidor No se puede conectar con el servidor - El servidor no devolvio datos - El servidor no acepta descargas multi-hilos, intente de nuevo con @string/msg_threads = 1 - No se logro obtener el rango solicitado + El servidor no está enviando datos + El servidor no acepta descargas multiproceso; intente de nuevo con @string/msg_threads = 1 + No se puede satisfacer el intervalo seleccionado No encontrado - Fallo el post-procesado - NewPipe se cerro mientras se trabajaba en el archivo + Falló el posprocesamiento + NewPipe se cerró mientras se trabajaba en el archivo No hay suficiente espacio disponible en el dispositivo Se perdió el progreso porque el archivo fue eliminado Tiempo de espera excedido @@ -460,8 +460,8 @@ abrir en modo popup Usar SAF El Framework de Acceso al Almacenamiento permite descargar en la tarjeta SD externa.\nNota: Algunos los dispositivos no son compatibles Cancelar suscripción - Nueva pestaña - Elige la pestaña + Pestaña nueva + Elija la pestaña Control de volumen por gestos Usar gestos para controlar el volumen del reproductor Control de brillo por gestos @@ -469,7 +469,7 @@ abrir en modo popup Actualizaciones Eventos Notificación de actualización de la aplicación - Notificaciones para nueva versión de NewPipe + Notificaciones de versiones nuevas de NewPipe Almacenamiento externo no disponible No es posible descargar a una tarjeta SD externa. \¿Restablecer la ubicación de la carpeta de descarga\? Usando las pestañas por defecto, error al leer las pestañas guardadas @@ -487,7 +487,7 @@ abrir en modo popup ¡Actualización de NewPipe disponible! Pulsa para descargar Mostrar comentarios - Deshabilitar para dejar de mostrar comentarios + Desactívela para ocultar los comentarios Reproducción automática Comentarios @@ -500,10 +500,11 @@ abrir en modo popup Restaurar última posición de la reproducción Posiciones en listas Mostrar indicador de posición en listas de reproducción - Borrar datos - Posiciones de reproducción borradas. - Borrar posiciones de reproducción + Vaciar datos + Se eliminaron las posiciones de reproducción. + Eliminar posiciones de reproducción Elimina todas las posiciones de reproducción - ¿Borrar todas las posiciones de reproducción\? + ¿Quiere eliminar todas las posiciones de reproducción\? Activar/desactivar servicio, seleccionados actualmente: + kiosco predeterminado \ 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 55fa53c61..836c55e63 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -71,7 +71,7 @@ توضیح شما (به انگلیسی): جزییات: بندانگشتی پیش‌نمایش ویدیو - بندانگشتی پیش‌نمایش ویدیو + پخش ویدیو، مدت زمان: بندانگشتی کاربر بارگذاری کننده پسندها نپسندیدن‌ها @@ -496,4 +496,7 @@ گزارش کردن خطاهای \"خارج از چرخه حیات\" حذف حافظه کش شده همه صفحات وب کوچک کردن پخش کننده به پس زمینه + آی‌دی شما، soundcloud.com/yourid + عملکرد هنگام تغییر به برنامه دیگر از پخش‌کننده اصلی فیلم — %s + آهنگ‌ها \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6749a90f2..1e91fa55a 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -17,7 +17,7 @@ Valitse selain kierto Käytä ulkoista videosoitinta - Joillain resoluutioilla EI ole ääntä, kun tämä on valittuna + Poistaa äänen JOILLAIN resoluutioilla Käytä ulkoista äänisoitinta NewPipe ponnahdusikkuna Tilaa @@ -397,4 +397,7 @@ Ei koskaan Pienennä taustasoittimeksi Muuta ponnahdusikkunaksi + Peru tilaus + Uusi välilehti + Valitse välilehti \ 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 8506b6511..147502088 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -18,20 +18,20 @@ Paramètres Partager Partager avec - Afficher une option pour lire une vidéo avec Kodi + Affiche une option pour lire une vidéo via Kodi Afficher l’option « Lire avec Kodi » Publiée le %1$s - %1$s vues + %1$s vues Audio Format audio par défaut Télécharger Suivant Afficher les vidéos « Suivantes » et « Similaires » URL non pris en charge - Vidéo & audio + Vidéo et audio Autre Miniature d’aperçu vidéo - Miniature d’aperçu vidéo + Lecture vidéo, durée : Je n’aime pas J’aime Langue du contenu par défaut @@ -54,7 +54,7 @@ Répertoire de téléchargement « %1$s » créé Erreur Impossible d’analyser le site web - Contenu non disponible + Contenu indisponible Désolé, des erreurs sont survenues. Contenu Contenu avec limite d’âge @@ -77,7 +77,7 @@ Autorisation d’accès au stockage refusée Appuyer sur la loupe pour commencer Lecture automatique - Afficher les vidéos soumises à une limite d’âge. Autoriser ce type de contenu est possible depuis les paramètres. + Affiche les vidéos soumises à une limite d’âge. Autoriser ce type de contenu est possible depuis les paramètres. Rapport utilisateur RAPPORTER Impossible de configurer le menu de téléchargement @@ -86,7 +86,7 @@ Téléchargements Rapport d’erreur Démarrer - Pause + Mettre en pause Lire Supprimer Somme de contrôle @@ -118,7 +118,7 @@ Plus tard Désactivé Quoi :\\nRequête :\\nLangue du contenu :\\nService :\\nHeure UTC :\\nPaquet :\\nVersion :\\nVersion du système d’exploitation : - K + k M Cette autorisation est nécessaire pour \nutiliser le mode flottant @@ -129,7 +129,7 @@ Seuls certains appareils prennent en charge les vidéos 2K et 4K Format vidéo par défaut Mémoriser les taille et position de la fenêtre flottante - Mémoriser les dernières taille et position de la fenêtre flottante + Mémorise les dernières taille et position de la fenêtre flottante Fenêtre flottante Filtre Rafraîchir @@ -137,9 +137,9 @@ Redimensionner B Retire l’audio à CERTAINES définitions - Utiliser les gestes pour contrôler la luminosité et le volume du lecteur + Utiliser des gestes pour contrôler la luminosité et le volume du lecteur Suggestions de recherche - Afficher les suggestions lors d’une recherche + Affiche les suggestions lors d’une recherche Contrôles gestuels de la lecture Meilleure définition S’abonner @@ -168,12 +168,12 @@ Que ce soit pour des idées de traductions, de changements de design, de nettoyage de code ou de gros changements de code, une aide est toujours la bienvenue. Plus on contribue, meilleur il devient ! Impossible de modifier l’abonnement Impossible d’actualiser l’abonnement - Continuer la lecture après les interruptions (ex : appels téléphoniques) + Continue la lecture après les interruptions (ex : appels téléphoniques) Caractères autorisés dans les noms de fichier Les caractères invalides sont remplacés par cette valeur Caractère de remplacement Historique de recherche - Stocker l’historique de recheche sur l’appareil + Stocke l’historique de recheche sur l’appareil Voir l’historique Historique Recherché @@ -184,11 +184,11 @@ Historique supprimé Notification NewPipe Annuler - Garder un suivi des vidéos vues + Garde un suivi des vidéos vues Reprendre à l’obtention de la cible de saisie Lecteur Comportement - Historique & cache + Historique et cache Liste de lecture Notifications pour les lecteurs en arrière-plan et en mode flottant de NewPipe Aucun résultat @@ -217,7 +217,7 @@ Fil de syndication Chaîne Sélectionner une chaîne - Populaires + Tendances Top 50 Nouveau & populaire En file d’attente sur le lecteur en arrière-plan @@ -232,7 +232,7 @@ Détails Paramètres audios Afficher l’astuce « Maintenir pour ajouter » - Afficher l’astuce lors de l’appui du bouton « Arrière-plan » ou « Mode flottant » sur la page de détails d’une vidéo + 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 @@ -251,13 +251,13 @@ Donner en retour Pays du contenu par défaut Rotation - Passer en arrière-plan - Passer en flottant - Passer en principal + Basculer en arrière-plan + Basculer en mode flottant + Basculer en principal Service Ouvrir le menu Fermer le menu - Aucun lecteur de flux trouvé (vous pouvez installer VLC pour le lire). + Aucun lecteur de flux multimédias trouvé (vous pouvez installer VLC pour le lire). Toujours Une seule fois Les lecteurs externes ne prennent pas en charge ces types de liens @@ -272,7 +272,7 @@ Importer la base de données Exporter la base de données Remplace votre historique et vos abonnements actuels - Exporter l’historique, les abonnements et les listes de lecture + Exporte l’historique, les abonnements et les listes de lecture Exporté Importé Aucun fichier ZIP valide @@ -308,12 +308,12 @@ Ajuster Zoomer Utiliser la recherche rapide approximative - Permettre au lecteur d’accéder plus rapidement à une position au détriment de la précision + 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 de réduire l’utilisation de bande passante et de mémoire. Modifier cette option vide les caches d’image en mémoire vive et sur le disque. + Désactiver pour empêcher le chargement des miniatures, afin de réduire l’utilisation de la bande passante et de la mémoire. Modifier cette option vide les caches d’image en mémoire vive et sur le disque. Images en cache effacées Effacer les métadonnées en cache - Effacer toutes les pages web mises en cache + Efface toutes les données de pages Web en cache Métadonnées en cache effacées Fichier Aucun dossier de ce type @@ -325,7 +325,7 @@ Quelque chose va bientôt apparaître ici ;D Télécharger le fichier de flux Vidéo suivante en file d’attente - Ajout automatique d’un morceau suggéré lors de la lecture du dernier morceau dans une file d’attente non bouclée + Ajoute automatiquement un flux lié lors de la lecture du dernier flux dans une file d’attente sans répétition Débogage Remplir Générés automatiquement @@ -370,11 +370,11 @@ Ton Aucune application installée pour lire ce fichier Effacer l’historique des vues - Supprimer l’historique des flux lus et des positions de reprise - Voulez-vous supprimer tout l’historique des vues \? + Supprime l’historique des flux lus et des positions de reprise de lecture + Voulez-vous supprimer entièrement l’historique des vues \? Historique des vues supprimé. Supprimer l’historique de recherche - Supprimer l’historique de recherche par mots-clés + Supprime l’historique des mots-clés de recherche Voulez-vous supprimer entièrement l’historique de recherche \? Historique de recherche supprimé. 1 élément supprimé. @@ -392,7 +392,7 @@ Limiter la définition lors de l’utilisation des données mobiles Chaînes Listes de lecture - Pistes + Morceaux Utilisateurs Accélérer pendant les silences Étape @@ -490,20 +490,22 @@ 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 - Mettre en pause les téléchargements + Mettre les téléchargements en pause Demander où télécharger Vous allez être interrogé sur l’emplacement d’enregistrement de chaque téléchargement - Vous allez être interrogé sur l’emplacement de téléchargement de chaque téléchargement. -\nVeuillez choisir SAF si vous voulez télécharger sur une carte mémoire externe - Rétablir la précédente position de lecture + Vous allez être interrogé sur l’emplacement de téléchargement de chaque téléchargement. +\nVeuillez choisir ILAF si vous voulez télécharger sur une carte mémoire externe + Reprend la lecture à la dernière position Positions dans les listes Afficher les indicateurs de position de lecture dans les listes - Positions de reprise supprimées. - Utiliser SAF - Le « Storage Access Framework » permet de télécharger sur une carte mémoire externe. + Positions de reprise de lecture supprimées. + Utiliser ILAF + L\'Infrastructure Logicielle d\'Accès au Stockage permet de télécharger sur une carte mémoire externe. \nNote : certains appareils ne sont pas compatibles - Supprimer les positions de lecture - Supprimer toutes les positions de reprise - Voulez-vous supprimer toutes les positions de reprise \? - Changez les dossier de téléchargement pour activer + Supprimer les positions de reprise de lecture + Supprime toutes les positions de reprise de lecture + Voulez-vous supprimer toutes les positions de reprise de lecture \? + Changez les dossiers de téléchargement pour que cela prenne effet + Activer/Désactiver le service, actuellement sélectionné : + Kiosque par défaut \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 6f826fdf0..b5a0778d4 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -515,4 +515,5 @@ למחוק את מיקומי הנגינה\? יש להחליף את תיקיות ההורדה כדי שייכנס לתוקף הפעלה/כיבוי שירות, בחירה נוכחית: + קיוסק בררת מחדל \ 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 9c3278d7c..364ab8f02 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -128,7 +128,7 @@ वापस जाए सारे प्ले करे NewPipe की अधिसूचना - NewPipe के बैकग्राउंड में चल रहे विडियो और पॉपअप विडियो के लिए अधिसूचना + न्यूपाइप के बैकग्राउंड में चल रहे विडियो और पॉपअप विडियो के लिए अधिसूचना [नहीं जानते] त्रुटी नेटवर्क में त्रुटी @@ -155,7 +155,7 @@ आपकी टिप्पणी: विवरण: विडियो के thumbnail के पूर्व दर्शन - विडियो के thumbnail के पूर्व दर्शन + वीडियो चलाये, समय : अपलोडर के thumbnail वाले फोटो पसंद नापसंद @@ -184,8 +184,8 @@ %s दर्शके - वीडियो - वीडियोस + %s वीडियो + %s वीडियो शुरू रोके @@ -204,7 +204,7 @@ विवरण देखने के लिए दबाये कृपया इंतज़ार करे… क्लिपबोर्ड पर कॉपी हो गया है - कृपया उपलब्ध डाउनलोड फोल्डर को चुने + कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुने पॉपअप के तरीके में खोलने के लिए अनुमति की जरुरत है reCAPTCHA reCAPTCHA चुनौती @@ -237,11 +237,11 @@ पॉपअप प्लेयर निकाले विवरण - कतार में खड़ा करे - कतार को बैकग्राउंड में लगाये - कतार को पॉपअप में लगाये + जोड़ने के लिए पकड़ें रहे + पृष्टभूमि की कतार में लगाए + नए पॉपअप कि कतार में लगाए यंहा से चलाना शुरू करे - बैकग्राउंड में चलाना शुरू करे + पृष्टभूमि में चलाना शुरू करे पॉपअप में चलाना शुरू करे स्ट्रीम करने के लिए प्लेयर उपलब्ध नहीं है (आप इसे चलाने के लिए VLC प्लेयर इंस्टॉल कर सकते हैं)। स्ट्रीम डाउनलोड करें @@ -293,20 +293,20 @@ हमेशा पूछें जानकारी प्राप्त की जा रही है… अनुरोधित सामग्री लोड कर रहे है - नई प्लेलिस्ट बनाएं - प्लेलिस्ट हटाएं - प्लेलिस्ट का नाम बदलें + नई प्लेलिस्ट + हटाएं + नाम बदलें नाम प्लेलिस्ट में जोड़ें प्लेलिस्ट थंबनेल के रूप में सेट करें प्लेलिस्ट बुकमार्क करें बुकमार्क हटायें - क्या आप इस प्लेलिस्ट को हटाना चाहते हैं? + प्लेलिस्ट को हटाना चाहते हैं\? सूची बना दी गई प्लेलिस्ट में जोड़ा गया - प्लेलिस्ट का थंबनेल बदल दिया गया है - सूची हटाने में असफल - कोई कैप्शन नहीं है + प्लेलिस्ट का थंबनेल बदल दिया गया है। + सूची हटाने में असफल। + कोई अनुशीर्षक नहीं है फिट भरें ज़ूम करें @@ -318,7 +318,7 @@ छायाप्रारुप लोड करें तेजी से अचूक तलाश का प्रयोग करें अचूक खोज प्लेयर को कम परिशुद्धता के साथ तेजी से पदों की तलाश करने की अनुमति देता है - लोडिंग थंबनेल, डेटा और मेमोरी उपयोग को रोकने के लिए बंद करें। इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को बदलता है + थंबनेल लोड करने, डेटा और मेमोरी उपयोग को रोकने के लिए बंद करें। इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को बदलता है| छवि कैश मिटा दिया कैश मेटाडेटा वाइप करें सभी कैश किए गए वेबपृष्ठ डेटा हटाएं @@ -331,7 +331,7 @@ क्स उपभोगता देखे हुए वीडियो की सूची साफ करें - चलाये गए स्ट्रीम का इतिहास साफ करता है + चलाये गए स्ट्रीम के इतिहास और प्लेबैक स्थानों को साफ करता है देखे गए सभी का इतिहास साफ करें\? देखे हुए का इतिहास साफ कर दिया गया। ढूंढने के इतिहास को साफ करें @@ -351,10 +351,10 @@ \nन्यूपाइप की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। गोपनीयता नीति पढ़े क्या आप सेटिंग्स भी आयात करना चाहते है? - पसंदीदा \'खोलने पर\' करवाई + पसंदीदा \'खोलने\' कि प्रक्रिया सामग्री खोलते समय डिफ़ॉल्ट कारवाही — %s - केप्सन - प्लेयर केप्शन के शब्दों का परिमाण और पृष्ठभूमि शैलियो को बदले। लागू करने के लिए ऐप को पुनः प्रारम्भ करना जरूरी है। + अनुशीर्षक + प्लेयर अनुशीर्षक के शब्दों का परिमाण और पृष्ठभूमि शैलियो को बदले। लागू करने के लिए ऐप को पुनः प्रारम्भ करना जरूरी है। आयात/निर्यात आयात से आयात करे @@ -370,7 +370,7 @@ \n1. इस URL पर जाए: %1$s \n2. जब कहा जाए, लॉगिन करे \n3. एक डाउनलोड शुरू होना चाहिए (यही निर्यात की गई फाइल है) - आपका आई डी, soundcloud.com/yourid + आपका आई डी, soundcloud.com/(आपका आई डी) ध्यान रखे, यह तरीका नेटवर्क साधनो के लिए मंहगा हो सकता है। \n \nक्या आप आगे बढ़ना चाहते है? @@ -384,16 +384,125 @@ स्वीकारे अस्वीकार करे असीमित - मोबाइल डेटा उपयोग करते समय रेसॉल्युसेन मर्यादित करे - ऐप बदलते समय मिनिमाइज करे - "कार्यवाई, मुख्य वीडियो चालक से दूसरी ऐप पर जाने पर — %s" + मोबाइल डेटा उपयोग करते समय रेसॉल्युसेन को सिमित करे + ऐप बदलते समय उसे मिनिमाइज करे + मुख्य वीडियो चालक से दूसरी ऐप पर जाने पर — %s कोई नही - पृष्ठभूमि प्लेयर जैसे मिनिमाइज करे - पॉप अप प्लेयर जैसे मिनिमाइज करे + पृष्ठभूमि प्लेयर में बदले + पॉप अप प्लेयर में बदले न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। सदस्यता वापस ले ली नया टॅब टॅब चुने वॉल्यूम नियंत्रण कतार + प्लेयर का वॉल्यूम बढ़ने के लिए इशारो का इस्तेमाल करे + चमक बदलने का इशारा + प्लेयर की चमक बदलने के लिए इशारो का इस्तेमाल करे + अपडेट + फाइल मिटा दी गयी + अप्प अपडेट अधिसूचना + नए NewPipe अपडेट की अधिसूचना + एक्सटर्नल स्टोरेज अनुपलब्ध + SD कार्ड पर डाउनलोड करना संभव नहीं।डाउनलोड स्थान पुनः चुने\? + सामान्य चुनाव पर लौटे + क्या आप सामान्य चुनाव पर लौटना चाहते है\? + अभिदाता संख्या अनुपलब्ध + मुख्य पृष्ठ पर कौन से टैब दिखाए जाते हैं + चयन + अपडेट + सूची + दृश्य बदले + NewPipe अपडेट उपलब्ध! + डाउनलोड करने के लिए टैप करें + समाप्त + अपूर्ण + रोका हुआ + कतार में + प्रक्रिया के बाद + कार्य सिस्टम द्वारा अस्वीकार + डाउनलोड विफल रहा + डाउनलोड समाप्त + %s डाउनलोड समाप्त + अनोखा नाम बनाये + ऊपर लिखना + इस नाम का एक डाउनलोड चालू है + कोड + गंतव्य फ़ोल्डर नहीं बनाया जा सकता + फ़ाइल नहीं बनाई जा सकती + सिस्टम द्वारा अनुमति से इनकार किया गया + सुूरक्षित कनेक्शन विफल + सर्वर नहीं ढूँढ सका + सर्वर से जुड़ नहीं सकता + सर्वर डेटा नहीं भेजता है + अनुरोधित सीमा संतोषजनक नहीं है + नहीं मिला + प्रक्रिया के बाद का कार्य विफल रहा + समाप्त डाउनलोड साफ़ करें + रुको + अधिकतम पुनर्प्रयास + डाउनलोड रद्द करने से पहले प्रयासों की अधिकतम संख्या + मीटर्ड नेटवर्क पर रोके + मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परन्तु कुछ डौन्लोडस रोके नहीं जा सकते है + घटनायें + सम्मेलनों + टिप्पणियाँ दिखाए + टिप्पणियाँ न देखने के लिए बंद करे + ऑटोप्ले + + टिप्पणियाँ + + + कोई टिपण्णी नहीं + टिप्पणियाँ लोड नहीं कर सका + बंद करे + फिर से शुरू करे + आखरी प्लेबैक स्थान पर लौटे + सूचियों में स्थान + प्लेबैक स्थान निशान सूचियों में दिखाए + डाटा मिटायें + प्लेबैक स्थान मिटा दिए गए| + फाइल की जगह बदली गयी या फिर फाइल मिटा दी गयी + इस नाम की कोई फ़ाइल पहले से मौजूद है + इस नाम की एक डाउनलोड की गई फ़ाइल पहले से मौजूद है + फाइल के ऊपर नहीं लिख सकते + इस नाम का एक डाउनलोड बाकी है + फ़ाइल पर कार्य करते समय NewPipe बंद किया गया + डिवाइस पर जगह समाप्त + प्रगति खो गई, क्योंकि फ़ाइल मिटा दी गई थी + कनेक्शन का समय समाप्त + क्या आपको यकीन है\? + डाउनलोड कतार सीमित करें + एक ही समय में एक डाउनलोड चलेगा + डाउनलोड प्रारंभ करें + डाउनलोड रोकें + डोलोड कहाँ करने के लिए पूछे + आपको हर डाउनलोड का स्थान पूछा जाएगा + SAF का उपयोग करें + प्लेबैक स्थानों को मिटाये + सारे प्लेबैक स्थानों को मिटाये + सारे प्लेबैक स्थानों को मिटाये\? + प्रभावी होने के लिए डाउनलोड फ़ोल्डर बदलें + फ्रेगमेंट या एक्टिविटी लाइफसाइकिल के बाद Rx सन्देश ना पहुँचाया जा सके तोह ज़रूर कोशिश करे + SoundCloud प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: +\n१ अपने वेब ब्राउज़र मैं \"डेस्कटॉप मोड\" चालू करे (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) +\n२ इस युआरएल को खोले:% 1 $ s +\n३ लोग इन करे +\n४ आप जिस प्रोफाइल युआरएल पे भेजे जाते है उसे कॉपी करे| + यूरोप के जनरल डाटा प्रोटेक्शन रेगुलेशन (जी डी पी आर) का पालन करने के लिए, हम आपका ध्यान न्यूपाइप की नयी प्राइवेसी पालिसी पी डालना चाहते है।इसे बारीकी से पढ़िए। +\nआपको अगर हमें किसी मुसीबत का सन्देश भेजना हो तो इसे स्वीकार करे। + सामान्य टैब्स का इस्तेमाल, सहेजे टैब्स को पढ़ने में रूकावट + जब इस ऐप के लिए अपडेट उपलब्ध हो, अधिसूचना दिखाई जाये + सूचि देखने वाला ढंग + ग्रिड + ऑटो + मुसीबत दिखाए + सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ + आपके %s रुके हुए कामों को डौन्लोडस में पुनः से शुरू करे + आपको डाउनलोड कहाँ सहेजना है हर डाउनलोड पर पूछा जायेगा +\nअगर आपको एक्सटर्नल एस डी कार्ड पर डाउनलोड करना हो तो एस ऐ ऍफ़ चुनिए + स्टोरेज एक्सेस फ्रेमवर्क (एस ऐ ऍफ़) आपको एस डी कार्ड पर डाउनलोड करने देता है +\nसुचना - कुछ उपकरणों पर ये नहीं चलता + सेवा चुने, वर्तमान चुनाव : + सामान्य कीओस्क \ No newline at end of file diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 0bbbbbe9e..db738d749 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -68,7 +68,7 @@ Komentar anda (dalam bahasa Inggris): Detail: Thumbnail pratinjau video - Thumbnail pratinjau video + Putar video, durasi: Suka Thumbnail avatar pengunggah Tidak suka @@ -499,4 +499,8 @@ Hapus semua posisi pemutaran Hapus semua posisi pemutaran\? Ubah folder unduhan + + Video + + Aktif/Nonaktifkan layanan, saat ini aktif: \ No newline at end of file diff --git a/app/src/main/res/values-iw b/app/src/main/res/values-iw new file mode 120000 index 000000000..08adc17cc --- /dev/null +++ b/app/src/main/res/values-iw @@ -0,0 +1 @@ +values-he/ \ 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 8057e9f48..b67da798c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -85,7 +85,7 @@ 開始 一時停止 再生 - 削除する + 削除 チェックサム 新しいミッション OK @@ -112,7 +112,7 @@ ブラック すべて チャンネル - K + k M B はい @@ -244,7 +244,7 @@ これにより、現在の設定が上書きされます。 バックグラウンド再生 ここから再生を開始 - バックグランドで再生を開始 + バックグランドで連続再生を開始 ドロワーを開く ドロワーを閉じる 動画プレイヤー @@ -284,7 +284,7 @@ 変更 プレイリスト名 プレイリストに追加 - プレイリストのサムネイルとして設定 + プレイリストのサムネイルに設定 プレイリストをブックマーク ブックマークを削除 このプレイリストを削除しますか? @@ -348,10 +348,10 @@ トラック NewPipe バックグラウンドおよびポップアップのプレイヤーの通知 新着 & 人気 - 長押ししてキューに入れる - バックグラウンドでキューに入れる - ポップアップでキューに入れる - 新しいポップアップで再生を開始 + 長押ししてキューに追加 + バックグラウンドのキューに追加 + ポップアップのキューに追加 + ポップアップで連続再生を開始 すぐにここに表示されます;D お好みの \'開く\' アクション コンテンツを開くときのデフォルト動作 — %s @@ -499,4 +499,8 @@ すべての再生位置を削除しますか\? ダウンロードフォルダーを変更して有効にします サービスの切り替え、現在の選択: + + %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 6cd24123a..333891910 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,45 +1,45 @@ - 시청 횟수 %1$s + 조회수 %1$s회 %1$s에 업로드됨 - 스트리밍 플레이어가 발견되지 않았습니다. VLC를 설치할까요? + 스트림 플레이어가 발견되지 않았습니다. VLC를 설치할까요\? 설치 취소 - 브라우저에서 열기 + 브라우저로 열기 공유 다운로드 검색 설정 - 혹시 이것을 검색하셨습니까\?: %1$s\? + %1$s를 찾으셨나요\? 다음으로 공유 브라우저 선택 회전 비디오 다운로드 폴더 - 다운로드된 비디오 파일이 이 곳에 저장 됩니다 - 비디오 파일을 다운로드 받을 폴더를 선택하세요 + 다운로드된 비디오 파일이 이 곳에 저장됩니다 + 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 Kore 앱이 발견되지 않았습니다. Kore를 설치할까요? \"Kodi로 재생\" 옵션 표시 - 비디오를 Kodi media center를 사용해 재생하는 옵션을 표시합니다 + 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 기본 오디오 형식 다운로드 다음 - 다음 및 유사한 비디오 표시 - 지원하지 않는 URL 입니다 + 다음/유사한 비디오 표시 + 지원하지 않는 URL입니다 기본 컨텐츠 언어 비디오 & 오디오 비디오 미리보기 썸네일 - 비디오 미리보기 썸네일 + 비디오 재생, 구간: 업로더 썸네일 싫어요 좋아요 외부 비디오 플레이어 사용 외부 오디오 플레이어 사용 오디오 다운로드 폴더 - 다운로드된 오디오 파일은 여기에 저장됩니다 - 오디오 파일을 다운로드할 폴더를 선택하세요 + 다운로드된 오디오 파일이 이 곳에 저장됩니다 + 오디오 파일이 다운로드 될 폴더를 선택하세요 테마 어두운 테마 밝은 테마 @@ -53,8 +53,8 @@ 다운로드 디렉토리를 만들 수 없습니다 \'%1$s\' 다운로드 디렉토리를 만들었습니다 \'%1$s\' 검색 버튼을 눌러서 시작하세요 - 자동으로 재생 - NewPipe가 다른 앱으로부터 호출되었을 때 동영상을 재생합니다 + 자동재생 + NewPipe가 다른 앱에서 호출되었을 때 동영상을 재생합니다 컨텐츠 연령 제한 컨텐츠 연령 제한 비디오입니다. 설정 메뉴에서 시청 허용 여부를 변경하실 수 있습니다. @@ -88,18 +88,18 @@ 일시정지 삭제 체크섬 - 팝업 모드에서 열기 - 일부 해상도에서 소리가 나지 않습니다 - 뉴파이프 팝업 모드 + 팝업 모드로 열기 + 일부 해상도에서 소리가 나지 않을 수 있습니다 + NewPipe 팝업 모드 구독 - 구독됨 - 채널 구독 해제됨 + 구독중 + 구독 취소됨 구독 여부를 변경할 수 없음 구독을 업데이트할 수 없음 메인 화면 구독 새로운 영상 - 배경 + 백그라운드 팝업 기본 팝업 해상도 높은 해상도 표시 @@ -108,21 +108,21 @@ 검은 테마 팝업 크기 및 위치 기억 마지막으로 사용한 팝업 위치 및 크기를 기억합니다 - 제스쳐로 재생 조작 - 제스쳐를 사용해 화면 밝기와 음량을 조절합니다 + 제스처 재생 조작 + 제스처를 사용해 화면 밝기와 음량을 조절합니다 검색 제안 검색 중에 제안을 표시합니다 검색 기록 검색 기록을 기기에 저장합니다 기록 보기 - 시청했던 비디오 기록을 저장 - 초점 복원시 재생 재개 + 시청했던 비디오 기록을 저장합니다 + 자동으로 다시 재생 전화 통화 등으로 인해 재생이 중단된 이후에 다시 재생을 시작합니다 - 눌러서 팁 표시 - 비디오 상세 정보 페이지에서 백그라운드 재생 또는 팝업 버튼을 누를 경우 팁 표시 + \"길게 눌러 대기열에 추가하기\" 팁 표시 + 비디오 상세 정보 페이지에서 백그라운드/팝업 재생 버튼을 누를 경우 팁을 표시합니다 플레이어 동작 - 기록과 캐시 + 기록 & 캐시 팝업 팝업 모드에서 재생 중 백그라운드 플레이어에 대기됨 @@ -141,8 +141,8 @@ 최대 해상도 되돌리기 전부 재생 - 뉴파이프 알림 - 뉴파이프 백그라운드 및 팝업 플레이어 알림 + NewPipe 알림 + NewPipe 백그라운드 및 팝업 플레이어 알림 [알 수 없음] 이미지를 불러올 수 없습니다 앱/UI 충돌 @@ -154,14 +154,14 @@ 구독할 항목을 추가하세요 백만 - 10억 + 십억 구독자 없음 - %s 구독자 + 구독자 %s명 - 시청 횟수 없음 + 조회수 없음 - %s 시청 횟수 + 조회수 %s회 비디오 없음 재생 @@ -173,46 +173,46 @@ 지원하지 않는 서버 파일이 이미 존재합니다 올바르지 않은 URL이거나 인터넷에 접속할 수 없음 - 뉴파이프 다운로드 중 + NewPipe 다운로드 중 터치해서 상세 정보 확인 - 잠시만 기다려주십시오… + 잠시만 기다리세요… 클립보드에 복사됨 - 다운로드 할 폴더를 설정에서 지정하십시오 + 다운로드 할 폴더를 설정에서 지정하세요 이 권한은 팝업 모드에서 \n열기 위해 필요합니다 - 로봇인지 확인 (reCAPTCHA) - reCAPTCHA challenge 요청됨 + reCAPTCHA + reCAPTCHA 확인 요청됨 다운로드 파일명에 허용되는 문자 올바르지 않은 문자는 다음 문자로 대체됩니다 대체 문자 문자 및 숫자 가장 특수한 문자 - 뉴파이프에 대해서 + NewPipe에 대해서 설정 - 뉴파이프 + NewPipe 정보 제3자 라이센스 © %3$s 하에서 %2$s 에 의한 %1$s 라이센스 불러올 수 없음 웹사이트 열기 - 뉴파이프 + NewPipe 정보 기여자 라이센스 가볍고 빠른 자유 안드로이드 스트리밍 앱입니다. 기여 - 번역, 디자인, 코딩 등 다양한 기여를 언제나 환영합니다. 향상에 참여해주세요! + 번역, 디자인, 코딩 등 다양한 기여를 언제나 환영합니다. 더 나아지도록 도와주세요! GitHub에서 보기 기부 - 여러분의 사용자 경험을 위해 자원봉사자들이 시간을 들여 뉴파이프를 개발하고 있습니다. 뉴파이프를 개선하는데 참여하는 개발자들을 위하여 기부해 주세요. + 여러분들의 더 나은 경험을 위해 많은 사람들이 NewPipe를 개발하는데 노력을 기울이고 있습니다. NewPipe에 참여하는 개발자들이 커피 한 잔을 즐길 수 있도록 기부해주세요. 보답하기 웹사이트 - 뉴파이프에 관한 최신 및 상세 정보를 얻으려면 웹사이트를 방문하세요. - 뉴파이프가 채택한 라이센스 + NewPipe에 관한 더 많은 정보를 얻으려면 웹사이트를 방문하세요. + NewPipe가 채택한 라이센스 라이센스 읽기 기록 검색함 시청함 - 기록을 사용하지 않습니다 + 기록 기능이 꺼져 있습니다 기록 기록이 없습니다 기록이 삭제되었습니다 @@ -237,20 +237,20 @@ 상세 정보 오디오 설정 눌러서 대기열에 추가 - 백그라운드로 갈 경우 재생목록에서 제거 - 새 팝업으로 갈 경우 재생목록에서 제거 + 백그라운드 대기열에 추가 + 새 팝업으로 대기열에 추가 여기서부터 재생 백그라운드에서 재생 새 팝업에서 재생 - 스트리밍 플레이어를 찾을 수 없습니다. VLC를 설치하면 플레이하실 수 있습니다. - 스트리밍 파일 다운로드하기 + 스트림 플레이어를 찾을 수 없습니다 (VLC를 설치하여 동영상을 재생할 수 있습니다). + 스트림 파일 다운로드하기 정보 보기 - 플레이리스트 북마크 + 재생목록 북마크 이곳에 추가 정확하지는 않지만 빠른 탐색 - 정확하지 않은 탐색은 빠르게 위치로 탐색할 수 있지만 정확도는 떨어집니다 - 다음 스트림을 자동으로 재생열에 추가하기 - 이전 스트림이 무한 반복 재생 큐가 아닐 경우, 관련 스트림을 자동 재생합니다 + 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다 + 다음 스트림을 자동으로 대기열에 추가하기 + 이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생합니다 기본 콘텐츠 국가 서비스 디버그 @@ -270,11 +270,11 @@ 발견된 오디오 스트림 없음 드래그하여 재배열 만들기 - 1개 삭제하기 + 하나 삭제하기 모두 삭제하기 취소 이름 바꾸기 - 로봇인지 확인합니다 + reCAPTCHA 확인 이 항목을 시청 기록에서 삭제하시겠습니까? 모든 항목을 시청 기록에서 삭제하시겠습니까? 마지막으로 재생 @@ -282,7 +282,7 @@ 내보내기 완료 가져오기 완료 유효한 ZIP 파일 없음 - 경고: 모든 파일 가져오기를 실패했습니다. + 경고: 파일을 전부 가져오지 못했습니다. 이것은 현재 설정을 덮어쓸 것입니다. 드로어 열기 드로어 닫기 @@ -292,7 +292,7 @@ 팝업 플레이어 항상 묻기 정보 가져오는 중… - 요청한 콘텐츠를 로딩 중입니다 + 요청한 콘텐츠를 로드 중입니다 새로운 재생목록 삭제 이름 바꾸기 @@ -304,15 +304,15 @@ 이 재생목록을 삭제하시겠습니까? 재생목록 생성 완료 재생목록에 추가됨 - 재생목록 썸내일이 바뀜. + 재생목록 썸네일 변경 완료. 재생목록을 삭제할 수 없습니다. 자막 없음 꼭 맞게 하기 채우기 확대 자동 생성됨 - LeakCanary 할성화 - 힙 덤프 중 메모리 누수 점검으로 앱이 불안정해질 수 있습니다 + LeakCanary 활성화 + 메모리 누수 감시를 사용할 시 힙 덤프로 인해 앱이 반응하지 않을 수 있습니다 out-of-lifecycle 오류 보고 프래그먼트 또는 버려진 액티비티 주기 밖에서 일어나는 전달할 수 없는 Rx 예외를 강제적으로 보고하기 파일 @@ -345,12 +345,11 @@ \n3. 로그인이 필요하면 하세요. \n4. 리디렉트된 프로필 URL을 복사하세요. 프로필ID, soundcloud.com/프로필ID - 경고: 데이터 소모량이 늘어날 수 있습니다. + 경고: 데이터가 많이 소모될 수 있습니다. \n -\n계속하시겠습니까? - 썸내일 로드하기 - 동영상 썸네일을 로드하지 않으며, 데이터와 메모리 사용을 최대한 줄입니다. 이 옵션을 -\n선택 시 모든 메모리 캐시와 저장소 캐시를 삭제합니다. +\n계속하시겠습니까\? + 썸네일 로드하기 + 동영상 썸네일을 로드하지 않으며, 데이터와 메모리 사용을 최대한 줄입니다. 이 옵션을 선택 시 모든 메모리 캐시와 저장소 캐시를 삭제합니다. 이미지 캐시 지워짐 캐시된 메타데이터 지우기 캐시된 모든 웹페이지 데이터 지우기 @@ -365,9 +364,9 @@ 선호하는 열기 동작 컨텐츠를 열 때 사용할 기본 동작 — %s 자막 - 플레이어 자막 텍스트 크기와 배경 스타일을 변경합니다. 효과를 적용하려면 앱을 재시작 해야합니다. - 채널만 - 재생 목록만 + 플레이어 자막 글자 크기와 배경 스타일을 변경합니다. 이를 적용하려면 앱을 재시작 해야 합니다. + 채널 + 재생목록 시청 기록 삭제하기 동영상 시청 기록과 저장된 재생 위치를 삭제합니다 모든 시청 기록을 삭제하시겠습니까\? @@ -376,32 +375,32 @@ 검색 기록을 모두 삭제합니다 모든 검색 기록을 삭제하시겠습니까\? 검색 기록이 삭제되었습니다. - 뉴파이프 개인정보 보호 정책 - 뉴파이프 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. -\n뉴파이프 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다. + NewPipe 개인정보 보호 정책 + NewPipe 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. +\nNewPipe 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다. 개인정보 보호 정책 읽기 - 뉴파이프는 카피레프트 자유 소프트웨어입니다. 사용자는 이 앱을 사용, 공유, 또는 수정할 수 있고, 수정 후 재배포 시 자유 소프트웨어 재단의 GNU 라이센스 버전 3 또는 그 이상의 버전을 포함해야 합니다. - 앱 설정을 가져오시겠습니까? - 무음 구간 스킵 - 유럽 연합 일반 데이터 보호 규정 (GDPR) 에 따라, 사용자는 뉴파이프 개인정보 보호 정책을 읽고 꼼꼼히 확인해야 합니다. 버그 리포트를 보내시려면 개인정보 보호 정책에 동의해주세요. + NewPipe는 카피레프트 자유 소프트웨어입니다. 사용자는 이 앱을 사용, 공유, 또는 수정할 수 있고, 수정 후 재배포 시 자유 소프트웨어 재단의 GNU 라이센스 버전 3 또는 그 이상의 버전을 포함해야 합니다. + 설정도 가져오시겠습니까\? + 무음 구간 빨리 감기 + 유럽 연합 일반 데이터 보호 규정 (GDPR) 에 따라, 사용자는 NewPipe 개인정보 보호 정책을 읽고 꼼꼼히 확인해야 합니다. 버그 리포트를 보내시려면 개인정보 보호 정책에 동의해주세요. 동의 동의하지 않음 데이터 제한 없음 모바일 데이터 사용 시 화질 제한 - 구독 해제 + 구독 취소 새 탭 탭 선택 - 제스쳐로 음량 조작 - 제스쳐를 사용해 플레이어의 음량을 조작 합니다 - 제스쳐로 밝기 조작 - 제스쳐를 사용해 화면 밝기를 조작합니다 + 제스처 음량 조작 + 제스처를 사용해 플레이어의 음량을 조작합니다 + 제스처 밝기 조작 + 제스처를 사용해 화면 밝기를 조작합니다 업데이트 트랙 사용자 이벤트 파일 삭제됨 앱 업데이트 알림 - 새 뉴파이프 버전 알림 + 새 NewPipe 버전 알림 외부 저장소 없음 SD 카드로 다운로드 할 수 없습니다. 다운로드 폴더 경로를 초기화 하시겠습니까\? 1개의 항목이 삭제되었습니다. @@ -415,8 +414,8 @@ 저장된 탭을 읽는 중 오류가 발생하여 기본 탭을 사용합니다 초기화 초기 설정으로 복원하시겠습니까\? - 구독자 숫자가 없습니다 - 메인 화면에 표시할 탭 + 구독자 수를 가져올 수 없습니다 + 메인 화면에 표시할 탭을 설정합니다 선택 업데이트 새 버전이 있을 경우 앱을 업데이트하도록 알림 표시 @@ -474,8 +473,8 @@ 닫기 재생 재개 마지막 재생 위치부터 재생 - 리스트내 위치 - 리스트에서 재생위치 인디케이터를 표시합니다 + 리스트 내 위치 표시 + 리스트에서 재생 위치를 표시합니다 데이터 삭제 재생위치 삭제완료. 파일이 이동되거나 삭제되었습니다 @@ -489,7 +488,7 @@ 다운로드 대기 제한 다운로드 시작 다운로드 일시정지 - 다운로드 위치를 물음 + 다운로드 위치를 묻기 다운로드 할때 마다 저장위치를 물을 것 입니다 SAF 사용 스토리지 액세스 프레임워크(SAF)는 외장 SD카드에 다운로드 할 수 있도록 해줍니다. @@ -499,4 +498,11 @@ 모든 재생 위치를 삭제하시겠습니까\? 매 다운로드 마다 저장경로를 묻습니다. \n외장 SD카드에 다운로드 하고자 한다면 SAF를 선택하십시오 + + %s개의 동영상 + + 하나의 다운로드가 동시에 진행됩니다 + 적용하려면 다운로드 폴더를 변경하세요 + 서비스 토글, 현재 선택된 서비스: + 기본 키오스크 \ No newline at end of file diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index ca1721115..94119119a 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -1,16 +1,17 @@ - -Стисни на пребарување за да почнеш + + + Стисни на пребарување за да почнеш %1$s прегледи Објавено на %1$s Не е најден плеер за стримови. Инсталирај VLC? - Не е најден плеер за стримови (можеш да инсталираш VLC) + Не е пронајден плеер за стримови (можеш да инсталираш VLC) Инсталирај Откажи Отвори во пребарувач Отвори во прозорче Сподели Превземи - Превземи стрим датотека. + Превземи датотека за стрим Пребарај Поставки Мислеше на: %1$s\? @@ -18,7 +19,7 @@ Одбери пребарувач ротација Користи надворешен видео плеер - Некои резолуции НЕМААТ звук со оваа опција + Отстранува звук на НЕКОИ резолуции Користи надворешен аудио плеер NewPipe мало прозорче Зачлени се @@ -27,25 +28,19 @@ Не може да се промени членството Не може да се освежи членството Покажи информации - Почетна Членства - Обележани - + Обележани плејлисти Новости - Позадина Подпрозорче Додај на - Локација за зачувување на видеата Локација за зачувување на видеата Внеси локација за зачувување на видеата - Локација за зачувување аудио Локација за зачувување аудио Внеси локација за зачувување аудио - Автоматско пуштање Пушта видео кога NewPipe е повикана од друга апликација Стандардна резолуција @@ -130,17 +125,13 @@ Секогаш Само еднаш Датотека - Известување од NewPipe NewPipe Известувања за подпрозорчето и заднинското пуштање - [Непознато] - Смени ориентација Пушти во позадина Пушти во подпрозорче Пушти во главната апликација - Внеси датабаза Изнеси база на податоци Ќе ги избрише моменталните членства и историја @@ -169,7 +160,6 @@ Датотеката не постои или се потребни привилегии за достапност Датотеката не може да биде празна Настана проблем: %1$s - Извинете, не требаше да се случи тоа. Извести за грешката по е-пошта Извинете, настана проблем. @@ -179,8 +169,6 @@ Што:\\nБарање:\\nЈазик на Содрж.:\\nУслуга:\\nGMT Час:\\nПакет:\\nВерзија:\\nВерз. на ОС: Ваш коментар (на Англиски): Детали: - - Сликичка за преглед на видеото Сликичка за преглед на видеото Икона од аватарот на објавителот @@ -193,37 +181,30 @@ Нема резултати Тука Е Празно :( Влечи за да разместиш - Не може да се создаде локација \'%1$s\' Создадена локација \'%1$s\' - Видео Звук Пробај повторно Нема привилегии за пристап - K M B - Нема зачленети - %s зачленет - %s зачленети - - + %s зачленет + %s зачленети + Нула прегледи - %s преглед - %s прегледи - - + %s преглед + %s прегледи + Нема видеа - %s видео - %s видеа - - + %s видео + %s видеа + Започни Пауза Пушти @@ -234,10 +215,8 @@ Чексума Отфрли Прекрсти - Нова мисија Готово - Име на датотека Нишки Грешка @@ -251,19 +230,15 @@ Одберете достапна локација за превземања Оваа привилегија е потребна за \nотворање во подпрозорче - „reCAPTCHA“ reCAPTCHA Предизвик Потребен е reCAPTCHA предизвик - Превземања Дозволени знаци во имињата на датотеките Невалидните знаци се менуваат со оваа вредност Знак за замена - Букви и броеви Повеќето посебни знаци - За NewPipe Поставки За апликацијата @@ -285,8 +260,6 @@ За повеќе информации и новости за NewPipe посети ја вебстраната. "Лиценцата на NewPipe " Прочитај лиценца - - Историја Пребарано Гледано @@ -300,7 +273,6 @@ Сигурно сакаш да ја избришеш целата историја? Последно пуштено Најгледани - Содржина Празна страна Киоск @@ -315,7 +287,6 @@ Нема валиден ZIP фајл Предупредување: Не се внесени сите датотеки. Ова ќе ги избрише моменталните поставки. - Киоск Популарни Топ 50 @@ -331,64 +302,47 @@ Пушти тука Пушти тука во позадина Пушти тука во прозорче - Отвори картон Затвори картон Нешто спремаме за тука ;D - - Видео плеер Позадински плеер Пушти во прозорче Секогаш прашај - Чекање информации… Одбраната содржина се чита - Создај нова плејлиста Избриши плејлиста Прекрсти плејлиста Име Додај во плејлиста Постави како икона на плејлистата - Обележи ја плејлистата Избриши ја белешката - Сакаш да ја избришеш плејлистата? Листата е создадена Додадено во плејлиста Се смени иконата на плејлистата Неуспешно бришење на листата - Без превод - Вклопи Исполни Зумирај - Автоматски создадено - Вклучи LeakCanary Следењето на мемориските грешки може да ја прикочува апликацијата - Пријави Out-of-lifecycle грешки Секогаш пријавувај неуспешни Rx исклучоци кои настануваат надвор од fragment или activity циклусот по отстранување - Внеси/Изнеси Внеси Внеси од Изнеси до - Внесување… Изнесување… - Внеси датотека Претходно изнесување - Неуспешно внесување членства Неуспешно изнесување членства - Внеси YouTube членства, преку симнување на извозен фајл: \n \n1. Оди на оваа врска: %1$s @@ -401,17 +355,15 @@ \n3. Пријавете се на вашиот профил \n4. Копирајте го URL-то на кое бевте пренасочени (тоа е URL-то на вашиот профил). korisnickoime, soundcloud.com/korisnickoime - Треба да знаеш дека оваа операција троши многу интернет. \n \nСакаш да продолжиш? - Контрола на брзината на траката Темпо Тон Откачи (може да создаде мутации) Стандардно -Избриши историја на гледаност + Избриши историја на гледаност Ја брише историјата на пуштени видеа Избриши ја целата историја на гледаност. Избришана е историјата на гледаност. @@ -420,20 +372,14 @@ Избриши ја целата историја на пребарувања. Избришана е историјата на пребарувања. Нема стримови за симнување - 1 ставка избришана. - Нема апликација за пуштање на овој фајл - NewPipe е „copyleft“ слободен софтвер: Можеш да ја користиш, истражуваш и подобруваш по твоја желба. Можеш да ја редистрибуираш и/или да ја промениш под условите на GNU GPL лиценцата, публикувана од фондацијата FSF - или верзија 3 од лиценцата, или (по можност) понова верзија. Дали сакаш да се внесат и подесувањата? - Претпочитана акција за „отворање“ Стандардна акција при отворање видеа — %s - Преводи Смени ја големината и стилот на преводот. Потребен е рестарт за промена - NewPipe - политика за приватност Проектот NewPipe сериозно ја сфаќа вашата приватност. Затоа апликацијата не собира ваши податоци без ваша дозвола. \nПолитиката за приватност на NewPipe детално објаснува кои податоци се зачувани и пратени кога праќате извештај за грешка во апликацијата. @@ -442,7 +388,6 @@ \nВе молиме прочитајте ја внимателно. Мора да ја прифатите за да ни го испратите извештајот за грешка во апликацијата. Прифати Отфрли - Неограничено Ограничи резолуција при користење мобилен интернет Канали @@ -452,11 +397,93 @@ Прескокни ја тишината Скокни Почни одново - Скриј при промена на апликацијата Пушти во заднина при промена на апликацијата од видео плеерот — %s Никое Смали го во позадина Смали го во прозорче - - + Откажи членство + Ново јазиче + Одбери јазиче + Гест за контрола на јачина на звук + Користи гест за контрола на јачината на звукот + Гест за контрола на осветленост + Користи гест за контрола на осветленот + Ажурирања + Дадотеката е избришана + Известување за ажурирање на апликација + Известување за нова NewPipe верзија + Надворешната меморија е недостапна + Превземањето на надворешната SD картичка не е можно. Ресетирајте ја локацијата на папката за преземање \? + Бројот на зачленети не е достапен + Кои јазичиња се прикажани на главната страница + Избор + Ажурирања + Покажи известување за навремено ажурирање на апликацијата кога е достапна нова верзија + Режим на прегледување список + Список + Решетка + Автоматски + NewPipe ажурирање е достапно! + Допри за преземање + Завршено + Во очекување + Паузирано + Во ред за чекање + Редица + Акција одбиена од системот + преземањето не успеа + Преземањето заврши + %s преземањата завршија + Генерирај уникатно име + Презапиши + Во тек е преземање со ова име + Покажи грешка + Код + Папката не може да се создаде + Датотеката не може да се создаде + Дозволата е одбиена од системот + Безбедна врска не успеа + Не може да се пронајде серверот + Не може да се поврзе со серверот + Серверот не испраќа податоци + Серверот не прифаќа преземања со повеќе навои, обидете се со @string/msg_threads = 1 + Побараниот опсег не е задоволителен + Не е најдено + Избриши завршени преземања + Стоп + Максимални обиди + Максимален број обиди пред откажување на преземањето + Корисно при префрлување на мобилни податоци, иако некои преземања не можат да бидат прекинати + Настани + Конференции + Прикажи коментари + Автоматски старт + + Коментари + + + Нема коментари + Не може да се вчитаат коментарите + Затвори + Продолжи со репродукција + Врати ја последната позиција за репродукција + Избриши податоци + Дадотеката е преместена или избришана + Ддотека со ова име веќе постои + Преземената дадотека со ова име веќе постои + NewPipe беше затворен додека работеше на датотеката + Не останува простор на уредот + Истечено време за поврзување + Дали си сигурен\? + Ограничи ја редицата за преземање + Едно преземање ќе работи истовремено + Започи со преземања + Паузирај преземања + Вие ќе добиете прашање каде да го зачувате секое преземање + Вие ќе добиете прашање каде да го зачувате секое преземање +\nИзберете SAF ако сакате да преземете во надворешна SD картичка + Користи SAF + Рамката за пристап до складирање овозможува преземања во надворешна SD-картичка. +\nЗабелешка: некои уреди не се поддржани. + \ 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 456da27fc..d26886844 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -16,12 +16,12 @@ sideoppsett Bruk ekstern videoavspiller Bruk ekstern lydavspiller - Videoens nedlastingssti - Mappe lagrede nedlastinger skal puttes i - Skriv inn nedlastingssti for videoer + Video nedlasting mappe + Nedlastede videofiler lagres her + Velg nedlastingsmappe for videofiler Nedlastingsmappe for lyd - Nedlastet lyd lagres her - Skriv inn nedlastingssti for lydfiler + Nedlastede lydfiler lagres her + Velg nedlastingsmappe for lydfiler Forvalgt oppløsning Spill av med Kodi Kore-programmet ble ikke funnet. Installer det? @@ -44,7 +44,7 @@ Spill av Nettverksfeil Video-forhåndsvisning i miniatyrbilde - Miniatyrbilde for video-forhåndsvisning + Spill av video, varighet: Opplasterens avatar Nikk Nesetrekk @@ -65,7 +65,7 @@ Kunne ikke tolke nettside fullstendig Innholdet er utilgjengelig Kunne ikke sette opp nedlastingsmeny - Direktesendinger støttes ikke enda. + Direktesendinger støttes ikke ennå Kunne ikke finne noen strømmer Beklager, dette skal ikke skje. Rapporter feil via e-post @@ -105,7 +105,7 @@ Start Nytt mål Feilaktig nettadresse eller manglende internettilknytning - Velg nedlastingsmappe senere i innstillingene + Definer en nedlastingsmappe senere i innstillingene reCAPTCHA reCAPTCHA-oppgave Åpne i oppsprettsmodus @@ -376,7 +376,7 @@ Skru av for å stoppe innlasting av miniatyrbilder, noe som sparer data- og minnebruk. Endring av dette vil tømme både disk- og minne-hurtiglager. Legg til en relatert strøm ved avspilling av forrige strøm i ikke-repeterende kø Minnelekkasjeoppsyn kan forårsake programmet å opptre uresponsivt under haugdumping - Rapporter feil som opptrer utenfor sin levetid + Rapporter feil utenfor livssyklusen Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse Avhekt (kan forårsake forvrenging) NewPipes personvernspraksis @@ -415,7 +415,7 @@ Merknader for nye NewPipe-versjoner Ekstern lagring utilgjengelig Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\? - Bruker forvalgte faner, feil under lagring av lagrede faner. + Bruker forvalgte faner, feil under lesing av lagrede faner Gjenopprett forvalg Ønsker du å gjenopprette alt til forvalgene\? Abonnementsantall ikke tilgjengelig @@ -423,17 +423,17 @@ Utvalg Konferanser Oppdatering - Vis en merknad for spørring om programoppdatering når en ny versjon er tilgjengelig + Varsle om programoppdatering når en ny versjon er tilgjengelig Listevisningmodus Liste Rutenett Auto Veksle visning - Ny NewPipe-versjon tilgjengelig. + NewPipe-oppdatering tilgjengelig! Trykk for å laste ned Fullført pauset - i kø + I kø etterbehandling Handling avvist av systemet @@ -454,7 +454,7 @@ Kan ikke koble til tjeneren Tjeneren sender ikke data "Tjeneren godtar ikke flertrådede nedlastinger, prøv igjen med @string/msg_threads = 1 " - Forespurt nummerområde kan ikke innvilges + Forespurt rekkevidde er ikke tilfredsstillende Ikke funnet Etterbehandling mislyktes Tøm fullførte nedlastinger @@ -480,7 +480,7 @@ Posisjon i lister Vis avspillingsposisjonsindikator i lister Tøm data - Avspillingsposisjon slettet + Avspillingsposisjon slettet. Fil flyttet eller slettet En fil ved dette navnet finnes allerede Kan ikke overskrive filen @@ -496,13 +496,15 @@ Sett nedlastinger på pause Spør om hvor ting skal lastes ned til Du vil bli spurt om hvor hver nedlasting skal plasseres - Du vil bli spurt om hvor hver nedlasting skal plasseres. -\nSkru på dette valget hvis du vil laste ned til eksternt SD-kort. + Du vil bli spurt om hvor hver nedlasting skal plasseres. +\nSkru på SAF hvis du vil laste ned til eksternt SD-kort Bruk SAF Lagringstilgangsrammeverk (SAF) tillater nedlastinger til eksternt SD-kort. -\nMerk: Noen enheter er ikke kompatible. +\nMerk: Noen enheter er ikke kompatible Slett avspillingsposisjoner Sletter alle avspillingsposisjoner Slett alle avspillingsposisjoner\? - Endre nedlastingsmapper for å benytte dette + Endre nedlastingsmappene for å tre i kraft + Skru tjeneste av/på, for tiden er dette status: + Standard kiosk \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a899b342e..d3c84aa22 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -72,7 +72,7 @@ Twój komentarz (po angielsku): Szczegóły: Miniatura filmu - Miniatura filmu + Odtwarzane wideo, czas trwania: Miniatura zdjęcia wysyłającego Polubienia Łapka w dół @@ -133,7 +133,7 @@ Odśwież Wyczyść Zmiana rozmiaru - K + k M B To pozwolenie jest wymagane, aby @@ -510,4 +510,6 @@ Usuwa wszystkie pozycje odtwarzania Usunąć wszystkie pozycje odtwarzania\? Zmień foldey pobierania, aby zostały uwzględnione + Przełączanie usługi, aktualnie wybranej: + Domyślny Kiosk \ No newline at end of file diff --git a/app/src/main/res/values-pr/strings.xml b/app/src/main/res/values-pr/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-pr/strings.xml @@ -0,0 +1,2 @@ + + \ 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 109d173b3..aaac4fd4c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -7,7 +7,7 @@ Informações: %1$s visualizações Reproduzir - Mostra vídeo com restrições de idade. Permissão para vídeos com essa restrição pode ser dada no menu Configurações. + Contém vídeo com restrição de idade. É possível permitir vídeos com essa restrição em Configurações > Conteúdo. Vídeo Reproduz um vídeo quando o NewPipe for aberto a partir de outro aplicativo Reprodução automática @@ -80,13 +80,13 @@ A interface do aplicativo parou Reproduzindo em segundo plano Não foi possível configurar o menu de download - Capa do vídeo + Reproduzir vídeo, duração: Miniatura do usuário que enviou o vídeo - Informe a pasta de download de áudios - Pasta para salvar áudios baixados + Escolha a pasta de download para áudios + Os áudios baixados serão salvos aqui Pasta para áudios baixados - Informe a pasta de download de vídeos - Pasta para salvar vídeos baixados + Escolha a pasta de download para vídeos + Os vídeos baixados serão salvos aqui Pasta para vídeos baixados Aplicativo Kore não instalado. Instalar? Não foi possível interpretar completamente o site @@ -124,7 +124,7 @@ Desativado k M - G + B Essa permissão é necessária para abrir em modo popup Modo de popup NewPipe @@ -177,7 +177,7 @@ abrir em modo popup Ative para continuar reproduzindo depois de interrupções (por exemplo: ligações) Histórico de pesquisas Armazena histórico de pesquisas feitas - Histórico de visualizações + Histórico de assistidos Armazena histórico de vídeos assistidos Histórico Pesquisado @@ -212,7 +212,7 @@ abrir em modo popup Player Não há nada aqui Deseja apagar este item do seu histórico de pesquisas\? - Conteúdo + Conteúdo da página principal Página em branco Página de banca Página de inscrição @@ -238,7 +238,7 @@ abrir em modo popup Remover Detalhes Configurações de áudio - Mantenha pressionado para colocar na fila + Segure para adicionar à fila [Desconhecido] Adicionar à fila em segundo plano Adicionar à fila em novo popup @@ -287,7 +287,7 @@ abrir em modo popup Excluir todos Dispensar Renomear - Deseja apagar este item do seu histórico de visualizações? + Deseja apagar este item do seu histórico de assistidos\? Tem certeza que deseja apagar todos itens do histórico? Reproduzido anteriormente Mais reproduzido @@ -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 vídeo reproduzido quando a repetição estiver desativada + Adicionar 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 @@ -376,10 +376,10 @@ abrir em modo popup Legendas 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 reproduções + Limpar histórico de assistidos Apaga o histórico de vídeos assistidos e a lista de reprodução - Apagar todo o histórico de reproduções\? - Histórico de reproduções limpo. + Apagar todo o histórico de assistidos\? + Histórico de assistidos limpo. Limpar histórico de pesquisas Apaga o histórico de pesquisas feitas Apagar todo o histórico de pesquisas\? @@ -513,4 +513,7 @@ abrir em modo popup Apagar lista de reprodução Deletar todo o histórico de reprodução Deletar todo o histórico de reprodução\? + Mude as pastas de download para surtir efeito + Alterar serviço, selecionados: + Quiosque Padrão \ 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 8a1a3bcc4..5d7cd8146 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -33,7 +33,7 @@ Idioma do conteúdo predefinido Vídeo e áudio Miniatura de pré-visualização de vídeo - Miniatura de pré-visualização de vídeo + Reproduzir vídeo, duração: Miniatura do avatar do canal Não gostar Gostos @@ -112,7 +112,7 @@ Canais Sim Depois - K + k M B Esta permissão é necessária @@ -505,4 +505,6 @@ Elimina todas as posições de reprodução Eliminar todas as posições de reprodução\? Alterar as pastas de descarregamento para que tenham efeito + Alternar serviço, agora selecionado: + Quiosque Predefinição \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8529d6af5..6f079a221 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -11,7 +11,7 @@ Поиск Настройки Возможно, вы имели в виду: %1$s? - Поделиться в + Поделиться Выбор браузера поворот Папка для скачанного видео @@ -33,7 +33,7 @@ Внешний вид Другое Миниатюра видео-превью - Миниатюра видео-превью + Воспроизвести видео, длительность: Миниатюра аватара пользователя Не понравилось Понравилось @@ -73,7 +73,7 @@ Автовоспроизведение Воспроизводить видео при вызове NewPipe из другого приложения Контент - Видео с возрастными ограничениями. Разрешить подобный контент можно в \"Настройках\". + Видео с возрастными ограничениями. Разрешить подобный контент можно в \"Настройках\" Трансляция Загрузки Загрузки @@ -92,7 +92,7 @@ Информация: Что произошло: Подробности: - (Экспериментально) Загружать через Tor для повышения конфиденциальности (прямые трансляции пока не поддерживаются). + Загружать через Tor для повышения конфиденциальности (прямые трансляции пока не поддерживаются) Сообщить об ошибке Сообщить о нарушении Создана папка для загрузок \"%1$s\" @@ -122,18 +122,18 @@ Фильтр Новая цель Что:\\nЗапрос:\\nЯзык контента:\\nСервис:\\nВремя по Гринвичу:\\nПакет:\\nВерсия:\\nВерсия ОС: - Это разрешение нужно для + Это разрешение нужно для \nвоспроизведения в окне reCAPTCHA Открыть во всплывающем окне - Показать предложения при поиске + Предлагать варианты при поиске Позже Отключено Изменение размера Убирает звук в НЕКОТОРЫХ разрешениях - млн - млрд. - тыс. + " млн" + " млрд" + " тыс." Разрешение очереди всплывающего окна Помнить последние размер и позицию всплывающего окна Поисковые предложения @@ -235,7 +235,7 @@ Не удалось воспроизвести этот поток Сведения Настройки звука - Пока нет подписок на каналы + Подписок на каналы пока нет Удалить Вы подписаны Подписка отменена @@ -246,11 +246,11 @@ В фоне В окне Зажмите, чтобы добавить в очередь - Добавить в очередь \"В фоне\" - Добавить в очередь \"В окне\" - Начать отсюда в плеере - Начать отсюда в фоне - Начать отсюда в окне + В очередь в фоне + В очередь в окне + Играть отсюда в плеере + Играть отсюда в фоне + Играть отсюда в окне Потоковый плеер не найден (можно установить VLC) Страна контента по умолчанию Сервис @@ -260,7 +260,7 @@ Перейти в фон Перейти в окно Перейти в плеер - Ошибка плеера без возможности восстановления + Неустранимая ошибка плеера Внешние плееры не поддерживают ссылки этих типов Неверная ссылка Видеопотоки не найдены @@ -309,18 +309,18 @@ Экспорт завершён Импорт завершён Нет верного Zip-файла - Внимание: не все файлы были импортированы. - Текущие данные будут заменены. + Внимание: не все файлы были импортированы + Текущие данные будут заменены Скоро здесь кое-что появится ;D Всегда спрашивать Создать плейлист Удалить Переименовать Имя - Добавить в плейлист + В плейлист На миниатюру плейлиста Сохранить плейлист - Удалить закладку + Удалить плейлист Удалить плейлист\? Плейлист создан Добавлено в плейлист @@ -375,19 +375,19 @@ Титры Приложение для воспроизведения этого файла не установлено Изменить размер текста и стиль титров. Нужен перезапуск - Очистить историю просмотров + Очистить историю Удалить всю историю просмотров\? История просмотров удалена - Очистить историю поиска - Удалить историю запросов поиска + Очистить запросы поиска + Удалить все запросы поиска Удалить историю воспроизведённых потоков и позиции воспроизведения Удалить всю историю поиска\? История поиска удалена - 1 элемент удалён. + 1 элемент удалён NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. При открытии ссылки Хотите импортировать настройки? - Политика конфиденциальности NewPipe + Конфиденциальность Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. \nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. Прочитать политику @@ -431,7 +431,7 @@ Менять громкость плеера жестом Жест громкости Обновления - Файл удален + Файл удалён Уведомление об обновлении Уведомления о новой версии NewPipe Обновления @@ -451,9 +451,9 @@ Код Папка назначения не может быть создана Файл не может быть создан - Доступ запрещен системой + Доступ запрещён системой Сервер не найден - "Сервер не поддерживает многопотоковую загрузку, попробуйте с @string/msg_threads = 1" + Сервер не принимает многопоточные загрузки, повторная попытка с @string/msg_threads = 1 Запрашиваемый диапазон недопустим Не найдено Очистить завершённые @@ -475,14 +475,14 @@ Пост-обработка не удалась Прервать в мобильной сети Закрыть - Время соединения вышло + Время соединения истекло Показать комментарии Отключите, чтобы скрыть комментарии Автовоспроизведение - Комментарии - - + комментарий + комментария + комментариев Нет комментариев Не удалось загрузить комментарии @@ -504,10 +504,11 @@ Для каждой загрузки запрашивать папку для сохранения. \nИспользуйте SAF для загрузки на внешний накопитель Использовать SAF - Storage Access Framework позволяет сохранять файлы на внешнем накопителе. -\nПоддерживается не всеми устройствами + Storage Access Framework позволяет сохранять файлы на внешнем накопителе. Поддерживается не всеми устройствами Очистить позиции воспроизведения Удалить все позиции воспроизведения Удалить все позиции воспроизведения\? - Измените папки загрузки для вступления в силу + Измените папки загрузки для вступления настроек в силу + Переключение сервисов, сейчас выбрано: + Киоск по умолчанию \ 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 5682897d8..09502f60a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -297,8 +297,8 @@ Získavajú sa informácie… Načítanie požadované obsahu Vytvoriť nový zoznam skladieb - Vymazať zoznam skladieb - Premenovať zoznam skladieb + Vymazať + Premenovať Názov Pridať do zoznamu skladieb Nastaviť ako miniatúru zoznamu skladieb @@ -342,8 +342,7 @@ 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 -\n + Import/Export Import \n Importovať z @@ -512,4 +511,7 @@ Odstrániť pozície prehrávania Odstráni všetky pozície prehrávania Odstrániť všetky pozície prehrávania\? + Zmeniť miesto pre stiahnuté súbory + Prepnúť službu, práve vybraté: + Predvolený kiosk \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0d583a41b..92785a950 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,5 +1,6 @@ - -Tryck på sök för att komma igång + + + Tryck på sök för att komma igång Publicerad den %1$s Ingen strömspelare hittades. Vill du installera VLC? Installera @@ -20,15 +21,12 @@ NewPipe popup-läge Bakgrund Extrafönster - - Sökväg för nerladdning av video - Sökväg för lagring av nerladdade videor - Ange sökväg för nedladdning av videor - + Mapp för nerladdning av video + Nedladdade videofiler lagras här + Välj nedladdningsmappen för videofiler Sökväg för nerladdning av ljud - Nedladdat ljud lagras här - Ange sökväg för nedladdning av ljudfiler - + Nedladdade ljudfiler lagras här + Välj nedladdningsmapp för ljudfiler Spelar automatiskt upp videon när NewPipe öppnas av en annan app Standardupplösning Standardupplösning för popup @@ -51,9 +49,7 @@ Använd gester för att kontrollera spelarens ljusstyrka och volym Sökförslag Visa förslag i samband med sökning - Ladda ned - Nästa Visa \'Nästa\' och \'Liknande\' videor Webbadressen stöds inte @@ -67,7 +63,7 @@ Spela upp Innehåll Åldersbegränsat innehåll - Videon är åldersbegränsad. Du kan aktivera åldersbegränsade videor i \"inställningar\". + Videon är åldersbegränsad. Du kan aktivera åldersbegränsade videor i inställningar. LIVE Nedladdningar Nedladdningar @@ -81,7 +77,6 @@ Uppdatera Rensa Bästa upplösningen - Fel Nätverksfel Kunde inte ladda alla miniatyrbilder @@ -99,8 +94,6 @@ Vad som skedde: Din kommentar (på Engelska): Detaljer: - - Gillar Ogillar Använd Tor @@ -111,16 +104,13 @@ Prenumeration avslutad Kunde inte ändra prenumeration Kunde inte uppdatera prenumeration - Hem Prenumerationer - Vad är nytt - Spela upp automatiskt Sökhistorik Spara sökfrågor lokalt - Historik & Cacheminne + Visningshistorik Håll koll på videor som du tittat på Återuppta när fokus återfås Fortsätta spela efter avbrott (t.ex. telefonsamtal) @@ -135,67 +125,54 @@ Storleksändring Ångra Spela Alla - NewPipe Avisering Aviseringar för NewPipe bakgrunds och popup-spelare - [Okänd] - Kunde inte dekryptera video URL signatur Kunde inte hitta någon ström Misslyckades med att spela denna ström Allvarligt spelarfel inträffade Återhämtar sig från spelarfel - Rapportera fel via e-post Vad:\\nBegäran:\\nInnehållsspråk:\\nTjänst:\\nGMT Tid:\\nPaket:\\nVersion:\\nOS-version: Videons miniatyrbild - Videons miniatyrbild + Spela video, längd: Uppladdarens avatar miniatyrbild (Experimentellt) Tvinga nedladdningstrafiken via Tor för ökad integritet (videostreaming stöds inte än). Användarrapport Inga resultat Här va\' det tomt - Kunde inte skapa nedladdnings katalog \'%1$s\' Skapa nedladdnings katalog \'%1$s\' - Video Ljud Försök igen Tillgång till lagringsområde nekades - - k + K mn - md - + B Inga prenumeranter - %s prenumerant - %s prenumeranter - - + %s prenumerant + %s prenumeranter + Inga visningar - %s visning - %s visningar - - + %s visning + %s visningar + Inga videor - %s video - %s videor - - + %s video + %s videor + Start Pausa Spela Ta bort Kontrollsumma - Nytt uppdrag Ok - Filnamn Trådar Fel @@ -206,22 +183,18 @@ Tryck för detaljer Vänta… Kopierat till urklipp - Välj en tillgänglig nedladdningsmapp + 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 utmaning begärd - Nedladdning Tillåtna tecken i filnamn Ogiltiga tecken ersätts med detta värde Ersättningstecknet - Bokstäver och siffror De flesta specialtecken - Om NewPipe Inställningar Om @@ -238,7 +211,6 @@ Vad du än har för idéer; översättningar, designändringar, kodstädning eller riktiga stora kodändringar—hjälp är alltid välkommen. Ju mer som görs desto bättre blir det! Läs hela licensen Bidra - Historik Sökt Tittade @@ -248,7 +220,6 @@ Historiken har rensats Objektet bortaget Vill du ta bort det här objektet från sökhistoriken? - Huvudsidans innehåll Tom sida Kiosk sida @@ -258,7 +229,6 @@ Välj en kanal Inga kanal prenumerationer ännu Välj en kiosk - Kiosk Trend Topp 50 @@ -272,29 +242,25 @@ Placera i bakgrunds-kön Placera i popup-kön Börja spela här - Börja här i bakgrunden - Börja här i popup -Donera + Börja spela i bakgrunden + Börja spela i en ny popup + Donera NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe. Ge tillbaka Webbplats För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats. Visa info - Bokmärkta Spellistor - Lägg till - Använd snabb inexakt sökning Ladda miniatyrbilder - Inaktivera för att stänga av laddning av miniatyrbilder, sparar data och minnesanvändning. Förändringar kommer att rensa cache-minnet. + Stäng av för att hindra laddning av miniatyrbilder, spara data och minnesanvändning. Förändringar kommer att rensa cache-minnet. Bild cacheminnet rensad Tjänst Debug Alltid Bara en gång Fil - Växla orienteringen Rensa metadatan i cacheminnet Ingen strömspelare hittades (du kan installera VLC för att spela upp). @@ -303,7 +269,7 @@ Ta bort alla cachade webbsidor Metadata cache rensad "Köa nästa ström automatiskt " - Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö. + Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö Standard innehållsland Kanaler Spellistor @@ -312,13 +278,12 @@ Växla till Bakgrunden Växla till popup Växla till main - Importera databas Exportera databas Skriver över din nuvarande historik och prenumerationer Exportera historik, prenumerationer och spellistor Rensa visningshistorik - Tar bort historiken för spelade videoklipp + Tar bort historiken för spelade videoklipp och uppspelningspositioner Ta bort hela visningshistoriken\? Visningshistorik borttagen. Rensa sökhistorik @@ -329,25 +294,20 @@ Ogiltig URL Inga videoströmmar hittades Inga ljudspår hittades - Ogiltig katalog - Ogiltig fil/innehålls källa + Ingen sådan mapp + Ingen sådan fil/innehållskälla Filen finns inte eller behörighet att läsa eller skriva till den saknas Filnamnet får inte vara tomt Ett fel uppstod: %1$s Inga strömmar är tillgängliga för nedladdning - Dra för att ändra ordning - Skapa Ta bort en Ta bort alla Avfärda Byt namn - 1 objekt borttaget. - Ingen app installerad för att spela upp filen - NewPipes Sekretesspolicy NewPipe projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. NewPipes Sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport. Läs sekretesspolicy @@ -356,77 +316,57 @@ Är du säker du vill ta bort alla föremål från historiken? Senast spelade Mest spelade - Exporterad Importerad Ogiltig ZIP-fil Varning: det gick inte att importera alla filer. Det här kommer skriva över dina nuvarande inställningar. Vill du också importera inställningar? - Öppna navigationspanelen Stäng navigationspanelen Något kommer att visas här snart ;D - - Föredragen \'öppna\' åtgärd Standardåtgärden när du öppnar innehåll — %s - Videospelare Bakgrundsspelare Popup-spelare Fråga alltid - Hämtar information… Laddar begärt innehåll - Ny spellista Radera Byt namn Namn Lägg till i spellistan Använd som spellistans miniatyrbild - Bokmärk spellistan Ta bort bokmärke - Ta bort spellista\? Spellistan skapades Tillagad i spellistan Spellistans miniatyrbild förändrades. Kunde inte ta bort spellistan. - Ingen textning - Passa Fyll Zoom - Autogenererade - Textning Ändra spelarens textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft. - Aktivera LeakCanary Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning - Rapportera out-of-lifecycle fel Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning - Importera/exportera Importera Importera från Exportera till - Importera… Exporterar… - Importera fil Föregående export - Kunde inte importera prenumerationer kunde inte exportera prenumerationer - Importera YouTube-prenumerationer genom att hämta export-filen: \n \n1. Gå till följande webbadress: %1$s @@ -439,11 +379,9 @@ \n3. Logga in när du blir tillfrågad \n4. Kopiera profilens webbadress som du blev omdirigerad till. dittID, soundcloud.com/dittid - Tänk på att operationer kan vara nätverks intensiv. \n \nVill du fortsätta? - Uppspelningshastighet Kontroller Tempo Tonhöjd @@ -451,11 +389,9 @@ Snabbspola vid frånvaro av ljud Steg Återställ - För att uppfylla den Europeiska dataskyddsförordningen (GDPR), uppmärksammar vi NewPipes sekretesspolicy. Läs den noggrant. Du måste acceptera det om du vill skicka felrapporten. Acceptera Avböj - Ingen gräns Begränsa upplösningen när du använder mobil data "Minimera vid växling av applikationen " @@ -463,5 +399,64 @@ Ingen Minimera till Bakgrunds-spelare Minimera till popup-spelare - - + Avsluta prenumeration + Ny flik + Välj flik + Gestkontroll för volym + Använd gester för att justera spelarens volym + Gestkontroll för ljusstyrka + Använd gester för att justera ljusstyrkan + Uppdateringar + Fil raderad + Appuppdateringsnotifikation + Notifikationer för nya NewPipe versioner + Extern lagring otillgänglig + Fel vid läsning av sparade flikar, använder standard flikar istället + Återställ default + Vill du återställa default\? + Antalet prenumeranter är otillgängligt + Vilka flikar visas på Huvudsidan + Markering + Uppdateringar + Visa notifikation för att uppdatera appen när en ny version finns tillgänglig + Listvy + Lista + Rutnät + Auto + Växla vy + NewPipe uppdatering tillgänglig! + Tryck för att ladda ned + Färdig + pausad + köad + efterbehandling + + Åtgärd som nekas av systemet + Nedladdningen misslyckades + Nedladdningen är färdig + %s nedladdningar är färdiga + Generera unikt namn + Skriv över + Det finns en pågående nedladdning med det här namnet + Visa fel + Kod + Säker anslutning misslyckades + Kunde inte hitta servern + Kunde inte ansluta till servern + Servern skickar ingen data + Servern accepterar inte flertrådade nedladdningar, försök igen med @string/msg_threads = 1 + Hittades inte + Efterbehandling misslyckades + Töm färdiga nedladdningar + Fortsätt med %s väntande överföringar från Nedladdningar + Stanna + Max försök + Max antal försök tills nedladdning avbryts + Händelser + Konferenser + Visa kommentarer + + Kommentarer + + + \ 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 1d5a3fba6..c17b58f50 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -119,7 +119,7 @@ Yorumunuz (İngilizce): Ayrıntılar: Video ön izleme küçük resmi - K + b M B Bu izin, açılır pencere modunda @@ -503,4 +503,9 @@ 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: + + %s video + %s video + + Varsayılan Kiosk \ 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 d86ce9a50..375557b04 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -233,9 +233,9 @@ %s підписників - %s Відео - %s Відео - %s Відео + %s відео + %s відео + %s відео Створити Видалити одне @@ -510,4 +510,5 @@ Видалити усі запам\'ятовані позиції\? Змініть папки завантаження для ефективності Перемкнути службу, наразі обрано: + Кіоск за замовчуванням \ 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 07495895b..028986866 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -1,6 +1,6 @@ - شروع کرنے کیلئے تلاش کو ٹپ کریں + شروع کرنے کے لیے تلاش پر ٹیپ کریں ملاحظات کوشائع ہوا انسٹال @@ -20,9 +20,490 @@ \n rotation کرو external video player استعمال کریں - SOME قرارداد پر آواز ہٹا دے گا + کچھ ریذولوشن پر آڈیو ہٹاتا ہے بیرونی سوتی عامل ایپ استعمال کریں NewPipe ابھاری اسلوب سبسکرائیب کریں سبسکرائیب کر لیا + چینل کی رکنیت ختم کردی گئی + رکنیت کو تبدیل نہیں کیا جاسکا + سبسکرپشن کو اپ ڈیٹ نہیں کیا جاسکا + معلومات دکھائیں + بنیادی + سبسکرپشنز + بُک مارک کردہ پلے لسٹس + نئ آمد + پس منظر + پوپ اپ + شامل کریں + ویڈیو ڈاؤن لوڈ فولڈر + ڈاؤن لوڈ کی ویڈیو فائلوں کو یہاں ذخیرہ کیا جاتا ہے + ویڈیو فائلوں کے لئے ڈاؤن لوڈ فولڈر کا انتخاب کریں + آڈیو ڈاؤن لوڈ فولڈر + ڈاؤن لوڈ کی گئی آڈیو فائلیں یہاں محفوظ ہیں + آڈیو فائلوں کے لئے ڈاؤن لوڈ فولڈر کا انتخاب کریں + آٹوپلے + ایک ویڈیو ادا کرتا ہے جب نیو پائپ کسی دوسرے ایپ سے بلایا جاتا ہے + طے شدہ جزیات + طے شدہ پوپ جزیات + اعلی قراردادیں دکھائیں + صرف کچھ آلات 2K / 4K ویڈیوز کھیلنے میں معاون ہیں + کوڈی کے ساتھ استعمال کریں + کور ایپ نہیں ملی۔ اسے انسٹال کریں؟ + \"کودی کے ساتھ کھیلیں\" کا آپشن دکھائیں + کوڈی میڈیا سنٹر کے ذریعے ویڈیو چلانے کا آپشن دکھائیں + آڈیو + پہلے سے طے شدہ آڈیو فارمیٹ + طے شدہ وڈیو وضع + خیالیہ + روشنی + تاریک + سیاہ + پاپ اپ سائز اور پوزیشن کو یاد رکھیں + آخری سائز اور پوپ اپ کی پوزیشن یاد رکھیں + تیز رفتار تلاش کریں + غیر معقول تلاش سے کھلاڑی کم ہونے والی صحت سے متعلق تیزی سے پوزیشن حاصل کرنے کی اجازت دیتا ہے + Thumbnailلوڈکریں + تھمب نیلز کو لوڈ کرنے ، اعداد و شمار کی بچت اور میموری کے استعمال کو روکنے کیلئے آف کریں۔ تبدیلیاں دونوں میموری میں اور آن ڈسک امیج کیشے کو صاف کرتی ہیں۔ + تصویری کیشے کا صفایا کردیا + کیشڈ میٹا ڈیٹا کو صاف کریں + ویب میں موجود سبھی ڈیٹا کو ہٹا دیں + میٹا ڈیٹا کیشے کا صفایا کردیا + آٹو قطار اگلا اسٹریم + جب دوبارہ نہ چلنے والی قطار میں آخری سلسلہ جاری ہو تو متعلقہ سلسلے کو خود سے شامل کریں + پلیر اشارہ کنٹرول + اشارے کی چمک اور آواذکو کنٹرول کرنے کے لئے اشاروں کا استعمال کریں + تلاش کی تجاویز + تلاش کرتے وقت تجاویز دکھائیں + تاریخ تلاش کریں + تلاش کے استفسارات کو مقامی طور پر ذخیرہ کریں + واچ ہسٹری + دیکھے ہوئے ویڈیوز کا ریکارڈرکھیں + فوکس حاصل پر دوبارہ شروع کریں + مداخلت کے بعد چلاناجاری رکھیں (جیسے فون کالز) + ڈاؤن لوڈ + اگلا + \'اگلا\' اور \'ملتے جلتے\' ویڈیوز دکھائیں + \"الحاق کرنے کے لئے منعقد\" ٹپ دکھائیں + ویڈیو تفصیلات کے صفحے پر جب بیک گراؤنڈ یا پاپ اپ بٹن دبائے جاتے ہیں تو ٹپ دکھائیں + غیر معاون URL + طے شدہ مواد والا ملک + خدمت + پلیئر + رویہ + ویڈیو & آڈیو + تاریخ اور کیشے + پوپ اپ + ظہور + دیگر + ڈیبگ + پس منظر میں چلائیں + پوپ اپ موڈ میں چلائیں + بیک گراؤنڈ پلیئر پر قطار ہے + پاپ اپ پلیئر پر قطارہے + چلائیں + مواد + عمر محدود مواد + عمر پر پابندی والا ویڈیو دکھائیں۔ ترتیبات سے اس طرح کے مواد کی اجازت ممکن ہے۔ + براہ راست + ڈاؤن لوڈ + ڈاؤن لوڈ + غلطی کی اطلاع + تمام + چینل(ذریعہ) + پلے لسٹ + ہاں + بعد میں + غیر فعال + فلٹر + تازہ + صاف + سائز تبدیل کریں + بہترین ریزولوشن + کالعدم کریں + تمام چلائیں + ہمیشہ + صرف ایک بار + فائل + نیو پائپ نوٹیفیکیشن + نیو پائپ کے پس منظر اور پاپ اپ پلیئرز کیلئے اطلاعات + [نامعلوم] + ترتیب وضع کریں + پس منظر پر جائیں + پاپ اپ پر جائیں + مین پر سوئچ کریں + کوائفیہ درآمد کریں + کوائفیہ برآمد کریں + اپنی موجودہ تاریخ اور رکنیت ضد + تاریخ ، خریداری اور پلے لسٹ برآمد کریں + خرابی + نیٹ ورک کی خرابی + تمام تمبنیلذلوڈ نہیں کر سکے + ویڈیو یو آر ایل کے دستخط ڈکرپٹ نہیں ہو سکے + ویب سائٹ کو تجزیہ نہیں کیا جاسکا + ویب سائٹ کو مکمل طور پر تجزیہ نہیں کرسکے + مواد دستیاب نہیں ہے + ڈاؤن لوڈ مینو ترتیب نہیں دے سکتے + براہ راست سلسلے ابھی تک تعاون یافتہ نہیں ہیں + کوئی اسٹریم نہیں مل سکی + تصویر کو لوڈ نہیں کر سکتا + ایپ/UI کریش + یہ اسٹریم نہیں چل سکا + انریکوورابلی پلیئر نقص واقع ہوا + پلیر نقص سے بازیافت کر رہا ہے + بیرونی پلیراس قسم کے لنکس کی حمایت نہیں کرتے + غلط URL + کوئی ویڈیو اسٹریمز نہیں ملے + کوئی آڈیو اسٹریمز نہیں ملے + ایسا کوئی فولڈر نہیں + ایسی کوئی فائل / مواد کا ذریعہ نہیں + فائل موجود نہیں ہے اور نہ ہی اسے پڑھنے یا لکھنے کی اجازت ہے + فائل کا نام ضروری ہے + ایک خامی پیش آگئی:٪ 1 $ s + کوئی اسٹریمز ڈاؤن لوڈ کرنے کے لئے دستیاب نہیں + معذرت ، ایسا نہیں ہونا چاہئے تھا۔ + ای میل کے ذریعے غلطی کی اطلاع دیں + معذرت ، کچھ خرابی آگئی + رپورٹ کریں + معلومات: + کوئی مسئلہ ہے + What:\\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + آپ کا تبصرہ (انگریزی میں): + تفصیلات: + ویڈیو پیش نظارہ تھمب نیل + وڈیو کادورانیہ: + اپ لوڈر کا اوتار تھمب نیل + پسند + ناپسند + Tor کا استعمال + (تجرباتی) بڑھتی ہوئی رازداری کے لئے ٹور کے ذریعہ ٹریفک کو ڈاؤن لوڈ کرنے پر مجبور کریں (ویڈیوز کو ابھی تک سپورٹ نہیں کیا گیا ہے)۔ + غلطی کی اطلاع دیں + صارف رپورٹ + کوئی نتیجہ نہیں + یہاں کچھ نہیں مگر اداسی کے + دوبارہ ترتیب دینے کیلئے کھینچں + ڈاؤن لوڈ ڈائریکٹری \'٪ 1 $ s\' تشکیل نہیں دے سکتے + ڈاؤن لوڈ ڈائریکٹری \'٪ 1 $ s\' بن گئی + ویڈیو + آڈیو + دوبارہ کوشش کریں + ذخیرہ رسائی اجازت مسترد + K + ایم + بی + کوئی صارفین نہیں + + % s صارف + % s صارفین + + کوئی مناظر نہیں + + % s منظر + % s مناظر + + ویڈیوز دستیاب نہیں + + ویڈیوز + + + شروع کریں + توقف + چلائیں + بنانا + حذف کریں + ایک کو حذف کریں + تمام حذف کریں + تشخیص کریں + برخاست کریں + نام تبدیل کریں + نیا حدف + ٹھيک ہے + فائل کا نام + موضوعات + خرابی + غیر معاون سرور + فائل پہلے سے موجود ہے + ناقص URL یا انٹرنیٹ دستیاب نہیں + نیو پائپ ڈاؤن لوڈ ہو رہا ہے + تفصیلات کے لیے ٹیپ کریں + براۓ مہربانی انتظار کريں… + کلپ بورڈ میں کاپی کریں + براہ کرم بعد میں ترتیبات میں ڈاؤن لوڈ فولڈر کی وضاحت رکھیں + پوپ اپ موڈ میں کھولنے کیلئے اس اجازت کی ضرورت ہے + reCAPTCHA + reCAPTCHA چیلنج + reCAPTCHA چیلینج کی درخواست کی گئی + ڈاؤن لوڈ + فائل ناموں میں حروف کی اجازت ہے + ناجائز کریکٹر اس قدر کے ساتھ تبدیل کیےگئے ہیں + متبادل کریکٹر + خطوط اور ہندسے + سب سے خاص کردار + نیو پائپ کے بارے میں + ترتیبات + کے بارے میں + تیسری پارٹی کے لائسنس + 3٪ 1 $ s بذریعہ٪ 2 $ s٪ 3 $ s کے تحت + لائسنس لوڈ نہیں کر سکا + ویب سائٹ کھولیں + کے بارے میں + معاونین + لائسنس + لوڈ ، اتارنا Android پر ہلکا پھلکا اسٹریمنگ۔ + تعاون کریں + چاہے آپ کے خیالات ہوں؛ ترجمہ ، ڈیزائن میں تبدیلیاں ، کوڈ صاف کرنا ، یا حقیقی ہیوی کوڈ میں تبدیلی — مدد کا ہمیشہ خیرمقدم کیا جاتا ہے۔ جتنا زیادہ ہوتا ہے اتنا ہی بہتر ہوتا ہے! + گٹ ہب پر دیکھیں + عطیہ + نیا پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت گزارتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں مدد دینے کے لئے واپس دیں۔ + واپس دو + ویب سائٹ + مزید معلومات اور خبروں کے لئے نیو پائپ ویب سائٹ ملاحظہ کریں۔ + نیو پائپ کا لائسنس + لائسنس پڑھیں + تاریخ + تلاش کیا گیا + دیکھاھوا + تاریخ آف کردی گئی ہے + تاریخ + تاریخ خالی ہے + تاریخ صاف ہوگئی + آئٹم حذف ہوگیا + کیا آپ اس آئٹم کو تلاش کی تاریخ سے حذف کرنا چاہتے ہیں؟ + کیا آپ اس آئٹم کو دیکھنے کی تاریخ سے حذف کرنا چاہتے ہیں؟ + کیا آپ واقعی تاریخ سے سبھی اشیاء کو حذف کرنا چاہتے ہیں؟ + آخری پلے کیا گیا + سب سے زیادہ دیکھاگیا + مرکزی صفحہ کا مواد + خالی صفحہ + رجحان صفحہ + سکریپشن پیج + فیڈ صفحہ + چینل کا صفحہ + ایک چینل منتخب کریں + کسی چینل کی رکنیت نہیں + ایک کیوسک منتخب کریں + برآمدشدہ + درآمدشدہ + کوئی درست زپ فائل نہیں ہے + انتباہ: تمام فائلوں کو درآمد نہیں کیا جاسکا۔ + یہ آپ کے موجودہ سیٹ اپ کو اوور رائڈ کرے گا۔ + کیوسک + رجحان سازی + Top 50 + نیا اور تاذہ + پس منظر پلیئر + پوپ اپ پلیئر + ہٹائیں + تفصیلات + آڈیو کی ترتیبات + انقطار کو پکڑو + پس منظر میں قطار + ایک نئی پوپ اپ میں انقطار + یہاں سےچلاناشروع کریں + پس منظر میں چلاناشروع کریں + نئے پاپ اپ میں چلاناشروع کریں + دراز کھولیں + دراز بند کریں + یہاں جلد ہی کچھ نظر آئے گا D D + ترجیح \' کھلی \' عمل + مواد کھولنے پر ڈیفالٹ کارروائی -٪ s + ویڈیو پلیئر + پس منظر پلیئر + پوپ اپ پلیئر + ہمیشہ اجازت لیں + معلومات حاصل کر رہا ہے… + درخواست کردہ مواد کو لوڈ کیا جارہا ہے + نئی پلے لسٹ + حذف کریں + نام تبدیل کریں + نام + پلے لسٹ میں شامل + پلے لسٹ تھمب نیل کے بطور سیٹ کریں + پلے لسٹ کو بُک مارک کریں + بُک مارک کو حدف کریں + اس پلے لسٹ کو حذف کریں؟ + پلے لسٹ بنائی گئی + فہرست میں شامل کر دیا + پلے لسٹ تھمب نیل تبدیل کر دیا گیا۔ + پلے لسٹ کو حذف نہیں کیا جاسکا۔ + کوئی کیپشن نہیں + فٹ + بھریں + زوم + خود بخود تیار + لیک کینری کو قابل بنائیں + میموری لیک ہونے کی نگرانی ہیپ ڈمپنگ کے وقت ایپ کو غیرذمہ دار بننے کا باعث بن سکتی ہے + زندگی سے دور کی غلطیوں کی اطلاع دیں + ضائع ہونے کے بعد ٹکڑے یا سرگرمی زندگی سے دور کے ناقابل تسخیر Rx مستثنیات کی اطلاع دہندگی + درآمد برآمد + درآمد + سے درآمد کریں + کو برآمد کریں + درآمد کیا جا رہا ہے… + برآمد کر رہا ہے… + فائل درآمد کریں + پچھلی برآمد + سبسکرپشنز کو درآمد نہیں کیا جاسکا + رکنیت برآمد نہیں کر سکا + برآمد فائل کو ڈاؤن لوڈ کرکے YouTube کی رکنیت کو درآمد کریں: +\n +\n1. اس یو آر ایل پر جائیں:٪ 1 $ s +\n2. جب پوچھا جائے تو لاگ ان کریں +\nA. ڈاؤن لوڈ شروع ہونا چاہئے (یہ برآمد فائل ہے) + URL یا آپ کی ID ٹائپ کرکے ایک SoundCloud پروفائل درآمد کریں: +\n +\n1. ویب براؤزر میں \"ڈیسک ٹاپ موڈ\" کو فعال کریں (سائٹ موبائل آلات کے لئے دستیاب نہیں ہے) +\n2. اس URL پر جائیں: %1 $ s +\n3. پوچھا گیا میں لاگ ان کریں +\n4. پروفائل یو آر ایل کاپی کریں جو آپ کو ہدایت کی گئی تھی. + yourID، soundcloud.com/yourid + یاد رکھیں کہ یہ آپریشن نیٹ ورک مہنگا ہوسکتا ہے۔ +\n +\nکیا آپ جاری رکھنا چاہتے ہیں؟ + پلے بیک رفتار کنٹرول + Tempo + "آواز کو موٹا کرنا" + ختم (مسخ کا سبب بن سکتا ہے) + کیپشن + پلیئر کیپشن ٹیکسٹ اسکیل اور بیک گراونڈ اسٹائل میں ترمیم کریں۔ اثر لینے کیلئے ایپ کو دوبارہ شروع کرنا ضروری ہے۔ + اس فائل کو چلانے کے لئے کوئی ایپ انسٹال نہیں ہے + دیکھنے کی تاریخ صاف کریں + ادا شدہ اسٹریمز اور پلے بیک پوزیشنوں کی تاریخ کو خارج کریں + دیکھنے کی پوری تاریخ کو حذف کریں؟ + تلاش کی ہسٹری کو مٹا دیں + تلاش کے مطلوبہ الفاظ کی تاریخ کو حذف کریں + پوری تلاش کی تاریخ کو حذف کریں؟ + تلاش کی تاریخ حذف ہوگئی۔ + 1 شے حذف کر دی گئی ۔ + نیو پائپ کاپلیفٹ فری سافٹ ویئر ہے: آپ استعمال کرسکتے ہیں ، مطالعہ شیئر کرسکتے ہیں اور اپنی مرضی سے اسے بہتر کرسکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور / یا ترمیم کرسکتے ہیں ، جو لائسنس کا ورژن 3 ، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن ہے۔ + کیا آپ سیٹنگیں بھی درآمد کرنا چاہتے ہیں؟ + نیو پائپ کی رازداری کی پالیسی + نیوپی پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا ، اپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا. +\nنیو پائپ کی رازداری کی پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کو کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔ + رازداری کی پالیسی پڑھیں + یورپی جنرل ڈیٹا پروٹیکشن ریگولیشن (جی ڈی پی آر) کی تعمیل کرنے کیلئے ، ہم آپ کی توجہ نیو پائپ کی رازداری کی پالیسی کی طرف مبذول کراتے ہیں۔ برائے مہربانی اسے غور سے پڑھیں۔ +\nہمیں بگ رپورٹ بھیجنے کے ل it آپ کو اسے قبول کرنا چاہئے۔ + قبول کریں + رد + کوئی حد نہیں + موبائل ڈیٹا کا استعمال کرتے وقت ریذولوشن کو محدود کریں + ایپ سوئچ کو کم سے کم کریں + اہم ویڈیو پلیئر سے دوسرے ایپ میں سوئچنگ کرتے وقت کارروائی-% s + کوئی نہیں + پس منظری پلیر میں کم کریں + پاپ اپ پلیر میں کم کریں + خاموشی کے دوران فاسٹ فارورڈ + قدم + ری سیٹ کریں + چینلز + پلے لسٹس + ویڈیو ذ + صارفین + اندراج خارج کریں + نیا ٹیب + ٹیب کا انتخاب کریں + صوت اشارہ کنٹرول + پلیر کی آواذکنٹرول کرنے کے لیے اشاروں کا استعمال کریں + چمک اشارہ کنٹرول + پلیرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں + ڈیفالٹ مواد کی زبان + تازہ کاریاں + فائل حذف ہوگئی + ایپ اپ ڈیٹ نوٹیفکیشن + نئے نیو پائپ ورژن کیلئے نوٹیفیکیشن + بیرونی اسٹوریج دستیاب نہیں + بیرونی ایسڈی کارڈ پر ڈاؤن لوڈ ممکن نہیں۔ ڈاؤن لوڈ فولڈر کے مقام کو دوبارہ ترتیب دیں؟ + پہلے سے طے شدہ ٹیبز کا استعمال ، محفوظ ٹیبز کو پڑھنے کے دوران خرابی + ڈیفالٹس بحال کریں + کیا آپ ڈیفالٹس کو بحال کرنا چاہتے ہیں؟ + صارفین کا شمار دستیاب نہیں + مرکزی صفحہ پر کون کون سے ٹیبزدکھائے جاہیں + انتخاب + تازہ ترین + جب نیا ورژن دستیاب ہوتا ہے تو فوری طور پر ایپ اپڈیٹ کے لئے ایک اطلاع دکھائیں + فہرست منظردیکھیں + فہرست + گرڈ + خودکار + منظر سوئچ کریں + نیو پائپ اپ ڈیٹ دستیاب! + ڈاؤن لوڈ کرنے کے لئے کلک کریں + ختم + ملتوی + موقوف + قطار میں کھڑا ہے + پوسٹ پروسیسنگ + قطار + سسٹم نےکارروائی سے انکار کیا گیا + ڈاؤن لوڈ ناکام + ڈاؤن لوڈ تکمیل + ٪ s ڈاؤن لوڈ مکمل ہوگئے + منفرد نام بنائیں + برتحریر + اس نام کے ساتھ ایک ڈاؤن لوڈ جاری ہے + غلطی دکھائیں + کوڈ + مقصود پوشہ نہیں بنایا جا سکتا + فائل نہیں بنائی جاسکتی ہے + نظام نے اجازت نہیں دی + محفوظ کنکشن ناکام + سرور نہیں مل سکا + سرور سے متصل نہیں ہوسکتا + سرور ڈیٹا نہیں بھیجتا ہے + سرور ملٹی تھریڈڈ ڈاؤن لوڈز کو قبول نہیں کرتا ہے ، @ سٹرنگ / msg_threads = 1 کے ساتھ دوبارہ کوشش کریں + درخواست کی گئی حد قابل اطمینان نہیں ہے + نہیں ملا + پوسٹ پروسیسنگ ناکام + ختم شدہ ڈاؤن لوڈ صاف کریں + اپنے% s زیر التوا منتقلیوں کو ڈاؤن لوڈز سے جاری رکھیں + رکو + زیادہ سے زیادہ دوبارہ کوشش کریں + ڈاؤن لوڈ منسوخ کرنے سے پہلے کوششوں کی زیادہ سے زیادہ تعداد + میٹرڈ نیٹ ورک پر مداخلت + موبائل ڈیٹا پر سوئچنگ کرتے وقت مفید ہے ، اگرچہ کچھ ڈاؤن لوڈ معطل نہیں ہوسکتی ہیں + تقریبات + کانفرنسیں + تبصرے دکھائیں + تبصرے دکھانا بند کرو + آٹوپلے + + تبصرے + + + کوئی تبصرہ نہیں + تبصرے لوڈ نہیں ہوسکے + بند کریں + پلے بیک دوبارہ شروع کریں + آخری پلے بیک پوزیشن بحال کریں + فہرست میں پوزیشن + فہرستوں میں پلے بیک پوزیشن کے اشارے دکھائیں + کوائف صاف کریں + دیکھنے کی تاریخ حذف ہوگئی۔ + پلے بیک پوزیشنیں حذف ہوگئیں۔ + فائل منتقل یا حذف ہوگئی + اس نام والی فائل پہلے سے موجود ہے + اس نام والی ڈاؤن لوڈ کی فائل پہلے سے موجود ہے + فائل برتحریر نہیں کر سکتا + اس نام کے ساتھ ڈاؤن لوڈ زیر التوا ہے + فائل پر کام کرنے کے دوران نیو پائپ بند کردی گئی تھی + آلے میں کوئی جگہ نہیں بچی + پیشرفت ختم ہوگئی ، کیونکہ فائل کو حذف کردیا گیا تھا + رابطے کا وقت ختم + کیا تمہیں یقین ہے؟ + ڈاؤن لوڈ کی قطار کو محدود کریں + ایک ڈاؤن لوڈ ایک ہی وقت میں چلے گا + ڈاؤن لوڈ شروع کریں + ڈاؤن لوڈ روکیں + کہاں پرڈاؤن لوڈ کریں + آپ سے پوچھا جائے گا کہ ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے + آپ سے پوچھا جائے گا کہ ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے۔ +\nاگر آپ کسی بیرونی SD کارڈ پر ڈاؤن لوڈ کرنا چاہتے ہیں تو SAF کا انتخاب کریں + SAF استعمال کریں + اسٹوریج ایکسیس فریم ورک ایک بیرونی SD کارڈ میں ڈاؤن لوڈ کی اجازت دیتا ہے۔ +\nنوٹ: کچھ آلات مطابقت نہیں رکھتے ہیں + پلے بیک پوزیشن حذف کریں + تمام پلے بیک پوزیشن حذف کریں + تمام پلے بیک پوزیشنوں کو حذف کریں ؟ + اثر لینے کے لئے ڈاؤن لوڈ فولڈرز کو تبدیل کریں + ٹوگل خدمت ، حالیہ منتخب: \ 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 bb8551137..3294094dc 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -7,7 +7,7 @@ 下載 搜尋 設定 - 您是不是要查:%1$s? + 你是不是在寻找:%1$s? 選擇瀏覽器 旋轉 使用外置影片播放器 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7e7eaf1c4..fe4c1b00a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -114,7 +114,7 @@ 音訊 重試 無法存取儲存空間 - K + k 百萬 B 開始 @@ -499,4 +499,8 @@ 刪除所有播放位置? 變更下載資料夾以使其生效 切換服務,目前已選取: + + %s 影片 + + 預設 Kiosk \ No newline at end of file diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index fc7abf678..80f2bb1f4 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -111,8 +111,8 @@ debug_pref_screen_key allow_heap_dumping_key - allow_disposed_exceptions_key + show_original_time_ago_text_key theme diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70bd9e0a8..74ac35112 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -247,7 +247,7 @@ Audio Retry Storage access permission denied - K + k M B Toggle service, currently selected: @@ -263,6 +263,19 @@ %s view %s views + + No one is watching + + %s watching + %s watching + + + No one is listening + + %s listener + %s listeners + + No videos %s video @@ -304,7 +317,7 @@ MD5 SHA-1 - reCAPTCHA + reCAPTCHA reCAPTCHA challenge reCAPTCHA challenge requested @@ -366,6 +379,7 @@ Selection Blank Page Kiosk Page + Default Kiosk Subscription Page Feed Page Channel Page @@ -379,6 +393,8 @@ This will override your current setup. Do you want to also import settings? Could not load comments + Localization changes will not take effect until the app is restarted + Kiosk Trending @@ -443,6 +459,10 @@ Memory leak monitoring may cause the app to become unresponsive when heap dumping Report out-of-lifecycle errors Force reporting of undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal + + Show original time ago on items + Original texts from services will be visible in stream items + Import/export Import diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 1a1a39e21..596852bb6 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -3,15 +3,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:title="@string/content"> - - + + + + diff --git a/app/src/test/java/org/schabi/newpipe/settings/tabs/TabTest.java b/app/src/test/java/org/schabi/newpipe/settings/tabs/TabTest.java index 4b3fbc2e0..45c7c0fff 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/tabs/TabTest.java +++ b/app/src/test/java/org/schabi/newpipe/settings/tabs/TabTest.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.settings.tabs; -import org.junit.Ignore; import org.junit.Test; import java.util.HashSet; @@ -9,7 +8,6 @@ import java.util.Set; import static org.junit.Assert.assertTrue; public class TabTest { - @Ignore @Test public void checkIdDuplication() { final Set usedIds = new HashSet<>(); diff --git a/app/src/test/java/org/schabi/newpipe/settings/tabs/TabsJsonHelperTest.java b/app/src/test/java/org/schabi/newpipe/settings/tabs/TabsJsonHelperTest.java index 20785e548..1f951159f 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/tabs/TabsJsonHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/settings/tabs/TabsJsonHelperTest.java @@ -5,7 +5,6 @@ import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; -import org.junit.Ignore; import org.junit.Test; import java.util.Arrays; @@ -21,19 +20,19 @@ public class TabsJsonHelperTest { private static final String JSON_TABS_ARRAY_KEY = "tabs"; private static final String JSON_TAB_ID_KEY = "tab_id"; - @Ignore @Test public void testEmptyAndNullRead() throws TabsJsonHelper.InvalidJsonException { + final List defaultTabs = TabsJsonHelper.getDefaultTabs(); + final String emptyTabsJson = "{\"" + JSON_TABS_ARRAY_KEY + "\":[]}"; List items = TabsJsonHelper.getTabsFromJson(emptyTabsJson); - assertTrue(!items.isEmpty()); + assertEquals(items, defaultTabs); final String nullSource = null; items = TabsJsonHelper.getTabsFromJson(nullSource); - assertTrue(!items.isEmpty()); + assertEquals(items, defaultTabs); } - @Ignore @Test public void testInvalidIdRead() throws TabsJsonHelper.InvalidJsonException { final int blankTabId = Tab.Type.BLANK.getTabId(); @@ -84,17 +83,17 @@ public class TabsJsonHelperTest { return jsonObject.getArray(JSON_TABS_ARRAY_KEY).size() == 0; } - @Ignore @Test public void testSaveAndReading() throws JsonParserException { // Saving final Tab.BlankTab blankTab = new Tab.BlankTab(); + final Tab.DefaultKioskTab defaultKioskTab = new Tab.DefaultKioskTab(); final Tab.SubscriptionsTab subscriptionsTab = new Tab.SubscriptionsTab(); final Tab.ChannelTab channelTab = new Tab.ChannelTab(666, "https://example.org", "testName"); final Tab.KioskTab kioskTab = new Tab.KioskTab(123, "trending_key"); - final List tabs = Arrays.asList(blankTab, subscriptionsTab, channelTab, kioskTab); - String returnedJson = TabsJsonHelper.getJsonToSave(tabs); + final List tabs = Arrays.asList(blankTab, defaultKioskTab, subscriptionsTab, channelTab, kioskTab); + final String returnedJson = TabsJsonHelper.getJsonToSave(tabs); // Reading final JsonObject jsonObject = JsonParser.object().from(returnedJson); @@ -106,16 +105,19 @@ public class TabsJsonHelperTest { final Tab.BlankTab blankTabFromReturnedJson = requireNonNull((Tab.BlankTab) Tab.from(((JsonObject) tabsFromArray.get(0)))); assertEquals(blankTab.getTabId(), blankTabFromReturnedJson.getTabId()); - final Tab.SubscriptionsTab subscriptionsTabFromReturnedJson = requireNonNull((Tab.SubscriptionsTab) Tab.from(((JsonObject) tabsFromArray.get(1)))); + final Tab.DefaultKioskTab defaultKioskTabFromReturnedJson = requireNonNull((Tab.DefaultKioskTab) Tab.from(((JsonObject) tabsFromArray.get(1)))); + assertEquals(defaultKioskTab.getTabId(), defaultKioskTabFromReturnedJson.getTabId()); + + final Tab.SubscriptionsTab subscriptionsTabFromReturnedJson = requireNonNull((Tab.SubscriptionsTab) Tab.from(((JsonObject) tabsFromArray.get(2)))); assertEquals(subscriptionsTab.getTabId(), subscriptionsTabFromReturnedJson.getTabId()); - final Tab.ChannelTab channelTabFromReturnedJson = requireNonNull((Tab.ChannelTab) Tab.from(((JsonObject) tabsFromArray.get(2)))); + final Tab.ChannelTab channelTabFromReturnedJson = requireNonNull((Tab.ChannelTab) Tab.from(((JsonObject) tabsFromArray.get(3)))); assertEquals(channelTab.getTabId(), channelTabFromReturnedJson.getTabId()); assertEquals(channelTab.getChannelServiceId(), channelTabFromReturnedJson.getChannelServiceId()); assertEquals(channelTab.getChannelUrl(), channelTabFromReturnedJson.getChannelUrl()); assertEquals(channelTab.getChannelName(), channelTabFromReturnedJson.getChannelName()); - final Tab.KioskTab kioskTabFromReturnedJson = requireNonNull((Tab.KioskTab) Tab.from(((JsonObject) tabsFromArray.get(3)))); + final Tab.KioskTab kioskTabFromReturnedJson = requireNonNull((Tab.KioskTab) Tab.from(((JsonObject) tabsFromArray.get(4)))); assertEquals(kioskTab.getTabId(), kioskTabFromReturnedJson.getTabId()); assertEquals(kioskTab.getKioskServiceId(), kioskTabFromReturnedJson.getKioskServiceId()); assertEquals(kioskTab.getKioskId(), kioskTabFromReturnedJson.getKioskId()); diff --git a/build.gradle b/build.gradle index 60a85021a..5ceffb6e7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext.kotlin_version = '1.3.50' repositories { jcenter() google() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:3.5.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/fastlane/metadata/android/en-US/changelogs/790.txt b/fastlane/metadata/android/en-US/changelogs/790.txt new file mode 100644 index 000000000..ec77b2acb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/790.txt @@ -0,0 +1,14 @@ +Improved +• Add more titles to improve accessibility for blind people #2655 +• Make language of download folder setting more consistent and less ambiguous #2637 + +Fixed +• Check if last byte in the block is downloaded #2646 +• Fixed scrolling in video detail fragment #2672 +• Remove double search clear box animations to one #2695 +• [SoundCloud] Fix client_id extraction #2745 + +Development +• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 +• Migrate to AndroidX #2685 +• Update to ExoPlayer 2.10.6 #2697, #2736 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e98d29bd8..d757f3d33 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Mon Oct 07 06:29:33 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip