mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 15:23:00 +00:00 
			
		
		
		
	Merge branch 'dev' into unhook-save-restore
This commit is contained in:
		| @@ -53,6 +53,7 @@ ext { | ||||
|     okHttpLibVersion = '3.12.6' | ||||
|     icepickLibVersion = '3.2.0' | ||||
|     stethoLibVersion = '1.5.0' | ||||
|     markwonVersion = '4.2.1' | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
| @@ -62,7 +63,7 @@ dependencies { | ||||
|         exclude module: 'support-annotations' | ||||
|     }) | ||||
|  | ||||
|     implementation 'com.github.TeamNewPipe:NewPipeExtractor:ff61e284' | ||||
|     implementation 'com.github.TeamNewPipe:NewPipeExtractor:9112a10' | ||||
|     testImplementation 'junit:junit:4.12' | ||||
|     testImplementation 'org.mockito:mockito-core:2.23.0' | ||||
|  | ||||
| @@ -108,4 +109,7 @@ dependencies { | ||||
|  | ||||
|     implementation "com.squareup.okhttp3:okhttp:${okHttpLibVersion}" | ||||
|     debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoLibVersion}" | ||||
|  | ||||
|     implementation "io.noties.markwon:core:${markwonVersion}" | ||||
|     implementation "io.noties.markwon:linkify:${markwonVersion}" | ||||
| } | ||||
|   | ||||
| @@ -112,7 +112,7 @@ | ||||
|  | ||||
|         <activity | ||||
|             android:name=".ReCaptchaActivity" | ||||
|             android:label="@string/reCaptchaActivity"/> | ||||
|             android:label="@string/recaptcha"/> | ||||
|  | ||||
|         <provider | ||||
|             android:name="androidx.core.content.FileProvider" | ||||
|   | ||||
| @@ -1,20 +1,25 @@ | ||||
| package org.schabi.newpipe; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.content.Intent; | ||||
| import android.graphics.Bitmap; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import androidx.core.app.NavUtils; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
|  | ||||
| import android.util.Log; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.webkit.CookieManager; | ||||
| import android.webkit.WebSettings; | ||||
| import android.webkit.WebView; | ||||
| import android.webkit.WebViewClient; | ||||
|  | ||||
| import org.schabi.newpipe.util.ThemeHelper; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| /* | ||||
|  * Created by beneth <bmauduit@beneth.fr> on 06.12.16. | ||||
|  * | ||||
| @@ -37,48 +42,46 @@ import android.webkit.WebViewClient; | ||||
| public class ReCaptchaActivity extends AppCompatActivity { | ||||
|     public static final int RECAPTCHA_REQUEST = 10; | ||||
|     public static final String RECAPTCHA_URL_EXTRA = "recaptcha_url_extra"; | ||||
|  | ||||
|     public static final String TAG = ReCaptchaActivity.class.toString(); | ||||
|     public static final String YT_URL = "https://www.youtube.com"; | ||||
|  | ||||
|     private String url; | ||||
|     private WebView webView; | ||||
|     private String foundCookies = ""; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         ThemeHelper.setTheme(this); | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_recaptcha); | ||||
|         Toolbar toolbar = findViewById(R.id.toolbar); | ||||
|         setSupportActionBar(toolbar); | ||||
|  | ||||
|         url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA); | ||||
|         String url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA); | ||||
|         if (url == null || url.isEmpty()) { | ||||
|             url = YT_URL; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         // Set return to Cancel by default | ||||
|         // set return to Cancel by default | ||||
|         setResult(RESULT_CANCELED); | ||||
|  | ||||
|         Toolbar toolbar = findViewById(R.id.toolbar); | ||||
|         setSupportActionBar(toolbar); | ||||
|  | ||||
|         ActionBar actionBar = getSupportActionBar(); | ||||
|         if (actionBar != null) { | ||||
|             actionBar.setDisplayHomeAsUpEnabled(true); | ||||
|             actionBar.setTitle(R.string.reCaptcha_title); | ||||
|             actionBar.setDisplayShowTitleEnabled(true); | ||||
|         } | ||||
|         webView = findViewById(R.id.reCaptchaWebView); | ||||
|  | ||||
|         WebView myWebView = findViewById(R.id.reCaptchaWebView); | ||||
|  | ||||
|         // Enable Javascript | ||||
|         WebSettings webSettings = myWebView.getSettings(); | ||||
|         // enable Javascript | ||||
|         WebSettings webSettings = webView.getSettings(); | ||||
|         webSettings.setJavaScriptEnabled(true); | ||||
|  | ||||
|         ReCaptchaWebViewClient webClient = new ReCaptchaWebViewClient(this); | ||||
|         myWebView.setWebViewClient(webClient); | ||||
|         webView.setWebViewClient(new WebViewClient() { | ||||
|             @Override | ||||
|             public void onPageFinished(WebView view, String url) { | ||||
|                 super.onPageFinished(view, url); | ||||
|                 handleCookies(url); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         // Cleaning cache, history and cookies from webView | ||||
|         myWebView.clearCache(true); | ||||
|         myWebView.clearHistory(); | ||||
|         // cleaning cache, history and cookies from webView | ||||
|         webView.clearCache(true); | ||||
|         webView.clearHistory(); | ||||
|         android.webkit.CookieManager cookieManager = CookieManager.getInstance(); | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|             cookieManager.removeAllCookies(aBoolean -> {}); | ||||
| @@ -86,77 +89,82 @@ public class ReCaptchaActivity extends AppCompatActivity { | ||||
|             cookieManager.removeAllCookie(); | ||||
|         } | ||||
|  | ||||
|         myWebView.loadUrl(url); | ||||
|         webView.loadUrl(url); | ||||
|     } | ||||
|  | ||||
|     private class ReCaptchaWebViewClient extends WebViewClient { | ||||
|         private final Activity context; | ||||
|         private String mCookies; | ||||
|     @Override | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         getMenuInflater().inflate(R.menu.menu_recaptcha, menu); | ||||
|  | ||||
|         ReCaptchaWebViewClient(Activity ctx) { | ||||
|             context = ctx; | ||||
|         ActionBar actionBar = getSupportActionBar(); | ||||
|         if (actionBar != null) { | ||||
|             actionBar.setDisplayHomeAsUpEnabled(false); | ||||
|             actionBar.setTitle(R.string.title_activity_recaptcha); | ||||
|             actionBar.setSubtitle(R.string.subtitle_activity_recaptcha); | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void onPageStarted(WebView view, String url, Bitmap favicon) { | ||||
|             // TODO: Start Loader | ||||
|             super.onPageStarted(view, url, favicon); | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|         @Override | ||||
|         public void onPageFinished(WebView view, String url) { | ||||
|             String cookies = CookieManager.getInstance().getCookie(url); | ||||
|  | ||||
|             // TODO: Stop Loader | ||||
|  | ||||
|             // find cookies : s_gl & goojf and Add cookies to Downloader | ||||
|             if (find_access_cookies(cookies)) { | ||||
|                 // Give cookies to Downloader class | ||||
|                 DownloaderImpl.getInstance().setCookies(mCookies); | ||||
|  | ||||
|                 // Closing activity and return to parent | ||||
|                 setResult(RESULT_OK); | ||||
|                 finish(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private boolean find_access_cookies(String cookies) { | ||||
|             boolean ret = false; | ||||
|             String c_s_gl = ""; | ||||
|             String c_goojf = ""; | ||||
|  | ||||
|             String[] parts = cookies.split("; "); | ||||
|             for (String part : parts) { | ||||
|                 if (part.trim().startsWith("s_gl")) { | ||||
|                     c_s_gl = part.trim(); | ||||
|                 } | ||||
|                 if (part.trim().startsWith("goojf")) { | ||||
|                     c_goojf = part.trim(); | ||||
|                 } | ||||
|             } | ||||
|             if (c_s_gl.length() > 0 && c_goojf.length() > 0) { | ||||
|                 ret = true; | ||||
|                 //mCookies = c_s_gl + "; " + c_goojf; | ||||
|                 // Youtube seems to also need the other cookies: | ||||
|                 mCookies = cookies; | ||||
|             } | ||||
|  | ||||
|             return ret; | ||||
|         } | ||||
|     @Override | ||||
|     public void onBackPressed() { | ||||
|         saveCookiesAndFinish(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         int id = item.getItemId(); | ||||
|         switch (id) { | ||||
|             case android.R.id.home: { | ||||
|                 Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class); | ||||
|                 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | ||||
|                 NavUtils.navigateUpTo(this, intent); | ||||
|             case R.id.menu_item_done: | ||||
|                 saveCookiesAndFinish(); | ||||
|                 return true; | ||||
|             } | ||||
|             default: | ||||
|                 return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void saveCookiesAndFinish() { | ||||
|         handleCookies(webView.getUrl()); // try to get cookies of unclosed page | ||||
|         if (!foundCookies.isEmpty()) { | ||||
|             // give cookies to Downloader class | ||||
|             DownloaderImpl.getInstance().setCookies(foundCookies); | ||||
|             setResult(RESULT_OK); | ||||
|         } | ||||
|  | ||||
|         Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class); | ||||
|         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | ||||
|         NavUtils.navigateUpTo(this, intent); | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     private void handleCookies(String url) { | ||||
|         String cookies = CookieManager.getInstance().getCookie(url); | ||||
|         if (MainActivity.DEBUG) Log.d(TAG, "handleCookies: url=" + url + "; cookies=" + (cookies == null ? "null" : cookies)); | ||||
|         if (cookies == null) return; | ||||
|  | ||||
|         addYoutubeCookies(cookies); | ||||
|         // add other methods to extract cookies here | ||||
|     } | ||||
|  | ||||
|     private void addYoutubeCookies(@Nonnull String cookies) { | ||||
|         if (cookies.contains("s_gl=") || cookies.contains("goojf=") || cookies.contains("VISITOR_INFO1_LIVE=")) { | ||||
|             // youtube seems to also need the other cookies: | ||||
|             addCookie(cookies); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void addCookie(String cookie) { | ||||
|         if (foundCookies.contains(cookie)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (foundCookies.isEmpty() || foundCookies.endsWith("; ")) { | ||||
|             foundCookies += cookie; | ||||
|         } else if (foundCookies.endsWith(";")) { | ||||
|             foundCookies += " " + cookie; | ||||
|         } else { | ||||
|             foundCookies += "; " + cookie; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -32,18 +32,20 @@ public class AboutActivity extends AppCompatActivity { | ||||
|      * List of all software components | ||||
|      */ | ||||
|     private static final SoftwareComponent[] SOFTWARE_COMPONENTS = new SoftwareComponent[]{ | ||||
|             new SoftwareComponent("Giga Get", "2014", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2), | ||||
|             new SoftwareComponent("NewPipe Extractor", "2017", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3), | ||||
|             new SoftwareComponent("Giga Get", "2014 - 2015", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2), | ||||
|             new SoftwareComponent("NewPipe Extractor", "2017 - 2020", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3), | ||||
|             new SoftwareComponent("Jsoup", "2017", "Jonathan Hedley", "https://github.com/jhy/jsoup", StandardLicenses.MIT), | ||||
|             new SoftwareComponent("Rhino", "2015", "Mozilla", "https://www.mozilla.org/rhino/", StandardLicenses.MPL2), | ||||
|             new SoftwareComponent("ACRA", "2013", "Kevin Gaudin", "http://www.acra.ch", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("Universal Image Loader", "2011 - 2015", "Sergey Tarasevich", "https://github.com/nostra13/Android-Universal-Image-Loader", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("CircleImageView", "2014 - 2017", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("CircleImageView", "2014 - 2020", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("NoNonsense-FilePicker", "2016", "Jonas Kalderstam", "https://github.com/spacecowboy/NoNonsense-FilePicker", StandardLicenses.MPL2), | ||||
|             new SoftwareComponent("ExoPlayer", "2014-2017", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("RxAndroid", "2015", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("RxJava", "2016-present", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("RxBinding", "2015", "Jake Wharton", "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2) | ||||
|             new SoftwareComponent("ExoPlayer", "2014 - 2020", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("RxAndroid", "2015 - 2018", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("RxJava", "2016 - 2020", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("RxBinding", "2015 - 2018", "Jake Wharton", "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("PrettyTime", "2012 - 2020", "Lincoln Baxter, III", "https://github.com/ocpsoft/prettytime", StandardLicenses.APACHE2), | ||||
|             new SoftwareComponent("Markwon", "2017 - 2020", "Noties", "https://github.com/noties/Markwon", StandardLicenses.APACHE2) | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -2,7 +2,6 @@ package org.schabi.newpipe.fragments.detail; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.content.Context; | ||||
| import android.content.DialogInterface; | ||||
| import android.content.Intent; | ||||
| import android.content.SharedPreferences; | ||||
| import android.net.Uri; | ||||
| @@ -18,7 +17,6 @@ import androidx.fragment.app.Fragment; | ||||
| import androidx.core.content.ContextCompat; | ||||
| import androidx.viewpager.widget.ViewPager; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.app.AlertDialog; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import android.text.Html; | ||||
| import android.text.Spanned; | ||||
| @@ -58,6 +56,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||
| import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||
| import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; | ||||
| import org.schabi.newpipe.extractor.stream.AudioStream; | ||||
| import org.schabi.newpipe.extractor.stream.Description; | ||||
| import org.schabi.newpipe.extractor.stream.Stream; | ||||
| import org.schabi.newpipe.extractor.stream.StreamInfo; | ||||
| import org.schabi.newpipe.extractor.stream.StreamType; | ||||
| @@ -96,6 +95,8 @@ import java.util.List; | ||||
| import java.util.concurrent.TimeUnit; | ||||
|  | ||||
| import icepick.State; | ||||
| import io.noties.markwon.Markwon; | ||||
| import io.noties.markwon.linkify.LinkifyPlugin; | ||||
| import io.reactivex.Single; | ||||
| import io.reactivex.android.schedulers.AndroidSchedulers; | ||||
| import io.reactivex.disposables.CompositeDisposable; | ||||
| @@ -483,7 +484,6 @@ public class VideoDetailFragment | ||||
|         videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view); | ||||
|         videoDescriptionView = rootView.findViewById(R.id.detail_description_view); | ||||
|         videoDescriptionView.setMovementMethod(LinkMovementMethod.getInstance()); | ||||
|         videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS); | ||||
|  | ||||
|         thumbsUpTextView = rootView.findViewById(R.id.detail_thumbs_up_count_view); | ||||
|         thumbsUpImageView = rootView.findViewById(R.id.detail_thumbs_up_img_view); | ||||
| @@ -919,28 +919,41 @@ public class VideoDetailFragment | ||||
|         return sortedVideoStreams != null ? sortedVideoStreams.get(selectedVideoStreamIndex) : null; | ||||
|     } | ||||
|  | ||||
|     private void prepareDescription(final String descriptionHtml) { | ||||
|         if (TextUtils.isEmpty(descriptionHtml)) { | ||||
|     private void prepareDescription(Description description) { | ||||
|         if (TextUtils.isEmpty(description.getContent()) || description == Description.emptyDescription) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         disposables.add(Single.just(descriptionHtml) | ||||
|                 .map((@io.reactivex.annotations.NonNull String description) -> { | ||||
|                     Spanned parsedDescription; | ||||
|                     if (Build.VERSION.SDK_INT >= 24) { | ||||
|                         parsedDescription = Html.fromHtml(description, 0); | ||||
|                     } else { | ||||
|                         //noinspection deprecation | ||||
|                         parsedDescription = Html.fromHtml(description); | ||||
|                     } | ||||
|                     return parsedDescription; | ||||
|                 }) | ||||
|                 .subscribeOn(Schedulers.computation()) | ||||
|                 .observeOn(AndroidSchedulers.mainThread()) | ||||
|                 .subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> { | ||||
|                     videoDescriptionView.setText(spanned); | ||||
|                     videoDescriptionView.setVisibility(View.VISIBLE); | ||||
|                 })); | ||||
|         if (description.getType() == Description.HTML) { | ||||
|             disposables.add(Single.just(description.getContent()) | ||||
|                     .map((@io.reactivex.annotations.NonNull String descriptionText) -> { | ||||
|                         Spanned parsedDescription; | ||||
|                         if (Build.VERSION.SDK_INT >= 24) { | ||||
|                             parsedDescription = Html.fromHtml(descriptionText, 0); | ||||
|                         } else { | ||||
|                             //noinspection deprecation | ||||
|                             parsedDescription = Html.fromHtml(descriptionText); | ||||
|                         } | ||||
|                         return parsedDescription; | ||||
|                     }) | ||||
|                     .subscribeOn(Schedulers.computation()) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> { | ||||
|                         videoDescriptionView.setText(spanned); | ||||
|                         videoDescriptionView.setVisibility(View.VISIBLE); | ||||
|                     })); | ||||
|         } else if (description.getType() == Description.MARKDOWN) { | ||||
|             final Markwon markwon = Markwon.builder(getContext()) | ||||
|                     .usePlugin(LinkifyPlugin.create()) | ||||
|                     .build(); | ||||
|             markwon.setMarkdown(videoDescriptionView, description.getContent()); | ||||
|             videoDescriptionView.setVisibility(View.VISIBLE); | ||||
|         } else { | ||||
|             //== Description.PLAIN_TEXT | ||||
|             videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS); | ||||
|             videoDescriptionView.setText(description.getContent(), TextView.BufferType.SPANNABLE); | ||||
|             videoDescriptionView.setVisibility(View.VISIBLE); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void setHeightThumbnail() { | ||||
|   | ||||
| @@ -1,9 +1,15 @@ | ||||
| package org.schabi.newpipe.info_list.holder; | ||||
|  | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import android.content.ClipData; | ||||
| import android.content.ClipboardManager; | ||||
| import android.content.Context; | ||||
| import android.text.util.Linkify; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
|  | ||||
| import org.jsoup.helper.StringUtil; | ||||
| import org.schabi.newpipe.R; | ||||
| @@ -120,6 +126,21 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { | ||||
|                 itemBuilder.getOnCommentsSelectedListener().selected(item); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|  | ||||
|         itemView.setOnLongClickListener(new View.OnLongClickListener() { | ||||
|             @Override | ||||
|             public boolean onLongClick(View view) { | ||||
|  | ||||
|                 ClipboardManager clipboardManager = (ClipboardManager) itemBuilder.getContext() | ||||
|                                                     .getSystemService(Context.CLIPBOARD_SERVICE); | ||||
|                 clipboardManager.setPrimaryClip(ClipData.newPlainText(null,commentText)); | ||||
|                 Toast.makeText(itemBuilder.getContext(), R.string.msg_copied, Toast.LENGTH_SHORT).show(); | ||||
|                 return true; | ||||
|  | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     private void ellipsize() { | ||||
|   | ||||
| @@ -137,6 +137,7 @@ public class DataReader { | ||||
|  | ||||
|         position = 0; | ||||
|         readOffset = readBuffer.length; | ||||
|         readCount = 0; | ||||
|     } | ||||
|  | ||||
|     public boolean canRewind() { | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import org.schabi.newpipe.streams.io.SharpStream; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.nio.ByteBuffer; | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| /** | ||||
|  * @author kapodamy | ||||
| @@ -23,7 +24,6 @@ public class Mp4FromDashWriter { | ||||
|     private final static byte SAMPLES_PER_CHUNK = 6;// ffmpeg uses 2, basic uses 1 (with 60fps uses 21 or 22). NewPipe will use 6 | ||||
|     private final static long THRESHOLD_FOR_CO64 = 0xFFFEFFFFL;// near 3.999 GiB | ||||
|     private final static int THRESHOLD_MOOV_LENGTH = (256 * 1024) + (2048 * 1024); // 2.2 MiB enough for: 1080p 60fps 00h35m00s | ||||
|     private final static short SINGLE_CHUNK_SAMPLE_BUFFER = 256; | ||||
|  | ||||
|     private final long time; | ||||
|  | ||||
| @@ -46,6 +46,8 @@ public class Mp4FromDashWriter { | ||||
|  | ||||
|     private int overrideMainBrand = 0x00; | ||||
|  | ||||
|     private ArrayList<Integer> compatibleBrands = new ArrayList<>(5); | ||||
|  | ||||
|     public Mp4FromDashWriter(SharpStream... sources) throws IOException { | ||||
|         for (SharpStream src : sources) { | ||||
|             if (!src.canRewind() && !src.canRead()) { | ||||
| @@ -57,6 +59,10 @@ public class Mp4FromDashWriter { | ||||
|         readers = new Mp4DashReader[sourceTracks.length]; | ||||
|         readersChunks = new Mp4DashChunk[readers.length]; | ||||
|         time = (System.currentTimeMillis() / 1000L) + EPOCH_OFFSET; | ||||
|  | ||||
|         compatibleBrands.add(0x6D703431);// mp41 | ||||
|         compatibleBrands.add(0x69736F6D);// isom | ||||
|         compatibleBrands.add(0x69736F32);// iso2 | ||||
|     } | ||||
|  | ||||
|     public Mp4Track[] getTracksFromSource(int sourceIndex) throws IllegalStateException { | ||||
| @@ -104,8 +110,8 @@ public class Mp4FromDashWriter { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void setMainBrand(int brandId) { | ||||
|         overrideMainBrand = brandId; | ||||
|     public void setMainBrand(int brand) { | ||||
|         overrideMainBrand = brand; | ||||
|     } | ||||
|  | ||||
|     public boolean isDone() { | ||||
| @@ -159,7 +165,13 @@ public class Mp4FromDashWriter { | ||||
|             tablesInfo[i] = new TablesInfo(); | ||||
|         } | ||||
|  | ||||
|         boolean singleChunk = tracks.length == 1 && tracks[0].kind == TrackKind.Audio; | ||||
|         int single_sample_buffer; | ||||
|         if (tracks.length == 1 && tracks[0].kind == TrackKind.Audio) { | ||||
|             // near 1 second of audio data per chunk, avoid split the audio stream in large chunks | ||||
|             single_sample_buffer = tracks[0].trak.mdia.mdhd_timeScale / 1000; | ||||
|         } else { | ||||
|             single_sample_buffer = -1; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         for (int i = 0; i < readers.length; i++) { | ||||
| @@ -210,31 +222,10 @@ public class Mp4FromDashWriter { | ||||
|  | ||||
|             readers[i].rewind(); | ||||
|  | ||||
|             int tmp = tablesInfo[i].stsz - SAMPLES_PER_CHUNK_INIT; | ||||
|             tablesInfo[i].stco = (tmp / SAMPLES_PER_CHUNK) + 1;// +1 for samples in first chunk | ||||
|  | ||||
|             tmp = tmp % SAMPLES_PER_CHUNK; | ||||
|             if (singleChunk) { | ||||
|                 // avoid split audio streams in chunks | ||||
|                 tablesInfo[i].stsc = 1; | ||||
|                 tablesInfo[i].stsc_bEntries = new int[]{ | ||||
|                         1, tablesInfo[i].stsz, 1 | ||||
|                 }; | ||||
|                 tablesInfo[i].stco = 1; | ||||
|             } else if (tmp == 0) { | ||||
|                 tablesInfo[i].stsc = 2;// first chunk (init) and succesive chunks | ||||
|                 tablesInfo[i].stsc_bEntries = new int[]{ | ||||
|                         1, SAMPLES_PER_CHUNK_INIT, 1, | ||||
|                         2, SAMPLES_PER_CHUNK, 1 | ||||
|                 }; | ||||
|             if (single_sample_buffer > 0) { | ||||
|                 initChunkTables(tablesInfo[i], single_sample_buffer, single_sample_buffer); | ||||
|             } else { | ||||
|                 tablesInfo[i].stsc = 3;// first chunk (init) and successive chunks and remain chunk | ||||
|                 tablesInfo[i].stsc_bEntries = new int[]{ | ||||
|                         1, SAMPLES_PER_CHUNK_INIT, 1, | ||||
|                         2, SAMPLES_PER_CHUNK, 1, | ||||
|                         tablesInfo[i].stco + 1, tmp, 1 | ||||
|                 }; | ||||
|                 tablesInfo[i].stco++; | ||||
|                 initChunkTables(tablesInfo[i], SAMPLES_PER_CHUNK_INIT, SAMPLES_PER_CHUNK); | ||||
|             } | ||||
|  | ||||
|             sampleCount[i] = tablesInfo[i].stsz; | ||||
| @@ -259,7 +250,7 @@ public class Mp4FromDashWriter { | ||||
|  | ||||
|         boolean is64 = read > THRESHOLD_FOR_CO64; | ||||
|  | ||||
|         // calculate the moov size; | ||||
|         // calculate the moov size | ||||
|         int auxSize = make_moov(defaultMediaTime, tablesInfo, is64); | ||||
|  | ||||
|         if (auxSize < THRESHOLD_MOOV_LENGTH) { | ||||
| @@ -272,11 +263,6 @@ public class Mp4FromDashWriter { | ||||
|         final int ftyp_size = make_ftyp(); | ||||
|  | ||||
|         // reserve moov space in the output stream | ||||
|         /*if (outStream.canSetLength()) { | ||||
|             long length = writeOffset + auxSize; | ||||
|             outStream.setLength(length); | ||||
|             outSeek(length); | ||||
|         } else {*/ | ||||
|         if (auxSize > 0) { | ||||
|             int length = auxSize; | ||||
|             byte[] buffer = new byte[64 * 1024];// 64 KiB | ||||
| @@ -292,10 +278,10 @@ public class Mp4FromDashWriter { | ||||
|         } | ||||
|  | ||||
|         // tablesInfo contains row counts | ||||
|         // and after returning from make_moov() will contain table offsets | ||||
|         // and after returning from make_moov() will contain those table offsets | ||||
|         make_moov(defaultMediaTime, tablesInfo, is64); | ||||
|  | ||||
|         // write tables: stts stsc | ||||
|         // write tables: stts stsc sbgp | ||||
|         // reset for ctts table: sampleCount sampleExtra | ||||
|         for (int i = 0; i < readers.length; i++) { | ||||
|             writeEntryArray(tablesInfo[i].stts, 2, sampleCount[i], defaultSampleDuration[i]); | ||||
| @@ -305,6 +291,7 @@ public class Mp4FromDashWriter { | ||||
|                 sampleCount[i] = 1;// the index is not base zero | ||||
|                 sampleExtra[i] = -1; | ||||
|             } | ||||
|             writeEntryArray(tablesInfo[i].sbgp, 1, sampleCount[i]); | ||||
|         } | ||||
|  | ||||
|         if (auxBuffer == null) { | ||||
| @@ -314,8 +301,8 @@ public class Mp4FromDashWriter { | ||||
|         outWrite(make_mdat(totalSampleSize, is64)); | ||||
|  | ||||
|         int[] sampleIndex = new int[readers.length]; | ||||
|         int[] sizes = new int[singleChunk ? SINGLE_CHUNK_SAMPLE_BUFFER : SAMPLES_PER_CHUNK]; | ||||
|         int[] sync = new int[singleChunk ? SINGLE_CHUNK_SAMPLE_BUFFER : SAMPLES_PER_CHUNK]; | ||||
|         int[] sizes = new int[single_sample_buffer > 0 ? single_sample_buffer : SAMPLES_PER_CHUNK]; | ||||
|         int[] sync = new int[single_sample_buffer > 0 ? single_sample_buffer : SAMPLES_PER_CHUNK]; | ||||
|  | ||||
|         int written = readers.length; | ||||
|         while (written > 0) { | ||||
| @@ -329,8 +316,8 @@ public class Mp4FromDashWriter { | ||||
|                 long chunkOffset = writeOffset; | ||||
|                 int syncCount = 0; | ||||
|                 int limit; | ||||
|                 if (singleChunk) { | ||||
|                     limit = SINGLE_CHUNK_SAMPLE_BUFFER; | ||||
|                 if (single_sample_buffer > 0) { | ||||
|                     limit = single_sample_buffer; | ||||
|                 } else { | ||||
|                     limit = sampleIndex[i] == 0 ? SAMPLES_PER_CHUNK_INIT : SAMPLES_PER_CHUNK; | ||||
|                 } | ||||
| @@ -342,6 +329,7 @@ public class Mp4FromDashWriter { | ||||
|                     if (sample == null) { | ||||
|                         if (tablesInfo[i].ctts > 0 && sampleExtra[i] >= 0) { | ||||
|                             writeEntryArray(tablesInfo[i].ctts, 1, sampleCount[i], sampleExtra[i]);// flush last entries | ||||
|                             outRestore(); | ||||
|                         } | ||||
|                         sampleIndex[i] = -1; | ||||
|                         break; | ||||
| @@ -390,10 +378,6 @@ public class Mp4FromDashWriter { | ||||
|                         } else { | ||||
|                             tablesInfo[i].stco = writeEntryArray(tablesInfo[i].stco, 1, (int) chunkOffset); | ||||
|                         } | ||||
|  | ||||
|                         if (singleChunk) { | ||||
|                             tablesInfo[i].stco = -1; | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     outRestore(); | ||||
| @@ -470,7 +454,42 @@ public class Mp4FromDashWriter { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void initChunkTables(TablesInfo tables, int firstCount, int succesiveCount) { | ||||
|         // tables.stsz holds amount of samples of the track (total) | ||||
|         int totalSamples = (tables.stsz - firstCount); | ||||
|         float chunkAmount = totalSamples / (float) succesiveCount; | ||||
|         int remainChunkOffset = (int) Math.ceil(chunkAmount); | ||||
|         boolean remain = remainChunkOffset != (int) chunkAmount; | ||||
|         int index = 0; | ||||
|  | ||||
|         tables.stsc = 1; | ||||
|         if (firstCount != succesiveCount) { | ||||
|             tables.stsc++; | ||||
|         } | ||||
|         if (remain) { | ||||
|             tables.stsc++; | ||||
|         } | ||||
|  | ||||
|         // stsc_table_entry = [first_chunk, samples_per_chunk, sample_description_index] | ||||
|         tables.stsc_bEntries = new int[tables.stsc * 3]; | ||||
|         tables.stco = remainChunkOffset + 1;// total entrys in chunk offset box | ||||
|  | ||||
|         tables.stsc_bEntries[index++] = 1; | ||||
|         tables.stsc_bEntries[index++] = firstCount; | ||||
|         tables.stsc_bEntries[index++] = 1; | ||||
|  | ||||
|         if (firstCount != succesiveCount) { | ||||
|             tables.stsc_bEntries[index++] = 2; | ||||
|             tables.stsc_bEntries[index++] = succesiveCount; | ||||
|             tables.stsc_bEntries[index++] = 1; | ||||
|         } | ||||
|  | ||||
|         if (remain) { | ||||
|             tables.stsc_bEntries[index++] = remainChunkOffset + 1; | ||||
|             tables.stsc_bEntries[index++] = totalSamples % succesiveCount; | ||||
|             tables.stsc_bEntries[index] = 1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void outWrite(byte[] buffer) throws IOException { | ||||
|         outWrite(buffer, buffer.length); | ||||
| @@ -585,19 +604,29 @@ public class Mp4FromDashWriter { | ||||
|  | ||||
|  | ||||
|     private int make_ftyp() throws IOException { | ||||
|         byte[] buffer = new byte[]{ | ||||
|                 0x00, 0x00, 0x00, 0x1C, 0x66, 0x74, 0x79, 0x70,// ftyp | ||||
|                 0x6D, 0x70, 0x34, 0x32,// mayor brand (mp42) | ||||
|                 0x00, 0x00, 0x02, 0x00,// default minor version (512) | ||||
|                 0x6D, 0x70, 0x34, 0x31, 0x69, 0x73, 0x6F, 0x6D, 0x69, 0x73, 0x6F, 0x32// compatible brands: mp41 isom iso2 | ||||
|         }; | ||||
|         int size = 16 + (compatibleBrands.size() * 4); | ||||
|         if (overrideMainBrand != 0) size += 4; | ||||
|  | ||||
|         if (overrideMainBrand != 0) | ||||
|             ByteBuffer.wrap(buffer).putInt(8, overrideMainBrand); | ||||
|         ByteBuffer buffer = ByteBuffer.allocate(size); | ||||
|         buffer.putInt(size); | ||||
|         buffer.putInt(0x66747970);// "ftyp" | ||||
|  | ||||
|         outWrite(buffer); | ||||
|         if (overrideMainBrand == 0) { | ||||
|             buffer.putInt(0x6D703432);// mayor brand "mp42" | ||||
|             buffer.putInt(512);// default minor version | ||||
|         } else { | ||||
|             buffer.putInt(overrideMainBrand); | ||||
|             buffer.putInt(0); | ||||
|             buffer.putInt(0x6D703432);// "mp42" compatible brand | ||||
|         } | ||||
|  | ||||
|         return buffer.length; | ||||
|         for (Integer brand : compatibleBrands) { | ||||
|             buffer.putInt(brand);// compatible brand | ||||
|         } | ||||
|  | ||||
|         outWrite(buffer.array()); | ||||
|  | ||||
|         return size; | ||||
|     } | ||||
|  | ||||
|     private byte[] make_mdat(long refSize, boolean is64) { | ||||
| @@ -740,13 +769,12 @@ public class Mp4FromDashWriter { | ||||
|                 .array() | ||||
|         ); | ||||
|  | ||||
|         make_mdia(tracks[index].trak.mdia, tables, is64); | ||||
|         make_mdia(tracks[index].trak.mdia, tables, is64, tracks[index].kind == TrackKind.Audio); | ||||
|  | ||||
|         lengthFor(start); | ||||
|     } | ||||
|  | ||||
|     private void make_mdia(Mdia mdia, TablesInfo tablesInfo, boolean is64) throws IOException { | ||||
|  | ||||
|     private void make_mdia(Mdia mdia, TablesInfo tablesInfo, boolean is64, boolean isAudio) throws IOException { | ||||
|         int start_mdia = auxOffset(); | ||||
|         auxWrite(new byte[]{0x00, 0x00, 0x00, 0x00, 0x6D, 0x64, 0x69, 0x61});// mdia | ||||
|         auxWrite(mdia.mdhd); | ||||
| @@ -766,7 +794,7 @@ public class Mp4FromDashWriter { | ||||
|         // And stsz can be empty if has a default sample size | ||||
|         // | ||||
|         if (moovSimulation) { | ||||
|             make(0x73747473, -1, 2, 1); | ||||
|             make(0x73747473, -1, 2, 1);// stts | ||||
|             if (tablesInfo.stss > 0) { | ||||
|                 make(0x73747373, -1, 1, tablesInfo.stss); | ||||
|             } | ||||
| @@ -789,6 +817,11 @@ public class Mp4FromDashWriter { | ||||
|             tablesInfo.stco = make(is64 ? 0x636F3634 : 0x7374636F, -1, is64 ? 2 : 1, tablesInfo.stco); | ||||
|         } | ||||
|  | ||||
|         if (isAudio) { | ||||
|             auxWrite(make_sgpd()); | ||||
|             tablesInfo.sbgp = make_sbgp();// during simulation the returned offset is ignored | ||||
|         } | ||||
|  | ||||
|         lengthFor(start_stbl); | ||||
|         lengthFor(start_minf); | ||||
|         lengthFor(start_mdia); | ||||
| @@ -816,6 +849,48 @@ public class Mp4FromDashWriter { | ||||
|         return buffer.array(); | ||||
|     } | ||||
|  | ||||
|     private int make_sbgp() throws IOException { | ||||
|         int offset = auxOffset(); | ||||
|  | ||||
|         auxWrite(new byte[] { | ||||
|                 0x00, 0x00, 0x00, 0x1C,// box size | ||||
|                 0x73, 0x62, 0x67, 0x70,// "sbpg" | ||||
|                 0x00, 0x00, 0x00, 0x00,// default box flags | ||||
|                 0x72, 0x6F, 0x6C, 0x6C,// group type "roll" | ||||
|                 0x00, 0x00, 0x00, 0x01,// group table size | ||||
|                 0x00, 0x00, 0x00, 0x00,// group[0] total samples (to be set later) | ||||
|                 0x00, 0x00, 0x00, 0x01// group[0] description index | ||||
|         }); | ||||
|  | ||||
|         return offset + 0x14; | ||||
|     } | ||||
|  | ||||
|     private byte[] make_sgpd() { | ||||
|         /* | ||||
|          * Sample Group Description Box | ||||
|          * | ||||
|          * ¿whats does? | ||||
|          * the table inside of this box gives information about the | ||||
|          * characteristics of sample groups. The descriptive information is any other | ||||
|          * information needed to define or characterize the sample group. | ||||
|          * | ||||
|          * ¿is replicabled this box? | ||||
|          * NO due lacks of documentation about this box but... | ||||
|          * most of m4a encoders and ffmpeg uses this box with dummy values (same values) | ||||
|          */ | ||||
|  | ||||
|         ByteBuffer buffer = ByteBuffer.wrap(new byte[] { | ||||
|                 0x00, 0x00, 0x00, 0x1A,// box size | ||||
|                 0x73, 0x67, 0x70, 0x64,// "sgpd" | ||||
|                 0x01, 0x00, 0x00, 0x00,// box flags (unknown flag sets) | ||||
|                 0x72, 0x6F, 0x6C, 0x6C, // ¿¿group type?? | ||||
|                 0x00, 0x00, 0x00, 0x02,// ¿¿?? | ||||
|                 0x00, 0x00, 0x00, 0x01,// ¿¿?? | ||||
|                 (byte)0xFF, (byte)0xFF// ¿¿?? | ||||
|         }); | ||||
|  | ||||
|         return buffer.array(); | ||||
|     } | ||||
|  | ||||
|     class TablesInfo { | ||||
|  | ||||
| @@ -827,5 +902,6 @@ public class Mp4FromDashWriter { | ||||
|         int stsz_default; | ||||
|         int stss; | ||||
|         int stco; | ||||
|         int sbgp; | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										9
									
								
								app/src/main/res/drawable/ic_done_black_24dp.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/res/drawable/ic_done_black_24dp.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|         android:width="24dp" | ||||
|         android:height="24dp" | ||||
|         android:viewportWidth="24.0" | ||||
|         android:viewportHeight="24.0"> | ||||
|     <path | ||||
|         android:fillColor="#FF000000" | ||||
|         android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/> | ||||
| </vector> | ||||
							
								
								
									
										5
									
								
								app/src/main/res/drawable/ic_done_white_24dp.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/src/main/res/drawable/ic_done_white_24dp.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <vector android:height="24dp" android:tint="#FFFFFF" | ||||
|     android:viewportHeight="24.0" android:viewportWidth="24.0" | ||||
|     android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <path android:fillColor="#FF000000" android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/> | ||||
| </vector> | ||||
| @@ -14,9 +14,7 @@ | ||||
|         android:minHeight="?attr/actionBarSize" | ||||
|         android:theme="@style/ThemeOverlay.AppCompat.ActionBar" | ||||
|         app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar" | ||||
|         app:titleTextAppearance="@style/Toolbar.Title"> | ||||
|  | ||||
|     </androidx.appcompat.widget.Toolbar> | ||||
|         app:titleTextAppearance="@style/Toolbar.Title"/> | ||||
|  | ||||
|     <WebView | ||||
|         android:id="@+id/reCaptchaWebView" | ||||
|   | ||||
							
								
								
									
										10
									
								
								app/src/main/res/menu/menu_recaptcha.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/menu/menu_recaptcha.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/menu_item_done" | ||||
|         android:title="@string/recaptcha_done_button" | ||||
|         android:icon="?attr/ic_done" | ||||
|         app:showAsAction="always"/> | ||||
| </menu> | ||||
| @@ -187,7 +187,7 @@ | ||||
|     <string name="no_available_dir">يرجى تحديد مجلد التنزيل لاحقا في الإعدادات</string> | ||||
|     <string name="msg_popup_permission">هذا الإذن مطلوب | ||||
| \nللفتح في وضع النافذة المنبثقة</string> | ||||
|     <string name="reCaptchaActivity">اختبار reCAPTCHA</string> | ||||
|     <string name="recaptcha">اختبار reCAPTCHA</string> | ||||
|     <string name="settings_file_charset_title">السماح بالرموز في أسماء الملفات</string> | ||||
|     <string name="settings_file_replacement_character_summary">يتم استبدال الرموز غير المسموح بها بهذه القيمة</string> | ||||
|     <string name="settings_file_replacement_character_title">استبدال الحرف</string> | ||||
| @@ -235,7 +235,7 @@ | ||||
|     <string name="play_queue_audio_settings">الإعدادات الصوتية</string> | ||||
|     <string name="start_here_on_main">تشغيل هنا</string> | ||||
|     <string name="start_here_on_popup">بدأ التشغيل في نافذة منبثقة جديدة</string> | ||||
|     <string name="reCaptcha_title">تحدي الكابتشا</string> | ||||
|     <string name="title_activity_recaptcha">تحدي الكابتشا</string> | ||||
|     <string name="hold_to_append">ضغط مطول للإدراج الى قائمة الانتظار</string> | ||||
|     <plurals name="views"> | ||||
|         <item quantity="zero">%s بدون مشهادة</item> | ||||
|   | ||||
| @@ -58,8 +58,8 @@ | ||||
|     <string name="short_billion">Mil mill.</string> | ||||
|     <string name="msg_popup_permission">Precísase esti permisu | ||||
| \np\'abrir nel mou ventanu</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Retu de reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Retu de reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Solicitóse\'l retu de reCAPTCHA</string> | ||||
|     <string name="controls_background_title">En segundu planu</string> | ||||
|     <string name="controls_popup_title">Ventanu</string> | ||||
|   | ||||
| @@ -110,7 +110,7 @@ | ||||
|     <string name="msg_running_detail">点击了解详情</string> | ||||
|     <string name="msg_wait">请稍候…</string> | ||||
|     <string name="msg_copied">复制至剪贴板</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA验证码</string> | ||||
|     <string name="recaptcha">reCAPTCHA验证码</string> | ||||
|     <string name="controls_popup_title">悬浮窗播放</string> | ||||
|     <string name="title_activity_about">关于NewPipe</string> | ||||
|     <string name="action_settings">设置</string> | ||||
| @@ -207,7 +207,7 @@ | ||||
|     <string name="no_available_dir">请稍后在设置中设定下载目录</string> | ||||
|     <string name="msg_popup_permission">用悬浮窗模式 | ||||
| \n需要此权限</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA验证</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA验证</string> | ||||
|     <string name="recaptcha_request_toast">请求的新的CAPTCHA验证</string> | ||||
|     <string name="popup_mode_share_menu_title">NewPipe 悬浮窗模式</string> | ||||
|     <string name="popup_playing_toast">在悬浮窗中播放</string> | ||||
|   | ||||
| @@ -247,8 +247,8 @@ | ||||
|     <string name="msg_popup_permission">Гэтае разрозненне трэба для  | ||||
| \nпрайгравання ў акне</string> | ||||
|     <string name="one_item_deleted">1 элемент выдалены.</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Запыт reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Запыт reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Запытаны ўвод reCAPTCHA</string> | ||||
|     <string name="settings_category_downloads_title">Загрузкі</string> | ||||
|     <string name="settings_file_charset_title">Дапушчальныя сімвалы назвы файлаў</string> | ||||
|   | ||||
| @@ -269,8 +269,8 @@ | ||||
|     <string name="msg_popup_permission">Това разрешение се изисква за | ||||
| \nвъзпроизвеждане в отделен прозорец</string> | ||||
|     <string name="one_item_deleted">1 елемент е изтрит.</string> | ||||
|     <string name="reCaptchaActivity">преКАПЧА</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA заявка</string> | ||||
|     <string name="recaptcha">преКАПЧА</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA заявка</string> | ||||
|     <string name="recaptcha_request_toast">Изисква се въвеждане на reCAPTCHA</string> | ||||
|     <string name="settings_category_downloads_title">Изтегляне</string> | ||||
|     <string name="charset_most_special_characters">Повечето специални символи</string> | ||||
|   | ||||
| @@ -145,8 +145,8 @@ | ||||
|     <!-- Checksum types --> | ||||
|     <!--     <string name="md5" translatable="false">MD5</string> --> | ||||
|     <!--     <string name="sha1" translatable="false">SHA1</string> --> | ||||
|     <string name="reCaptchaActivity">রিক্যাপচা</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA চ্যালেঞ্জ</string> | ||||
|     <string name="recaptcha">রিক্যাপচা</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA চ্যালেঞ্জ</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে</string> | ||||
|     <!-- End of GigaGet's Strings --> | ||||
|     <string name="info_labels">কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর:</string> | ||||
|   | ||||
| @@ -67,7 +67,7 @@ | ||||
|     <string name="finish">D\'acord</string> | ||||
|     <string name="msg_name">Nom de fitxer</string> | ||||
|     <string name="msg_error">Error</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="settings_category_downloads_title">Baixades</string> | ||||
|     <string name="action_settings">Paràmetres</string> | ||||
|     <string name="action_about">Quant a</string> | ||||
| @@ -307,7 +307,7 @@ | ||||
|     <string name="msg_running_detail">Feu un toc aquí per a més detalls</string> | ||||
|     <string name="no_available_dir">Defineix una carpeta de baixades més endavant als paràmetres</string> | ||||
|     <string name="msg_popup_permission">Es necessita aquest permís per a obrir el mode emergent</string> | ||||
|     <string name="reCaptcha_title">Camp reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Camp reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">S\'ha sol·licitat l\'emplenament d\'un camp reCAPTCHA</string> | ||||
|     <string name="settings_file_replacement_character_summary">Se substituiran els caràcters no vàlids amb aquest valor</string> | ||||
|     <string name="settings_file_replacement_character_title">Caràcter de substitució</string> | ||||
|   | ||||
| @@ -266,8 +266,8 @@ | ||||
|     <string name="msg_popup_permission">在悬浮窗模式打开 | ||||
| \n需要此权限</string> | ||||
|     <string name="one_item_deleted">已删除一个项目。</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA 验证</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA 验证</string> | ||||
|     <string name="recaptcha">reCAPTCHA 验证</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA 验证</string> | ||||
|     <string name="recaptcha_request_toast">需完成 reCAPTCHA 验证</string> | ||||
|     <string name="settings_category_downloads_title">下载</string> | ||||
|     <string name="settings_file_charset_title">文件名中允许的字符</string> | ||||
|   | ||||
| @@ -102,8 +102,8 @@ | ||||
|     <string name="view">Přehrát</string> | ||||
|     <string name="add">Nová mise</string> | ||||
|     <string name="finish">OK</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Výzva reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Výzva reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Požadována výzva reCAPTCHA</string> | ||||
|     <string name="black_theme_title">Černé</string> | ||||
|     <string name="checksum">Kontrolní součet</string> | ||||
|   | ||||
| @@ -249,8 +249,8 @@ | ||||
|     <string name="no_available_dir">Vælg venligst en tilgængelig downloadmappe</string> | ||||
|     <string name="msg_popup_permission">Denne tilladelse er nødvendig for at kunne åbne i pop op-tilstand</string> | ||||
|     <string name="one_item_deleted">1 element slettet.</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA-udfordring</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA-udfordring</string> | ||||
|     <string name="recaptcha_request_toast">Der blev anmodet om en reCAPTCHA-udfordring</string> | ||||
|     <string name="settings_category_downloads_title">Download</string> | ||||
|     <string name="settings_file_charset_title">Tilladte tegn i filnavne</string> | ||||
|   | ||||
| @@ -110,9 +110,9 @@ | ||||
|     <string name="msg_running">NewPipe lädt herunter</string> | ||||
|     <string name="msg_running_detail">Für Details antippen</string> | ||||
|     <string name="msg_url_malform">Ungültige URL oder Internet nicht verfügbar</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="black_theme_title">Schwarz</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA-Aufgabe</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA-Aufgabe</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA-Aufgabe angefordert</string> | ||||
|     <string name="later">Später</string> | ||||
|     <string name="yes">Ja</string> | ||||
|   | ||||
| @@ -251,8 +251,8 @@ | ||||
|     <string name="msg_popup_permission">Αυτή η άδεια είναι απαραίτητη για | ||||
| \nτο άνοιγμα αναδυόμενων παραθύρων</string> | ||||
|     <string name="one_item_deleted">1 αντικείμενο διαγράφηκε.</string> | ||||
|     <string name="reCaptchaActivity">Αυτόματο τεστ</string> | ||||
|     <string name="reCaptcha_title">Πρόκληση reCAPTCHA</string> | ||||
|     <string name="recaptcha">Αυτόματο τεστ</string> | ||||
|     <string name="title_activity_recaptcha">Πρόκληση reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Ζητήθηκε πρόκληση reCAPTCHA</string> | ||||
|     <string name="settings_file_charset_title">Επιτρεπόμενοι χαρακτήρες σε ονόματα αρχείων</string> | ||||
|     <string name="settings_file_replacement_character_summary">Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή</string> | ||||
|   | ||||
| @@ -109,8 +109,8 @@ | ||||
|     <string name="error_report_title">Erarosignalo</string> | ||||
|     <string name="could_not_load_image">Ne povis ŝarĝi bildon</string> | ||||
|     <string name="app_ui_crash">Apo kraŝis</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA defio</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA defio</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA defio petita</string> | ||||
|     <string name="all">Ĉiuj</string> | ||||
|     <string name="channel">Kanalo</string> | ||||
|   | ||||
| @@ -115,11 +115,11 @@ | ||||
|     <string name="short_thousand">k</string> | ||||
|     <string name="short_million">M</string> | ||||
|     <string name="short_billion">MM</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="open_in_popup_mode">Abrir en modo emergente</string> | ||||
|     <string name="msg_popup_permission">Se necesita este permiso | ||||
| \npara abrir en modo emergente</string> | ||||
|     <string name="reCaptcha_title">Reto reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Reto reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Reto reCAPTCHA requerido</string> | ||||
|     <string name="popup_mode_share_menu_title">Modo emergente de NewPipe</string> | ||||
|     <string name="popup_playing_toast">Reproduciendo en modo emergente</string> | ||||
|   | ||||
| @@ -238,7 +238,7 @@ | ||||
|     <string name="msg_popup_permission">Need õigused on vajalikud | ||||
| \nhüpikakna avamiseks</string> | ||||
|     <string name="one_item_deleted">Kustutati 1 element.</string> | ||||
|     <string name="reCaptchaActivity">"reCAPTCHA "</string> | ||||
|     <string name="recaptcha">"reCAPTCHA "</string> | ||||
|     <string name="settings_category_downloads_title">Laadi alla</string> | ||||
|     <string name="settings_file_charset_title">Lubatud tähemärgid failinimedes</string> | ||||
|     <string name="settings_file_replacement_character_summary">Vigased tähemärgid asendatakse selle väärtusega</string> | ||||
| @@ -370,7 +370,7 @@ | ||||
|     <string name="tracks">Lood</string> | ||||
|     <string name="users">Kasutajad</string> | ||||
|     <string name="switch_to_main">Lülitu peamisele</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA nõue</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA nõue</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA nõude taotlus</string> | ||||
|     <string name="copyright" formatted="true">© %1$s %2$s %3$s alla</string> | ||||
|     <string name="app_description">Vaba kergekaaluline Androidi voogesitus.</string> | ||||
|   | ||||
| @@ -139,8 +139,8 @@ | ||||
|     <string name="no_available_dir">Ezarri deskargetarako karpeta bat ezarpenetan geroago</string> | ||||
|     <string name="msg_popup_permission">Baimen hau beharrezkoa da | ||||
| \nlaster-leiho moduan irekitzeko</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA erronka</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA erronka</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA erronka eskatu da</string> | ||||
|     <string name="title_activity_about">NewPipe aplikazioari buruz</string> | ||||
|     <string name="action_settings">Ezarpenak</string> | ||||
|   | ||||
| @@ -296,7 +296,7 @@ | ||||
|     <string name="use_inexact_seek_title">زمان فعلی پخش کننده را به صورت تقریبی و سریع جلو ببر</string> | ||||
|     <string name="use_inexact_seek_summary">این گزینه باعث می شود هنگام جلو/عقب کردن زمان تصویر، به جای زمان دقیق انتخاب شده، به زمان غیر دقیق و نزدیک به مکان انتخاب شده برود که این کار سریع تر انجام می شود</string> | ||||
|     <string name="app_ui_crash">کاره یا رابط کاربری با خطا مواجه شد</string> | ||||
|     <string name="reCaptchaActivity">ریکپچا</string> | ||||
|     <string name="recaptcha">ریکپچا</string> | ||||
|     <string name="settings_category_downloads_title">بارگیری</string> | ||||
|     <string name="toggle_orientation">تغییر جهت</string> | ||||
|     <string name="switch_to_background">تغییر وضعیت به پسزمینه</string> | ||||
| @@ -361,7 +361,7 @@ | ||||
|     <string name="undo">بازگردانی</string> | ||||
|     <string name="background_player_append">در صف پخش کننده پسزمینه قرار گرفت</string> | ||||
|     <string name="info_labels">چه:\\nدرخواست:\\nزبان درخواست:\\nخدمت:\\nزمان GMT:\\nنگارش:\\nنگارش س.ع:\\nبازه آیپی:</string> | ||||
|     <string name="reCaptcha_title">چالش ریکپچا</string> | ||||
|     <string name="title_activity_recaptcha">چالش ریکپچا</string> | ||||
|     <string name="recaptcha_request_toast">نیاز به چالش ریکپچا است</string> | ||||
|     <string name="msg_popup_permission">این مجوز مورد نیاز است | ||||
| \nتا بتوان به حالت تصویر در تصویر رفت</string> | ||||
|   | ||||
| @@ -173,8 +173,8 @@ | ||||
|     <string name="msg_copied">Kopioitu leikepöydälle</string> | ||||
|     <string name="no_available_dir">Valitse saatavilla oleva latauskansio</string> | ||||
|     <string name="msg_popup_permission">Tämä käyttöoikeus tarvitaan ponnahdusikkunan käytölle</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA Haaste</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA Haaste</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA Haaste pyydetty</string> | ||||
|     <string name="settings_category_downloads_title">Lataus</string> | ||||
|     <string name="settings_file_charset_title">Sallitut merkit tiedostonimissä</string> | ||||
|   | ||||
| @@ -105,11 +105,11 @@ | ||||
|     <string name="no_available_dir">Veuillez définir ultérieurement un dossier de téléchargement dans les paramètres</string> | ||||
|     <string name="could_not_load_image">Impossible de charger l’image</string> | ||||
|     <string name="app_ui_crash">L’application a planté</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="black_theme_title">Noir</string> | ||||
|     <string name="all">Tout</string> | ||||
|     <string name="channel">Chaîne</string> | ||||
|     <string name="reCaptcha_title">Défi reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Défi reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Défi reCAPTCHA demandé</string> | ||||
|     <string name="open_in_popup_mode">Ouvrir en mode flottant</string> | ||||
|     <string name="popup_mode_share_menu_title">Mode flottant NewPipe</string> | ||||
|   | ||||
| @@ -266,8 +266,8 @@ | ||||
| \npara abrir o vídeo no modo «popup»</string> | ||||
|     <string name="one_item_deleted">1 elemento foi eliminado.</string> | ||||
|  | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Desafío reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Desafío reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Desafío reCAPTCHA solicitado</string> | ||||
|  | ||||
|     <string name="settings_category_downloads_title">Descarregar</string> | ||||
|   | ||||
| @@ -192,8 +192,8 @@ | ||||
|     <string name="no_available_dir">נא לציין תיקיית הורדה בהגדרות בהמשך</string> | ||||
|     <string name="msg_popup_permission">הרשאה זו נדרשת לטובת  | ||||
| \nפתיחה בחלון צף</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">אתגר reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">אתגר reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">התקבלה בקשה לאתגר reCAPTCHA</string> | ||||
|     <string name="settings_category_downloads_title">הורדה</string> | ||||
|     <string name="settings_file_charset_title">רשימת תווים אפשרית בשמות קבצים</string> | ||||
|   | ||||
| @@ -206,8 +206,8 @@ | ||||
|     <string name="msg_copied">क्लिपबोर्ड पर कॉपी हो गया है</string> | ||||
|     <string name="no_available_dir">कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुने</string> | ||||
|     <string name="msg_popup_permission">पॉपअप के तरीके में खोलने के लिए अनुमति की जरुरत है</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA चुनौती</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA चुनौती</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA चुनौती का अनुरोध किया</string> | ||||
|     <string name="settings_category_downloads_title">डाउनलोड</string> | ||||
|     <string name="settings_file_charset_title">फाइल के नाम के लिए आवश्यक characters(जैसे - १२३, abc) की अनुमति है</string> | ||||
|   | ||||
| @@ -153,8 +153,8 @@ | ||||
|     <string name="no_available_dir">Molimo odaberite dostupnu mapu za preuzimanje</string> | ||||
|     <string name="msg_popup_permission">Ova dozvola je potrebna za | ||||
| \notvaranje skočnog prozora</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA zadatak</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA zadatak</string> | ||||
|     <string name="recaptcha_request_toast">Traži se reCAPTCHA zadatak</string> | ||||
|     <string name="settings_category_downloads_title">Preuzimanja</string> | ||||
|     <string name="settings_file_charset_title">Dozvoljeni znakovi u nazivima datoteka</string> | ||||
|   | ||||
| @@ -232,8 +232,8 @@ | ||||
|     <string name="rename">Átnevezés</string> | ||||
|     <string name="msg_popup_permission">Ez az engedély szükséges a felugró ablakban történő megnyitáshoz</string> | ||||
|     <string name="one_item_deleted">1 elem törölve.</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA rejtvény</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA rejtvény</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA rejtvény igényelve</string> | ||||
|     <string name="settings_category_downloads_title">Letöltés</string> | ||||
|     <string name="settings_file_charset_title">Fájlnevekben engedélyezett karakterek</string> | ||||
|   | ||||
| @@ -105,8 +105,8 @@ | ||||
|     <string name="info_labels">Apa:\\nPermintaan:\\nBahasa Konten:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS:</string> | ||||
|     <string name="user_report">Laporan pengguna</string> | ||||
|     <string name="msg_threads">Thread</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Tantangan reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Tantangan reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Meminta kode reCAPTCHA</string> | ||||
|     <string name="black_theme_title">Hitam</string> | ||||
|     <string name="all">Semua</string> | ||||
|   | ||||
| @@ -106,8 +106,8 @@ | ||||
|     <string name="could_not_load_image">Impossibile caricare l\'immagine</string> | ||||
|     <string name="app_ui_crash">L\'app/UI si è interrotta</string> | ||||
|     <string name="info_labels">Cosa:\\nRichiesta:\\nLingua contenuto:\\nServizio:\\nOrario GMT:\\nPacchetto:\\nVersione:\\nVersione SO:</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Risoluzione reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Risoluzione reCAPTCHA</string> | ||||
|     <string name="black_theme_title">Nero</string> | ||||
|     <string name="all">Tutto</string> | ||||
|     <string name="channel">Canale</string> | ||||
|   | ||||
| @@ -106,8 +106,8 @@ | ||||
|     <string name="could_not_load_image">画像を読み込みできません</string> | ||||
|     <string name="app_ui_crash">アプリ/UI がクラッシュしました</string> | ||||
|     <string name="info_labels">何:\\\\n提案:\\\\nコンテンツ言語:\\\\nサービス:\\\\nGMT 時間:\\\\nパッケージ:\\\\nバージョン:\\\\nOSバージョン:</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA の要求</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA の要求</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA を要求しました</string> | ||||
|     <string name="black_theme_title">ブラック</string> | ||||
|     <string name="all">すべて</string> | ||||
|   | ||||
| @@ -180,7 +180,7 @@ | ||||
|     <string name="no_available_dir">다운로드 할 폴더를 설정에서 지정하세요</string> | ||||
|     <string name="msg_popup_permission">이 권한은 팝업 모드에서 | ||||
| \n열기 위해 필요합니다</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA 확인 요청됨</string> | ||||
|     <string name="settings_category_downloads_title">다운로드</string> | ||||
|     <string name="settings_file_charset_title">파일명에 허용되는 문자</string> | ||||
| @@ -274,7 +274,7 @@ | ||||
|     <string name="delete_all">모두 삭제하기</string> | ||||
|     <string name="dismiss">취소</string> | ||||
|     <string name="rename">이름 바꾸기</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA 확인</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA 확인</string> | ||||
|     <string name="delete_stream_history_prompt">이 항목을 시청 기록에서 삭제하시겠습니까?</string> | ||||
|     <string name="delete_all_history_prompt">모든 항목을 시청 기록에서 삭제하시겠습니까?</string> | ||||
|     <string name="title_last_played">마지막으로 재생</string> | ||||
|   | ||||
| @@ -215,8 +215,8 @@ | ||||
|     <string name="no_available_dir">تکایە فۆڵدەرێک بۆ شوێنی داگرتن دیاریبکە لە ڕێکخستنەکان</string> | ||||
|     <string name="msg_popup_permission">ئەم دەسەڵاتە پێویستە بۆ | ||||
| \nکردنەوەی پەنجەرەی بچووک</string> | ||||
|     <string name="reCaptchaActivity" translatable="false">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA داواکاری</string> | ||||
|     <string name="recaptcha" translatable="false">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA داواکاری</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA داواکراوە</string> | ||||
|     <string name="settings_category_downloads_title">داگرتن</string> | ||||
|     <string name="charset_letters_and_digits">پیت و ژمارەکان</string> | ||||
|   | ||||
| @@ -153,8 +153,8 @@ | ||||
|     <string name="no_available_dir">Prašome pasirinkti galimą atsisiuntimų aplankalą</string> | ||||
|     <string name="msg_popup_permission">Šis leidimas nereikalingas, kad atidarytiviššokančio lango rėžime</string> | ||||
|  | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA iššūkis</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA iššūkis</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA prašomas iššūkis</string> | ||||
|  | ||||
|     <string name="subscribe_button_title">Prenumeruoti</string> | ||||
|   | ||||
| @@ -230,8 +230,8 @@ | ||||
|     <string name="no_available_dir">Одберете достапна локација за превземања</string> | ||||
|     <string name="msg_popup_permission">Оваа привилегија е потребна за | ||||
| \nотворање во подпрозорче</string> | ||||
|     <string name="reCaptchaActivity">„reCAPTCHA“</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA Предизвик</string> | ||||
|     <string name="recaptcha">„reCAPTCHA“</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA Предизвик</string> | ||||
|     <string name="recaptcha_request_toast">Потребен е reCAPTCHA предизвик</string> | ||||
|     <string name="settings_category_downloads_title">Превземања</string> | ||||
|     <string name="settings_file_charset_title">Дозволени знаци во имињата на датотеките</string> | ||||
|   | ||||
| @@ -258,8 +258,8 @@ | ||||
|     <string name="msg_popup_permission">Kebenaran ini diperlukan untuk | ||||
| \nbuka dalam mod popup</string> | ||||
|     <string name="one_item_deleted">1 item dipadamkan.</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Cabaran reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Cabaran reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Meminta kod reCAPTCHA</string> | ||||
|     <string name="settings_category_downloads_title">Muat turun</string> | ||||
|     <string name="settings_file_charset_title">Karakter yang dibenarkan dalam nama fail</string> | ||||
|   | ||||
| @@ -106,8 +106,8 @@ | ||||
|     <string name="add">Nytt mål</string> | ||||
|     <string name="msg_url_malform">Feilaktig nettadresse eller manglende internettilknytning</string> | ||||
|     <string name="no_available_dir">Definer en nedlastingsmappe senere i innstillingene</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA-oppgave</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA-oppgave</string> | ||||
|     <string name="open_in_popup_mode">Åpne i oppsprettsmodus</string> | ||||
|     <string name="popup_mode_share_menu_title">NewPipe oppsprettsmodus</string> | ||||
|     <string name="default_popup_resolution_title">Forvalgt oppsprettsoppløsning</string> | ||||
|   | ||||
| @@ -230,8 +230,8 @@ | ||||
|     <string name="msg_copied">Gekopieerd naar klembord</string> | ||||
|     <string name="no_available_dir">Kies een beschikbare downloadmap</string> | ||||
|     <string name="msg_popup_permission">Deze toestemming is vereist voor te openen in pop-upmodus</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA-uitdaging</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA-uitdaging</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA-uitdaging gevraagd</string> | ||||
|     <string name="settings_category_downloads_title">Download</string> | ||||
|     <string name="settings_file_charset_title">Toegelaten tekens in bestandsnamen</string> | ||||
|   | ||||
| @@ -107,8 +107,8 @@ | ||||
|     <string name="msg_copied">Gekopieerd naar klembord</string> | ||||
|     <string name="no_available_dir">Kies een beschikbare downloadmap</string> | ||||
|     <string name="black_theme_title">Zwart</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA-uitdaging</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA-uitdaging</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA-uitdaging gevraagd</string> | ||||
|     <string name="open_in_popup_mode">Openen in pop-upmodus</string> | ||||
|     <string name="all">Alles</string> | ||||
|   | ||||
| @@ -237,8 +237,8 @@ | ||||
|     <string name="no_available_dir">ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ</string> | ||||
|     <string name="msg_popup_permission">ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ ਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</string> | ||||
|     <string name="one_item_deleted">1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ.</string> | ||||
|     <string name="reCaptchaActivity">ReCaptcha</string> | ||||
|     <string name="reCaptcha_title">ReCaptcha ਚੁਣੌਤੀ</string> | ||||
|     <string name="recaptcha">ReCaptcha</string> | ||||
|     <string name="title_activity_recaptcha">ReCaptcha ਚੁਣੌਤੀ</string> | ||||
|     <string name="recaptcha_request_toast">ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ</string> | ||||
|     <string name="settings_category_downloads_title">ਡਾਊਨਲੋਡ</string> | ||||
|     <string name="settings_file_charset_title">ਫਾਈਲ ਨਾਮ ਵਿੱਚ ਪ੍ਰਵਾਨਿਤ ਅੱਖਰ</string> | ||||
|   | ||||
| @@ -106,8 +106,8 @@ | ||||
|     <string name="app_ui_crash">Awaria aplikacji/interfejsu</string> | ||||
|     <string name="use_tor_summary">(Eksperymentalne) Wymuś pobieranie przez Tora w celu zwiększenia prywatności (strumieniowe wideo nie jest jeszcze obsługiwane).</string> | ||||
|     <string name="start">Start</string> | ||||
|     <string name="reCaptchaActivity">CAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Wyzwanie reCAPTCHA</string> | ||||
|     <string name="recaptcha">CAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Wyzwanie reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Wymagane wyzwanie dotyczące reCAPTCHA</string> | ||||
|     <string name="use_external_video_player_summary">Usuwa dźwięk w niektórych rozdzielczościach</string> | ||||
|     <string name="controls_background_title">Tło</string> | ||||
|   | ||||
| @@ -50,8 +50,8 @@ | ||||
|     <string name="next_video_title">Próximo</string> | ||||
|     <string name="open_in_browser">Abrir no navegador</string> | ||||
|     <string name="pause">Pausar</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Desafio reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Desafio reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Desafio reCAPTCHA solicitado</string> | ||||
|     <string name="report_error">Reportar um erro</string> | ||||
|     <string name="retry">Tentar novamente</string> | ||||
|   | ||||
| @@ -117,8 +117,8 @@ | ||||
|     <string name="short_billion">B</string> | ||||
|     <string name="msg_popup_permission">Esta permissão é necessária  | ||||
| \npara o modo de janela</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Desafio reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Desafio reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Desafio reCAPTCHA solicitado</string> | ||||
|     <string name="popup_mode_share_menu_title">Modo de janela autónoma do NewPipe</string> | ||||
|     <string name="popup_playing_toast">Reproduzir no modo de janela autónoma</string> | ||||
|   | ||||
| @@ -106,8 +106,8 @@ | ||||
|     <string name="open_in_popup_mode">Deschide in modul popup</string> | ||||
|     <string name="msg_popup_permission">Aceasta permisiune este necesara | ||||
| pentru a deschide în mod pop-up</string> | ||||
|     <string name="reCaptchaActivity">ReCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Provocare reCAPTCHA</string> | ||||
|     <string name="recaptcha">ReCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Provocare reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA nouă cerută</string> | ||||
|     <string name="popup_mode_share_menu_title">NewPipe mod pop-up</string> | ||||
|     <string name="default_popup_resolution_title">"Rezoluție pop-up inițială "</string> | ||||
|   | ||||
| @@ -124,7 +124,7 @@ | ||||
|     <string name="info_labels">Что:\\nЗапрос:\\nЯзык контента:\\nСервис:\\nВремя по Гринвичу:\\nПакет:\\nВерсия:\\nВерсия ОС:</string> | ||||
|     <string name="msg_popup_permission">Это разрешение нужно для | ||||
| \nвоспроизведения в окне</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="open_in_popup_mode">Открыть во всплывающем окне</string> | ||||
|     <string name="show_search_suggestions_summary">Предлагать варианты при поиске</string> | ||||
|     <string name="later">Позже</string> | ||||
| @@ -138,7 +138,7 @@ | ||||
|     <string name="popup_remember_size_pos_summary">Помнить последние размер и позицию всплывающего окна</string> | ||||
|     <string name="show_search_suggestions_title">Поисковые предложения</string> | ||||
|     <string name="best_resolution">Лучшее разрешение</string> | ||||
|     <string name="reCaptcha_title">Запрос reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Запрос reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Запрошен ввод reCAPTCHA</string> | ||||
|     <string name="show_higher_resolutions_title">Высокие разрешения</string> | ||||
|     <string name="popup_mode_share_menu_title">NewPipe во всплывающем окне</string> | ||||
|   | ||||
| @@ -106,8 +106,8 @@ | ||||
|     <string name="could_not_load_image">Nemožno načítať obrázok</string> | ||||
|     <string name="app_ui_crash">Aplikácia/UP zlyhalo</string> | ||||
|     <string name="info_labels">Čo:\\nPožiadavka:\\nJazyk obsahu:\\nSlužba:\\nČas v GMT:\\nBalík:\\nVerzia:\\nVerzia OS:</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Výzva reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Výzva reCAPTCHA</string> | ||||
|     <string name="black_theme_title">Čierna</string> | ||||
|     <string name="all">Všetko</string> | ||||
|     <string name="channel">Kanál</string> | ||||
|   | ||||
| @@ -124,8 +124,8 @@ | ||||
|  | ||||
|     <string name="could_not_load_image">Slike ni mogoče naložiti</string> | ||||
|     <string name="app_ui_crash">Program se je sesul!</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">Izziv reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Izziv reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Zahteva izziva reCAPTCHA</string> | ||||
|  | ||||
|     <string name="info_labels">Predmet:\\nZahteva:\\nJezik vsebine:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS:</string> | ||||
|   | ||||
| @@ -107,8 +107,8 @@ | ||||
|     <string name="could_not_load_image">Не могох да учитам слику</string> | ||||
|     <string name="app_ui_crash">Апликација/УИ је краховала</string> | ||||
|     <string name="info_labels">Шта:\\nЗахтев:\\nЈезик садржаја:\\nУслуга:\\nГМТ време:\\nПакет:\\nИздање:\\nИздање ОС-а:\\nГлоб. ИП распон:</string> | ||||
|     <string name="reCaptchaActivity">Стопка</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA стопка</string> | ||||
|     <string name="recaptcha">Стопка</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA стопка</string> | ||||
|     <string name="recaptcha_request_toast">Решите reCAPTCHA стопку</string> | ||||
|     <string name="black_theme_title">Црна</string> | ||||
|     <string name="all">Сви</string> | ||||
|   | ||||
| @@ -186,8 +186,8 @@ | ||||
|     <string name="no_available_dir">Ange en hämtningsmapp senare i inställningar</string> | ||||
|     <string name="msg_popup_permission">Denna tillåtelse behövs för att | ||||
| \nöppna i popup-läge</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA utmaning</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA utmaning</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA utmaning begärd</string> | ||||
|     <string name="settings_category_downloads_title">Nedladdning</string> | ||||
|     <string name="settings_file_charset_title">Tillåtna tecken i filnamn</string> | ||||
|   | ||||
| @@ -124,8 +124,8 @@ | ||||
|     <string name="short_billion">B</string> | ||||
|     <string name="msg_popup_permission">Bu izin, açılır pencere modunda  | ||||
| \naçmak için gereklidir</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA formu</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA formu</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA formu istendi</string> | ||||
|     <string name="controls_background_title">Arka plan</string> | ||||
|     <string name="controls_popup_title">Açılır pencere</string> | ||||
|   | ||||
| @@ -184,7 +184,7 @@ | ||||
|     <string name="msg_url_malform">Помилковий URL або немає доступу в Інтернет</string> | ||||
|     <string name="msg_popup_permission">Цей дозвіл потрібен для перегляду | ||||
| \nу віконному режимі</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="settings_category_downloads_title">Завантаження</string> | ||||
|     <string name="settings_file_charset_title">Допустимі символи у іменах файлів</string> | ||||
|     <string name="settings_file_replacement_character_summary">Недопустимі символи замінити на цей</string> | ||||
| @@ -256,7 +256,7 @@ | ||||
|         <item quantity="many">%s переглядів</item> | ||||
|     </plurals> | ||||
|     <string name="add">Нове завдання</string> | ||||
|     <string name="reCaptcha_title">Перевірка reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">Перевірка reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Запит на перевірку reCAPTCHA</string> | ||||
|     <string name="copyright" formatted="true">© %1$s, %2$s під %3$s</string> | ||||
|     <string name="tab_contributors">Учасники</string> | ||||
|   | ||||
| @@ -228,9 +228,7 @@ | ||||
|     <string name="msg_wait">براۓ مہربانی انتظار کريں…</string> | ||||
|     <string name="msg_copied">کلپ بورڈ میں نقل ہوا</string> | ||||
|     <string name="no_available_dir">براہ کرم بعد میں ترتیبات میں ڈاؤن لوڈ فولڈر کی وضاحت رکھیں</string> | ||||
|     <string name="msg_popup_permission">پوپ اپ موڈ میں کھولنے کیلئے/nاس اجازت کی ضرورت ہے</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA چیلنج</string> | ||||
|     <string name="msg_popup_permission">پوپ اپ موڈ میں کھولنے کیلئے اس اجازت کی ضرورت ہے</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA چیلینج کی درخواست کی گئی</string> | ||||
|     <string name="settings_category_downloads_title">ڈاؤن لوڈ</string> | ||||
|     <string name="settings_file_charset_title">فائل کے ناموں میں ان حروف کی اجازت ہے</string> | ||||
| @@ -537,4 +535,4 @@ | ||||
|     <string name="clear_download_history">ڈاؤن لوڈ کی سرگزشت صاف کریں</string> | ||||
|     <string name="delete_downloaded_files">ڈاؤن لوڈ شدہ فائلیں حذف کریں</string> | ||||
|     <string name="deleted_downloads">%1$s ڈاؤن لوڈز کو حذف کیا گیا</string> | ||||
| </resources> | ||||
| </resources> | ||||
|   | ||||
| @@ -135,8 +135,8 @@ | ||||
|     <string name="no_available_dir">Chọn một thư mục tải về có sẵn trong cài đặt</string> | ||||
|     <string name="msg_popup_permission">Cần quyền này để  | ||||
| \nmở trong chế độ popup</string> | ||||
|     <string name="reCaptchaActivity">ReCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA</string> | ||||
|     <string name="recaptcha">ReCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA</string> | ||||
|     <string name="recaptcha_request_toast">Yêu cầu reCAPTCHA</string> | ||||
|     <string name="title_activity_about">Giới thiệu về NewPipe</string> | ||||
|     <string name="action_settings">Cài đặt</string> | ||||
|   | ||||
| @@ -117,8 +117,8 @@ | ||||
|     <string name="could_not_load_image">无法加载图像</string> | ||||
|     <string name="app_ui_crash">应用/界面已崩溃</string> | ||||
|     <string name="info_labels">原因:\\n请求:\\n内容语言:\\n服务:\\nGMT时间:\\n包:\\n版本:\\n操作系统版本:</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA 验证</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA 验证</string> | ||||
|  | ||||
|     <string name="recaptcha_request_toast">需要 reCAPTCHA 验证</string> | ||||
|  | ||||
|   | ||||
| @@ -120,8 +120,8 @@ | ||||
|     <string name="info_labels">事件:\\n請求:\\n內容語言:\\n服務:\\nGMT 時間:\\nPackage:\\n版本:\\n作業系統版本:</string> | ||||
|     <string name="short_thousand">K</string> | ||||
|     <string name="short_million">M</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA 挑戰</string> | ||||
|     <string name="recaptcha">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA 挑戰</string> | ||||
|     <string name="msg_popup_permission">畫中畫模式需要此權限</string> | ||||
|     <string name="recaptcha_request_toast">需完成 reCAPTCHA 挑戰</string> | ||||
|     <string name="use_external_video_player_summary">啟用此選項將導致某些解像度的影片失去聲音</string> | ||||
|   | ||||
| @@ -136,8 +136,8 @@ | ||||
|     <string name="msg_copied">已複製至剪貼簿</string> | ||||
|     <string name="no_available_dir">稍後請在設定中選擇下載資料夾</string> | ||||
|     <string name="msg_popup_permission">使用懸浮視窗模式需要此權限</string> | ||||
|     <string name="reCaptchaActivity">reCAPTCHA 驗證</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA 驗證</string> | ||||
|     <string name="recaptcha">reCAPTCHA 驗證</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA 驗證</string> | ||||
|     <string name="recaptcha_request_toast">已請求 reCAPTCHA 驗證</string> | ||||
|     <string name="controls_popup_title">懸浮視窗</string> | ||||
|     <string name="duration_live">直播</string> | ||||
|   | ||||
| @@ -45,6 +45,7 @@ | ||||
|     <attr name="ic_grid" format="reference"/> | ||||
|     <attr name="ic_delete" format="reference"/> | ||||
|     <attr name="ic_settings_update" format="reference"/> | ||||
|     <attr name="ic_done" format="reference"/> | ||||
|  | ||||
|     <attr name="progress_horizontal_drawable" format="reference"/> | ||||
|     <!-- Can't refer to colors directly in drawable's xml--> | ||||
|   | ||||
| @@ -327,10 +327,12 @@ | ||||
|     <!-- Checksum types --> | ||||
|     <string name="md5" translatable="false">MD5</string> | ||||
|     <string name="sha1" translatable="false">SHA-1</string> | ||||
|     <string name="reCaptchaActivity" translatable="false">reCAPTCHA</string> | ||||
|     <string name="reCaptcha_title">reCAPTCHA challenge</string> | ||||
|     <!-- reCAPTCHA --> | ||||
|     <string name="recaptcha" translatable="false">reCAPTCHA</string> | ||||
|     <string name="title_activity_recaptcha">reCAPTCHA challenge</string> | ||||
|     <string name="subtitle_activity_recaptcha">Press \"Done\" when solved</string> | ||||
|     <string name="recaptcha_request_toast">reCAPTCHA challenge requested</string> | ||||
|     <!-- End of GigaGet's Strings --> | ||||
|     <string name="recaptcha_done_button">Done</string> | ||||
|     <!-- Downloads --> | ||||
|     <string name="settings_category_downloads_title">Download</string> | ||||
|     <string name="settings_file_charset_title">Allowed characters in filenames</string> | ||||
|   | ||||
| @@ -60,6 +60,7 @@ | ||||
|         <item name="ic_grid">@drawable/ic_grid_black_24dp</item> | ||||
|         <item name="ic_delete">@drawable/ic_delete_black_24dp</item> | ||||
|         <item name="ic_settings_update">@drawable/ic_settings_update_black</item> | ||||
|         <item name="ic_done">@drawable/ic_done_black_24dp</item> | ||||
|  | ||||
|         <item name="separator_color">@color/light_separator_color</item> | ||||
|         <item name="contrast_background_color">@color/light_contrast_background_color</item> | ||||
| @@ -129,6 +130,7 @@ | ||||
|         <item name="ic_delete">@drawable/ic_delete_white_24dp</item> | ||||
|         <item name="pause">@drawable/ic_pause_white_24dp</item> | ||||
|         <item name="ic_settings_update">@drawable/ic_settings_update_white</item> | ||||
|         <item name="ic_done">@drawable/ic_done_white_24dp</item> | ||||
|  | ||||
|         <item name="separator_color">@color/dark_separator_color</item> | ||||
|         <item name="contrast_background_color">@color/dark_contrast_background_color</item> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Stypox
					Stypox